Beim Kopieren mit cp
bleiben 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 xattr
mit cp
oder 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
filesystems
rsync
cp
xattr
Martin Vegter
quelle
quelle
mount
für dieses Dateisystem anzeigen?setfattr -n system.name0 -v "value" test_file
. Ich habe dastest_file
to / from ext4 / jfs / xfs mit kopiertcp --preserve=all
und hatte keine Probleme, die erweiterten Attribute beizubehalten .Antworten:
Aktualisieren
Nachdem wir mehr damit herumgespielt und den Code nach
chattr
und nach durchgesehen habene2fsprogs
, ist klar, dass die vonchattr
und die von gesetzten Attributelibattr
(z. B. mit dem Befehlsetfattr
) sehr unterschiedlich sind.chattr
Setztext
Dateisystem-Flags, die einfach keinem benannten Attribut oder Namespace zugeordnet werden. Keiner von ihnen zeigt bei jedem Anruf auflibattr
‚slistxattr
. Sie sollten wahrscheinlich benannten Attributen imsystem
Namespace zuordnen, wie im Folgenden angenommen, dies ist jedoch noch nicht vollständig implementiert. Auch dassystem.posix_acl_access
Attribut, das ich für die Zuordnung zu einem der folgenden Attribute gehalten habe, hat nichts mit denext
Dateisystem-Flags zu tun, sondern eher mit Zugriffssteuerungslisten. Der zugehörigestrace
Meldungen werden für jede Datei angezeigt und verschwinden, wenn nurcp --preserve=xattr
verwendet wird.Es scheint, dass die von festgelegten Attribute
chattr
spezifisch fürext
Dateisysteme sind und dass die einzige Möglichkeit, sie zu beeinflussen,e2fsprogs
Tools sind. Tatsächlich wird auf derman
Seite nicht der Begriff "erweiterte Attribute" verwendet, sondern "Dateiattribute". 'Echte' erweiterte Attribute sind Name / Wert-Paare, die vonlibattr
mehreren Dateisystemen geändert und auf diesen implementiert werden können. Diese sind wascp
undrsync
suchen und übertragen auf kopierte Dateien, wenn die richtigen Optionen angegeben werden. Es scheint jedoch, dass es einensystem
Namespace gibt, mit dem diechattr
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 nurext
Dateisysteme. Laut Wikipedia entspricht es demchflags
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:
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 getestetreiser4
. Auch wenn dasc
Flag gesetzt werden kann, wirdext4
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 derrsync
Dokumentation:Es ist schwierig, die vonDie anderen beiden Namespaces, die imchattr
undlsattr
verwendeten Attributbuchstaben den zugrunde liegenden benannten Attributen im Dateisystem zuzuordnen (zum einen gibt es keine Liste im Internet). Nach meinen Tests wird dasA
Attribut demsystem.posix_acl_access
Attribut zugeordnet, und da dies dersystem
Namespace ist,rsync
wird nicht einmal versucht, es zu kopieren.man
Snippet nicht erwähnt werden , sindtrusted
und.security
Zum Festlegen dieser Namespaces sind Root-Berechtigungen erforderlich (undrsync
werden ohne diese nicht versucht).Höchstwahrscheinlich fallen die Attribute, die Sie festgelegt haben, in den
system
Namespace, derrsync
ignoriert wird (und wahrscheinlich mit Bedacht). Entweder das, oder Sie müssen root sein, um diejenigen zu erhalten, die es nicht sind.Was das betrifftLaufencp
, scheint es Bugs zu geben.strace
aufcp -a
, ich die folgenden zwei interessante Linien erhalten:und
Erstens gibt derfgetxattr
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 seincp
, aber was die Probleme verursacht, scheint ein Fehler in zu sein,libattr
da derfsetattr
Aufruf0
für den Erfolg zurückkehrt, ohne das Attribut tatsächlich zu setzen.Ich bekomme dieses Verhalten
ext4
unabhängig davon, ob ich mit mountuser_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 socp
leise zu scheitern.Eigentlich
user_xattr
ist erforderlich aufext2
,ext3
,reiserfs
und möglicherweise einige andere. Es ist nicht notwendig fürext4
Beachten Sie auch , dass die
attr
Werkzeugesetfattr
,getfattr
undattr
(letztere dokumentiert ist nur für seinXFS
nur, aber es scheint zu funktionieren genauso gut wie die anderen fürext4
) haben Probleme in etwas arbeiten , aber deruser
Namespace. Ich bekomme,Operation not supported
wenn ich versuche,setfattr
ein Attribut in densystem
Namespace (oder keinen Namespace gemäß diesem Fehler ) zu setzen.setfattr
erscheint in dem um erfolgreich zu seintrusted
undsecurity
Namespaces, aber danngetfattr
nicht lesen , nicht alles zurück und auch etwas von dem lesensystem
von Namespace - Setchattr
. Der Grund, derchattr
erfolgreich ist, ist, dass es einenioctl
Anruf verwendet und nichtlibattr
.Was jedoch perfekt funktioniert, ist, erweiterte Attribute im
user
Namespace zu setzensetfattr
und mitrsync
odercp
zu kopieren (es gibt sogar keine Probleme,cp
wenn Sie beim Erstellen des Attributs keinen Wert angeben). Ich denke, das Fazit ist, dasssystem
derzeit Namespace-Werte verwendet werdenBuggy und / oderzumindest in Debian und wahrscheinlich auch in anderen Distributionen nicht unterstützt. Wahrscheinlichrsync
wissen die Entwickler das, weshalb sie sie ignorieren.quelle