Tengo un script bash que usa rsync
para hacer copias de seguridad de archivos en Archlinux. Noté que rsync
no se pudo copiar un archivo /sys
, aunque cp
funcionó bien:
# rsync /sys/class/net/enp3s1/address /tmp
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
ERROR: address failed verification -- update discarded.
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]
# cp /sys/class/net/enp3s1/address /tmp ## this works
Me pregunto por qué rsync
falla y ¿es posible copiar el archivo con él?
linux
arch-linux
rsync
sysfs
Eugene Yarmash
fuente
fuente
/sys/
?/sys/class/net/*/address
(recibo un "permiso denegado" cuando lo intento)? De lo contrario, no está haciendo una copia de seguridad real / útil ya que no se puede restaurar.Respuestas:
Rsync tiene un código que comprueba específicamente si un archivo se trunca durante la lectura y genera este error
ENODATA
. No sé por qué los archivos/sys
tienen este comportamiento, pero como no son archivos reales, supongo que no es demasiado sorprendente. No parece haber una manera de decirle a rsync que omita esta verificación en particular.Creo que probablemente sea mejor no sincronizar
/sys
y usar secuencias de comandos específicas para seleccionar la información particular que desea (como la dirección de la tarjeta de red).fuente
En primer lugar
/sys
es un pseudo sistema de archivos . Si nos fijamos/proc/filesystems
, encontrará una lista de sistemas de archivos registrados donde hay bastantesnodev
por delante. Esto indica que son pseudo sistemas de archivos . Esto significa que existe en un núcleo en ejecución como un sistema de archivos basado en RAM. Además, no requieren un dispositivo de bloqueo.Al arrancar, el núcleo monta este sistema y actualiza las entradas cuando sea adecuado. Por ejemplo, cuando se encuentra nuevo hardware durante el arranque o por
udev
.En
/etc/mtab
general, encuentras el montaje por:Para un buen artículo sobre el tema, lea Patric Mochel's - El sistema de archivos sysfs .
stat de archivos / sys
Si va a un directorio debajo
/sys
y hace unls -l
, notará que todos los archivos tienen un tamaño. Típicamente 4096 bytes. Esto es informado porsysfs
.Además, puede hacer un
stat
en un archivo y notar otra característica distinta; Ocupa 0 bloques. También el inodo de la raíz (stat / sys) es 1./stat/fs
típicamente tiene inodo 2. etc.rsync vs. cp
La explicación más fácil para la falla rsync de sincronizar pseudo archivos es quizás por ejemplo.
Digamos que tenemos un archivo llamado
address
que tiene 18 bytes. Unals
ostat
del archivo informa 4096 bytes.rsync
read_size == 4096
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
, línea 2554096
bytes. Poner a cero el búfer.ENODATA
.Durante este proceso, en realidad lee todo el archivo. Pero sin tamaño disponible, no puede validar el resultado, por lo que el fracaso es la única opción.
cp
Compruebe si es probable que el archivo sea escaso. Ese es el archivo tiene agujeros, etc.
Como el
stat
archivo de informes tiene cero bloques, se clasifica como escaso.Intenta leer el archivo mediante la extensión-copia (una forma más eficiente de copiar archivos dispersos normales ), y falla.
Típicamente
18446744073709551615
bytes en un sistema de 32 bits.fuente
Puede estar relacionado, pero las llamadas de atributos extendidos fallarán en sysfs:
Mirando mi strace parece que rsync intenta extraer atributos extendidos por defecto:
He intentado encontrar una bandera para dar rsync para ver si saltarse los atributos extendidos resuelve el problema, pero no era capaz de encontrar cualquier cosa (
--xattrs
los vuelve sobre el destino).fuente
Rsync normalmente lee la información del archivo, transfiere el contenido del archivo o delta a un archivo temporal en el directorio de destino, luego, después de verificar los datos del archivo, lo renombra al nombre del archivo de destino.
Creo que el problema con sysfs es que todos los archivos se muestran como 4k (una página de memoria) pero pueden contener solo unos pocos bytes. Para evitar copiar un archivo potencialmente dañado en el destino, rsync cancela la copia cuando ve una discrepancia entre los metadatos del archivo y lo que se copió realmente.
Al menos en rsync v3.0.6, este comportamiento se puede evitar con el modificador
--inplace
. Rsync aún detectará errores, pero dado que los archivos de destino ya se habrán sobrescrito cuando lo haga, dejará allí los archivos potencialmente corruptos.Sin embargo, tenga en cuenta que un efecto secundario es que los archivos terminan con relleno de cero a 4k, ya que este es el tamaño que rsync cree que son los archivos. No debería hacer una diferencia en la mayoría de los casos, ya que los bytes nulos generalmente se ignoran.
fuente