Crear un archivo "falso" arbitrariamente grande

16

Me gustaría crear un archivo especial similar a /dev/nullo /dev/random, donde el archivo en realidad no existe pero puedes leer de todos modos, excepto que podría establecer un límite en el tamaño aparente del archivo.

Para decirlo de otra manera, quiero crear un archivo especial donde (suponiendo que establezca el límite en 500 GB) cuando "gateo" el archivo, generará los 500 GB del archivo y luego se detendrá. Tiene que actuar igual que un archivo real de 500 GB, pero sin ocupar espacio. El contenido de este archivo no importan, que podría ser todos \0's como /dev/null, o simplemente una pequeña cadena que se está enviado una y otra, o lo que sea.

¿Es esto algo factible? La única cosa remotamente cercana que he podido encontrar es hablar de páginas de manual mknod, pero no fueron muy útiles.

Gopher mediocre
fuente

Respuestas:

17

Puede crear un archivo disperso en ciertos sistemas de archivos, que parecerá tener un cierto tamaño, pero en realidad no utilizará tanto espacio en el 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
Ignacio Vazquez-Abrams
fuente
Esto funciona perfectamente En el mejor de los casos, esperaba una solución en la que realmente pudiera escribir cuál es la salida (por ejemplo, para cada posición de búsqueda que mire los datos habría un hash de esa posición o algo por el estilo), pero eso fue bastante allí. Esto definitivamente funciona por ahora, ¡gracias!
Mediocre Gopher
1
@MediocreGopher, ciertamente podrías hacer algo así con FUSE .
cjm
1

Más allá de la solución portátil basada en dd / seek ya mencionada, algunos Unix tienen comandos especializados:

Al menos en Solaris , MacOS / X e Irix :

mkfile -n 500m sparseFile

En HP-UX prealloc , en AIX lmktemp. y muchas distribuciones de Linux se han truncado

jlliagre
fuente
1

Si no necesita buscar de nuevo en el archivo, puede usar una tubería con nombre:

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

Por supuesto, puede usar cualquier otro comando, incluido un script complejo, para generar datos en la tubería.

jfg956
fuente
0

Bueno, con dd, puede especificar un tamaño de bloque y un recuento, y así limitar el tamaño de esta manera:

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

Si desea leer de él, simplemente póngalo:

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

En el pasado, cada instalación de Linux que hice incluía algunas herramientas de red, portmap, inet.d y demás, y en inet.d, donde algunos servicios siempre especificaban, uno de ellos se describía / llamaba chargen, si no recuerdo mal.

(... un minuto después ...)

Si. En / etc / services, encontrará

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

Así que supongo que es un servicio para probar algo, y que envía caracteres, quizás al azar, a través de la red. Solo encuentro /etc/xinet.d/chargen en mi PC. Hay más información:

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

Sin embargo, no sé cómo usarlo para su propósito.

usuario desconocido
fuente