Criando um arquivo “falso” arbitrariamente grande

16

Eu gostaria de criar um arquivo especial semelhante a /dev/null ou /dev/random , onde o arquivo não existe, mas você pode ler tudo da mesma maneira, exceto que eu poderia realmente definir um limite para o aparente tamanho do arquivo.

Para colocar de outra forma, eu quero criar um arquivo especial onde (assumindo que eu coloquei o limite de 500GB) quando eu "cat" o arquivo que irá produzir todos os 500GB do arquivo e depois parar. Ele precisa agir da mesma forma que um arquivo real de 500 GB, mas sem ocupar o espaço. O conteúdo deste arquivo não importa, pode ser todo /dev/null como mknod , ou apenas uma pequena string sendo enviada repetidamente, ou o que for.

Isso é algo que pode ser feito? A única coisa que remotamente consegui encontrar são man pages falando sobre %code% , mas eles não ajudaram muito.

    
por Mediocre Gopher 10.05.2012 / 04:09

4 respostas

17

Você pode criar um arquivo esparso em determinados sistemas de arquivos, que aparecerão para ter um determinado tamanho, mas na verdade não usará tanto espaço no 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
    
por 10.05.2012 / 04:26
1

Além da solução portátil baseada em dd / seek já mencionada, alguns Unixes possuem comandos especializados:

Pelo menos no Solaris , MacOS / X e Irix :

mkfile -n 500m sparseFile

No HP-UX pré-aloc , no AIX lmktemp. e muitas distribuições do Linux têm truncado

    
por 10.05.2012 / 08:14
1

Se você não precisar buscar novamente no arquivo, poderá usar um canal nomeado:

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

Claro, você pode usar qualquer outro comando, incluindo um script complexo, para gerar dados no pipe.

    
por 19.05.2012 / 22:28
0

Bem, com o dd, você pode especificar um tamanho de bloco e uma contagem e, assim, limitar o tamanho assim:

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

Se você quiser ler a partir dele, apenas canalize:

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

Antigamente, toda instalação do linux que eu fazia vinha com algumas ferramentas de rede, portmap, inet.d e tal, e no inet.d, onde alguns serviços sempre eram especificados, um deles era descrito / chamado chargen, se eu lembre-se corretamente.

(... um minuto depois ...)

Sim. Em / etc / services, você encontra

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

Então eu acho que é um serviço para testar algo, e que envia caracteres - talvez aleatórios - pela rede. Eu só encontro /etc/xinet.d/chargen no meu PC. Existem mais informações:

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

No entanto, não sei como usá-lo para o seu propósito.

    
por 10.05.2012 / 04:20