Primeiro, /sys
é um pseudo sistema de arquivos . Se você olhar para /proc/filesystems
, você encontrará uma lista de sistemas de arquivos registrados, onde alguns têm nodev
em frente. Isso indica que eles são pseudo filesystems . 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 exigem um
dispositivo de bloco.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Na inicialização, o kernel monta este sistema e atualiza as entradas quando adequado. Por exemplo. quando
novo hardware é encontrado durante a inicialização ou por udev
.
Em /etc/mtab
, você geralmente encontra a montagem por:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Para um bom artigo sobre o assunto, leia
Patric Mochel's - O sistema de arquivos sysfs .
stat dos arquivos / sys
Se você entrar em um diretório em /sys
e fizer um ls -l
, perceberá que
todos os arquivos têm um tamanho. Normalmente, 4096 bytes. Isso é relatado por sysfs
.
:/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type
-r--r--r-- 1 root root 4096 Apr 24 20:09 address
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len
...
Além disso, você pode fazer um stat
em um arquivo e observar outro recurso distinto;
ocupa 0 blocos. Também inode da raiz (stat / sys) é 1. /stat/fs
tipicamente
tem inode 2. etc.
rsync vs. cp
A explicação mais fácil para a falha do rsync de sincronizar pseudo-arquivos é
talvez pelo exemplo.
Digamos que tenhamos um arquivo chamado address
, que é 18 bytes. Um ls
ou stat
do
arquivo relata 4096 bytes.
rsync
- Abre o descritor de arquivos, fd.
- Usa fstat (fd) para obter informações como tamanho.
- Prepare-se para ler bytes de tamanho, ou seja, 4096. Isso seria linha 253 do código vinculado por @mattdm . %código%
- Pergunte; leia: 4096 bytes.
- Uma string curta é lida, isto é, 18 bytes. %código%
-
read_size == 4096
- Pergunte; ler: 4078 bytes
- 0 bytes lidos (como primeira leitura consumiu todos os bytes no arquivo).
-
nread == 18
, linha 255
- Não é possível ler
read_size = read_size - nread (4096 - 18 = 4078)
bytes. Zero out buffer.
- Definir erro
nread == 0
.
- Retornar.
- Comunicar erro.
- Tente novamente. (Acima do loop).
- Falha.
- Comunicar erro.
- FINA.
Durante este processo, ele lê o arquivo inteiro. Mas sem tamanho
disponível não pode validar o resultado - assim, a falha é apenas a opção.
cp
- Abre o descritor de arquivos, fd.
- Usa fstat (fd) para obter informações como st_size (também usa lstat e stat).
-
Verifique se é provável que o arquivo seja escasso. Esse é o arquivo tem furos etc.
copy.c:1010
/* Use a heuristic to determine whether SRC_NAME contains any sparse
* blocks. If the file has fewer blocks than would normally be
* needed for a file of its size, then at least one of the blocks in
* the file is a hole. */
sparse_src = is_probably_sparse (&src_open_sb);
Como o arquivo de relatórios 4096
tem blocos zero, ele é classificado como esparso.
-
Tenta ler o arquivo por cópia de extensão (uma maneira mais eficiente de copiar normal
arquivos esparsos) e falha.
- Copiar por cópia esparsa.
- Começa com o tamanho máximo de leitura de MAXINT.
tipicamente
ENODATA
bytes em um sistema de 32 bits.
- Pergunte; leia 4096 bytes. (Tamanho do buffer alocado na memória a partir de informações estatísticas).
- Uma string curta é lida, isto é, 18 bytes.
- Verifique se um buraco é necessário, não.
- Escreve o buffer para o destino.
- Subtraia 18 do tamanho máximo de leitura.
- Pergunte; leia 4096 bytes.
- 0 bytes como todos consumidos na primeira leitura.
- Retornar o sucesso.
- Tudo OK. Atualizar sinalizadores para arquivo.
- FINA.