Comment pouvez-vous découper des fichiers en utilisant la ligne de commande?

18

Quel est l'équivalent console du code Python suivant:

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

Peut-être une incantation DD? L'idée est de créer un fichier avec la taille apparente de 2 Go pour une utilisation par exemple dans la virtualisation.

kvm disk -cd whatever.iso #Only allocate space as necessary
badp
la source
ddest le seul outil traditionnel qui expose l' seekappel système (voir dd vs cat - dd est-il toujours pertinent de nos jours? mais il existe d'autres façons de dépecer ce chat sur les unités actuelles typiques.
Gilles 'SO- arrête d'être méchant'

Réponses:

8

D'une manière générale, utilisez simplement dd; mais comme vous mentionnez l'utilisation de la virtualisation KVM, vous pourriez envisager d'utiliser qemu-img:

qemu-img create -f raw disk 2G

Cela fait la même chose que la ddcommande dans la réponse de Chris Down, efficacement.

Quelle que soit la commande que vous utilisez, pour une utilisation dans la virtualisation, je suggère fortement d'utiliser fallocatepour pré-allouer des blocs afin d'éviter la fragmentation et d'augmenter les performances.

fallocate -l 2G disk

Cependant, il n'est pas disponible sur toutes les plateformes et tous les systèmes de fichiers. Cela n'écrira pas de zéros, mais affectera simplement des blocs au fichier, plutôt que de le faire à la demande plus tard chaque fois qu'il doit étendre le fichier.

gertvdijk
la source
La citation est-elle une faute de frappe?
badp
@badp oui, corrigé.
gertvdijk
2
qemu-imget les dddeux effectuent un appel système pour définir la taille du fichier (ftruncate), mais effectueront beaucoup plus pour se charger et charger les bibliothèques auxquelles ils sont liés. Et, à cet égard, ddva être beaucoup plus efficace que qemu-img(ce qui est beaucoup plus grand et est lié à beaucoup plus de bibliothèques). GNU truncateva être encore plus efficace. dda également l'avantage d'être omniprésent. Bon point fallocatecependant.
Stéphane Chazelas
@StephaneChazelas J'appuie totalement votre commentaire. J'ai édité ma réponse pour souligner que qemu-imgc'est juste une alternative évidente dans l'utilisation de la virtualisation KVM.
gertvdijk
14

Vous pouvez créer un fichier clairsemé comme celui-ci avec dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk
Chris Down
la source
4
Est également 2Gune extension GNU pour dd. Vous pouvez l'utiliser bs=1024 seek=2097152si vous n'avez pas GNU dd.
Chris Down
Heh, Gest une extension, et elle n'est pas prise en charge par la version OpenBSD de dd ... mais, Met Kest prise en charge, donc peut seek=2048M- être un peu plus lisible, selon les plates-formes que vous
visez
Vous devriez lire à partir de / dev / zero: if = / dev / zero
Daniel Fanjul
@DanielFanjul Pourquoi? Il n'y a absolument aucune différence, aucun octet n'est écrit.
Chris Down du
@ChrisDown Parce que / dev / null ne contient aucune donnée lorsque vous lisez, mais / dev / zero contient des zéros infinis. Oh, count = 1, le nombre d'octets à écrire ne doit pas être nul.
Daniel Fanjul
6

Voir aussi la truncatecommande GNU :

truncate -s 2G some-file
Stéphane Chazelas
la source