Podczas kopiowania z cp
rozszerzonymi atrybutami nie są zachowywane, nawet z jawnym
cp -a --preserve=all /source /dest
lub
cp -a --preserve=xattr /source /dest
To samo dotyczy rsync
, tj
rsync -aq -A -X --delete /source /dest
Jednak w docelowym systemie plików mogę ręcznie utworzyć rozszerzony atrybut (za pomocą chattr
). Oznacza to, że docelowy system plików obsługuje xattr.
Dlaczego nie mogę zachować xattr
przy pomocy cp
lub rsync
?
Dodatkowe informacje:
- Zarówno źródłowy, jak i docelowy system plików to ext4
- Zarówno źródłowy, jak i docelowy system plików są lokalne (nie NFS)
- Używam Debian Wheezy
filesystems
rsync
cp
xattr
Martin Vegter
źródło
źródło
mount
tego systemu plików?setfattr -n system.name0 -v "value" test_file
. Skopiowałemtest_file
do / z ext4 / jfs / xfscp --preserve=all
i nie miałem żadnych problemów z zachowaniem rozszerzonych atrybutów.Odpowiedzi:
Aktualizacja
Po tym, jak trochę się z tym pogubić i przyjrzeć kodowi
chattr
i innyme2fsprogs
, jasne jest, że atrybuty ustawione przezchattr
i ustawione przezlibattr
(np. Za pomocą poleceniasetfattr
) są bardzo różne.chattr
ustawiaext
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łaniulibattr
„slistxattr
. Prawdopodobnie powinny być odwzorowane na nazwane atrybuty wsystem
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 zext
flagami systemu plików, a raczej z listami kontroli dostępu. Powiązanestrace
komunikaty pojawiają się dla każdego pliku i znikają, gdy tylkocp --preserve=xattr
jest używany.Wygląda na to, że ustawione atrybuty
chattr
są specyficzne dlaext
systemów plików i że jedynym sposobem na ich wpływ sąe2fsprogs
narzędzia. W rzeczywistościman
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 przezlibattr
wiele systemów plików i są zaimplementowane. Są cocp
irsync
wygląd i przeniesione do skopiowanych plików, gdy są podane odpowiednie opcje. Wydaje się jednak, żesystem
istnieje przestrzeń nazw do mapowaniachattr
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ż tylkoext
systemów plików. Według Wikipedii jest to odpowiednikchflags
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:
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łemreiser4
. Również, gdyc
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
sekcjirsync
dokumentacji:Trudno jest odwzorować litery atrybutów używane przezPozostałe dwie przestrzenie nazw niewymienione wechattr
ilsattr
na bazowe nazwane atrybuty używane w systemie plików (dla jednego nie ma listy w Internecie). Jednak z moich testówA
atrybut odwzorowujesystem.posix_acl_access
atrybut, a ponieważ jest tosystem
przestrzeń nazw,rsync
nawet nie spróbuję go skopiować.man
fragmencie totrusted
isecurity
, 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órarsync
ignoruje (i prawdopodobnie mądrze). Albo to, albo musisz być rootem, aby uzyskać te, które nie są.Jeśli chodzi oUruchomionycp
, wydaje się, że w grze występują błędy.strace
nacp -a
, mam następujące dwie ciekawe linie:i
Po pierwsze,fgetxattr
wywołanie nie zwraca żadnych danych (prawdopodobnie dlatego, że ich nie ma - wystarczy istnienie atrybutu), ale w jakiś sposóbcp
znajduje 28 bajtów (śmieci?) Danych, aby ustawić je jako wartość atrybutu w pliku docelowym. To wydaje się być błędemcp
, ale raczej przyczyną problemu wydaje się być błąd,libattr
ponieważfsetattr
wywołanie powraca0
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ściwyfsetattr
i dlategocp
cicho zawodzi.Faktycznie
user_xattr
jest potrzebne naext2
,ext3
,reiserfs
i być może kilku innych. Nie jest to konieczneext4
Należy również zauważyć, że
attr
narzędziasetfattr
,getfattr
iattr
(ten ostatni jest udokumentowana być tylko dlaXFS
tylko, ale wydaje się działać tak samo dobrze jak inni oext4
) mają problemy w pracy niczego, aleuser
nazw. Dostaję się,Operation not supported
jeśli spróbuję użyćsetfattr
atrybutu wsystem
przestrzeni nazw (lub żadnej przestrzeni nazw w przypadku tego błędu ).setfattr
wydaje się odnosić sukcesy w przestrzeniach nazwtrusted
isecurity
, ale potemgetfattr
nie może odczytać niczego, a także nie może odczytać niczego zsystem
przestrzeni nazw ustawionej przezchattr
. Powodemchattr
jest to, że używaioctl
połączenia, a nielibattr
.To, co działa idealnie, to ustawienie rozszerzonych atrybutów w
user
przestrzeni nazw zasetfattr
pomocą i używaniersync
lubcp
kopiowanie z nimi nienaruszonymi (nie ma nawet problemów zcp
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. Prawdopodobniersync
programiści to wiedzą i dlatego je ignorują.źródło