Прежде всего /sys
, это псевдо файловая система . Если вы посмотрите на них, /proc/filesystems
вы найдете список зарегистрированных файловых систем, где их довольно много nodev
. Это указывает на то, что они являются псевдофайловыми системами . Это означает, что они существуют в работающем ядре как файловая система на основе RAM. Далее они не требуют блочного устройства.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
При загрузке ядро монтирует эту систему и обновляет записи, когда подходит. Например, когда новое оборудование найдено во время загрузки или udev
.
У /etc/mtab
вас обычно встречается монтировка:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Прочитайте статью Патрика Мохеля «Файловая система sysfs», чтобы прочитать хорошую статью на эту тему
.
статистика файлов / sys
Если вы войдете в каталог /sys
и выполните команду a, 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 блоков. Кроме того, индекс root (stat / sys) равен 1. Как /stat/fs
правило, индекс 2. и т. Д.
rsync против 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
.
- Возвращение.
- Сообщить об ошибке.
- Retry. (Выше петли).
- Провал.
- Сообщить об ошибке.
- FINE.
Во время этого процесса он фактически читает весь файл. Но при отсутствии доступного размера он не может проверить результат - таким образом, отказ является единственным вариантом.
ср
- Открывает дескриптор файла, 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 байт, поскольку все они были использованы в первом чтении.
- Верните успех.
- Все ок. Обновить флаги для файла.
- FINE.
/sys/
?