Actualizar
Después de jugar un poco más con esto y mirar el código para chattr
y otros e2fsprogs
, está claro que los atributos establecidos por chattr
y los establecidos por libattr
( por ejemplo, con el comando setfattr
) son muy diferentes. chattr
establece ext
indicadores 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 a libattr
's listxattr
. Probablemente deberían mapearse a atributos con nombre en el system
espacio de nombres como se supone a continuación, pero hasta ahora esto no está implementado por completo. Además, el system.posix_acl_access
atributo que confundí con la asignación a uno de estos atributos a continuación, no tiene nada que ver con los ext
indicadores del sistema de archivos y más bien tiene que ver con las listas de control de acceso. El asociadostrace
los mensajes aparecen para cualquier archivo y desaparecen cuando solo cp --preserve=xattr
se usa.
Parece que los atributos establecidos por chattr
son específicos de los ext
sistemas de archivos y que la única forma de afectarlos es a través de las e2fsprogs
herramientas. De hecho, la man
pá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 alterados libattr
e implementados en múltiples sistemas de archivos. Estos son los que cp
y rsync
look para y transfieren a los archivos copiados cuando se dan las opciones correctas. Sin embargo, parece que system
existe un espacio de nombres para asignar los chattr
atributos 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 , chattr
funciona en más que solo ext
sistemas de archivos. Según Wikipedia , es equivalente al chflags
comando 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:
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
Tenga en cuenta que todos los intentos de leer / configurar reiserfs
marcas de archivo dieron el error anterior, a pesar de que se enumera en Wikipedia con alguna funcionalidad. No hice la prueba reiser4
. Además, aunque la c
bandera se puede poner ext4
, 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 chattr
es 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 rsync
parece ser que ni siquiera lo intenta. De la -X
sección de la rsync
documentación:
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.
Es difícil mapear las letras de atributo utilizadas por chattr
y lsattr
con 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, el A
atributo se asigna al system.posix_acl_access
atributo y, dado que este es el system
espacio de nombres, rsync
ni siquiera intentará copiarlo.Los otros dos espacios de nombres que no se mencionan en el man
fragmento son trusted
y security
, se requieren privilegios de root para establecerlos (y rsync
no lo intentarán sin).
Lo más probable es que los atributos que ha intentado establecer caigan en el system
espacio de nombres que rsync
ignora (y probablemente sabiamente). O eso o debes ser root para obtener los que no lo son.
En cuanto a cp
, parece que hay errores en juego.Correr strace
en cp -a
, consigo las siguientes dos líneas interesantes:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
y
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
En primer lugar, la fgetxattr
llamada no devuelve ningún dato (probablemente porque no hay ninguno; la existencia del atributo es suficiente), pero de alguna manera cp
encuentra 28 bytes de datos (¿basura?) Para establecer como el valor del atributo en el archivo de destino. Esto parece un error cp
, pero más bien lo que está causando los problemas parece ser un error libattr
ya que la fsetattr
llamada regresa 0
para el éxito sin establecer realmente el atributo.
Obtengo este comportamiento ext4
independientemente de si monto con user_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á mal fsetattr
y, por lo tanto, cp
falla en silencio.
En realidad user_xattr
se necesita en ext2
, ext3
, reiserfs
y posiblemente algunos otros. No es necesario paraext4
Tenga en cuenta también que las attr
herramientas setfattr
, getfattr
y attr
(este último se ha documentado que ser sólo para XFS
solamente, pero parece que funciona tan bien como los otros para ext4
) tienen problemas para trabajar en otra cosa que el user
espacio de nombres. Obtengo Operation not supported
si intento usar setfattr
para poner un atributo en el system
espacio de nombres (o no hay espacio de nombres según este error ). setfattr
parece tener éxito en los espacios de nombres trusted
y security
, pero luego getfattr
no puede leer nada y tampoco puede leer nada del system
espacio de nombres establecido por chattr
. La razón que chattr
tiene éxito es que usa una ioctl
llamada y no libattr
.
Sin embargo, lo que funciona perfectamente es establecer atributos extendidos en el user
espacio de nombres setfattr
y usarlos rsync
o cp
copiarlos intactos (incluso no hay problemas cp
si no especifica un valor al crear el atributo). Creo que la conclusión es que usar system
valores de espacio de nombres es actualmentebuggy y / osin soporte, al menos en Debian y probablemente otras distribuciones también. Es probable que los rsync
desarrolladores lo sepan, por eso los ignoran.