Beibehaltung erweiterter Attribute mit cp / rsync

12

Beim Kopieren mit cpbleiben die erweiterten Attribute auch bei expliziten Attributen nicht erhalten

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

oder

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

Das gleiche gilt mit rsync, dh

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

Auf dem Zieldateisystem kann ich das erweiterte Attribut jedoch manuell erstellen (mit chattr). Dies bedeutet, dass das Zieldateisystem xattr unterstützt.

Warum kann ich nicht xattrmit cpoder konservieren rsync?

Zusätzliche Information:

  • Sowohl Quell- als auch Zieldateisysteme sind ext4
  • Sowohl Quell- als auch Zieldateisysteme sind lokal (nicht nfs)
  • Ich benutze Debian Wheezy
Martin Vegter
quelle
Wie mounten Sie dieses Zieldateisystem? Ist es über NFS?
SLM
Das Zieldateisystem ist ein lokales Dateisystem
Martin Vegter
Können Sie die Ausgabe mountfür dieses Dateisystem anzeigen?
slm
1
Auf welcher Unix-Variante und Version? Welche Dateisystemtypen an beiden Enden, mit welchen Einhängeoptionen?
Gilles 'SO- hör auf böse zu sein'
1
@MartinVegter Können Sie ein Beispielattribut für Ihre Datei angeben? Ich habe gerade ein ext4-Dateisystem in zwei Dateien erstellt und einen Test mit durchgeführt setfattr -n system.name0 -v "value" test_file. Ich habe das test_fileto / from ext4 / jfs / xfs mit kopiert cp --preserve=allund hatte keine Probleme, die erweiterten Attribute beizubehalten .
UVV

Antworten:

14

Aktualisieren

Nachdem wir mehr damit herumgespielt und den Code nach chattrund nach durchgesehen haben e2fsprogs, ist klar, dass die von chattrund die von gesetzten Attribute libattr(z. B. mit dem Befehl setfattr) sehr unterschiedlich sind. chattrSetzt extDateisystem-Flags, die einfach keinem benannten Attribut oder Namespace zugeordnet werden. Keiner von ihnen zeigt bei jedem Anruf auf libattr‚s listxattr. Sie sollten wahrscheinlich benannten Attributen im systemNamespace zuordnen, wie im Folgenden angenommen, dies ist jedoch noch nicht vollständig implementiert. Auch das system.posix_acl_accessAttribut, das ich für die Zuordnung zu einem der folgenden Attribute gehalten habe, hat nichts mit den extDateisystem-Flags zu tun, sondern eher mit Zugriffssteuerungslisten. Der zugehörigestraceMeldungen werden für jede Datei angezeigt und verschwinden, wenn nur cp --preserve=xattrverwendet wird.

Es scheint, dass die von festgelegten Attribute chattrspezifisch für extDateisysteme sind und dass die einzige Möglichkeit, sie zu beeinflussen, e2fsprogsTools sind. Tatsächlich wird auf der manSeite nicht der Begriff "erweiterte Attribute" verwendet, sondern "Dateiattribute". 'Echte' erweiterte Attribute sind Name / Wert-Paare, die von libattrmehreren Dateisystemen geändert und auf diesen implementiert werden können. Diese sind was cpund rsyncsuchen und übertragen auf kopierte Dateien, wenn die richtigen Optionen angegeben werden. Es scheint jedoch, dass es einen systemNamespace gibt, mit dem die chattrAttribute Namen und letztendlich äquivalenten Attributen in anderen Dateisystemen zugeordnet werden können. Derzeit funktioniert dies jedoch nicht.

Ich habe die ursprüngliche Antwort unangetastet gelassen, da es dort einige gute Informationen gibt, obwohl sie in bestimmten Punkten ziemlich falsch sind.

Update 2

Ich sollte wieder haben kam , bevor jetzt diese zurück, aber nach dieser Antwort , chattrfunktioniert auf mehr als nur extDateisysteme. Laut Wikipedia entspricht es dem chflagsBefehl auf BSD-basierten Systemen.

Ich habe ein Skript geschrieben, um die Einstellung und das Lesen dieser Attribute auf einigen Dateisystemen zu testen und habe die folgenden Ergebnisse erhalten:

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

Beachten Sie, dass alle Versuche, reiserfsDatei-Flags zu lesen / zu setzen, den obigen Fehler verursachten, obwohl sie in Wikipedia als funktionsfähig aufgeführt wurden. Ich habe nicht getestet reiser4. Auch wenn das cFlag gesetzt werden kann, wird ext4es nicht gewürdigt. Möglicherweise gibt es auch Tuning- / Mount-Optionen, die sich auf diese Flags auswirken, aber ich konnte keine finden.

Momentan scheint es jedoch chattrdas einzige Dienstprogramm unter Linux zu sein, das diese Attribute ändern kann, und daher kann kein Kopierdienstprogramm sie beibehalten.

Ursprüngliche Antwort

Der Grund dafür rsyncscheint zu sein, dass es nicht einmal versucht wird. Aus dem -XAbschnitt der rsyncDokumentation:

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.

Es ist schwierig, die von chattrund lsattrverwendeten Attributbuchstaben den zugrunde liegenden benannten Attributen im Dateisystem zuzuordnen (zum einen gibt es keine Liste im Internet). Nach meinen Tests wird das AAttribut dem system.posix_acl_accessAttribut zugeordnet, und da dies der systemNamespace ist, rsyncwird nicht einmal versucht, es zu kopieren.Die anderen beiden Namespaces, die im manSnippet nicht erwähnt werden , sind trustedund. securityZum Festlegen dieser Namespaces sind Root-Berechtigungen erforderlich (und rsyncwerden ohne diese nicht versucht).

Höchstwahrscheinlich fallen die Attribute, die Sie festgelegt haben, in den systemNamespace, der rsyncignoriert wird (und wahrscheinlich mit Bedacht). Entweder das, oder Sie müssen root sein, um diejenigen zu erhalten, die es nicht sind.

Was das betrifft cp, scheint es Bugs zu geben.Laufen straceauf cp -a, ich die folgenden zwei interessante Linien erhalten:

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

und

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

Erstens gibt der fgetxattrAufruf keine Daten zurück (wahrscheinlich, weil es keine gibt - das Vorhandensein des Attributs ist ausreichend), cpfindet jedoch irgendwie 28 Byte (Junk?) Daten, die als Attributwert in der Zieldatei festgelegt werden sollen. Dies scheint ein Fehler in zu sein cp, aber was die Probleme verursacht, scheint ein Fehler in zu sein, libattrda der fsetattrAufruf 0für den Erfolg zurückkehrt, ohne das Attribut tatsächlich zu setzen.

Ich bekomme dieses Verhalten ext4unabhängig davon, ob ich mit mount user_xattr. Ich kann dazu keine andere Dokumentation finden, als zu sagen, dass 'einige Systeme' diese Mount-Option benötigen, damit erweiterte Attribute funktionieren. Anscheinend meins (Debian Jessie) nicht. Auch gibt es eine Montage Problem ist ich verpasst haben, ist es falsch , fsetattrund so cpleise zu scheitern.

Eigentlich user_xattrist erforderlich auf ext2, ext3, reiserfsund möglicherweise einige andere. Es ist nicht notwendig fürext4

Beachten Sie auch , dass die attrWerkzeuge setfattr, getfattrund attr(letztere dokumentiert ist nur für sein XFSnur, aber es scheint zu funktionieren genauso gut wie die anderen für ext4) haben Probleme in etwas arbeiten , aber der userNamespace. Ich bekomme, Operation not supportedwenn ich versuche, setfattrein Attribut in den systemNamespace (oder keinen Namespace gemäß diesem Fehler ) zu setzen. setfattrerscheint in dem um erfolgreich zu sein trustedund securityNamespaces, aber dann getfattrnicht lesen , nicht alles zurück und auch etwas von dem lesen systemvon Namespace - Set chattr. Der Grund, der chattrerfolgreich ist, ist, dass es einen ioctlAnruf verwendet und nicht libattr.

Was jedoch perfekt funktioniert, ist, erweiterte Attribute im userNamespace zu setzen setfattrund mit rsyncoder cpzu kopieren (es gibt sogar keine Probleme, cpwenn Sie beim Erstellen des Attributs keinen Wert angeben). Ich denke, das Fazit ist, dass systemderzeit Namespace-Werte verwendet werdenBuggy und / oderzumindest in Debian und wahrscheinlich auch in anderen Distributionen nicht unterstützt. Wahrscheinlich rsyncwissen die Entwickler das, weshalb sie sie ignorieren.

Graeme
quelle