У меня есть скрипт bash, который используется rsync
для резервного копирования файлов в Archlinux. Я заметил, что rsync
не удалось скопировать файл /sys
, хотя cp
работал нормально:
# rsync /sys/class/net/enp3s1/address /tmp
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
ERROR: address failed verification -- update discarded.
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]
# cp /sys/class/net/enp3s1/address /tmp ## this works
Интересно, почему не получается rsync
, и возможно ли скопировать файл вместе с ним?
linux
arch-linux
rsync
sysfs
Евгений Ярмаш
источник
источник
/sys/
?/sys/class/net/*/address
(я получаю «разрешение отказано», когда я пытаюсь это сделать)? Если нет, то вы не создаете реальную / полезную резервную копию, поскольку ее невозможно восстановить.Ответы:
Rsync имеет код, который специально проверяет, урезан ли файл во время чтения, и выдает эту ошибку -
ENODATA
. Я не знаю, почему файлы/sys
имеют такое поведение, но так как они не настоящие файлы, я думаю, это не слишком удивительно. Похоже, нет способа заставить rsync пропустить эту конкретную проверку.Я думаю, что вам, вероятно, лучше не использовать rsyncing
/sys
и использовать специальные сценарии, чтобы выбрать нужную информацию (например, адрес сетевой карты).источник
Прежде всего
/sys
, это псевдо файловая система . Если вы посмотрите на них,/proc/filesystems
вы найдете список зарегистрированных файловых систем, где их довольно многоnodev
. Это указывает на то, что они являются псевдофайловыми системами . Это означает, что они существуют в работающем ядре как файловая система на основе RAM. Далее они не требуют блочного устройства.При загрузке ядро монтирует эту систему и обновляет записи, когда подходит. Например, когда новое оборудование найдено во время загрузки или
udev
.У
/etc/mtab
вас обычно встречается монтировка:Прочитайте статью Патрика Мохеля «Файловая система sysfs», чтобы прочитать хорошую статью на эту тему .
статистика файлов / sys
Если вы войдете в каталог
/sys
и выполните команду a,ls -l
вы заметите, что все файлы имеют один размер. Обычно 4096 байт. Об этом сообщаетsysfs
.Далее вы можете сделать
stat
файл и заметить другую особенность; это занимает 0 блоков. Кроме того, индекс root (stat / sys) равен 1. Как/stat/fs
правило, индекс 2. и т. Д.rsync против cp
Возможно, самое простое объяснение сбоя синхронизации псевдо-файлов в rsync - это пример.
Скажем, у нас есть файл с именем
address
18 байтов. Файлls
илиstat
файл сообщает 4096 байт.Rsync
read_size == 4096
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
, Линия 2554096
байты. Обнуление буфера.ENODATA
.Во время этого процесса он фактически читает весь файл. Но при отсутствии доступного размера он не может проверить результат - таким образом, отказ является единственным вариантом.
ср
Проверьте, не является ли файл редким. То есть файл имеет дыры и т. Д.
Поскольку
stat
файл отчетов имеет нулевые блоки, он классифицируется как разреженный.Пытается прочитать файл с помощью экстент-копии (более эффективный способ копирования обычных разреженных файлов) и завершается неудачно.
Обычно
18446744073709551615
байты в 32-битной системе.источник
Может быть связано, но вызовы расширенных атрибутов не будут работать на sysfs:
Глядя на мой список, похоже, что rsync пытается добавить расширенные атрибуты по умолчанию:
Я пытался найти флаг , чтобы дать Rsync , чтобы увидеть , если пропустить расширенные атрибуты решает эту проблему , но не смог найти что - нибудь (
--xattrs
превращает их на месте назначения).источник
Rsync обычно читает информацию файла, передает содержимое файла или дельту во временный файл в каталоге назначения, затем после проверки данных файла переименовывает его в имя файла назначения.
Я считаю, что проблема с sysfs заключается в том, что все файлы отображаются как 4 КБ (одна страница памяти), но они могут содержать только несколько байтов. Чтобы избежать копирования потенциально поврежденного файла в место назначения, rsync отменяет копию, когда обнаруживает несоответствие между метаданными файла и тем, что было фактически скопировано.
По крайней мере на rsync v3.0.6 такого поведения можно избежать с помощью
--inplace
коммутатора. Rsync по-прежнему будет обнаруживать ошибки, но поскольку файлы назначения уже будут перезаписаны, он оставит там потенциально поврежденные файлы.Обратите внимание, что побочным эффектом этого является то, что файлы заканчиваются заполнением нулями до 4 КБ, так как это тот размер, который rsync считает для файлов. Это не должно иметь значения в большинстве случаев, поскольку нулевые байты обычно игнорируются.
источник