Primeiro, /sys
é um sistema de pseudo arquivos . Se você olhar /proc/filesystems
, encontrará uma lista de sistemas de arquivos registrados, onde muitos têm nodev
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.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
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:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
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 um ls -l
, notará 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
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. Um ls
ou stat
do arquivo relata 4096 bytes.
rsync
- Abre o descritor de arquivo, fd.
- Usa fstat (fd) para obter informações como tamanho.
- Decida ler bytes de tamanho, ou seja, 4096. Essa seria a linha 253 do código vinculado por @mattdm .
read_size == 4096
- Ask; leitura: 4096 bytes.
- Uma string curta é lida, isto é, 18 bytes.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Ask; leitura: 4078 bytes
- 0 bytes lidos (como a primeira leitura consumiu todos os bytes no arquivo).
nread == 0
, linha 255
- Não foi possível ler os
4096
bytes. Zerar o buffer.
- Definir erro
ENODATA
.
- Retorna.
- Reportar erro.
- Repetir. (Loop acima).
- Falhou.
- Reportar erro.
- BEM.
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
- Abre o descritor de arquivo, 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 buracos, 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 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.
- Copie com cópia esparsa.
- Começa com o tamanho máximo de leitura de MAXINT.
Normalmente,
18446744073709551615
bytes em um sistema de 32 bits.
- Ask; 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 é necessário um orifício, não.
- Grave o buffer no destino.
- Subtraia 18 do tamanho máximo de leitura.
- Ask; leia 4096 bytes.
- 0 bytes, todos consumidos na primeira leitura.
- Retornar com sucesso.
- Tudo bem. Atualize sinalizadores para o arquivo.
- BEM.
/sys/
?