Atualizar
Depois de mexer um pouco mais com isso e examinar o código para chattr
outro e2fsprogs
, fica claro que os atributos definidos por chattr
e aqueles definidos por libattr
( por exemplo, com o comando setfattr
) são muito diferentes.chattr
define ext
sinalizadores do sistema de arquivos que simplesmente não são mapeados para um atributo ou espaço para nome nomeado. Nenhum deles aparecem com qualquer chamada para libattr
's listxattr
. Eles provavelmente devem mapear para atributos nomeados no system
espaço para nome, conforme assumido abaixo, mas ainda não foi completamente implementado. Além disso, o system.posix_acl_access
atributo que confundi com o mapeamento para um desses atributos abaixo, não tem nada a ver com os ext
sinalizadores do sistema de arquivos e sim com as listas de controle de acesso. O associadostrace
as mensagens aparecem para qualquer arquivo e desaparecem quando apenas cp --preserve=xattr
é usado.
Parece que os atributos definidos por chattr
são específicos para os ext
sistemas de arquivos e que a única maneira de afetá-los é atravése2fsprogs
ferramentas. De fato, a man
página não usa realmente o termo 'atributos estendidos' para eles, mas 'atributos de arquivo'. Atributos estendidos 'reais' são pares nome / valor que podem ser alterados libattr
e implementados em vários sistemas de arquivos. Estes são o que cp
e rsync
procurar e transferir para os arquivos copiados quando as opções corretas são dadas. Parece, no entanto, que system
existe espaço para nome para mapear os chattr
atributos para nomes e, finalmente, para atributos equivalentes em outros sistemas de arquivos, mas por enquanto isso não funciona.
Eu deixei a resposta original intacta, pois há algumas informações boas lá, embora, em alguns casos, dê muito errado.
Atualização 2
Eu deveria ter voltado a isso novamente antes agora, mas, de acordo com essa resposta , chattr
funciona em mais do que apenas ext
sistemas de arquivos. Segundo a Wikipedia , é equivalente ao chflags
comando em sistemas baseados em BSD.
Escrevi um script para testar a configuração e a leitura desses atributos em alguns sistemas de arquivos e obtive os seguintes resultados:
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
Observe que todas as tentativas de ler / definir reiserfs
sinalizadores de arquivo deram o erro acima, apesar de estar listado na Wikipedia como tendo alguma funcionalidade. Eu não testei reiser4
. Além disso, embora o c
sinalizador possa ser definido, ext4
isso não é respeitado. Também pode haver opções de ajuste / montagem que afetam esses sinalizadores, mas não encontrei nenhum.
No entanto, parece que atualmente chattr
é o único utilitário no Linux capaz de modificar esses atributos e, portanto, nenhum utilitário de cópia é capaz de preservá-los.
Resposta original
A razão para isso rsync
parece ser que nem sequer tenta. Na -X
seção da rsync
documentação:
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.
É difícil mapear as letras de atributo usadas por chattr
e lsattr
para os atributos nomeados subjacentes usados no sistema de arquivos (para uma que não existe uma lista na Internet). Nos meus testes, porém, o A
atributo é mapeado para o system.posix_acl_access
atributo e, como esse é osystem
espaço para nome, rsync
nem tentará copiá-lo.Os outros dois namespaces não mencionados no man
snippet são trusted
e security
, são necessários privilégios de root para defini-los (e rsync
não tentam sem).
Muito provavelmente os atributos que você tentou definir caem no system
espaço para nome que rsync
ignora (e provavelmente com sabedoria). Ou isso ou você precisa ser root para obter os que não são.
Quanto a cp
, parece haver bugs em jogo.Correndo strace
em cp -a
, recebo as seguintes duas linhas interessantes:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
e
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
Em primeiro lugar, a fgetxattr
chamada não retorna nenhum dado (provavelmente porque não existe - a existência do atributo é suficiente), mas de alguma forma cp
encontra 28 bytes de dados (indesejados?) Para definir como o valor do atributo no arquivo de destino. Isso parece um bug cp
, mas o que está causando os problemas parece ser um bug, libattr
pois a fsetattr
chamada retorna 0
para o sucesso sem realmente definir o atributo.
Recebo esse comportamento ext4
independentemente de montar com ele user_xattr
. Não consigo encontrar nenhuma documentação sobre isso além de dizer que 'alguns sistemas' precisam dessa opção de montagem para que atributos estendidos funcionem. Aparentemente o meu (Debian Jessie) não. Mesmo que haja um problema de montagem que eu perdi, ele está errado fsetattr
e, portanto, cp
falha silenciosamente.
Realmente user_xattr
é necessário em ext2
, ext3
, reiserfs
e possivelmente alguns outros. Não é necessário paraext4
Observe também que as attr
ferramentas setfattr
, getfattr
e attr
(a última está documentada apenas para XFS
apenas, mas parece funcionar tão bem quanto as demais ext4
), têm problemas para trabalhar em qualquer coisa, menos no user
espaço de nomes. Eu recebo Operation not supported
se eu tentar usar setfattr
para colocar um atributo no system
espaço para nome (ou nenhum espaço para nome conforme esse bug ). setfattr
parece ter sucesso nos espaços de nome trusted
e security
, mas getfattr
falha ao ler qualquer coisa de volta e também falha ao ler qualquer coisa do system
espaço de nome definido por chattr
. O motivo chattr
é que ele usa uma ioctl
chamada e não libattr
.
No entanto, o que funciona perfeitamente é definir atributos estendidos no user
espaço para nome setfattr
e usá -los rsync
ou cp
copiá-los intactos (não há problemas cp
se você não especificar um valor ao criar o atributo). Eu acho que a linha inferior é que o uso de system
valores de namespace está atualmentebuggy e / ousem suporte, pelo menos no Debian e provavelmente em outras distros também. É provável que os rsync
desenvolvedores saibam disso, e é por isso que eles os ignoram.