J'ai un script bash qui permet rsync
de sauvegarder des fichiers dans Archlinux. J'ai remarqué qu'il rsync
n'a pas été possible de copier un fichier à partir de /sys
, alors qu'il cp
fonctionnait très bien:
# rsync /sys/class/net/enp3s1/address /tmp
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
ERROR: address failed verification -- update discarded.
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]
# cp /sys/class/net/enp3s1/address /tmp ## this works
Je me demande pourquoi rsync
échoue et est-il possible de copier le fichier avec?
linux
arch-linux
rsync
sysfs
Eugene Yarmash
la source
la source
/sys/
?/sys/class/net/*/address
(j'obtiens une "autorisation refusée" lorsque je l'essaye)? Sinon, vous ne faites pas de sauvegarde réelle / utile car elle ne peut pas être restaurée.Réponses:
Rsync a un code qui vérifie spécifiquement si un fichier est tronqué pendant la lecture et donne cette erreur -
ENODATA
. Je ne sais pas pourquoi les fichiers/sys
ont ce comportement, mais comme ce ne sont pas de vrais fichiers, je suppose que ce n'est pas trop surprenant. Il ne semble pas y avoir de moyen de dire à rsync d'ignorer cette vérification particulière.Je pense que vous feriez probablement mieux de ne pas synchroniser
/sys
et d'utiliser des scripts spécifiques pour sélectionner les informations particulières que vous souhaitez (comme l'adresse de la carte réseau).la source
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 ontnodev
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.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: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é parsysfs
.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. Unls
oustat
du fichier rapporte 4096 octets.rsync
read_size == 4096
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
, ligne 2554096
octets. Zéro tampon.ENODATA
.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
Vérifiez si le fichier est susceptible d'être clairsemé. C'est-à-dire que le fichier a des trous, etc.
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.
Généralement
18446744073709551615
octets sur un système 32 bits.la source
Peut être lié, mais les appels d'attributs étendus échoueront sur sysfs:
En regardant ma strace, il semble que rsync essaie de récupérer des attributs étendus par défaut:
J'ai essayé de trouver un drapeau pour donner rsync pour voir si sauter les attributs étendus résout le problème mais n'a pas été en mesure de trouver quoi que ce soit (
--xattrs
les tourne sur à la destination).la source
Rsync lit normalement les informations du fichier, transfère le contenu du fichier ou les delta vers un fichier temporaire dans le répertoire de destination, puis après avoir vérifié les données du fichier, il le renomme en nom de fichier de destination.
Je crois que le problème avec sysfs est que tous les fichiers s'affichent en 4k (une page mémoire) mais qu'ils ne contiennent que quelques octets. Pour éviter de copier un fichier potentiellement corrompu vers la destination, rsync annule la copie lorsqu'il voit un décalage entre les métadonnées du fichier et ce qui a été réellement copié.
Au moins sur rsync v3.0.6, ce comportement peut être évité en utilisant le
--inplace
commutateur. Rsync détectera toujours les erreurs, mais comme les fichiers de destination auront déjà été écrasés au moment où il le fera, il laissera les fichiers potentiellement corrompus.Notez cependant qu'un effet secondaire est que les fichiers finissent par être remplis de zéro à 4k car c'est la taille que rsync pense que les fichiers sont. Cela ne devrait pas faire de différence dans la plupart des cas, car les octets nuls sont généralement ignorés.
la source