збереження розширених атрибутів за допомогою cp / rsync


12

Під час копіювання cpрозширені атрибути не зберігаються, навіть із явними

cp -a --preserve=all /source /dest

або

cp -a --preserve=xattr /source /dest

Те саме з rsync, тобто

rsync -aq -A -X --delete /source /dest

Однак у файловій системі призначення я можу створювати розширений атрибут вручну (за допомогою chattr). Це означає, що цільова файлова система підтримує xattr.

Чому я не можу зберегти за xattrдопомогою cpабо rsync?

Додаткова інформація:

  • І вихідна, і цільова файлові системи є ext4
  • І вихідні, і цільові файлові системи є локальними (не nfs)
  • Я використовую Debian Wheezy

Як ви монтуєте цю файлову систему призначення? Це над NFS?
slm

цільова файлова система - локальна файлова система
Martin Vegter

Чи можете ви показати результат mountцієї файлової системи?
slm

1
Про який варіант і версію Unix? Яка файлова система вводиться на обох кінцях та які параметри монтажу?
Жил "ТАК - перестань бути злим"

1
@MartinVegter Чи можете ви надати зразок атрибута, який має ваш файл? Я щойно створив файлову систему ext4 у двох файлах і зробив тест setfattr -n system.name0 -v "value" test_file. Я скопіював в test_file/ з ext4 / jfs / xfs cp --preserve=allі не мав жодних проблем із збереженням розширених атрибутів.
УВВ

Відповіді:


14

Оновлення

Після того, як пограбувати цим ще і переглядати код для chattrіншого та іншого e2fsprogs, зрозуміло, що атрибути, встановлені командою chattrта встановлені командою libattr(наприклад, за допомогою команди setfattr), сильно відрізняються. chattrвстановлює extпрапори файлової системи, які просто не відображаються в названому атрибуті чи просторі імен. Жоден з них не відображається з жодним дзвінком до libattrs 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розробники знають це, через що вони їх ігнорують.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.