Оновлення
Після того, як пограбувати цим ще і переглядати код для chattr
іншого та іншого e2fsprogs
, зрозуміло, що атрибути, встановлені командою chattr
та встановлені командою libattr
(наприклад, за допомогою команди setfattr
), сильно відрізняються. chattr
встановлює ext
прапори файлової системи, які просто не відображаються в названому атрибуті чи просторі імен. Жоден з них не відображається з жодним дзвінком до libattr
s listxattr
. Вони, ймовірно, повинні зіставити названі атрибути в system
просторі імен, як це припускається нижче, але поки що це повністю не виконане. Також system.posix_acl_access
атрибут, який я неправильно сприйняв для відображення одного з цих атрибутів нижче, не має нічого спільного з ext
прапорами файлової системи і швидше стосується списків контролю доступу. Пов'язанеstrace
повідомлення з’являються для будь-якого файлу і зникають лише тоді, коли cp --preserve=xattr
використовується.
Здається, що атрибути задані chattr
специфічними для ext
файлових систем і єдиний спосіб вплинути на них - це через e2fsprogs
інструменти. Насправді man
сторінка насправді не використовує для них термін "розширені атрибути", а "атрибути файлів". "Реальні" розширені атрибути - це імена / значення пар, які можуть бути змінені libattr
та реалізовані в декількох файлових системах. Це те , що cp
і rsync
шукати і передавати до скопійованих файлів , коли потрібні параметри наведені. Однак здається, що system
існує простір імен для відображення chattr
атрибутів на імена та в кінцевому рахунку до еквівалентних атрибутів в інших файлових системах, але наразі це не працює.
Я залишив оригінальну відповідь недоторканою, оскільки там є якась хороша інформація, хоча в пунктах вона йде зовсім не так.
Оновлення 2
До цього я мав би повернутися ще раз, але відповідно до цієї відповіді , він chattr
працює на більш ніж просто ext
файлових системах. Згідно з Вікіпедією , він еквівалентний chflags
команді в системах на базі BSD.
Я написав сценарій для перевірки налаштування та зчитування цих атрибутів у кількох файлових системах і отримав такі результати:
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
Зауважте, що всі спроби читання / встановлення reiserfs
прапорів файлів дали вищевказану помилку, незважаючи на те, що вона вказана у Вікіпедії як деяка функціональність. Я не тестував reiser4
. Крім того, хоча c
прапор може бути встановлений на ext4
ньому, не вшановується. Можливо, також є параметри настройки / монтажу, які впливають на ці прапори, але я не зміг їх знайти.
Однак здається, що наразі chattr
це єдина утиліта для Linux, здатна змінювати ці атрибути, тому жодна утиліта копіювання не здатна їх зберегти.
Оригінальний відповідь
rsync
Здається, причина в тому, що навіть не намагаються. З -X
розділу rsync
документації:
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.
Важко зіставити літери атрибутів, які використовуються chattr
та lsattr
до атрибутів, що лежать в основі, що використовуються у файловій системі (для одного немає списку в Інтернеті). Однак, з моїх тестів, A
атрибут відображається на system.posix_acl_access
атрибут, і оскільки це область system
імен, rsync
навіть не намагаюся його скопіювати.Інші два простори імен, які не згадані у man
фрагменті, є, trusted
і security
для їх встановлення потрібні кореневі привілеї (і без rsync
цього не випробувати).
Швидше за все, атрибути, які ви намагалися встановити, потрапляють у область system
імен, яка rsync
ігнорує (і, ймовірно, розумно). Або це, або потрібно мати корінь, щоб отримати ті, яких немає.
Що стосується cp
, виявляються помилки під час гри.Запускаючи strace
далі cp -a
, я отримую наступні два цікавих рядки:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
і
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
По-перше, fgetxattr
виклик не повертає жодних даних (можливо, тому, що таких немає - достатньо існування атрибуту), але якимось чином cp
знаходить 28 байт даних (junk?) Для встановлення значення атрибута у файлі призначення. Це здається помилкою cp
, але, швидше, те, що викликає проблеми, здається помилкою, libattr
оскільки fsetattr
виклик повертається 0
до успіху, фактично не встановлюючи атрибут.
Я отримую таку поведінку ext4
незалежно від того, чи монтую я user_xattr
. Я не можу знайти жодної документації з цього приводу, крім того, щоб сказати, що "деяким системам" потрібен цей варіант монтажу, щоб розширені атрибути працювали. Моя здається (Дебіан Джессі) ні. Навіть є проблема монтажу, яку я пропустив, це неправильно fsetattr
і, таким чином, cp
мовчки провалюватися.
На насправді user_xattr
необхідно на ext2
, ext3
, reiserfs
і , можливо , деяких інших. Це не потрібноext4
Слід також зазначити , що attr
інструменти setfattr
, getfattr
і attr
(останній документований бути тільки XFS
лише, але , здається, працюють точно так же , як і інші для ext4
) мають проблеми при роботі в чому - або , крім user
імен. Я отримую, Operation not supported
якщо намагаюся використовувати setfattr
атрибут у system
просторі імен (або немає простору імен відповідно до цієї помилки ). setfattr
виявляється, що це успішно в просторах trusted
і security
імен, але потім getfattr
не вдається прочитати нічого назад, а також не в змозі прочитати нічого з system
простору імен, встановлених chattr
. Причина, яка chattr
досягає успіху, полягає в тому, що він використовує ioctl
дзвінок, а не libattr
.
Хоча це чудово працює, це встановлення розширених атрибутів у user
просторі імен за setfattr
допомогою та використання rsync
або cp
копіювання з ними неушкодженими (навіть проблем не виникає, cp
якщо ви не вказуєте значення під час створення атрибута). Я думаю, що суть полягає в тому, що зараз використовується system
значення значень простору іменбаггі та / абонепідтримується, принаймні в Debian і, мабуть, також інших дистрибутивах. Ймовірно, rsync
розробники знають це, через що вони їх ігнорують.