При копировании с 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
filesystems
rsync
cp
xattr
Мартин Вегтер
источник
источник
mount
для этой файловой системы?setfattr -n system.name0 -v "value" test_file
. Я скопировал вtest_file
/ из ext4 / jfs / xfscp --preserve=all
и у меня не было проблем с сохранением расширенных атрибутов.Ответы:
Обновить
После того, как мы еще немного поиграемся с этим и посмотрим на код
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.Я написал скрипт для проверки установки и чтения этих атрибутов в нескольких файловых системах и получил следующие результаты:
Обратите внимание, что все попытки чтения / установки
reiserfs
файловых флагов привели к вышеуказанной ошибке, несмотря на то, что она была указана в Википедии как имеющая некоторую функциональность. Я не проверялreiser4
. Кроме того, хотяc
флаг может быть установлен наext4
нем не соблюдается. Также могут быть параметры настройки / монтирования, которые влияют на эти флаги, но я не смог их найти.Тем не менее, похоже, что в настоящее время
chattr
это единственная утилита в Linux, способная изменять эти атрибуты, и поэтому ни одна утилита копирования не способна их сохранить.Оригинальный ответ
rsync
Кажется, причина в том, что он даже не пытается. Из-X
разделаrsync
документации:Трудно сопоставить буквы атрибутов, используемыеДва других пространства имен, не упомянутых воchattr
иlsattr
с именованными атрибутами, используемыми в файловой системе (для одного нет списка в Интернете). Из моих тестов, однако,A
атрибут отображается наsystem.posix_acl_access
атрибут, и, поскольку этоsystem
пространство имен, яrsync
даже не буду пытаться его скопировать.man
фрагменте, - это,trusted
иsecurity
для их установки требуются привилегии root (иrsync
без них не будет).Скорее всего, атрибуты, которые вы пытались установить, попадают в
system
пространство имен, котороеrsync
игнорируется (и, вероятно, разумно). Либо это, либо вам нужно быть пользователем root, чтобы получить те, которые этого не делают.Что касаетсяБегcp
, кажется, есть ошибки в игре.strace
наcp -a
, я получаю следующие две интересные строки:и
Во-первых,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
разработчики знают это, поэтому они игнорируют их.источник