По-перше, /sys
це файлова система псевдо . Якщо ви подивитесь, /proc/filesystems
ви знайдете список зареєстрованих файлових систем, де їх досить багато nodev
попереду. Це означає, що вони є псевдофайловими системами . Це означає, що вони існують на запущеному ядрі як файлова система на основі ОЗУ. Далі вони не потребують блокового пристрою.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Під час завантаження ядра монтують цю систему та оновлює записи, коли вони підходять. Наприклад, коли під час завантаження або користування знайдено нове обладнання udev
.
У /etc/mtab
ви зазвичай знайти кріплення з допомогою:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Для приємного документу на цю тему прочитайте статті
Патріка Мочеля - Файлова система sysfs .
stat з / sys файлів
Якщо ви ввійдете в каталог під /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 кореня (stat / sys) дорівнює 1. /stat/fs
Зазвичай має inode 2. і т.д.
rsync vs. cp
Найпростіше пояснення несправності rsync синхронізації псевдофайлів, можливо, на прикладі.
Скажімо, у нас є ім'я файлу, address
який становить 18 байт. ls
Або stat
файл звіти 4096 байт.
rsync
- Відкриває дескриптор файлів, fd.
- Використовує fstat (fd) для отримання такої інформації, як розмір.
- Поставте перед читанням байт розміру, тобто 4096. Це був би рядок 253 коду, пов'язаний @mattdm .
read_size == 4096
- Запитайте; прочитано: 4096 байт.
- Читається короткий рядок, тобто 18 байт.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Запитайте; прочитано: 4078 байт
- Прочитано 0 байтів (як перше прочитане спожито всі байти у файлі).
nread == 0
, рядок 255
- Не вдається прочитати
4096
байти. Нульовий буфер.
- Встановити помилку
ENODATA
.
- Повернення.
- Повідомити про помилку.
- Повторіть спробу. (Вище петлі).
- Збій.
- Повідомити про помилку.
- ТОЧО.
Під час цього процесу він фактично зчитує весь файл. Але не маючи доступного розміру, він не може підтвердити результат - тому невдача є єдиним варіантом.
cp
- Відкриває дескриптор файлів, fd.
- Використовує fstat (fd) для отримання такої інформації, як st_size (також використовує lstat та stat).
Перевірте, чи файл, ймовірно, розріджений. Тобто у файлі є дірки тощо.
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
файл звітів має нульові блоки, він класифікується як рідкий.
Намагається читати файл методом масштабування (більш ефективний спосіб копіювання звичайних
розріджених файлів) і не дає змоги.
- Скопіюйте за допомогою рідкої копії.
- Починається з максимального розміру читання MAXINT.
Зазвичай
18446744073709551615
байти в 32-бітовій системі.
- Запитайте; читати 4096 байт. (Розмір буфера, виділений у пам'яті зі статистичної інформації.)
- Читається короткий рядок, тобто 18 байт.
- Перевірте, чи потрібен отвір, ні.
- Напишіть буфер для націлювання.
- Відняти 18 від максимального розміру читання.
- Запитайте; читати 4096 байт.
- 0 байтів, скільки всього було спожито під час першого читання.
- Повернути успіх.
- Все добре. Оновити прапори для файлу.
- ТОЧО.
/sys/
?