Wie können Sie Dateien über die Befehlszeile zuschneiden?

18

Was ist das Konsolenäquivalent des folgenden Python-Codes:

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

Vielleicht eine DD-Beschwörung? Die Idee ist, eine Datei mit einer scheinbaren Größe von 2 GB zu erstellen, die z. B. für die Virtualisierung verwendet werden kann.

kvm disk -cd whatever.iso #Only allocate space as necessary
badp
quelle
ddist das einzige traditionelle Tool, das den seekSystemaufruf aufdeckt (siehe dd vs cat - ist dd heutzutage immer noch relevant? Es gibt jedoch andere Möglichkeiten, diese Katze auf typischen aktuellen Unices zu häuten.
Gilles 'SO - hör auf, böse zu sein'

Antworten:

8

Im Allgemeinen verwenden Sie einfach dd; Wenn Sie jedoch die Verwendung der KVM-Virtualisierung erwähnen, sollten Sie Folgendes in Betracht ziehen qemu-img:

qemu-img create -f raw disk 2G

Es macht das gleiche wie der ddBefehl in der Antwort von Chris Down, effektiv.

Unabhängig davon, welchen Befehl Sie für die Verwendung in der Virtualisierung verwenden, empfehle ich dringend, fallocateBlöcke vorab zuzuweisen, um eine Fragmentierung zu verhindern und die Leistung zu steigern.

fallocate -l 2G disk

Es ist jedoch nicht auf allen Plattformen und Dateisystemen verfügbar. Dies schreibt keine Nullen, sondern weist der Datei nur Blöcke zu, anstatt dies bei Bedarf später jedes Mal zu tun, wenn die Datei erweitert werden muss.

gertvdijk
quelle
Ist das Zitat ein Tippfehler?
badp
@badp ja, behoben.
Gertvdijk
2
qemu-imgund ddbeide führen einen Systemaufruf aus, um die Dateigröße festzulegen (ftruncate), führen aber viel mehr aus, um sich selbst und die Bibliotheken, mit denen sie verknüpft sind, zu laden. Und in dieser Hinsicht ddwird es viel effektiver sein als qemu-img(was viel größer ist und mit viel mehr Bibliotheken verbunden ist). GNU truncatewird noch effektiver. ddhat auch den Vorteil, allgegenwärtig zu sein. Guter Punkt über fallocateobwohl.
Stéphane Chazelas
@StephaneChazelas Ich bin total hinter deinem Kommentar zurück. Ich habe meine Antwort dahingehend überarbeitet, dass dies qemu-imgnur eine offensichtliche Alternative für die Verwendung der KVM-Virtualisierung ist.
Gertvdijk
14

Sie können eine Sparse-Datei wie folgt erstellen dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk
Chris Down
quelle
4
Auch 2Gist eine GNU-Erweiterung zu dd. Sie können verwenden, bs=1024 seek=2097152wenn Sie GNU nicht haben dd.
Chris Down
Heh, Gist eine Erweiterung und wird von OpenBSDs Version von dd nicht unterstützt ... aber Mund Kwerden unterstützt, also ist es vielleicht seek=2048Mein bisschen besser lesbar, abhängig von den Plattformen, auf die Sie abzielen
Earlz,
Sie sollten aus / dev / zero lesen: if = / dev / zero
Daniel Fanjul
@DanielFanjul Warum? Es gibt absolut keinen Unterschied, es werden keine Bytes geschrieben.
Chris Down
@ChrisDown Weil / dev / null beim Lesen keine Daten enthält, aber / dev / zero unendlich viele Nullen enthält. Oh, count = 1, die Anzahl der zu schreibenden Bytes darf nicht Null sein.
Daniel Fanjul
6

Siehe auch den GNU- truncateBefehl:

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