Forum Linux.général Créer un gros fichier vide rapidement

Posté par  .
Étiquettes :
1
26
juil.
2012

Bonjour,

Je me posais la question, je ne trouve pas de réponse en cherchant sur google, peut-être que ce n'est pas possible, mais je voulais en avoir le cœur net.

J'aimerais savoir s'il existait un outils permettant de créer rapidement un gros fichier (plusieurs giga octets) mais sans écrire de données à l'intérieur, donc sans utiliser dd if=/dev/zero par exemple ?

Le but de cette manœuvre est de créer rapidement des conteneurs sur un disque usb dans lesquelles mettre des partitions virtuels.

Merci d'avance.

  • # Sparse file

    Posté par  . Évalué à 9.

    Est-ce ceci que tu cherches ?

    http://en.wikipedia.org/wiki/Sparse_file

    • [^] # Re: Sparse file

      Posté par  . Évalué à 1.

      Oui, c'est exactement de ça dont il s'agissait, merci beaucoup :)

      • [^] # Re: Sparse file

        Posté par  . Évalué à 1.

        Attention tout de même : la commande indiquée dans la page Wikipedia (dd if=/dev/null of=sparse-file bs=1k seek=5120) crée bien un fichier ayant une taille apparente de 5MO, mais au final la place effectivement occupée sur le disque sera nulle (au moins tant que l'on écrit rien dedans).

        On peut comme ça créer des fichiers de plusieurs dizaines de GO sur des systèmes ne faisant que quelques centaines de MO… Ce n'est que lorsque les fichiers vont se "remplir" que ça risque de poser problème.

        On peut voir la taille effective occupée par un fichier avec un "ls -ls" ou avec "du".

        • [^] # Re: Sparse file

          Posté par  . Évalué à -3.

          Mais à la place de /dev/null, on peut utiliser /dev/zero, /dev/random ou /dev/urandom.

          • [^] # Re: Sparse file

            Posté par  . Évalué à 1.

            Si on lit la demande initiale :
            > donc sans utiliser dd if=/dev/zero par exemple ?

            Donc non, cela ne lui ira pas…

            • [^] # Re: Sparse file

              Posté par  . Évalué à -1.

              Il reste donc /dev/random ou /dev/urandom ;)

              • [^] # Re: Sparse file

                Posté par  . Évalué à 2.

                Je pense que dans la demande initiale, l'important est aussi le «rapidement», et ce doit être la raison pour laquelle Christophe ne voualit pas utiliser "dd if=/dev/zero".
                Remplacer /dev/zero par /dev/urandom, ou pire par /dev/random/, ne fera qu'augmenter le temps de création du fichier.

                Je pense que l'utilisation de /dev/null avec seek= répond vraisemblablement à la question. Ma remarque était essentiellement un avertissement sur le fait que le fichier n'occupe alors pas réellement l'espace disque correspondant à sa taille apparente.

                • [^] # Re: Sparse file

                  Posté par  . Évalué à 2.

                  Merci, j'avais vu. Electronlibre63 fait trois propositions, earendil_fr en élimine une, il en reste donc deux, c'était juste de l'humour, javais mis un smiley pour l'indiquer.

                  Christophe indique :

                  permettant de créer rapidement un gros fichier (plusieurs giga octets) mais sans écrire de données à l'intérieur

                  Ce qu'il ne précise pas, c'est s'il veut créer un fichier vide qui réserve juste une inode (dans ce cas, dd if=/dev/null… suffit) ou créer un fichier sans écrire dedans car le contenu n'a pas d'importance, mais qui en plus de l'inode, réserve aussi les blocs pour avoir un fichier qui occupe réellement la taille demandée. Or avec /dev/null, il n'y a pas de bloc réservé comme tu le soulignes, donc si c'est le second cas alors /dev/zero (ou /dev(u)random) fonctionne, mais il y a une écriture inutile de zéro (ou de nombres plus ou moins aléatoires), d'où alors le besoin d'un programme particulier (j'ignore s'il existe) qui réserve les blocs sans avoir à écrire dedans.

                  • [^] # Re: Sparse file

                    Posté par  . Évalué à 2.

                    autre solution : VirtualBox permet de créer des containers de partitions virtuelles (c'est justement ce que veut l'auteur d'ailleurs), soit dynamiquement allouées (donc place occupée nulle), soit remplissant tout de suite la place.
                    J'imagine qu'il doit y avoir une ligne de commande (via VirtualBox je veux dire) pour créer cela sans passer par l'interface graphique

                    Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

                  • [^] # Re: Sparse file

                    Posté par  . Évalué à 1.

                    Dans le cas présent, ça m'allait. De toute façon, il me semble qu'utiliser /dev/null ou /dev/zero était similaire d'un point de vu résultat, on a un fichier de la taille demandé mais qui ne prends effectivement pas de place sur le disque tant que l'on écrit pas dedans. J'aurais aussi été curieux de voir s'il existait un moyen d'avoir cet espace alloué sur le disque pour éviter tout problème, mais je n'ai pas trouvé.

                    • [^] # Re: Sparse file

                      Posté par  . Évalué à 0. Dernière modification le 28 juillet 2012 à 07:50.

                      J'aurais aussi été curieux de voir s'il existait un moyen d'avoir cet espace alloué sur le disque pour éviter tout problème, mais je n'ai pas trouvé.

                      on l'a deja dit
                      dd if=/dev/(u)random of=/path/vers/ton/fichier bs=une valeur count=une autre valeur

                      dans l'exemple de ymorin dans le post ci-dessous, il cree un fichier de 100Mo
                      100Mo vu par ls et par du, donc l'espace doit deja etre alloué

                      • [^] # Re: Sparse file

                        Posté par  . Évalué à 2.

                        Oui, mais cette commande prends du temps à être exécutée vu qu'il y a une écriture de données sur le disque. Ma prérogative était que cela se fasse rapidement, sans que des données ne soient écrites sur le disque, en gros que le contenu du fichier soit ce que contient l'espace libre du disque, ça ne me semble pas totalement farfelu de penser que cela soit possible.

                        • [^] # Re: Sparse file

                          Posté par  . Évalué à 2.

                          fallocate(1) le fait mais dépend du système de fichiers. Apparemment, seuls btrfs, ext4, ocfs2, et xfs le supportent.

                          • [^] # Re: Sparse file

                            Posté par  . Évalué à 2.

                            Effectivement, dans le cas présent c'était sur un disque formaté en ntfs, donc ça n'aurait pas été possible, mais c'est utile de savoir que cela existe.

                        • [^] # Re: Sparse file

                          Posté par  . Évalué à 2.

                          que cela se fasse rapidement, sans que des données ne soient écrites sur le disque

                          D´où l´utilisation de l´option skip de dd.

                          --> man dd

                          en gros que le contenu du fichier soit ce que contient l'espace libre du disque

                          Avec l´option skip, c´est même mieux : les blocs ne sont pas alloués sur le disque, donc un fichier sparse occupe physiquement zéro octet sur le disque, tant que tu n´as pas écrit dedans, et la lecture renvoie que des 0x00 (sauf là où tu as écrit autre chose, bien sûr). Les blocs sur le disque sont alloués sur le disque uniquement lors d´une écriture dans le fichier.

                          Hop,
                          Moi.

                        • [^] # Re: Sparse file

                          Posté par  . Évalué à 2.

                          en meme temps vouloir reserver de l'espace disque, sans l'occuper, tu veux qu'il sache comment ton systeme que c'est reserve si tu n'as pas ecrit dans la table d'allocation que la zone est occupée (vu que tu ne veux pas ecrire de données sur le disque)

                          bon apparemment les nouveaux systemes de fichiers permettraient ce genre de chose, il faut peut-etre voir de ce coté,
                          ou bien accepté le temps que ca prend (j'espere que tu ne le fais pas tous les jours non plus)
                          ou bien changé de techno pour tes disques (SSD sur Sata 6Gbps, voire SSD sur PCI-e)

                • [^] # Re: Sparse file

                  Posté par  . Évalué à 1.

                  D’ailleurs, je me demande bien le temps que cela peut prendre de faire un fichier de plusieurs Giga avec /dev/random…

                  Déjà que je le trouve long pour faire un fichier de quelque kilo.

                  • [^] # Re: Sparse file

                    Posté par  . Évalué à 2.

                    C'est bien pour ça qu'on utiliser /dev/urandom

  • # dd

    Posté par  . Évalué à 1.

    Pour un fichier de 100MiB :

    dd if=/dev/zero of=mon_fichier bs=1048576 seek=100 count=0
    
    

    NB. 1048576 == 1MiB

    Hop,
    Moi.

    • [^] # Re: dd

      Posté par  (site web personnel) . Évalué à 2.

      sans utiliser dd if=/dev/zero par exemple

      ---------------->[]

      • [^] # Re: dd

        Posté par  . Évalué à 3.

        par exemple

        En fait, j´ai interprété sa question comme :

        Je veux un fichier de X MiB, mais qui ne prends pas de place sur le disque.

        En effet, s´il ne connait pas l´option skip de dd, alors je comprends qu´il ne veuille pas utiliser dd if=/dev/zero. Mais franchement, avec skip, c´est la bonne réponse (ou /dev/null, si tu veux).

        Hop,
        Moi.

  • # ftruncate

    Posté par  . Évalué à 2.

    Bon aller, sans utiliser dd il suffit d'utiliser l'appel système ftruncate (ou ftruncate64 si gros fichiers). Je n'ai pas trouvé d'utilitaire servant de surcouche mais bon créer une implémentation en C est simple, voir triviale en python, cf.: http://www.tutorialspoint.com/python/os_ftruncate.htm

    De la man page : « If the file previously was larger than this size, the extra data is lost. If the file previously was shorter, it is extended, and the extended part reads as null bytes ('\0').»

    • [^] # Re: ftruncate

      Posté par  . Évalué à 1.

      Je n'ai pas trouvé d'utilitaire servant de surcouche

      Il existe : truncate(1), non-standard mais présent au moins dans les GNU coreutils et sur FreeBSD.

      • [^] # Re: ftruncate

        Posté par  . Évalué à 1.

        ah ben merci :-) /me se sent un peu con d'être passé à côté du coup…
        Donc une solution pour créer un sparse file est `truncate -s 100M fichier', avec les problèmes associés de fragmentation et d'exhaustion possible de l'espace disque à posteriori.

        Maintenant ce dont Christophe a vraiment besoin et qui est mentioné par netsurfer est bien fallocate. Chez moi il y a un utilitaire qui fait partie du paquet util-linux et il s'utilise comme suit : `fallocate -l $((1024*1024*100)) fichier'.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.