Creazione di un file "falso" arbitrariamente grande


16

Vorrei creare un file speciale simile a /dev/nullo /dev/random, dove il file in realtà non esiste ma è possibile leggere da esso lo stesso, tranne per il fatto che potrei effettivamente impostare un limite sulla dimensione apparente del file.

Per dirla in altro modo, voglio creare un file speciale in cui (supponendo che abbia impostato il limite su 500 GB) quando "cat" il file verrà generato tutti i 500 GB del file e quindi fermarsi. Deve agire come un vero file da 500 GB, ma senza occupare spazio. Il contenuto di questo file non ha importanza, potrebbe essere tutto \0simile /dev/nullo solo una piccola stringa inviata più e più volte, o qualsiasi altra cosa.

È qualcosa di fattibile? L'unica cosa a distanza che sono riuscito a trovare sono le pagine man che parlano mknod, ma quelle non sono state molto utili.

Risposte:


17

È possibile creare un file sparse su alcuni file system, che sembrano essere una certa dimensione, ma non sarà effettivamente utilizzare più di tanto spazio su disco .

$ 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

Funziona perfettamente. Nel migliore dei casi speravo in una soluzione in cui potessi effettivamente scrivere quale fosse l'output (tipo, per ogni posizione di ricerca che guardi i dati ci sarebbe un hash di quella posizione o qualcosa del genere), ma era abbastanza fuori Là. Questo sicuramente funziona per ora, grazie!
Mediocre Gopher,

1
@MediocreGopher, potresti sicuramente fare qualcosa del genere con FUSE .
cjm,

1

Oltre alla soluzione portatile basata su dd / seek, già menzionata, alcuni Unix hanno comandi specializzati:

Almeno su Solaris , MacOS / X e Irix :

mkfile -n 500m sparseFile

Su HP-UX prealloc , su AIX lmktemp. e molte distribuzioni Linux sono troncate


1

Se non è necessario cercare nuovamente nel file, è possibile utilizzare una pipe denominata:

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

Ovviamente, puoi usare qualsiasi altro comando, incluso uno script complesso, per generare dati nella pipe.


0

Bene, con dd, puoi specificare una dimensione di blocco e un conteggio, e quindi limitare le dimensioni in questo modo:

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

Se vuoi leggere da esso, basta pipe:

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

In passato, ogni installazione di Linux che avevo fatto veniva fornita con alcuni strumenti di rete, portmap, inet.d e simili, e in inet.d, dove alcuni servizi venivano sempre specificati, uno di essi veniva descritto / chiamato chargen, se ricordo bene.

(... un minuto dopo ...)

Sì. In / etc / services, trovi

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

Quindi immagino che sia un servizio per testare qualcosa e che manda caratteri - forse casuali - sulla rete. Trovo /etc/xinet.d/chargen solo sul mio PC. Ci sono più informazioni:

# 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.

Tuttavia, non so come usarlo per il tuo scopo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.