Algumas respostas rápidas: primeiro, você não criou um arquivo esparso. Tente estes comandos extras
dd if=/tmp/BIL of=/tmp/sparse seek=1000
ls -ls /tmp/sparse
Você verá que o tamanho é 512003 bytes, mas leva apenas 8 blocos. Os bytes nulos devem ocupar um bloco inteiro e estar em um limite de bloco para que eles sejam possivelmente esparsos no sistema de arquivos.
-
Por que a segunda ocorrência de "BIL" aparece fora de ordem?
porque você está em um sistema little-endian e está escrevendo saída em shorts. Use bytes, como o gato faz.
-
Como o gato e outras ferramentas sabem imprimir na ordem correta?
eles trabalham em bytes.
-
Como programas como ls discernem entre o tamanho "alegado" e o tamanho alocado?
ls
e assim por diante usam a chamada de sistemastat(2)
que retorna 2 valores:st_size; /* total size, in bytes */ blkcnt_t st_blocks; /* number of 512B blocks allocated */
-
Quais ferramentas posso usar para interrogar inode information?
stat é bom.
-
Existe uma ferramenta onde eu possa andar nos blocos diretos e indiretos?
No ext2 / 3/4 você pode usar
hdparm --fibmap
com o nome do arquivo:$ sudo hdparm --fibmap ~/sparse filesystem blocksize 4096, begins at LBA 25167872; assuming 512 byte sectors. byte_offset begin_LBA end_LBA sectors 512000 226080744 226080751 8
Você também pode usar
debugfs
:$ sudo debugfs /dev/sda3 debugfs: stat <1040667> Inode: 1040667 Type: regular Mode: 0644 Flags: 0x0 Generation: 1161905167 Version: 0x00000000 User: 127 Group: 500 Size: 335360 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 664 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x4dd61e6c -- Fri May 20 09:55:24 2011 atime: 0x4dd61e29 -- Fri May 20 09:54:17 2011 mtime: 0x4dd61e6c -- Fri May 20 09:55:24 2011 Size of extra inode fields: 4 BLOCKS: (0-11):4182714-4182725, (IND):4182726, (12-81):4182727-4182796 TOTAL: 83
-
Por que o dd trunca meu arquivo e o dd ou outra ferramenta pode gravar no meio de um arquivo?
Sim,
dd
pode escrever no meio. Adicioneconv=notrunc
. -
Existem mecanismos para evitar que arquivos esparsos sejam reduzidos / aumentados? E se não, por que os arquivos esparsos são úteis?
Não. Porque eles ocupam menos espaço.
O aspecto esparso de um arquivo deve ser totalmente transparente para um programa, o que às vezes significa que a dispersão pode ser perdida quando o programa atualiza um arquivo.
Alguns utilitários de cópia têm opções para preservar a dispersão, por exemplo, tar --sparse
, rsync --sparse
.
Note que você pode converter explicitamente os blocos zero alinhados adequadamente em um arquivo em esparsidade usando cp --sparse=always
e o inverso, convertendo o espaço esparso em zeros reais, com cp --sparse=never
.