Eu tenho um script bash que usa rsync
para fazer backup de arquivos no Archlinux. Notei que rsync
não conseguiu copiar um arquivo /sys
, enquanto cp
funcionava bem:
# 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
Eu me pergunto por que rsync
falha, e é possível copiar o arquivo com ele?
linux
arch-linux
rsync
sysfs
Eugene Yarmash
fonte
fonte
/sys/
?/sys/class/net/*/address
(recebo "permissão negada" quando o tento)? Caso contrário, você não está fazendo um backup real / útil, pois não pode ser restaurado.Respostas:
O Rsync possui um código que verifica especificamente se um arquivo está truncado durante a leitura e gera esse erro -
ENODATA
. Não sei por que os arquivos/sys
têm esse comportamento, mas como não são arquivos reais, acho que não é tão surpreendente. Não parece haver uma maneira de dizer ao rsync para ignorar essa verificação específica.Acho que é melhor você não sincronizar
/sys
e usar scripts específicos para escolher as informações específicas que você deseja (como o endereço da placa de rede).fonte
Primeiro,
/sys
é um sistema de pseudo arquivos . Se você olhar/proc/filesystems
, encontrará uma lista de sistemas de arquivos registrados, onde muitos têmnodev
pela frente. Isso indica que eles são pseudo sistemas de arquivos . Isso significa que eles existem em um kernel em execução como um sistema de arquivos baseado em RAM. Além disso, eles não precisam de um dispositivo de bloco.Na inicialização, o kernel monta esse sistema e atualiza as entradas quando adequado. Por exemplo, quando um novo hardware é encontrado durante a inicialização ou por
udev
.Em
/etc/mtab
você normalmente encontra a montagem por:Para um bom artigo sobre o assunto, leia Patric Mochel's - The sysfs Filesystem .
arquivos stat / / sys
Se você entrar em um diretório
/sys
e fizer umls -l
, notará que todos os arquivos têm um tamanho. Normalmente, 4096 bytes. Isso é relatado porsysfs
.Além disso, você pode fazer um
stat
arquivo e perceber outro recurso distinto; ocupa 0 quarteirões. Também o inode da raiz (stat / sys) é 1./stat/fs
normalmente possui o inode 2. etc.rsync vs. cp
A explicação mais fácil para a falha do rsync na sincronização de pseudo arquivos é talvez pelo exemplo.
Digamos que tenhamos um arquivo com
address
18 bytes. Umls
oustat
do arquivo relata 4096 bytes.rsync
read_size == 4096
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
, linha 2554096
bytes. Zerar o buffer.ENODATA
.Durante esse processo, ele realmente lê o arquivo inteiro. Mas, sem tamanho disponível, ele não pode validar o resultado - portanto, a falha é a única opção.
cp
Verifique se é provável que o arquivo seja escasso. Esse é o arquivo tem buracos, etc.
Como o
stat
arquivo de relatórios possui zero blocos, é classificado como esparso.Tenta ler o arquivo por extensão-cópia (uma maneira mais eficiente de copiar arquivos esparsos normais ) e falha.
Normalmente,
18446744073709551615
bytes em um sistema de 32 bits.fonte
Pode estar relacionado, mas as chamadas de atributo estendidas falharão no sysfs:
Olhando para o meu rastreio, parece que o rsync tenta extrair atributos estendidos por padrão:
Tentei encontrar uma bandeira para dar rsync para ver se pular atributos estendidos resolve o problema, mas não foi capaz de encontrar qualquer coisa (
--xattrs
transforma-los em no destino).fonte
O Rsync normalmente lê as informações do arquivo, transfere o conteúdo ou delta para um arquivo temporário no diretório de destino e, depois de verificar os dados do arquivo, o renomeia para o nome do arquivo de destino.
Acredito que o problema com o sysfs é que todos os arquivos são exibidos como 4k (uma página de memória), mas podem conter apenas alguns bytes. Para evitar copiar um arquivo potencialmente corrompido para o destino, o rsync cancela a cópia quando vê uma incompatibilidade entre os metadados do arquivo e o que realmente foi copiado.
Pelo menos no rsync v3.0.6, esse comportamento pode ser evitado usando o
--inplace
switch. O Rsync ainda detectará erros, mas como os arquivos de destino já foram substituídos, isso deixará os arquivos potencialmente corrompidos lá.Observe, porém, que um efeito colateral disso é que os arquivos acabam sendo preenchidos com zero a 4k, pois esse é o tamanho que o rsync pensa que são. Na maioria dos casos, não deve fazer diferença, pois os bytes nulos geralmente são ignorados.
fonte