Como você pode aparar arquivos usando a linha de comando?

18

Qual é o equivalente do console do seguinte código Python:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

Talvez algum encantamento dd? A idéia é criar um arquivo com o tamanho aparente de 2 GB para uso, por exemplo, em virtualização.

kvm disk -cd whatever.iso #Only allocate space as necessary
badp
fonte
ddé a única ferramenta tradicional que expõe a seekchamada do sistema (veja dd vs cat - o dd ainda é relevante hoje em dia? mas existem outras maneiras de esfolar esse gato em unidades atuais típicas.
Gilles '- pare de ser mau'

Respostas:

8

De um modo geral, basta usar dd; mas como você menciona o uso da virtualização KVM, considere usar qemu-img:

qemu-img create -f raw disk 2G

Faz o mesmo que o ddcomando na resposta de Chris Down, efetivamente.

Independentemente de qual comando você usar, para uso em virtualização, sugiro fortemente o uso fallocatepara pré-alocar blocos para impedir a fragmentação e aumentar o desempenho.

fallocate -l 2G disk

Porém, ele não está disponível em todas as plataformas e sistemas de arquivos. Isso não grava zeros, mas apenas atribui blocos ao arquivo, em vez de fazer isso sob demanda mais tarde, sempre que for necessário estender o arquivo.

gertvdijk
fonte
A citação é um erro de digitação?
badp
@badp sim, corrigido.
gertvdijk
2
qemu-imge ddambos executam uma chamada de sistema para definir o tamanho do arquivo (ftruncate), mas executam muito mais para carregar a si mesmos e às bibliotecas às quais estão vinculados. E, nesse sentido, ddserá muito mais eficaz do que qemu-img(que é muito maior e está vinculado a muito mais bibliotecas). O GNU truncateserá ainda mais eficaz. ddtambém tem a vantagem de ser onipresente. Bom ponto sobre fallocateembora.
Stéphane Chazelas
@StephaneChazelas Eu recomendo totalmente o seu comentário. Editei minha resposta para apontar que qemu-imgé apenas uma alternativa óbvia no uso da virtualização KVM.
precisa saber é o seguinte
14

Você pode criar um arquivo esparso como este com dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk
Chris Down
fonte
4
Além disso, 2Gé uma extensão GNU para dd. Você pode usar bs=1024 seek=2097152se não tiver o GNU dd.
Chris Baixo
Heh, Gé uma extensão, e não é suportado pela versão do OpenBSD de dd ... mas, Me Ksão suportadas, talvez por isso seek=2048Mé um pouco mais legível, dependendo do que você está plataformas direcionados a
Earlz
Você deve ler a partir de / dev / zero: if = / dev / zero
Daniel Fanjul
@DanielFanjul Why? Não há absolutamente nenhuma diferença, nenhum bytes é gravado.
Chris Baixo
@ChrisDown Como / dev / null não contém dados quando você lê, mas / dev / zero contém zeros inteiros. Ah, conte = 1, o número de bytes a serem gravados não deve ser zero.
precisa
6

Veja também o truncatecomando GNU :

truncate -s 2G some-file
Stéphane Chazelas
fonte