Файловая система linux / proc на самом деле является переменными ядра, выдавая себя за файловую систему.Там нет ничего, чтобы сохранить, таким образом, ничего для резервного копирования.Если система позволит вам, вы можете rm -rf /proc
, и она волшебным образом появится при следующей перезагрузке.
Файловая система / dev имеет настоящие i-узлы, и они могут быть скопированы.За исключением того, что у них нет содержимого, только старший и младший номер, разрешения и имя.Инструменты, которые выполняют резервное копирование специальных файлов устройства, записывают только эти параметры и никогда не пытаются открыть (2) устройство.Тем не менее, поскольку старшие и младшие номера устройства имеют смысл только в той системе, для которой они созданы, резервное копирование их не имеет особых оснований.
Причина, по которой попытка переархивировать псевдофайловую систему / proc вызывает tarк segfault - потому что / proc имеет забавное поведение файла: такие вещи, как псевдофайл только для записи, могут иметь разрешения на чтение, но возвращают сообщение об ошибке, если программа пытается открыть (2) его для резервного копирования.Это наверняка приведет наворотливый tar для получения привередливости.
Добавлено в ответ на комментарий
Меня не удивляет, что tar имел проблемы с чтением / proc / kmsg, потому что у него есть некоторые забавные свойства:
# strace cat /proc/kmsg
execve("/bin/cat", ["cat", "kmsg"],
open("kmsg", O_RDONLY|O_LARGEFILE) = 3
// ok, no problem opening the file for reading
fstat64(3, { st_mode=S_IFREG|0400, st_size=0,
// looks like a normal file of zero length
// but cat does not pay attention to st_size so it just
// does a blocking read
read(3, "<4>[103128.156051] ata2.00: qc t"..., 32768) = 461
write(1, "<4>[103128.156051] ata2.00: qc t"..., 461) = 461
// ...forever...
read(3, "<6>[103158.228444] ata2.00: conf"..., 32768) = 48
write(1, "<6>[103158.228444] ata2.00: conf"..., 48) = 48
+++ killed by SIGINT +++
Поскольку / proc / kmsg - это текущий список сообщений ядра по мере их появления, он никогда не возвращает 0 (EOF), он просто продолжается до тех пор, пока мне не надоест и не нажму ^ C.
Интересно, что у моего tar нет проблем с / proc / kmsg:
$ tar --version
tar (GNU tar) 1.22
# tar cf /tmp/junk.tar /proc/kmsg
$ tar tvf /tmp/junk.tar
-r-------- root/root 0 2010-09-01 14:41 proc/kmsg
, и если вы посмотрите на вывод strace, GNU tar 1.22 увидел, что st_length == 0, и даже не удосужился открыть файл.для чтения, поскольку там ничего не было.
Я могу представить, что ваш tar увидел, что длина равна 0, выделил столько (ни одного) пространства, используя malloc (3), который должным образом вернул указатель на нольдлина буфера.Ваш tar прочитал из / proc / kmsg, получил чтение ненулевой длины и попытался сохранить его в буфере нулевой длины и получил нарушение сегментации.
Это всего лишь одна крысиная дыра, которая ожидает tar в/ Proc.Сколько еще там?Не знаю.Будут ли они вести себя одинаково?Возможно нет.Какие из ~ 1000 или около того файлов, которые не являются /proc/<pid>
псевдо-файлами, будут иметь странную семантику?Не знаю.
Но, пожалуй, самый интересный вопрос: какой смысл вы бы имели в / proc / sys / vm / lowmem_reserve_ratio, он будет другим на следующей неделе, и сможете ли вы чему-нибудь научиться из этого различия?