Почему rsync не удается скопировать файлы из / sys в Linux?

У меня есть сценарий 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 терпит неудачу, и можно ли скопировать файл с ним?

3 Solutions collect form web for “Почему rsync не удается скопировать файлы из / sys в Linux?”

Rsync имеет код, который специально проверяет, если файл усечен во время чтения и дает эту ошибку – ENODATA . Я не знаю, почему файлы в /sys имеют такое поведение, но поскольку они не являются реальными файлами, я думаю, это не слишком удивительно. Кажется, не существует способа сказать rsync пропустить эту конкретную проверку.

Я думаю, что вам, вероятно, лучше не rsyncing /sys и использовать определенные сценарии для вишни – выберите нужную вам информацию (например, адрес сетевой карты).

First off /sysпсевдо файловая система . Если вы посмотрите на /proc/filesystems вы найдете список зарегистрированных файловых систем, в которых довольно много nodev . Это означает, что они являются псевдо файловыми системами . Это означает, что они существуют на запущенном ядре в виде файловой системы на основе RAM. Кроме того, они не требуют блочного устройства.

 $ cat /proc/filesystems nodev sysfs nodev rootfs nodev bdev ... 

При загрузке ядро ​​монтирует эту систему и обновляет записи, когда они подходят. Например, при обнаружении нового оборудования во время загрузки или udev .

В /etc/mtab вы обычно находите mount:

 sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0 

Для хорошей статьи на эту тему читайте Patric Mochel's – The sysfs Filesystem .


stat of / sys files

Если вы перейдете в каталог под /sys и выполните ls -l вы заметите, что все файлы имеют один размер. Обычно 4096 байт. Об этом сообщается sysfs .

 :/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l -r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type -r--r--r-- 1 root root 4096 Apr 24 20:09 address -r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len ... 

Далее вы можете сделать stat в файле и заметить еще одну особенность; он занимает 0 блоков. Также inode root (stat / sys) равен 1. /stat/fs обычно имеет inode 2. и т. Д.

rsync против cp

Простейшим объяснением ошибки rsync синхронизации псевдофайлов является, пожалуй, пример.

Скажем, у нас есть файл с address который составляет 18 байт. Файл ls или stat сообщает 4096 байт.


Rsync

  1. Открывает файловый дескриптор, fd.
  2. Использует fstat (fd) для получения информации, такой как размер.
  3. Задайте размер байтов размера, то есть 4096. Это будет строка 253 кода, связанного с @mattdm . read_size == 4096
    1. Просить; читать: 4096 байт.
    2. Короткая строка считывается, т.е. 18 байт. nread == 18
    3. read_size = read_size - nread (4096 - 18 = 4078)
    4. Просить; читать: 4078 байт
    5. 0 байт прочитано (поскольку первое чтение потребляло все байты в файле).
    6. nread == 0 , строка 255
    7. Не удалось прочитать 4096 байт. Нулевой буфер.
    8. Установите ошибку ENODATA .
    9. Вернуть.
  4. Сообщить об ошибке.
  5. Повторите попытку. (Выше цикла).
  6. Потерпеть неудачу.
  7. Сообщить об ошибке.
  8. FINE.

Во время этого процесса он фактически считывает весь файл. Но без какого-либо размера он не может подтвердить результат – таким образом, отказ – это только вариант.

ср

  1. Открывает файловый дескриптор, fd.
  2. Использует fstat (fd) для получения информации, такой как st_size (также использует lstat и stat).
  3. Проверьте, может ли файл быть разреженным. Это файл имеет отверстия и т. Д.

     copy.c:1010 /* Use a heuristic to determine whether SRC_NAME contains any sparse * blocks. If the file has fewer blocks than would normally be * needed for a file of its size, then at least one of the blocks in * the file is a hole. */ sparse_src = is_probably_sparse (&src_open_sb); 

    Поскольку файл отчетов stat имеет нулевые блоки, он классифицируется как разреженный.

  4. Пытается прочитать файл по копии экземпляра (более эффективный способ копирования обычных разреженных файлов) и не удается.

  5. Скопируйте по разреженной копии.
    1. Запускается с максимальным размером чтения MAXINT.
      Обычно 18446744073709551615 байт на 32-битной системе.
    2. Просить; прочитайте 4096 байт. (Размер буфера выделен в памяти из информации о статике.)
    3. Короткая строка считывается, т.е. 18 байт.
    4. Проверьте, требуется ли отверстие, нет.
    5. Напишите буфер для цели.
    6. Вычитайте 18 из максимального размера чтения.
    7. Просить; прочитайте 4096 байт.
    8. 0 байтов, поскольку все они были использованы при первом чтении.
    9. Верните успех.
  6. Все ОК. Обновить флаги для файла.
  7. FINE.

Может быть связано, но расширенные вызовы атрибутов не будут выполняться в sysfs:

[root @ hypervisor eth0] # lsattr адрес

lsattr: Несоответствующий ioctl для устройства При чтении флагов по адресу

[root @ hypervisor eth0] #

Глядя на мой strace, похоже, что rsync по умолчанию пытается использовать расширенные атрибуты:

22964 <… getxattr resumed>, 0x7fff42845110, 132) = -1 ENODATA (Данных нет)

Я попытался найти флаг, чтобы дать rsync, чтобы увидеть, разрешает ли пропуски расширенные атрибуты проблемы, но ничего не может найти ( --xattrs включает их в пункт назначения).

  • Какие из proc, sys и т. Д. Должны быть привязаны (или нет), когда chrooting в «заменяющий» дистрибутив?
  • Использование Bash для записи на устройство в / sys?
  • Общий доступ к sysfs
  • Разрешить пользователям без полномочий root получать статистику сетевого трафика
  • Как найти слот pci контроллера usb в Linux?
  • В чем разница между / sys / block / sda1 / stat и / sys / block / xvda1 / stat?
  • Когда именно (и самое раннее) все блок-устройства были перечислены во время загрузки Linux?
  • Программно определить IRQ, связанные с сетевым интерфейсом
  • Какая единица этого значения
  • Методы для выяснения того, какие remounts / sys readonly (RHEL 6.7)
  • CONFIG_GPIO_SYSFS заставляет / sys / class / leds исчезать
  • Linux и Unix - лучшая ОС в мире.