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.

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

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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.