préservation des attributs étendus avec cp / rsync

12

Lors de la copie avec cp, les attributs étendus ne sont pas conservés, même avec

cp -a --preserve=all /source /dest

ou

cp -a --preserve=xattr /source /dest

La même chose est avec rsync, c'est à dire

rsync -aq -A -X --delete /source /dest

Cependant, sur le système de fichiers de destination, je peux créer manuellement un attribut étendu (avec chattr). Cela signifie que le système de fichiers cible prend en charge xattr.

Pourquoi suis-je incapable de conserver xattravec cpou rsync?

Information additionnelle:

  • Les systèmes de fichiers source et cible sont ext4
  • Les systèmes de fichiers source et cible sont locaux (pas nfs)
  • J'utilise Debian Wheezy
Martin Vegter
la source
Comment montez-vous ce système de fichiers de destination? Est-ce sur NFS?
slm
le système de fichiers de destination est un système de fichiers local
Martin Vegter
Pouvez-vous afficher la sortie de mountce système de fichiers?
slm
1
Sur quelle variante et version Unix? Quels types de système de fichiers aux deux extrémités, avec quelles options de montage?
Gilles 'SO- arrête d'être méchant'
1
@MartinVegter Pourriez-vous donner un exemple d'attribut à votre fichier? Je viens de créer un système de fichiers ext4 dans deux fichiers et j'ai fait un test avec setfattr -n system.name0 -v "value" test_file. J'ai copié le test_filevers / depuis ext4 / jfs / xfs avec cp --preserve=allet je n'ai eu aucun problème pour préserver les attributs étendus.
UVV

Réponses:

14

Mise à jour

Après avoir joué un peu plus avec cela et en regardant le code de chattret d'autres e2fsprogs, il est clair que les attributs définis par chattret ceux définis par libattr( par exemple avec la commande setfattr) sont très différents. chattrdéfinit des extindicateurs de système de fichiers qui ne correspondent tout simplement pas à un attribut nommé ou à un espace de noms. Aucun d'entre eux se présentent avec un appel à libattrl » listxattr. Ils devraient probablement être mappés aux attributs nommés dans l' systemespace de noms comme supposé ci-dessous, mais pour l'instant cela n'est pas du tout implémenté. De plus, l' system.posix_acl_accessattribut que j'ai confondu avec le mappage vers l'un de ces attributs ci-dessous, n'a rien à voir avec les extdrapeaux du système de fichiers et concerne plutôt les listes de contrôle d'accès. L'associéstraceles messages apparaissent pour n'importe quel fichier et disparaissent lorsque seul cp --preserve=xattrest utilisé.

Il semble que les attributs définis par chattrsont spécifiques aux extsystèmes de fichiers et que la seule façon de les affecter est d'utiliser des e2fsprogsoutils. En fait, la manpage n'utilise pas réellement le terme «attributs étendus» pour eux, mais plutôt «attributs de fichier». Les attributs étendus «réels» sont des paires nom / valeur qui peuvent être modifiées par libattret sont implémentées sur plusieurs systèmes de fichiers. Ce sont ce que cpet rsyncregarder et transférer vers les fichiers copiés lorsque les options sont données. Il semble cependant que l' systemespace de noms existe pour mapper les chattrattributs aux noms et finalement aux attributs équivalents sur d'autres systèmes de fichiers, mais pour l'instant cela ne fonctionne pas.

J'ai laissé la réponse originale intacte car il y a de bonnes informations là-bas, même si elles vont assez loin à certains points.

Update 2

J'aurais dû y revenir encore une fois avant maintenant, mais selon cette réponse , chattrfonctionne sur plus que des extsystèmes de fichiers. Selon Wikipedia , elle équivaut à la chflagscommande sur les systèmes basés sur BSD.

J'ai écrit un script pour tester le réglage et la lecture de ces attributs sur quelques systèmes de fichiers et j'ai obtenu les résultats suivants:

ext4:
suS-iadAcj-t-e-- mnt/test_file
suSDiadAcj-tTe-- mnt/test_dir

reiserfs:
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_file
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_dir

xfs:
--S-iadA-------- mnt/test_file
--S-iadA-------- mnt/test_dir

btrfs:
--S-iadAc------C mnt/test_file
--SDiadAc------C mnt/test_dir

Notez que toutes les tentatives de lecture / définition d' reiserfsindicateurs de fichier ont donné l'erreur ci-dessus, même si elle est répertoriée sur Wikipedia comme ayant certaines fonctionnalités. Je n'ai pas testé reiser4. Même si le cdrapeau peut être activé, ext4il n'est pas honoré. Il peut également y avoir des options de réglage / montage qui affectent ces indicateurs, mais je n'en ai pas trouvé.

Il semble cependant qu'actuellement, chattrc'est le seul utilitaire sous Linux capable de modifier ces attributs et donc aucun utilitaire de copie n'est capable de les conserver.

Réponse originale

La raison rsyncsemble être que ce n'est même pas essayer. Dans la -Xsection de la rsyncdocumentation:

For systems that support extended-attribute namespaces, a copy being done by a
super-user copies all namespaces except system.*.  A normal user only  copies
the user.* namespace.

Il est difficile de mapper les lettres d'attribut utilisées par chattret lsattravec les attributs nommés sous-jacents utilisés dans le système de fichiers (pour l'un, il n'y a pas de liste sur Internet). D'après mes tests, l' Aattribut est mappé à l' system.posix_acl_accessattribut et comme il s'agit de l' systemespace de noms, rsyncje n'essaierai même pas de le copier.Les deux autres espaces de noms non mentionnés dans l' manextrait de code sont trustedet security, les privilèges root sont nécessaires pour les définir (et rsyncn'essaieront pas sans).

Très probablement, les attributs que vous avez essayé de définir tombent dans l' systemespace de noms qui rsyncignore (et probablement à bon escient). Soit cela, soit vous devez être root pour obtenir ceux qui ne le sont pas.

Quant à cp, il semble y avoir des bogues en jeu.En cours straced' exécution cp -a, j'obtiens les deux lignes intéressantes suivantes:

fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)

et

fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0

Tout d'abord, l' fgetxattrappel ne renvoie aucune donnée (probablement parce qu'il n'y en a pas - l'existence de l'attribut suffit), mais cptrouve en quelque sorte 28 octets de données (indésirables?) À définir comme valeur d'attribut dans le fichier de destination. Cela semble être un bogue cp, mais la cause du problème semble être un bogue, libattrcar l' fsetattrappel revient 0pour réussir sans réellement définir l'attribut.

J'obtiens ce comportement ext4indépendamment du fait que je monte avec user_xattr. Je ne trouve aucune documentation à ce sujet autre que de dire que «certains systèmes» ont besoin de cette option de montage pour que les attributs étendus fonctionnent. Apparemment, le mien (Debian Jessie) ne le fait pas. Même s'il y a un problème de montage que j'ai manqué, il est incorrect fsetattret donc cpà échouer en silence.

En fait , user_xattrest nécessaire sur ext2, ext3, reiserfset peut - être quelques autres. Il n'est pas nécessaireext4

Notez également que les attroutils setfattr, getfattret attr(celui - ci est documenté pour être seulement pour XFSque, mais semble fonctionner aussi bien que les autres pour ext4) ont des problèmes de travail dans quoi que ce soit , mais l' userespace de noms. J'obtiens Operation not supportedsi j'essaye d'utiliser setfattrpour mettre un attribut dans l' systemespace de noms (ou aucun espace de noms selon ce bogue ). setfattrsemble réussir dans les espaces de noms trustedet security, mais getfattréchoue ensuite à lire quoi que ce soit et ne parvient pas non plus à lire quoi que ce soit à partir de l' systemespace de noms défini par chattr. La raison qui chattrréussit est qu'il utilise un ioctlappel et non libattr.

Cependant, ce qui fonctionne parfaitement, c'est de définir des attributs étendus dans l' userespace de noms avec setfattret d'utiliser rsyncou cpde copier avec eux intacts (il n'y a même aucun problème avec cpsi vous ne spécifiez pas de valeur lors de la création de l'attribut). Je pense que l'essentiel est que l'utilisation de systemvaleurs d'espace de noms est actuellementbuggy et / ounon pris en charge, au moins dans Debian et probablement d'autres distributions aussi. Les rsyncdéveloppeurs le savent probablement , c'est pourquoi ils les ignorent.

Graeme
la source