Como posso criar rapidamente um arquivo grande em um sistema Linux ( Red Hat Linux )?
O dd fará o trabalho, mas a leitura /dev/zero
e a gravação na unidade podem demorar muito tempo, quando você precisar de um arquivo com várias centenas de GBs de tamanho para teste ... Se você precisar fazer isso repetidamente, o tempo realmente aumentará.
Não ligo para o conteúdo do arquivo, apenas quero que ele seja criado rapidamente. Como isso pode ser feito?
Usar um arquivo esparso não funcionará para isso. Eu preciso que o arquivo seja alocado em espaço em disco.
linux
file
filesystems
DrStalker
fonte
fonte
df
que reportará? Testando um aplicativo que faz algo em particular. A resposta depende do que você deseja testar. De qualquer forma eu sou um pouco tarde - Vejo agora que tem sido anos desde a sua pergunta :-)Respostas:
dd
das outras respostas é uma boa solução, mas é lenta para esse fim. No Linux (e em outros sistemas POSIX), temosfallocate
, que usa o espaço desejado sem precisar gravá-lo, funciona com os sistemas de arquivos baseados em disco mais modernos, muito rapidamente:Por exemplo:
fonte
fallocate
é exatamente o que eu estava procurando.fallocate
) também não funcionará em um sistema de arquivos Linux ZFS - github.com/zfsonlinux/zfs/issues/326fallocate
faz parte doutil-linux
pacote. Esta ferramenta foi escrito por Karel Zak da RedHat e código-fonte pode ser encontrada aqui: kernel.org/pub/linux/utils/util-linuxEssa é uma pergunta comum - especialmente no ambiente atual de ambientes virtuais. Infelizmente, a resposta não é tão direta quanto se pode imaginar.
O dd é a primeira opção óbvia, mas o dd é essencialmente uma cópia e obriga a escrever todos os blocos de dados (assim, inicializando o conteúdo do arquivo) ... E é essa inicialização que ocupa tanto tempo de E / S. (Deseja demorar ainda mais? Use / dev / random em vez de / dev / zero ! Então você usará a CPU e o tempo de E / S!) No final, porém, dd é uma má escolha (embora essencialmente o padrão usado pela VM "criar" GUIs). Por exemplo:
truncar é outra opção - e provavelmente é a mais rápida ... Mas isso é porque cria um "arquivo esparso". Essencialmente, um arquivo esparso é uma seção do disco que possui muitos dos mesmos dados, e o sistema de arquivos subjacente "trapaceia" ao não armazenar realmente todos os dados, mas apenas "fingindo" que está tudo lá. Portanto, quando você usa truncado para criar uma unidade de 20 GB para sua VM, o sistema de arquivos não aloca 20 GB, mas trapaceia e diz que existem 20 GB de zeros lá, mesmo que apenas uma faixa no disco pode realmente (realmente) estar em uso. Por exemplo:
fallocate é o final - e melhor - escolha para uso com alocação de disco VM, porque é essencialmente "reservas" (ou "aloca" todo o espaço que você está procurando, mas ele não se preocupou em escrever qualquer coisa Então,. quando você usa fallocate para criar um espaço de unidade virtual de 20 GB, você realmente obtém um arquivo de 20 GB (não um "arquivo esparso" e não se preocupa em escrever nada nele - o que significa que praticamente qualquer coisa pode estar presente) lá - como um disco totalmente novo!) Por exemplo:
fonte
truncate
é funcional no JFS;fallocate
, não muito. Um ponto: você não pode incluir um número decimal no número, eu precisava especificar1536G
, não1.5T
.fallocate
página do homem, isso só é suportado embtrfs
,ext4
,ocfs2
exfs
sistemas de arquivosswapon
infelizmente não funciona em extensões pré-alocadas, a última vez que verifiquei. Houve alguma discussão na lista de discussão do XFS sobre ter uma opção de fallocate para expor os dados antigos do espaço livre e não ter a extensão marcada como pré-alocada, para que o swapon funcionasse. Mas acho que nada foi feito./dev/random
pode resultar na falta de dados aleatórios e "Quando o pool de entropia estiver vazio, as leituras de / dev / random serão bloqueadas até que o ruído ambiental adicional seja coletado", portanto, pode levar muito, muito, muito muito tempoLinux e todos os sistemas de arquivos
xfs_mkfile 10240m 10Gigfile
Linux e alguns sistemas de arquivos (ext4, xfs, btrfs e ocfs2)
fallocate -l 10G 10Gigfile
OS X, Solaris, SunOS e provavelmente outros UNIXes
mkfile 10240m 10Gigfile
HP-UX
prealloc 10Gigfile 10737418240
Explicação
Tente
mkfile <size>
myfile como uma alternativa aodd
. Com a-n
opção, o tamanho é anotado, mas os blocos de disco não são alocados até que os dados sejam gravados neles. Sem a-n
opção, o espaço é preenchido com zero, o que significa gravar no disco, o que significa levar tempo.O mkfile é derivado do SunOS e não está disponível em todos os lugares. A maioria dos sistemas Linux possui o
xfs_mkfile
que funciona exatamente da mesma maneira, e não apenas nos sistemas de arquivos XFS, apesar do nome. Está incluído no xfsprogs (para Debian / Ubuntu) ou em pacotes nomeados semelhantes.A maioria dos sistemas Linux também possui
fallocate
, que funciona apenas em determinados sistemas de arquivos (como btrfs, ext4, ocfs2 e xfs), mas é o mais rápido, pois aloca todo o espaço no arquivo (cria arquivos não-holey), mas não inicializa nenhum disso.fonte
mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img
xfs_mkfile
está incluído no xfsprogs no Ubuntu e funciona como um encanto no meu ext3 fs. :)criará um arquivo de 10 M instantaneamente (M significa 1024 * 1024 bytes, MB significa 1000 * 1000 - o mesmo com K, KB, G, GB ...)
EDIT: como muitos apontaram, isso não alocará fisicamente o arquivo no seu dispositivo. Com isso, é possível criar um arquivo grande arbitrário, independentemente do espaço disponível no dispositivo, pois ele cria um arquivo "esparso".
Portanto, ao fazer isso, você estará adiando a alocação física até que o arquivo seja acessado. Se você estiver mapeando esse arquivo para a memória, talvez não tenha o desempenho esperado.
Mas este ainda é um comando útil para saber
fonte
fallocate
resposta abaixo sim.Onde procurar é o tamanho do arquivo que você deseja em bytes - 1.
fonte
truncate
parece ser muito melhor.Exemplos em que procurar é o tamanho do arquivo que você deseja em bytes
Na página de manual do dd:
fonte
truncate
.Para criar um arquivo de 1 GB:
fonte
dd if=/dev/zero of=filename bs=20G count=1
criará apenas arquivos de 2 GB! não 20GB.Não sei muito sobre o Linux, mas aqui está o código C que escrevi para falsificar grandes arquivos no DC Share há muitos anos.
fonte
Você pode usar o comando "yes" também. A sintaxe é bastante simples:
Pressione "Ctrl + C" para interromper isso, caso contrário, ele consumirá todo o seu espaço disponível.
Para limpar este arquivo, execute:
irá limpar este arquivo.
fonte
Eu não acho que você vai ficar muito mais rápido que o dd. O gargalo é o disco; gravar centenas de GB de dados nele vai demorar muito, não importa como você o faça.
Mas aqui está uma possibilidade que pode funcionar para o seu aplicativo. Se você não se importa com o conteúdo do arquivo, que tal criar um arquivo "virtual" cujo conteúdo é a saída dinâmica de um programa? Em vez de abrir () o arquivo, use popen () para abrir um canal para um programa externo. O programa externo gera dados sempre que necessário. Uma vez que o canal está aberto, ele age como um arquivo comum, pois o programa que abriu o canal pode fseek (), rebobinar (), etc. Você precisará usar pclose () em vez de close () quando estiver feito com o cano.
Se o seu aplicativo precisar que o arquivo tenha um determinado tamanho, caberá ao programa externo acompanhar onde está o "arquivo" e enviar um eof quando o "final" for atingido.
fonte
Uma abordagem: se você pode garantir que aplicativos não relacionados não usem os arquivos de maneira conflitante, basta criar um conjunto de arquivos de tamanhos variados em um diretório específico e criar links para eles quando necessário.
Por exemplo, tenha um conjunto de arquivos chamado:
Então, se você tiver um aplicativo que precise de um arquivo 1G chamado / home / oracle / logfile, execute um "
ln /home/bigfiles/1024M-A /home/oracle/logfile
".Se estiver em um sistema de arquivos separado, você precisará usar um link simbólico.
Os arquivos A / B / etc podem ser usados para garantir que não haja uso conflitante entre aplicativos não relacionados.
A operação do link é o mais rápido possível.
fonte
O mkfile da GPL é apenas um wrapper de script (ba) sh em torno do dd; O mkfile do BSD apenas mescla um buffer com diferente de zero e o grava repetidamente. Eu não esperaria que o primeiro superasse o dd. O último pode deixar o dd se = / dev / zero um pouco, pois omite as leituras, mas qualquer coisa que tenha um desempenho significativamente melhor provavelmente está apenas criando um arquivo esparso.
Na ausência de uma chamada de sistema que realmente aloque espaço para um arquivo sem gravar dados (e o Linux e o BSD não possuem isso, provavelmente o Solaris também), você pode obter uma pequena melhoria no desempenho usando ftrunc (2) / truncate (1) para estender o arquivo para o tamanho desejado, mapeie o arquivo na memória e grave dados diferentes de zero nos primeiros bytes de cada bloco de disco (use fgetconf para encontrar o tamanho do bloco de disco).
fonte
Plugue descarado: O OTFFS fornece um sistema de arquivos que fornece arquivos arbitrariamente grandes (bem, quase. Exabytes é o limite atual) de conteúdo gerado. É somente Linux, C simples e no início do alfa.
Consulte https://github.com/s5k6/otffs .
fonte
Este é o mais rápido que pude fazer (o que não é rápido) com as seguintes restrições:
fallocate
não disponível)Esta é a essência disso ...
No nosso caso, isso é para um sistema linux incorporado e isso funciona bem o suficiente, mas prefere algo mais rápido.
Para sua informação, o comando
dd if=/dev/urandom of=outputfile bs=1024 count = XX
era tão lento que não podia ser utilizado.fonte