Création d'un «faux» fichier arbitrairement volumineux

16

Je voudrais créer un fichier spécial similaire à /dev/nullou /dev/random, où le fichier n'existe pas réellement mais vous pouvez tout de même le lire, sauf que je pourrais en fait fixer un plafond sur la taille apparente du fichier.

Pour le dire autrement, je veux créer un fichier spécial où (en supposant que je fixe la limite à 500 Go) lorsque je "cat" le fichier, il sortira tous les 500 Go du fichier puis s'arrêtera. Il doit agir de la même manière qu'un véritable fichier de 500 Go, mais sans prendre de place. Le contenu de ce fichier n'a pas d'importance, il pourrait \0ressembler à tout /dev/null, ou simplement une petite chaîne être envoyée encore et encore, ou autre chose.

Est-ce quelque chose de faisable? La seule chose proche que j'ai pu trouver à distance mknod, ce sont les pages de manuel qui parlent , mais celles-ci n'étaient pas très utiles.

Gopher médiocre
la source

Réponses:

17

Vous pouvez créer un fichier clairsemé sur certains systèmes de fichiers, qui semblera avoir une certaine taille, mais n'utilisera pas vraiment autant d'espace sur le disque .

$ dd if=/dev/null of=sparse bs=1024 count=1 seek=524288000
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.4444e-05 s, 0.0 kB/s
$ ls -l sparse 
-rw-rw-r--. 1 ignacio ignacio 536870912000 May  9 22:25 sparse
$ du -h sparse
0   sparse
Ignacio Vazquez-Abrams
la source
Cela fonctionne parfaitement. Dans le meilleur des cas, j'espérais une solution où je pourrais réellement décrire ce que la sortie est (comme, pour chaque position de recherche que vous regardez les données, il y aurait un hachage de cette position ou quelque chose dans ce sens), mais c'était assez Là. Cela fonctionne définitivement pour l'instant, merci!
Mediocre Gopher
1
@MediocreGopher, vous pourriez certainement faire quelque chose comme ça avec FUSE .
cjm
1

Au-delà de la solution portable dd / recherche déjà mentionnée, certains Unix ont des commandes spécialisées:

Au moins sur Solaris , MacOS / X et Irix :

mkfile -n 500m sparseFile

Sur pré - allocation HP-UX , sur AIX lmktemp. et de nombreuses distributions Linux ont tronqué

jlliagre
la source
1

Si vous n'avez pas besoin de rechercher dans le fichier, vous pouvez utiliser un canal nommé:

mkfifo my_special_file
yes | head -n 100 > my_special_file&
cat my_special_file

Bien sûr, vous pouvez utiliser n'importe quelle autre commande, y compris un script complexe, pour générer des données dans le canal.

jfg956
la source
0

Eh bien, avec dd, vous pouvez spécifier une taille de bloc et un nombre, et ainsi limiter la taille comme ceci:

dd if=/dev/urandom count=5 bs=1024 > nullfile

Si vous voulez en lire, lancez-le simplement:

dd if=/dev/urandom count=5 bs=1024 | yourReadingProcess 

Autrefois, chaque installation Linux que je faisais était livrée avec des outils de mise en réseau, portmap, inet.d et autres, et dans inet.d, là où certains services étaient toujours spécifiés, l'un d'eux était décrit / nommé chargen, si je me souviens bien.

(... une minute plus tard ...)

Oui. Dans / etc / services, vous trouvez

chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source

Donc je suppose que c'est un service pour tester quelque chose, et qui envoie des caractères - peut-être aléatoires - sur le réseau. Je ne trouve /etc/xinet.d/chargen que sur mon PC. Il y a plus d'infos:

# default: off
# description: An xinetd internal service which generate characters.  The
# xinetd internal service which continuously generates characters until the
# connection is dropped.  The characters look something like this:
# !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
# This is the tcp version.

Cependant, je ne sais pas comment l'utiliser pour votre but.

Utilisateur inconnu
la source