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 xattr
avec cp
ou 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
filesystems
rsync
cp
xattr
Martin Vegter
la source
la source
mount
ce système de fichiers?setfattr -n system.name0 -v "value" test_file
. J'ai copié letest_file
vers / depuis ext4 / jfs / xfs aveccp --preserve=all
et je n'ai eu aucun problème pour préserver les attributs étendus.Réponses:
Mise à jour
Après avoir joué un peu plus avec cela et en regardant le code de
chattr
et d'autrese2fsprogs
, il est clair que les attributs définis parchattr
et ceux définis parlibattr
( par exemple avec la commandesetfattr
) sont très différents.chattr
définit desext
indicateurs 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 àlibattr
l »listxattr
. Ils devraient probablement être mappés aux attributs nommés dans l'system
espace de noms comme supposé ci-dessous, mais pour l'instant cela n'est pas du tout implémenté. De plus, l'system.posix_acl_access
attribut que j'ai confondu avec le mappage vers l'un de ces attributs ci-dessous, n'a rien à voir avec lesext
drapeaux du système de fichiers et concerne plutôt les listes de contrôle d'accès. L'associéstrace
les messages apparaissent pour n'importe quel fichier et disparaissent lorsque seulcp --preserve=xattr
est utilisé.Il semble que les attributs définis par
chattr
sont spécifiques auxext
systèmes de fichiers et que la seule façon de les affecter est d'utiliser dese2fsprogs
outils. En fait, laman
page 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 parlibattr
et sont implémentées sur plusieurs systèmes de fichiers. Ce sont ce quecp
etrsync
regarder et transférer vers les fichiers copiés lorsque les options sont données. Il semble cependant que l'system
espace de noms existe pour mapper leschattr
attributs 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 ,
chattr
fonctionne sur plus que desext
systèmes de fichiers. Selon Wikipedia , elle équivaut à lachflags
commande 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:
Notez que toutes les tentatives de lecture / définition d'
reiserfs
indicateurs 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 lec
drapeau peut être activé,ext4
il 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,
chattr
c'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
rsync
semble être que ce n'est même pas essayer. Dans la-X
section de larsync
documentation:Il est difficile de mapper les lettres d'attribut utilisées parLes deux autres espaces de noms non mentionnés dans l'chattr
etlsattr
avec 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'A
attribut est mappé à l'system.posix_acl_access
attribut et comme il s'agit de l'system
espace de noms,rsync
je n'essaierai même pas de le copier.man
extrait de code sonttrusted
etsecurity
, les privilèges root sont nécessaires pour les définir (etrsync
n'essaieront pas sans).Très probablement, les attributs que vous avez essayé de définir tombent dans l'
system
espace de noms quirsync
ignore (et probablement à bon escient). Soit cela, soit vous devez être root pour obtenir ceux qui ne le sont pas.Quant àEn courscp
, il semble y avoir des bogues en jeu.strace
d' exécutioncp -a
, j'obtiens les deux lignes intéressantes suivantes:et
Tout d'abord, l'fgetxattr
appel ne renvoie aucune donnée (probablement parce qu'il n'y en a pas - l'existence de l'attribut suffit), maiscp
trouve 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 boguecp
, mais la cause du problème semble être un bogue,libattr
car l'fsetattr
appel revient0
pour réussir sans réellement définir l'attribut.J'obtiens ce comportement
ext4
indépendamment du fait que je monte avecuser_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 incorrectfsetattr
et donccp
à échouer en silence.En fait ,
user_xattr
est nécessaire surext2
,ext3
,reiserfs
et peut - être quelques autres. Il n'est pas nécessaireext4
Notez également que les
attr
outilssetfattr
,getfattr
etattr
(celui - ci est documenté pour être seulement pourXFS
que, mais semble fonctionner aussi bien que les autres pourext4
) ont des problèmes de travail dans quoi que ce soit , mais l'user
espace de noms. J'obtiensOperation not supported
si j'essaye d'utilisersetfattr
pour mettre un attribut dans l'system
espace de noms (ou aucun espace de noms selon ce bogue ).setfattr
semble réussir dans les espaces de nomstrusted
etsecurity
, maisgetfattr
échoue ensuite à lire quoi que ce soit et ne parvient pas non plus à lire quoi que ce soit à partir de l'system
espace de noms défini parchattr
. La raison quichattr
réussit est qu'il utilise unioctl
appel et nonlibattr
.Cependant, ce qui fonctionne parfaitement, c'est de définir des attributs étendus dans l'
user
espace de noms avecsetfattr
et d'utiliserrsync
oucp
de copier avec eux intacts (il n'y a même aucun problème aveccp
si vous ne spécifiez pas de valeur lors de la création de l'attribut). Je pense que l'essentiel est que l'utilisation desystem
valeurs d'espace de noms est actuellementbuggy et / ounon pris en charge, au moins dans Debian et probablement d'autres distributions aussi. Lesrsync
développeurs le savent probablement , c'est pourquoi ils les ignorent.la source