Tout d'abord, /sys
un pseudo système de fichiers . Si vous regardez, /proc/filesystems
vous trouverez une liste des systèmes de fichiers enregistrés où un bon nombre ont nodev
en face. Cela indique qu'il s'agit de pseudo-systèmes de fichiers . Cela signifie qu'ils existent sur un noyau en cours d'exécution en tant que système de fichiers basé sur la RAM. De plus, ils ne nécessitent pas de dispositif bloc.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Au démarrage, le noyau monte ce système et met à jour les entrées le cas échéant. Par exemple, lorsqu'un nouveau matériel est détecté au démarrage ou par udev
.
En /etc/mtab
vous trouvez généralement la monture par:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Pour un bon article sur le sujet, lisez
Patric Mochel's - The sysfs Filesystem .
fichiers stat / sys
Si vous allez dans un répertoire sous /sys
et faites un, ls -l
vous remarquerez que tous les fichiers ont une taille. En général, 4096 octets. Ceci est rapporté par 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
...
De plus, vous pouvez faire une stat
sur un fichier et remarquer une autre fonctionnalité distincte; il occupe 0 blocs. L'inode de la racine (stat / sys) est également 1. a /stat/fs
généralement l'inode 2. etc.
rsync vs cp
L'explication la plus simple de l'échec rsync de la synchronisation des pseudo-fichiers est peut-être par exemple.
Supposons que nous ayons un fichier nommé de address
18 octets. Un ls
ou stat
du fichier rapporte 4096 octets.
rsync
- Ouvre le descripteur de fichier, fd.
- Utilise fstat (fd) pour obtenir des informations telles que la taille.
- Partez pour lire les octets de taille, c'est-à-dire 4096. Ce serait la ligne 253 du code lié par @mattdm .
read_size == 4096
- Demander; lire: 4096 octets.
- Une courte chaîne est lue, c'est-à-dire 18 octets.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Demander; lire: 4078 octets
- 0 octet lu (comme la première lecture a consommé tous les octets du fichier).
nread == 0
, ligne 255
- Impossible de lire les
4096
octets. Zéro tampon.
- Définir l'erreur
ENODATA
.
- Revenir.
- Signaler une erreur.
- Retenter. (Au-dessus de la boucle).
- Échouer.
- Signaler une erreur.
- BIEN.
Au cours de ce processus, il lit en fait le fichier entier. Mais sans taille disponible, il ne peut pas valider le résultat - donc l'échec n'est qu'une option.
cp
- Ouvre le descripteur de fichier, fd.
- Utilise fstat (fd) pour obtenir des informations telles que st_size (utilise également lstat et stat).
Vérifiez si le fichier est susceptible d'être clairsemé. C'est-à-dire que le fichier a des trous, 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);
En tant stat
que fichier de rapports ne contenant aucun bloc, il est classé comme clairsemé.
Tente de lire le fichier par extension-copie (un moyen plus efficace de copier
des fichiers clairsemés normaux ), et échoue.
- Copie par copie clairsemée.
- Commence avec une taille de lecture maximale de MAXINT.
Généralement
18446744073709551615
octets sur un système 32 bits.
- Demander; lire 4096 octets. (Taille du tampon allouée en mémoire à partir des informations statistiques.)
- Une courte chaîne est lue, c'est-à-dire 18 octets.
- Vérifiez si un trou est nécessaire, non.
- Écrire le tampon dans la cible.
- Soustrayez 18 de la taille de lecture maximale.
- Demander; lire 4096 octets.
- 0 octet car tous ont été consommés lors de la première lecture.
- Retour du succès.
- Tout va bien. Mettre à jour les drapeaux du fichier.
- BIEN.
/sys/
?