Criando um arquivo "falso" arbitrariamente grande

16

Gostaria de criar um arquivo especial semelhante a /dev/nullou /dev/random, onde o arquivo realmente não existe, mas você pode ler o mesmo, exceto que, na verdade, eu poderia definir um limite para o tamanho aparente do arquivo.

Em outras palavras, quero criar um arquivo especial em que (supondo que eu defina o limite de 500 GB) quando "catar" o arquivo, ele produzirá todos os 500 GB do arquivo e depois parará. Ele precisa agir da mesma forma que um arquivo real de 500 GB, mas sem ocupar espaço. O conteúdo deste arquivo não importa, pode ser \0como /dev/null, ou apenas uma pequena string sendo enviada repetidamente, ou o que for.

Isso é algo que é possível? A única coisa remotamente próxima que consegui encontrar são as páginas de manual mknod, mas essas não foram muito úteis.

Gopher medíocre
fonte

Respostas:

17

Você pode criar um arquivo esparso em certos sistemas de arquivos, que parecerão ter um determinado tamanho, mas na verdade não usarão 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
Ignacio Vazquez-Abrams
fonte
Isso funciona perfeitamente. Na melhor das hipóteses, eu esperava uma solução em que eu pudesse realmente escrever qual é a saída (como, para cada posição de busca que você olha para os dados, haveria um hash dessa posição ou algo nesse sentido), mas isso era bastante claro há. Isso definitivamente funciona por enquanto, obrigado!
Gopher medíocre
11
@ MediocreGopher, você certamente poderia fazer algo assim com o FUSE .
Cjm
1

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

Pelo menos no Solaris , MacOS / X e Irix :

mkfile -n 500m sparseFile

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

jlliagre
fonte
1

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

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

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

jfg956
fonte
0

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

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

Se você quiser ler, basta canalizar:

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

Antigamente, todas as instalações Linux que eu fazia vinham com algumas ferramentas de rede, portmap, inet.d e outras, e no inet.d, onde alguns serviços sempre especificados, um deles foi descrito / nomeado chargen, se bem me lembro.

(... 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. Só encontro o /etc/xinet.d/chargen no meu PC. Há 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 seu propósito.

Usuário desconhecido
fonte