Ao copiar cp
, os atributos estendidos não são preservados, mesmo com explícitos
cp -a --preserve=all /source /dest
ou
cp -a --preserve=xattr /source /dest
O mesmo acontece com rsync
, ie
rsync -aq -A -X --delete /source /dest
No entanto, no sistema de arquivos de destino, posso criar atributos estendidos manualmente (com chattr
). Isso significa que o sistema de arquivos de destino suporta xattr.
Por que não xattr
consigo preservar com cp
ou rsync
?
Informação adicional:
- Os sistemas de arquivos de origem e de destino são ext4
- Os sistemas de arquivos de origem e de destino são locais (não nfs)
- Estou usando o Debian Wheezy
filesystems
rsync
cp
xattr
Martin Vegter
fonte
fonte
mount
deste sistema de arquivos?setfattr -n system.name0 -v "value" test_file
. Copiei otest_file
/ para ext4 / jfs / xfs comcp --preserve=all
e não tive nenhum problema ao preservar atributos estendidos.Respostas:
Atualizar
Depois de mexer um pouco mais com isso e examinar o código para
chattr
outroe2fsprogs
, fica claro que os atributos definidos porchattr
e aqueles definidos porlibattr
( por exemplo, com o comandosetfattr
) são muito diferentes.chattr
defineext
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 paralibattr
'slistxattr
. Eles provavelmente devem mapear para atributos nomeados nosystem
espaço para nome, conforme assumido abaixo, mas ainda não foi completamente implementado. Além disso, osystem.posix_acl_access
atributo que confundi com o mapeamento para um desses atributos abaixo, não tem nada a ver com osext
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 apenascp --preserve=xattr
é usado.Parece que os atributos definidos por
chattr
são específicos para osext
sistemas de arquivos e que a única maneira de afetá-los é atravése2fsprogs
ferramentas. De fato, aman
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 alteradoslibattr
e implementados em vários sistemas de arquivos. Estes são o quecp
ersync
procurar e transferir para os arquivos copiados quando as opções corretas são dadas. Parece, no entanto, quesystem
existe espaço para nome para mapear oschattr
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 apenasext
sistemas de arquivos. Segundo a Wikipedia , é equivalente aochflags
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:
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 testeireiser4
. Além disso, embora oc
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 darsync
documentação:É difícil mapear as letras de atributo usadas porOs outros dois namespaces não mencionados nochattr
elsattr
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, oA
atributo é mapeado para osystem.posix_acl_access
atributo e, como esse é osystem
espaço para nome,rsync
nem tentará copiá-lo.man
snippet sãotrusted
esecurity
, são necessários privilégios de root para defini-los (ersync
não tentam sem).Muito provavelmente os atributos que você tentou definir caem no
system
espaço para nome quersync
ignora (e provavelmente com sabedoria). Ou isso ou você precisa ser root para obter os que não são.Quanto aCorrendocp
, parece haver bugs em jogo.strace
emcp -a
, recebo as seguintes duas linhas interessantes:e
Em primeiro lugar, afgetxattr
chamada não retorna nenhum dado (provavelmente porque não existe - a existência do atributo é suficiente), mas de alguma formacp
encontra 28 bytes de dados (indesejados?) Para definir como o valor do atributo no arquivo de destino. Isso parece um bugcp
, mas o que está causando os problemas parece ser um bug,libattr
pois afsetattr
chamada retorna0
para o sucesso sem realmente definir o atributo.Recebo esse comportamento
ext4
independentemente de montar com eleuser_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á erradofsetattr
e, portanto,cp
falha silenciosamente.Realmente
user_xattr
é necessário emext2
,ext3
,reiserfs
e possivelmente alguns outros. Não é necessário paraext4
Observe também que as
attr
ferramentassetfattr
,getfattr
eattr
(a última está documentada apenas paraXFS
apenas, mas parece funcionar tão bem quanto as demaisext4
), têm problemas para trabalhar em qualquer coisa, menos nouser
espaço de nomes. Eu receboOperation not supported
se eu tentar usarsetfattr
para colocar um atributo nosystem
espaço para nome (ou nenhum espaço para nome conforme esse bug ).setfattr
parece ter sucesso nos espaços de nometrusted
esecurity
, masgetfattr
falha ao ler qualquer coisa de volta e também falha ao ler qualquer coisa dosystem
espaço de nome definido porchattr
. O motivochattr
é que ele usa umaioctl
chamada e nãolibattr
.No entanto, o que funciona perfeitamente é definir atributos estendidos no
user
espaço para nomesetfattr
e usá -losrsync
oucp
copiá-los intactos (não há problemascp
se você não especificar um valor ao criar o atributo). Eu acho que a linha inferior é que o uso desystem
valores de namespace está atualmentebuggy e / ousem suporte, pelo menos no Debian e provavelmente em outras distros também. É provável que osrsync
desenvolvedores saibam disso, e é por isso que eles os ignoram.fonte