Come puoi tagliare i file usando la riga di comando?


18

Qual è l'equivalente console del seguente codice Python:

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

Forse qualche incantesimo dd? L'idea è di creare un file con una dimensione apparente di 2 GB da utilizzare, ad esempio, nella virtualizzazione.

kvm disk -cd whatever.iso #Only allocate space as necessary

ddè l'unico strumento tradizionale che espone il seekchiamata di sistema (vedi gg vs gatto -? è GG ancora attuale in questi giorni , ma ci sono altri modi per la pelle questo gatto su unix tipiche correnti.
Gilles 'SO-smettere di essere cattivi'

Risposte:


8

In generale, basta usare dd; ma mentre menzioni l'uso della virtualizzazione KVM, potresti considerare di usare qemu-img:

qemu-img create -f raw disk 2G

Fa lo stesso del ddcomando nella risposta di Chris Down, in modo efficace.

Indipendentemente dal comando che usi, per l'uso nella virtualizzazione, suggerirei vivamente di utilizzare fallocateper pre-allocare i blocchi al fine di prevenire la frammentazione e aumentare le prestazioni.

fallocate -l 2G disk

Tuttavia, non è disponibile su tutte le piattaforme e i filesystem. Questo non scriverà zero, ma assegna solo blocchi al file, piuttosto che farlo su richiesta più tardi ogni volta che deve estendere il file.


La citazione è un refuso?
badp

@badp sì, risolto.
gertvdijk,

2
qemu-imged ddentrambi eseguono una chiamata di sistema per impostare la dimensione del file (ftruncate), ma eseguiranno molto di più per caricare se stessi e le librerie a cui sono collegati. E, a tale proposito, ddsarà molto più efficace di qemu-img(che è molto più grande ed è collegato a molte più librerie). GNU truncatesarà ancora più efficace. ddha anche il vantaggio di essere onnipresente. Un buon punto fallocateperò.
Stéphane Chazelas,

@StephaneChazelas Completamente secondo il tuo commento. Ho modificato la mia risposta per sottolineare che qemu-imgè solo un'alternativa ovvia nell'uso della virtualizzazione KVM.
gertvdijk,

14

Puoi creare un file sparso come questo con dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
Inoltre, 2Gè un'estensione GNU a dd. Puoi usarlo bs=1024 seek=2097152se non hai GNU dd.
Chris Down,

Heh, Gè un'estensione, e non è supportato dalla versione di OpenBSD di dd ... ma, Me Ksono supportati, quindi forse seek=2048Mè un po 'più leggibile, a seconda delle piattaforme che stai
prendendo di mira

Dovresti leggere da / dev / zero: if = / dev / zero
Daniel Fanjul il

@DanielFanjul Why? Non c'è assolutamente alcuna differenza, non vengono scritti byte.
Chris Down, il

@ChrisDown Perché / dev / null non contiene dati durante la lettura, ma / dev / zero contiene zeri iniziali. Oh, count = 1, il numero di byte da scrivere non deve essere zero.
Daniel Fanjul,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.