En primer lugar /sys
es un pseudo sistema de archivos . Si nos fijamos /proc/filesystems
, encontrará una lista de sistemas de archivos registrados donde hay bastantes nodev
por delante. Esto indica que son pseudo sistemas de archivos . Esto significa que existe en un núcleo en ejecución como un sistema de archivos basado en RAM. Además, no requieren un dispositivo de bloqueo.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Al arrancar, el núcleo monta este sistema y actualiza las entradas cuando sea adecuado. Por ejemplo, cuando se encuentra nuevo hardware durante el arranque o por udev
.
En /etc/mtab
general, encuentras el montaje por:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Para un buen artículo sobre el tema, lea
Patric Mochel's - El sistema de archivos sysfs .
stat de archivos / sys
Si va a un directorio debajo /sys
y hace un ls -l
, notará que todos los archivos tienen un tamaño. Típicamente 4096 bytes. Esto es informado por 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
...
Además, puede hacer un stat
en un archivo y notar otra característica distinta; Ocupa 0 bloques. También el inodo de la raíz (stat / sys) es 1. /stat/fs
típicamente tiene inodo 2. etc.
rsync vs. cp
La explicación más fácil para la falla rsync de sincronizar pseudo archivos es quizás por ejemplo.
Digamos que tenemos un archivo llamado address
que tiene 18 bytes. Una ls
o stat
del archivo informa 4096 bytes.
rsync
- Abre el descriptor de archivo, fd.
- Utiliza fstat (fd) para obtener información como el tamaño.
- Establezca la lectura de bytes de tamaño, es decir, 4096. Esa sería la línea 253 del código vinculado por @mattdm .
read_size == 4096
- Pedir; leer: 4096 bytes.
- Se lee una cadena corta, es decir, 18 bytes.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Pedir; leer: 4078 bytes
- 0 bytes leídos (como la primera lectura consumió todos los bytes en el archivo).
nread == 0
, línea 255
- No se pueden leer los
4096
bytes. Poner a cero el búfer.
- Set error
ENODATA
.
- Regreso.
- Informar error.
- Procesar de nuevo. (Por encima del bucle).
- Fallar.
- Informar error.
- MULTA.
Durante este proceso, en realidad lee todo el archivo. Pero sin tamaño disponible, no puede validar el resultado, por lo que el fracaso es la única opción.
cp
- Abre el descriptor de archivo, fd.
- Utiliza fstat (fd) para obtener información como st_size (también usa lstat y stat).
Compruebe si es probable que el archivo sea escaso. Ese es el archivo tiene agujeros, etc.
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);
Como el stat
archivo de informes tiene cero bloques, se clasifica como escaso.
Intenta leer el archivo mediante la extensión-copia (una forma más eficiente de copiar
archivos dispersos normales ), y falla.
- Copia por copia dispersa.
- Comienza con el tamaño máximo de lectura de MAXINT.
Típicamente
18446744073709551615
bytes en un sistema de 32 bits.
- Pedir; leer 4096 bytes. (Tamaño del búfer asignado en la memoria de la información estadística).
- Se lee una cadena corta, es decir, 18 bytes.
- Compruebe si se necesita un agujero, no.
- Escribir buffer al objetivo.
- Resta 18 del tamaño máximo de lectura.
- Pedir; leer 4096 bytes.
- 0 bytes ya que todo se consumió en la primera lectura.
- Devuelve el éxito.
- Todo bien. Actualizar banderas para el archivo.
- MULTA.
/sys/
?