Обновить
После того, как мы еще немного поиграемся с этим и посмотрим на код chattr
и прочее e2fsprogs
, становится ясно, что атрибуты, установленные chattr
и установленные libattr
(например, с помощью команды setfattr
), очень разные. chattr
устанавливает ext
флаги файловой системы, которые просто не отображаются на именованный атрибут или пространство имен. Ни один из них не отображаются с любым вызовом libattr
«с 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
для их установки требуются привилегии root (и rsync
без них не будет).
Скорее всего, атрибуты, которые вы пытались установить, попадают в system
пространство имен, которое rsync
игнорируется (и, вероятно, разумно). Либо это, либо вам нужно быть пользователем root, чтобы получить те, которые этого не делают.
Что касается 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 байтов (ненужных?) Данных для установки в качестве значения атрибута в целевом файле. Это похоже на ошибку в cp
, но скорее то, что вызывает проблемы, кажется ошибкой, libattr
поскольку fsetattr
вызов возвращается 0
для успеха без фактической установки атрибута.
Я получаю это поведение ext4
независимо от того, буду ли я монтировать с user_xattr
. Я не могу найти никакой документации по этому вопросу, кроме как сказать, что «некоторым системам» нужна эта опция монтирования для работы расширенных атрибутов. Кажется, моя (Debian Jessie) нет. Даже если есть растущая проблема, которую я пропустил, это неправильно 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
разработчики знают это, поэтому они игнорируют их.