dd no disco inteiro, mas não quero parte vazia

dd no disco inteiro, mas não quero parte vazia

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

Preciso criar uma imagem para armazenar em nosso servidor de arquivos para usar no flash de outros dispositivos que estamos fabricando, então quero apenas o espaço usado (apenas cerca de 4 GB). Quero manter o mbr etc... pois este dispositivo deve estar pronto para inicialização assim que a cópia for concluída.

Alguma ideia? Eu já estava usando o dd if=/dev/sda of=[//fileserver/file], mas naquela época minha cópia master estava em um flash ide de 4 GB.

Responder1

Antigamente, tive 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 morra. Exclua asdf.txt.

Você acabou de escrever zeros em todo o espaço livre do dispositivo.

Agora pegue uma imagem de disco e execute-a através do gzip. Voila, 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, tirar a imagem do disco.

Nota: Pode ser perigoso para SSD, o usuário deve considerar esta operação antes de confirmar.

Responder2

Supondo que você queira salvar /dev/sdXNe /tgtfs/image.rawseja root:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. Use zerofill, zerofreeou apenas:
    dd if=/dev/zero of=/srcfs/tmpzero.txt
    para preencher blocos não utilizados com zero; espere que ele preencha completamente o sistema de arquivos:
    rm /srcfs/tmpzero.txt

  3. Pegue a imagem com dd e use conv=sparse para inserir zeros instantaneamente:
    dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw

Se você quiser usar compactação, não precisa inserir zeros com dd, pois os blocos de zero são altamente compressíveis:

dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw

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 isso causará gravação extensa ao seu SSD e reduza sua vida útil. (mas está tudo bem para transferência ocasional de dados)

Responder3

Use dd, com a opção de contagem.

No seu caso, você estava usando o fdisk, então adotarei essa abordagem. Seu "sudo fdisk -l" produziu:

    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

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,3GB)

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:

    sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526

Onde -bs é o tamanho do bloco (é mais fácil usar a unidade que o fdisk usa, mas qualquer unidade serve, 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).

Responder4

Você não pode. ddé uma ferramenta de nível muito baixo e não tem como distinguir entre arquivos e espaços vazios.

Por outro lado, o espaço vazio será compactado muito, muito bem, então se você estiver preocupado apenas com o espaço de armazenamento, e não, por exemplo, com o tempo de gravação, basta canalizá-lo através do gzip.

informação relacionada