Comment remplir un disque dur sous Linux

24

Je fais des tests sur un morceau de code et je veux remplir un disque dur avec des données. J'ai trouvé que cela ddpeut faire d'énormes fichiers en un instant, mais je ne suis dfpas d'accord. Voici ce que j'ai essayé:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lhmontre un fichier 10G. Cependant, df -hmontre que la partition n'a pas diminué. Alors, que dois-je faire pour faire dfreconnaître que les données sont maintenant prises? J'espère quelque chose de rapide que je coderai dans un test unitaire.

Utilisateur1
la source
Vous aurez plus de chance si vous demandez à serverfault.com
BTW, 10 * 1024 * 1024 * 1024 est le même que 10 * 2 ** 30, un peu plus simple.
deltaray

Réponses:

26

Le problème avec l' seek=<big number>astuce est que le système de fichiers est (généralement) intelligent: si une partie d'un fichier n'a jamais été écrite (et n'est donc que des zéros), cela ne prend pas la peine de lui allouer de l'espace - donc, comme vous '' Comme nous l'avons vu, vous pouvez avoir un fichier de 10 Go qui ne prend pas de place (c'est ce qu'on appelle un "fichier épars", et peut être très utile dans certains cas, par exemple certaines implémentations de base de données).

Vous pouvez forcer l'allocation de l'espace avec (par exemple):

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

ce qui prendra beaucoup plus de temps, mais remplira en fait le disque. Je recommande de faire une taille de bloc beaucoup plus élevée que 1, car cela déterminera combien d'appels système le ddprocessus fait - plus la taille du bloc est petite, plus il y a d'appels sysys, et donc plus il s'exécutera lentement. (Bien qu'au-delà de 1 Mo environ, cela ne fera probablement pas beaucoup de différence et pourrait même ralentir les choses ...)

psmears
la source
J'utilise généralement bs = (quelle que soit la moitié de la taille du cache sur le lecteur que j'écris). Cela a bien fonctionné jusqu'à présent lors de la création d'images sur des disques durs plus grands pour un redimensionnement ultérieur. ETA: le mot critique DEMI.
atroon
20

Comme autre option, vous pouvez utiliser le oui avec une seule chaîne et son environ 10 fois plus rapide que l'exécution de dd if = / dev / urandom of = largefile. Comme ça

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
deltaray
la source
C'est, étonnamment, à peu près aussi rapide que d'utiliser dd if = / dev / zero of = filename bs = 1M.
bhinesley
La syntaxe est également facile à retenir.
AWT
7

Vous avez créé ce qui est connu comme un "fichier clairsemé" - un fichier qui, parce que la plupart est vide (c'est-à-dire lu en tant que \ 0), ne prend pas d'espace sur le disque en plus de ce qui est réellement écrit (1B, après 10 Go de l'écart).

Je ne pense pas que vous puissiez créer des fichiers volumineux, en prenant l'espace disque réel en un instant - prendre de l'espace physique signifie que le système de fichiers doit allouer des blocs de disque à votre fichier.

Je pense que vous êtes coincé avec l'ancien "dd if = / dev / zero of = filename bs = 100M count = 100" qui est limité par la vitesse d'écriture séquentielle de votre lecteur.

qdot
la source
6

Si vous testez simplement des cas avec des systèmes de fichiers remplis, peut-être que fallocate est assez bon. Et plus vite aussi! par exemple

fallocate -l 150G

uchihaangel
la source
3
Cela a besoin d' un nom de fichier à préciser: fallocate -l 150G foo. Néanmoins +1 pour avoir mentionné l'outil.
Kamil Maciorowski
3

Arrêtez d'utiliser seeket utilisez un très grand bset / ou count. En fait, vous créez un fichier clairsemé , et vous ne devez évidemment pas le faire.

Ignacio Vazquez-Abrams
la source
3

Si vous souhaitez remplir littéralement le disque dur, procédez comme suit:

dd if=/dev/zero of=zeros bs=1M

Vous pouvez éventuellement spécifier le nombre si vous souhaitez limiter la taille, mais si vous omettez le nombre, il s'exécutera jusqu'à ce que vous soyez à court d'espace disque.

dd if=/dev/zero of=zeros bs=1M count=10240

Comme psmears l'a mentionné, vous obtiendrez de meilleures performances si vous définissez la taille du bloc sur 1 Mo (bs = 1M) au lieu de 1 B (bs = 1). Cela prendra encore un certain temps, mais si vous souhaitez vérifier la progression de votre commande, ouvrez une console distincte et exécutez ces commandes:

ps aux | grep dd

Utilisez le PID de dd dans cette commande (remplacez PID par le PID de dd):

kill -USR1 PID

Ensuite, allez regarder votre terminal DD. Bien sûr, cela est d'une utilité limitée lorsque vous essayez simplement de remplir le lecteur (vous pouvez simplement utiliser df ou du pour vérifier l'espace disque libre ou la taille du fichier, respectivement). Cependant, il y a d'autres moments où il est pratique de faire en sorte que dd affiche sa progression.

Crédit supplémentaire: une utilisation pratique pour la remise à zéro de l'espace libre est que, par la suite, vous pouvez ensuite supprimer les fichiers "zéro" et dd la partition entière (ou le disque, si vous avez mis à zéro toutes les partitions) en un fichier image disque (disons , disk-backup.dd), puis compressez le fichier. L'espace libre est maintenant hautement compressible, donc votre image dd compressée sera beaucoup plus petite que le périphérique bloc d'origine dont elle contient le contenu.

Shenanigans: zippez un gros fichier de zéros et envoyez-le par e-mail à tous vos amis. Dites-leur que c'est quelque chose de vraiment cool.

Rob
la source
2

Vous créez un fichier 1 To non éparse avec la commande suivante:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

Cela a été utile pour tester ce qui se passe lorsque les quotas sont dépassés ou lorsqu'un système de fichiers se remplit.

df -h montre que l'espace disponible devient plus petit.

user75112
la source