O que você está se referindo é conhecido como um arquivo "esparso".
De esta página
Sparse files are basically just like any other file except that blocks that only contain zeros (i.e., nothing) are not actually stored on disk. This means you can have an apparently 16G file – with 16G of “data” – only taking up 1G of space on disk.
Para criar um usando dd
, você pode usar o parâmetro seek=
:
dd if=/dev/zero of=sparse-file bs=1 count=1 seek=1024k
Os parâmetros seek
e bs
informam simplesmente para buscar o final do arquivo após 1 bloco, o que deve fornecer um arquivo esparso que você pode, em seguida, vincular, se desejar.
Isto lhe dará um arquivo completamente vazio que não ocupa espaço no disco até que seja realmente gravado. Sua criação também deve ser quase instantânea.
- = EDIT = -
Se você quiser um arquivo alocado e não se importar com o conteúdo até que você o escreva, precisará de um arquivo esparso, mas geralmente por motivos de segurança do sistema de arquivos ele é considerado "de má forma" para permitir que um aplicativo não privilegiado crie um arquivo usando dados que já existem no disco.
Isso porque, se um aplicativo userland puder fazer isso, ele poderá expor dados confidenciais de outros usuários alocando um arquivo do tamanho de todo o espaço livre em um disco e vasculhando-o procurando senhas e outros dados confidenciais que outro usuário pode ter salvo, copiado ou excluído.
Isso é um projeto incorreto explícito em sistemas operacionais que gostam de pensar em si mesmos como seguros e que nenhum sistema operacional multiusuário moderno fará isso.
Esta é a outra razão pela qual os arquivos esparsos assumem o padrão de zeros ao serem lidos, em vez de permitir a alocação de uma área de disco.
Se você deseja criar um arquivo de dados arbitrários rapidamente sem pré-alocar blocos, você precisa de um arquivo esparso, se você quiser realmente alocar esses blocos, você precisa escrever explicitamente algo dentro deles.