Aktualizacja
Po tym, jak trochę się z tym pogubić i przyjrzeć kodowi chattr
i innym e2fsprogs
, jasne jest, że atrybuty ustawione przez chattr
i ustawione przez libattr
(np. Za pomocą polecenia setfattr
) są bardzo różne. chattr
ustawia ext
flagi systemu plików, które po prostu nie są mapowane na nazwany atrybut lub przestrzeń nazw. Żaden z nich nie pojawiają się z każdym wywołaniu libattr
„s listxattr
. Prawdopodobnie powinny być odwzorowane na nazwane atrybuty w system
przestrzeni nazw, jak założono poniżej, ale na razie nie jest to jeszcze zaimplementowane. Również system.posix_acl_access
atrybut, który pomyliłem przy mapowaniu do jednego z tych atrybutów poniżej, nie ma nic wspólnego z ext
flagami systemu plików, a raczej z listami kontroli dostępu. Powiązanestrace
komunikaty pojawiają się dla każdego pliku i znikają, gdy tylko cp --preserve=xattr
jest używany.
Wygląda na to, że ustawione atrybuty chattr
są specyficzne dla ext
systemów plików i że jedynym sposobem na ich wpływ są e2fsprogs
narzędzia. W rzeczywistości man
strona nie używa dla nich terminu „atrybuty rozszerzone”, a raczej „atrybuty pliku”. „Prawdziwe” rozszerzone atrybuty to pary nazwa / wartość, które mogą być zmieniane przez libattr
wiele systemów plików i są zaimplementowane. Są co cp
i rsync
wygląd i przeniesione do skopiowanych plików, gdy są podane odpowiednie opcje. Wydaje się jednak, że system
istnieje przestrzeń nazw do mapowania chattr
atrybutów na nazwy i ostatecznie na równoważne atrybuty w innych systemach plików, ale na razie to nie działa.
Oryginalną odpowiedź pozostawiłem nietkniętą, ponieważ jest tam kilka dobrych informacji, choć w niektórych punktach jest ona całkowicie błędna.
Aktualizacja 2
Powinienem wrócił do tego jeszcze przed teraz, ale jak za tą odpowiedź , chattr
pracuje na więcej niż tylko ext
systemów plików. Według Wikipedii jest to odpowiednik chflags
polecenia w systemach opartych na BSD.
Napisałem skrypt, aby przetestować ustawienie i odczyt tych atrybutów na kilku systemach plików i uzyskałem następujące wyniki:
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
Zauważ, że wszystkie próby odczytu / ustawienia reiserfs
flag plików dały powyższy błąd, mimo że jest wymieniony na Wikipedii jako mający pewną funkcjonalność. Nie testowałem reiser4
. Również, gdy c
flaga może być ustawiona, ext4
nie jest honorowane. Mogą istnieć również opcje strojenia / montowania, które wpływają na te flagi, ale nie mogłem ich znaleźć.
Wydaje się jednak, że obecnie chattr
jest to jedyne narzędzie w systemie Linux, które może modyfikować te atrybuty, więc żadne narzędzie kopiujące nie jest w stanie ich zachować.
Oryginalna odpowiedź
rsync
Wydaje się, że powodem tego jest to, że nawet nie próbuje. Z -X
sekcji rsync
dokumentacji:
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.
Trudno jest odwzorować litery atrybutów używane przez chattr
i lsattr
na bazowe nazwane atrybuty używane w systemie plików (dla jednego nie ma listy w Internecie). Jednak z moich testów A
atrybut odwzorowuje system.posix_acl_access
atrybut, a ponieważ jest to system
przestrzeń nazw, rsync
nawet nie spróbuję go skopiować.Pozostałe dwie przestrzenie nazw niewymienione we man
fragmencie to trusted
i security
, aby je ustawić, wymagane są uprawnienia roota ( rsync
bez nich nie można próbować).
Najprawdopodobniej atrybuty, które próbujesz ustawić, mieszczą się w system
przestrzeni nazw, która rsync
ignoruje (i prawdopodobnie mądrze). Albo to, albo musisz być rootem, aby uzyskać te, które nie są.
Jeśli chodzi o cp
, wydaje się, że w grze występują błędy.Uruchomiony strace
na cp -a
, mam następujące dwie ciekawe linie:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
i
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
Po pierwsze, fgetxattr
wywołanie nie zwraca żadnych danych (prawdopodobnie dlatego, że ich nie ma - wystarczy istnienie atrybutu), ale w jakiś sposób cp
znajduje 28 bajtów (śmieci?) Danych, aby ustawić je jako wartość atrybutu w pliku docelowym. To wydaje się być błędem cp
, ale raczej przyczyną problemu wydaje się być błąd, libattr
ponieważ fsetattr
wywołanie powraca 0
do sukcesu bez ustawiania atrybutu.
Zachowuję to ext4
niezależnie od tego, czy montuję user_xattr
. Nie mogę znaleźć na to żadnej dokumentacji poza stwierdzeniem, że „niektóre systemy” potrzebują tej opcji montowania, aby rozszerzone atrybuty działały. Niby mój (Debian Jessie) nie. Nawet problem z montażem, który przeoczyłem, jest niewłaściwy fsetattr
i dlatego cp
cicho zawodzi.
Faktycznie user_xattr
jest potrzebne na ext2
, ext3
, reiserfs
i być może kilku innych. Nie jest to konieczneext4
Należy również zauważyć, że attr
narzędzia setfattr
, getfattr
i attr
(ten ostatni jest udokumentowana być tylko dla XFS
tylko, ale wydaje się działać tak samo dobrze jak inni o ext4
) mają problemy w pracy niczego, ale user
nazw. Dostaję się, Operation not supported
jeśli spróbuję użyć setfattr
atrybutu w system
przestrzeni nazw (lub żadnej przestrzeni nazw w przypadku tego błędu ). setfattr
wydaje się odnosić sukcesy w przestrzeniach nazw trusted
i security
, ale potem getfattr
nie może odczytać niczego, a także nie może odczytać niczego z system
przestrzeni nazw ustawionej przez chattr
. Powodem chattr
jest to, że używa ioctl
połączenia, a nie libattr
.
To, co działa idealnie, to ustawienie rozszerzonych atrybutów w user
przestrzeni nazw za setfattr
pomocą i używanie rsync
lub cp
kopiowanie z nimi nienaruszonymi (nie ma nawet problemów z cp
tym, że nie podasz wartości podczas tworzenia atrybutu). Myślę, że sedno jest takie, że obecnie używa się system
wartości przestrzeni nazwbuggy i / lubnieobsługiwane, przynajmniej w Debianie i prawdopodobnie także w innych dystrybucjach. Prawdopodobnie rsync
programiści to wiedzą i dlatego je ignorują.