Aktualisieren
Nachdem wir mehr damit herumgespielt und den Code nach chattr
und nach durchgesehen haben e2fsprogs
, ist klar, dass die von chattr
und die von gesetzten Attribute libattr
(z. B. mit dem Befehl setfattr
) sehr unterschiedlich sind. chattr
Setzt ext
Dateisystem-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 system
Namespace zuordnen, wie im Folgenden angenommen, dies ist jedoch noch nicht vollständig implementiert. Auch das system.posix_acl_access
Attribut, das ich für die Zuordnung zu einem der folgenden Attribute gehalten habe, hat nichts mit den ext
Dateisystem-Flags zu tun, sondern eher mit Zugriffssteuerungslisten. Der zugehörigestrace
Meldungen werden für jede Datei angezeigt und verschwinden, wenn nur cp --preserve=xattr
verwendet wird.
Es scheint, dass die von festgelegten Attribute chattr
spezifisch für ext
Dateisysteme sind und dass die einzige Möglichkeit, sie zu beeinflussen, e2fsprogs
Tools sind. Tatsächlich wird auf der man
Seite nicht der Begriff "erweiterte Attribute" verwendet, sondern "Dateiattribute". 'Echte' erweiterte Attribute sind Name / Wert-Paare, die von libattr
mehreren Dateisystemen geändert und auf diesen implementiert werden können. Diese sind was cp
und rsync
suchen und übertragen auf kopierte Dateien, wenn die richtigen Optionen angegeben werden. Es scheint jedoch, dass es einen system
Namespace gibt, mit dem die chattr
Attribute 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 , chattr
funktioniert auf mehr als nur ext
Dateisysteme. Laut Wikipedia entspricht es dem chflags
Befehl 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, reiserfs
Datei-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 c
Flag gesetzt werden kann, wird ext4
es 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 chattr
das 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 rsync
scheint zu sein, dass es nicht einmal versucht wird. Aus dem -X
Abschnitt der rsync
Dokumentation:
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 chattr
und lsattr
verwendeten Attributbuchstaben den zugrunde liegenden benannten Attributen im Dateisystem zuzuordnen (zum einen gibt es keine Liste im Internet). Nach meinen Tests wird das A
Attribut dem system.posix_acl_access
Attribut zugeordnet, und da dies der system
Namespace ist, rsync
wird nicht einmal versucht, es zu kopieren.Die anderen beiden Namespaces, die im man
Snippet nicht erwähnt werden , sind trusted
und. security
Zum Festlegen dieser Namespaces sind Root-Berechtigungen erforderlich (und rsync
werden ohne diese nicht versucht).
Höchstwahrscheinlich fallen die Attribute, die Sie festgelegt haben, in den system
Namespace, der rsync
ignoriert 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 strace
auf 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 fgetxattr
Aufruf keine Daten zurück (wahrscheinlich, weil es keine gibt - das Vorhandensein des Attributs ist ausreichend), cp
findet 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, libattr
da der fsetattr
Aufruf 0
für den Erfolg zurückkehrt, ohne das Attribut tatsächlich zu setzen.
Ich bekomme dieses Verhalten ext4
unabhä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 , fsetattr
und so cp
leise zu scheitern.
Eigentlich user_xattr
ist erforderlich auf ext2
, ext3
, reiserfs
und möglicherweise einige andere. Es ist nicht notwendig fürext4
Beachten Sie auch , dass die attr
Werkzeuge setfattr
, getfattr
und attr
(letztere dokumentiert ist nur für sein XFS
nur, aber es scheint zu funktionieren genauso gut wie die anderen für ext4
) haben Probleme in etwas arbeiten , aber der user
Namespace. Ich bekomme, Operation not supported
wenn ich versuche, setfattr
ein Attribut in den system
Namespace (oder keinen Namespace gemäß diesem Fehler ) zu setzen. setfattr
erscheint in dem um erfolgreich zu sein trusted
und security
Namespaces, aber dann getfattr
nicht lesen , nicht alles zurück und auch etwas von dem lesen system
von Namespace - Set chattr
. Der Grund, der chattr
erfolgreich ist, ist, dass es einen ioctl
Anruf verwendet und nicht libattr
.
Was jedoch perfekt funktioniert, ist, erweiterte Attribute im user
Namespace zu setzen setfattr
und mit rsync
oder cp
zu kopieren (es gibt sogar keine Probleme, cp
wenn Sie beim Erstellen des Attributs keinen Wert angeben). Ich denke, das Fazit ist, dass system
derzeit Namespace-Werte verwendet werdenBuggy und / oderzumindest in Debian und wahrscheinlich auch in anderen Distributionen nicht unterstützt. Wahrscheinlich rsync
wissen die Entwickler das, weshalb sie sie ignorieren.