Al copiar con cp, los atributos extendidos no se conservan, incluso con valores explícitos
cp -a --preserve=all /source /dest
o
cp -a --preserve=xattr /source /dest
Lo mismo ocurre con rsync, es decir
rsync -aq -A -X --delete /source /dest
Sin embargo, en el sistema de archivos de destino, puedo crear atributos extendidos manualmente (con chattr). Esto significa que el sistema de archivos de destino es compatible con xattr.
¿Por qué no puedo preservar xattrcon cpo rsync?
Información Adicional:
- Los sistemas de archivos de origen y destino son ext4
- Los sistemas de archivos de origen y destino son locales (no nfs)
- Estoy usando Debian Wheezy
filesystems
rsync
cp
xattr
Martin Vegter
fuente
fuente

mounteste sistema de archivos?setfattr -n system.name0 -v "value" test_file. Copiétest_fileto / from ext4 / jfs / xfs concp --preserve=ally no tuve ningún problema para preservar los atributos extendidos.Respuestas:
Actualizar
Después de jugar un poco más con esto y mirar el código para
chattry otrose2fsprogs, está claro que los atributos establecidos porchattry los establecidos porlibattr( por ejemplo, con el comandosetfattr) son muy diferentes.chattrestableceextindicadores del sistema de archivos que simplemente no se asignan a un atributo con nombre o espacio de nombres. Ninguno de ellos aparece con ningún llamado alibattr'slistxattr. Probablemente deberían mapearse a atributos con nombre en elsystemespacio de nombres como se supone a continuación, pero hasta ahora esto no está implementado por completo. Además, elsystem.posix_acl_accessatributo que confundí con la asignación a uno de estos atributos a continuación, no tiene nada que ver con losextindicadores del sistema de archivos y más bien tiene que ver con las listas de control de acceso. El asociadostracelos mensajes aparecen para cualquier archivo y desaparecen cuando solocp --preserve=xattrse usa.Parece que los atributos establecidos por
chattrson específicos de losextsistemas de archivos y que la única forma de afectarlos es a través de lase2fsprogsherramientas. De hecho, lamanpágina en realidad no usa el término 'atributos extendidos' para ellos, sino más bien 'atributos de archivo'. Los atributos extendidos 'reales' son pares de nombre / valor que pueden ser alteradoslibattre implementados en múltiples sistemas de archivos. Estos son los quecpyrsynclook para y transfieren a los archivos copiados cuando se dan las opciones correctas. Sin embargo, parece quesystemexiste un espacio de nombres para asignar loschattratributos a los nombres y, en última instancia, a los atributos equivalentes en otros sistemas de archivos, pero por ahora esto no funciona.He dejado la respuesta original intacta ya que hay buena información allí, aunque en algunos puntos va bastante mal.
Actualización 2
Debería haber regresado a esto nuevamente antes, pero según esta respuesta ,
chattrfunciona en más que soloextsistemas de archivos. Según Wikipedia , es equivalente alchflagscomando en sistemas basados en BSD.Escribí un script para probar la configuración y la lectura de estos atributos en algunos sistemas de archivos y obtuve los siguientes resultados:
Tenga en cuenta que todos los intentos de leer / configurar
reiserfsmarcas de archivo dieron el error anterior, a pesar de que se enumera en Wikipedia con alguna funcionalidad. No hice la pruebareiser4. Además, aunque lacbandera se puede ponerext4, no se respeta. También puede haber opciones de ajuste / montaje que afectan estos indicadores, pero no pude encontrar ninguno.Sin embargo, parece que actualmente
chattres la única utilidad en Linux capaz de modificar estos atributos y, por lo tanto, ninguna utilidad de copia es capaz de preservarlos.Respuesta original
La razón
rsyncparece ser que ni siquiera lo intenta. De la-Xsección de larsyncdocumentación:Es difícil mapear las letras de atributo utilizadas porLos otros dos espacios de nombres que no se mencionan en elchattrylsattrcon los atributos nombrados subyacentes utilizados en el sistema de archivos (por un lado, no hay una lista en Internet). Sin embargo, según mis pruebas, elAatributo se asigna alsystem.posix_acl_accessatributo y, dado que este es elsystemespacio de nombres,rsyncni siquiera intentará copiarlo.manfragmento sontrustedysecurity, se requieren privilegios de root para establecerlos (yrsyncno lo intentarán sin).Lo más probable es que los atributos que ha intentado establecer caigan en el
systemespacio de nombres quersyncignora (y probablemente sabiamente). O eso o debes ser root para obtener los que no lo son.En cuanto aCorrercp, parece que hay errores en juego.straceencp -a, consigo las siguientes dos líneas interesantes:y
En primer lugar, lafgetxattrllamada no devuelve ningún dato (probablemente porque no hay ninguno; la existencia del atributo es suficiente), pero de alguna maneracpencuentra 28 bytes de datos (¿basura?) Para establecer como el valor del atributo en el archivo de destino. Esto parece un errorcp, pero más bien lo que está causando los problemas parece ser un errorlibattrya que lafsetattrllamada regresa0para el éxito sin establecer realmente el atributo.Obtengo este comportamiento
ext4independientemente de si monto conuser_xattr. No puedo encontrar ninguna documentación sobre esto aparte de decir que 'algunos sistemas' necesitan esta opción de montaje para que funcionen los atributos extendidos. Aparentemente el mío (Debian Jessie) no. Incluso hay un problema creciente que me he perdido, está malfsetattry, por lo tanto,cpfalla en silencio.En realidad
user_xattrse necesita enext2,ext3,reiserfsy posiblemente algunos otros. No es necesario paraext4Tenga en cuenta también que las
attrherramientassetfattr,getfattryattr(este último se ha documentado que ser sólo paraXFSsolamente, pero parece que funciona tan bien como los otros paraext4) tienen problemas para trabajar en otra cosa que eluserespacio de nombres. ObtengoOperation not supportedsi intento usarsetfattrpara poner un atributo en elsystemespacio de nombres (o no hay espacio de nombres según este error ).setfattrparece tener éxito en los espacios de nombrestrustedysecurity, pero luegogetfattrno puede leer nada y tampoco puede leer nada delsystemespacio de nombres establecido porchattr. La razón quechattrtiene éxito es que usa unaioctlllamada y nolibattr.Sin embargo, lo que funciona perfectamente es establecer atributos extendidos en el
userespacio de nombressetfattry usarlosrsyncocpcopiarlos intactos (incluso no hay problemascpsi no especifica un valor al crear el atributo). Creo que la conclusión es que usarsystemvalores de espacio de nombres es actualmentebuggy y / osin soporte, al menos en Debian y probablemente otras distribuciones también. Es probable que losrsyncdesarrolladores lo sepan, por eso los ignoran.fuente