Aggiornare
Dopo aver fatto un po 'di confusione con questo ancora e guardando il codice per chattr
e altro e2fsprogs
, è chiaro che gli attributi impostati da chattr
e quelli impostati da libattr
(ad esempio con il comando setfattr
) sono molto diversi. chattr
imposta ext
flag di filesystem che semplicemente non si associano a un attributo o spazio dei nomi con nome. Nessuno di loro presentarsi con qualsiasi chiamata a libattr
's listxattr
. Probabilmente dovrebbero essere associati ad attributi nominati nello system
spazio dei nomi come ipotizzato di seguito, ma al momento questo è completamente non implementato. Anche l' system.posix_acl_access
attributo che ho scambiato per il mapping a uno di questi attributi di seguito, non ha nulla a che fare con i ext
flag del filesystem ed è piuttosto a che fare con le liste di controllo degli accessi. Associatostrace
i messaggi vengono visualizzati per qualsiasi file e scompaiono quando cp --preserve=xattr
viene utilizzato solo .
Sembra che gli attributi impostati chattr
siano specifici per i ext
filesystem e che l'unico modo per influenzarli sia attraverso gli e2fsprogs
strumenti. In effetti la man
pagina non utilizza effettivamente il termine "attributi estesi" per loro, ma piuttosto "attributi di file". Gli attributi estesi "reali" sono coppie nome / valore che possono essere modificate libattr
e implementate su più filesystem. Si tratta di ciò cp
e rsync
cercare e trasferire verso i file copiati quando sono date le giuste opzioni. Sembra tuttavia che system
esista uno spazio dei nomi per mappare gli chattr
attributi sui nomi e, in definitiva, su attributi equivalenti su altri filesystem, ma per ora non funziona.
Ho lasciato intatta la risposta originale in quanto ci sono alcune buone informazioni lì, anche se in alcuni punti va abbastanza male.
Aggiornamento 2
Avrei dovuto tornare di nuovo a questo prima d'ora, ma secondo questa risposta , chattr
funziona più di un semplice ext
filesystem. Secondo Wikipedia , è equivalente al chflags
comando sui sistemi basati su BSD.
Ho scritto uno script per testare l'impostazione e la lettura di questi attributi su alcuni filesystem e ho ottenuto i seguenti risultati:
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
Si noti che tutti i tentativi di leggere / impostare reiserfs
flag di file hanno dato l'errore sopra riportato, nonostante sia elencato su Wikipedia come dotato di alcune funzionalità. Non ho provato reiser4
. Anche mentre la c
bandiera può essere posizionata, ext4
non viene onorata. Potrebbero esserci anche opzioni di ottimizzazione / montaggio che influenzano questi flag, ma non sono riuscito a trovarne.
Sembra tuttavia che attualmente chattr
sia l'unica utility su Linux in grado di modificare questi attributi e quindi nessuna utility di copia è in grado di preservarli.
Risposta originale
Il motivo rsync
sembra essere che non è nemmeno provare. Dalla -X
sezione della rsync
documentazione:
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.
È difficile mappare le lettere degli attributi utilizzate da chattr
e lsattr
agli attributi nominali sottostanti utilizzati nel filesystem (per uno non esiste un elenco su Internet). Dai miei test, l' A
attributo è mappato system.posix_acl_access
all'attributo e poiché questo è lo system
spazio dei nomi, rsync
non proverà nemmeno a copiarlo.Gli altri due spazi dei nomi non menzionati nello man
snippet sono trusted
e security
, sono necessari i privilegi di root per impostarli (e rsync
non ci proveranno senza).
Molto probabilmente gli attributi che hai cercato di impostare rientrano nello system
spazio dei nomi che rsync
ignora (e probabilmente saggiamente). O quello o devi essere root per ottenere quelli che non lo sono.
Per quanto riguarda cp
, sembra che ci siano bug in gioco.Correre strace
su cp -a
, ottengo le seguenti due righe interessanti:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
e
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
Innanzitutto la fgetxattr
chiamata non restituisce alcun dato (probabilmente perché non ce n'è - l'esistenza dell'attributo è sufficiente), ma in qualche modo cp
trova 28 byte di dati (spazzatura?) Da impostare come valore dell'attributo nel file di destinazione. Sembra un bug in cp
, ma piuttosto ciò che sta causando i problemi sembra essere un bug in libattr
quanto la fsetattr
chiamata ritorna 0
per successo senza effettivamente impostare l'attributo.
Ottengo questo comportamento ext4
indipendentemente dal fatto che io monti con user_xattr
. Non riesco a trovare alcuna documentazione su questo se non per dire che "alcuni sistemi" necessitano di questa opzione di montaggio per il funzionamento degli attributi estesi. Apparentemente mio (Debian Jessie) no. Anche se c'è un problema di montaggio che mi è sfuggito, è sbagliato fsetattr
e quindi cp
fallire silenziosamente.
In realtà user_xattr
è necessario su ext2
, ext3
, reiserfs
e forse alcuni altri. Non è necessario perext4
Si noti inoltre che gli attr
strumenti setfattr
, getfattr
e attr
(quest'ultimo è documentato per essere solo per XFS
solo, ma sembra funzionare altrettanto bene come gli altri per ext4
) hanno problemi a lavorare nel nulla, ma il user
namespace. Ottengo Operation not supported
se provo a utilizzare setfattr
per inserire un attributo nello system
spazio dei nomi (o nessuno spazio dei nomi come per questo bug ). setfattr
sembra riuscire negli spazi dei nomi trusted
e security
, ma poi getfattr
non riesce a leggere nulla indietro e non riesce a leggere nulla dallo system
spazio dei nomi impostato da chattr
. La ragione per cui ha chattr
successo è che utilizza una ioctl
chiamata e non libattr
.
Ciò che funziona perfettamente, tuttavia, è l'impostazione degli attributi estesi nello user
spazio dei nomi setfattr
e l'utilizzo rsync
o la cp
copia con essi intatti (non ci sono problemi anche cp
se non si specifica un valore durante la creazione dell'attributo). Penso che la linea di fondo sia che l'utilizzo system
dei valori dello spazio dei nomi è attualmentebuggy e / onon supportato, almeno in Debian e probabilmente anche in altre distro. Probabilmente gli rsync
sviluppatori lo sanno, motivo per cui li ignorano.