Prima di tutto /sys
è un pseudo file system . Se guardi /proc/filesystems
troverai un elenco di file system registrati in cui un bel po 'ha nodev
davanti. Ciò indica che sono pseudo filesystem . Ciò significa che esistono su un kernel in esecuzione come filesystem basato su RAM. Inoltre non richiedono un dispositivo a blocchi.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
All'avvio il kernel monta questo sistema e aggiorna le voci quando necessario. Ad esempio, quando viene trovato nuovo hardware durante l'avvio o da udev
.
In /etc/mtab
genere trovi il mount di:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Per un bel documento sull'argomento leggi
Patric Mochel's - The sysfs Filesystem .
stat dei file / sys
Se vai in una directory sotto /sys
e fai un ls -l
noterai che tutti i file hanno una dimensione. In genere 4096 byte. Questo è segnalato da 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
...
Inoltre puoi fare un stat
su un file e notare un'altra caratteristica distinta; occupa 0 blocchi. Anche l'inode di root (stat / sys) è 1. in /stat/fs
genere ha inode 2. ecc.
rsync vs. cp
La spiegazione più semplice dell'errore rsync di sincronizzazione dei pseudo file è forse l'esempio.
Supponiamo di avere un file denominato di address
18 byte. Uno ls
o stat
del file riporta 4096 byte.
rsync
- Apre il descrittore di file, fd.
- Usa fstat (fd) per ottenere informazioni come le dimensioni.
- Inizia a leggere byte di dimensioni, ovvero 4096. Sarebbe la riga 253 del codice collegato da @mattdm .
read_size == 4096
- Chiedi; leggi: 4096 byte.
- Viene letta una stringa breve, ovvero 18 byte.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Chiedi; leggi: 4078 byte
- 0 byte letti (come prima lettura consumati tutti i byte nel file).
nread == 0
, linea 255
- Impossibile leggere i
4096
byte. Azzerare il buffer.
- Imposta errore
ENODATA
.
- Ritorno.
- Segnala errore.
- Riprova. (Sopra il ciclo).
- Fallire.
- Segnala errore.
- FINI.
Durante questo processo legge effettivamente l'intero file. Ma senza dimensioni disponibili non è possibile convalidare il risultato, quindi il fallimento è solo un'opzione.
cp
- Apre il descrittore di file, fd.
- Usa fstat (fd) per ottenere informazioni come st_size (usa anche lstat e stat).
Controlla se è probabile che il file sia scarso. Questo è il file ha buchi ecc.
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);
Poiché il stat
file di report ha zero blocchi, è classificato come scarso.
Cerca di leggere il file con estensione-copia (un modo più efficiente per copiare i normali
file sparsi) e fallisce.
- Copia con copia sparsa.
- Inizia con la dimensione massima di lettura di MAXINT.
In genere
18446744073709551615
byte su un sistema a 32 bit.
- Chiedi; leggere 4096 byte. (Dimensione del buffer allocata in memoria dalle informazioni sulle statistiche.)
- Viene letta una stringa breve, ovvero 18 byte.
- Controlla se è necessario un foro, no.
- Scrivi buffer sul target.
- Sottrai 18 dalla dimensione massima di lettura.
- Chiedi; leggere 4096 byte.
- 0 byte poiché tutti sono stati consumati in prima lettura.
- Ritorna successo.
- Tutto ok. Aggiorna flag per il file.
- FINI.
/sys/
?