Eu tenho um disco, digamos /dev/sda.
Aqui está fdisk -l:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
Eu preciso fazer uma imagem para armazenar em nosso servidor de arquivos para usar no flashing de outros dispositivos que estamos fabricando, então quero apenas o espaço usado (apenas cerca de 4 gb). Eu quero manter o mbr etc... pois este dispositivo deve estar pronto para inicializar assim que a cópia for concluída.
Alguma ideia? Eu já estava usando dd if=/dev/sda of=[//fileserver/file]
, mas naquela época, minha cópia master estava em um flash ide de 4 gb.
Antigamente eu me deparei com um problema semelhante com distribuições Linux incorporadas - livre-se de todo o lixo antes de compactar a imagem.
dd if=/dev/zero of=asdf.txt
. Espere até que ele morra. Excluir asdf.txt.Você acabou de escrever zeros em todo o espaço livre no dispositivo.
Agora pegue uma imagem de disco e execute-a através do gzip. Voilá, imagem esparsa.
Provavelmente não escala muito bem e pode causar problemas se você realmente precisar gravar no disco, mas ei.
Você pode tirar um instantâneo rsync do disco para outro volume, zerá-lo e, em seguida, obter essa imagem de disco.
Nota: Pode ser perigoso para SSD, o usuário deve considerar esta operação antes de confirmar.
Supondo que você queira salvar e
/dev/sdXN
seja/tgtfs/image.raw
root:mkdir /srcfs && mount /dev/sdXN /srcfs
Use
zerofill
ou apenas:dd if=/dev/zero of=/srcfs/tmpzero.txt
para preencher com zero blocos não utilizados; espere que ele preencha o sistema de arquivos completamente então:
rm /srcfs/tmpzero.txt
Pegue a imagem com dd e use conv=sparse para perfurar zeros rapidamente:
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
Se você deseja usar compactação, não precisa perfurar os zeros com dd, pois os blocos de zero são altamente compressíveis:
PS: Você deve observar que não é uma boa ideia fazer isso (preencher o sistema de arquivos com zeros) em uma mídia de armazenamento baseada em memória flash (ou seja, seu sistema de arquivos de origem sendo um SSD) regularmente, pois causará gravação extensa ao seu SSD e reduzir sua vida útil. (mas tudo bem para transferências ocasionais de dados)
Use dd, com a opção de contagem.
No seu caso, você estava usando o fdisk, então vou adotar essa abordagem. Seu "sudo fdisk -l" produzido:
As duas coisas que você deve observar são 1) o tamanho da unidade e 2) a coluna "Fim". No seu caso você tem cilindros iguais a 8225280 Bytes. Na coluna "Fim", sda8 termina em 525 (que é 525[unidades]*16065*512 = ~4,3 GB)
dd pode fazer muitas coisas, como iniciar após um deslocamento ou parar após um número específico de blocos. Faremos o último usando a opção count em dd. O comando apareceria da seguinte forma:
Onde -bs é o tamanho do bloco (é mais fácil usar a unidade que o fdisk usa, mas qualquer unidade o fará desde que a opção count seja declarada nessas unidades), e count é o número de unidades que queremos copiar (observe que incrementamos a contagem em 1 para capturar o último bloco).
Embora seja possível
/dev/zero
usar o espaço livre em disco e usardd conv=sparse
/gz -c
, em discos enormes com espaço vazio rodando em 100s de GBs,/dev/zero
o ing é dolorosamente lento - sem mencionar que, como outras respostas notaram,/dev/zero
ing um SDD até EOF.Aqui está o que eu fiz quando me deparei com esta situação:
Em um live CD do lubuntu, usado
gparted
para 'encolher' o disco ao tamanho mínimo possível, deixando o restante do espaço não alocadoUsado
dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz
para criar a imagem compactada rapidamente (desnecessário dizer, você pode querer pular a compactação se tiver espaço suficiente para armazenar dados brutos (ou estiver inclinado a reduzir o carregamento da CPU)dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY
para copiar os dados de volta para um disco diferentegparted
novamente para 'expandir' a partiçãoEu não tentei para várias partições, mas acredito que o processo acima pode ser adaptado para copiar 'partições' se a tabela de partição no disco de destino for criada primeiro e apenas os dados contidos na partição forem copiados por meio
dd
de deslocamentos de leitura/gravação (skip
/seek
opção dedd
, respectivamente) seria necessária conforme apropriado.Você não pode.
dd
é uma ferramenta de nível muito baixo e não tem como distinguir entre arquivos e espaço vazio.Por outro lado, o espaço vazio será compactado muito, muito bem; portanto, se você estiver preocupado apenas com o espaço de armazenamento, não, por exemplo, com o tempo de gravação, basta canalizá-lo através do gzip.
Supondo que o resto da unidade esteja vazia (todos os zeros), você pode canalizar seu DD através do gzip, o que deve compactar o espaço vazio muito bem. Você pode usar uma ferramenta como zerofree para garantir que seu espaço vazio esteja realmente em branco para que seja compactado bem.
Se você usar uma ferramenta como partimage , clonezilla ou algumas das outras ferramentas de clonagem do linux, elas lidarão com a maior parte disso para você automaticamente.
A resposta aceita não está correta. Eu concordo com o comentário acima. Eu uso dd com parâmetro de contagem para fazer backup do meu disco regularmente. Basta substituir o BACKUP_FOLDER e a letra do seu dispositivo por "X":
Defina o último bloco usado do disco:
Em seguida, clonando o disco (excluindo o espaço vazio):