В Linux и Solaris вы также можете использовать «обратную ссылку» на исходный файл. «Рефссылка» — это копия файла, в которой изначально копируются только метаданные. Любые изменения в копии не распространяются обратно на исходный файл. Точно так же любые изменения в исходном файле не отражаются в копии. Рефлинки требуют, чтобы базовая файловая система поддерживала семантику записи копирования -на -.
Рефлинки поддерживаются в Linux файловыми системами BTRFS и XFS (Для XFS требуется ядро версии 4.8 или выше). Рефлинки можно создавать в Linux с помощью командыcp --reflink...
или функцийioctl(..., FI_CLONE,...)
или ioctl(..., FI_CLONERANGE,...)
.
Solaris 11.4 поддерживает ссылки на ZFS, где ссылки можно создать с помощью командыcp -z...
или функции reflink()
.
$ ulimit -c
unlimited
Это хорошо. Если у вас нет проблем с разрешениями, ваш основной файл будет сгенерирован без ограничений по размеру. Если эта команда не отображает unlimited
, вы можете изменить значение с помощью ulimit -c unlimited
.
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P %E
Если вам нужен основной файл на вашем диске, это не то, что вам нужно, так как этот параметр перенаправляет основной файл в apport
программу (, которая не установлена ).
Вы можете изменить это вручную, но у вас должны быть права администратора. Либо войдите в систему как root и измените основной файл шаблона _на
echo /tmp/cores/core.%e.%p.%h.%t > /proc/sys/kernel/core_pattern
... или используйтеsudo
:
echo /tmp/core.%e.%p.%h.%t | sudo dd of=/proc/sys/kernel/core_pattern
Лучше всего использоватьsysctl
:
sudo sysctl -w kernel.core_pattern=/tmp/cores/core.%e.%p.%h.%t
Обычно это изменение можно сделать постоянным, отредактировав /etc/sysctl.conf
соответствующим образом.
Примечание. :Я вижу, вы получили Read-only file system
при попытке изменить содержимое файла. Кажется, ваша proc FS смонтирована только для чтения -, и вы ДОЛЖНЫ перемонтировать ее с разрешением на чтение -для записи перед изменением любого содержимого в/proc
:
sudo mount -o remount,rw /proc
Вот именно. Теперь ваш основной файл будет сгенерирован в /tmp, как вы и просили. Вы можете проверить это следующим образом (с помощью Bash):
$ sleep 3 & kill -SEGV $!
[1] 4604
[1]+ Segmentation fault sleep 3
$ ls /tmp/core*
Дополнительная информация о файлах ядра с помощьюman 5 core
.