web-dev-qa-db-fra.com

Comment remplir un disque dur sous Linux

Je teste un morceau de code et je veux remplir un disque dur avec des données. J'ai trouvé que dd peut créer d’énormes fichiers en un instant, mais df n’est pas d’accord. Voici ce que j'ai essayé:

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

ls -lh affiche un fichier 10G. Cependant, df -h indique que la partition n'a pas été réduite. Alors, que dois-je faire pour que df reconnaisse que les données sont maintenant prises? J'espère que quelque chose de rapide que je code dans un test unitaire.

24
User1

Le problème avec l'astuce seek=<big number> est que le système de fichiers est (généralement) malin: si une partie d'un fichier n'a jamais été écrite (et est donc composée de zéros), cela ne vous gêne pas d'allouer de l'espace - alors, Nous avons vu que vous pouvez avoir un fichier de 10 Go qui ne prend pas d’espace (on parle de "fichier fragmenté" et qui peut être très utile dans certains cas, par exemple certaines implémentations de bases de données).

Vous pouvez forcer l’espace à être alloué avec (par exemple):

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

ce qui prendra beaucoup plus de temps, mais remplira réellement le disque. Je recommande de rendre la taille de bloc beaucoup plus grande que 1, car cela déterminera le nombre d'appels système que le processus dd rend - plus la taille de bloc est petite, plus le nombre d'appels système à payer est élevé et, par conséquent, 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 ...)

26
psmears

Comme autre option, vous pouvez utiliser le yes avec une seule chaîne. Il est environ 10 fois plus rapide que de lancer dd if =/dev/urandom of = largefile. Comme ça

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
19
deltaray

Vous avez créé ce que l’on appelle un "fichier fragmenté" - un fichier qui, du fait qu’il est en grande partie 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). d'écart).

Je ne pense pas que vous puissiez créer d’énormes fichiers en prenant un espace disque réel en un instant. En prenant un espace physique, le système de fichiers doit allouer des blocs de disque à votre fichier.

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

7
qdot

Si vous ne faites que tester des cas contenant des systèmes de fichiers pleins, peut-être que fallocate est suffisant. Et plus vite aussi! par exemple.

fallocate -l 150G

6
uchihaangel

Arrêtez d'utiliser seeket utilisez un très grand bset/ou countname__. Dans ce cas, vous créez un fichier fragmenté , et vous devez évidemment ne pas le faire.

3

Si vous voulez littéralement remplir 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 sera exécuté jusqu'à épuisement de l'espace disque.

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

Comme mentionné par psmears, vous obtiendrez de meilleures performances si vous définissez la taille de 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 séparée et exécutez les commandes suivantes:

ps aux | grep dd

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

kill -USR1 PID

Ensuite, allez voir votre terminal DD. Bien sûr, cela a 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 disponible ou la taille du fichier, respectivement). Cependant, il est parfois utile de faire en sorte que dd produise ses progrès.

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

Shenanigans: compressez un grand fichier de zéros et envoyez-le par courrier électronique à tous vos amis. Dis-leur que c'est quelque chose de vraiment cool.

3
rob

Vous créez un fichier non fragmenté 1 TB à l'aide de 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 qu'un système de fichiers se remplit.

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

2
user75112