dd no disco inteiro, mas não quer porção vazia

29

Eu tenho um disco, digamos / dev / sda.

Aqui está o 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 uso em outros dispositivos que estamos fabricando, então eu só quero o espaço usado (apenas cerca de 4GB). Eu quero manter o mbr etc ... como este dispositivo deve estar pronto para inicialização assim que a cópia terminar.

Alguma ideia? Anteriormente, eu estava usando dd if=/dev/sda of=[//fileserver/file] , mas, naquela época, minha cópia principal estava em um ide flash de 4 gb.

    
por Jonathan Henson 17.10.2012 / 00:17

7 respostas

34

De volta ao dia, tive um problema semelhante com as distribuições do Linux embarcadas - livre-se de todo o lixo antes de compactar a imagem.

dd if=/dev/zero of=asdf.txt . Espere até que morra. Apague asdf.txt.

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

Agora pegue uma imagem de disco e execute-a pelo gzip. Voila, imagem esparsa.

Provavelmente não é muito escalável e pode causar problemas se você realmente precisar gravar no disco, mas ei.

Você pode fazer um instantâneo rsync do disco para outro volume, zerar isso e depois capturar essa imagem de disco.

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

    
por 17.10.2012 / 01:37
13

Supondo que você deseja salvar /dev/sdXN a /tgtfs/image.raw e você é root:

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

  2. Use zerofill ou 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 e, em seguida, rm /srcfs/tmpzero.txt )

  3. Pegue a imagem com dd e use conv = sparse para perfurar zeros on-the-fly: dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw

Se você quiser usar a compactação, não será necessário inserir os zeros com dd, pois os blocos zero são altamente compactáveis:

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

PS: Você deve observar que isso não é uma boa ideia em uma mídia de armazenamento baseada em memória flash (ou seja, seu sistema de arquivos de origem seja SSD)

    
por 13.12.2014 / 02:02
8

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:

    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 tomar nota são 1) o tamanho da unidade e 2) a coluna "Fim". No seu caso você tem cilindros que são iguais a 8225280 Bytes. Na coluna "End", 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. Nós 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 fará isso contanto que a opção de contagem seja declarada nessas unidades), e count é o número de unidades que queremos copy (note que incrementamos a contagem em 1 para capturar o último bloco).

    
por 03.06.2017 / 02:33
7

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

Por outro lado, o espaço vazio irá compactar muito, muito bem, se você estiver preocupado apenas com o espaço de armazenamento, não por exemplo escrever tempo, então apenas canalize-o através do gzip.

    
por 17.10.2012 / 00:27
6

Supondo que o restante da unidade esteja vazia (todos os zeros), você poderia canalizar seu DD através do gzip, o que deve comprimir o espaço vazio muito bem. Você pode usar uma ferramenta como zerofree para garantir que seu espaço vazio esteja realmente em branco. comprime bem.

Se você usa uma ferramenta como partimage , clonezilla ou algumas das outras ferramentas de clonagem de linux, elas lidariam com a maioria das isso para você automaticamente.

    
por 17.10.2012 / 00:25
5

Embora /dev/zero do espaço livre em disco e uso dd conv=sparse / gz -c seja possível, em discos enormes com espaço vazio em 100s de GBs, /dev/zero ing é dolorosamente lento - sem mencionar que como outras respostas notaram, /dev/zero um SDD até EOF.

Veja o que fiz quando me deparei com esta situação:

  • Em um CD ao vivo lubuntu, usei gparted para 'encolher' o disco para o tamanho mínimo possível, deixando o resto do espaço não alocado

  • Usado em dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz para criar a imagem de compactação rápida (é desnecessário dizer que você pode pular a compactação se tiver espaço suficiente para armazenar dados brutos (ou se estiver inclinado a reduzir o carregamento da CPU)

  • Usado em dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY para copiar os dados de volta para o disco diferente
  • Usou gparted novamente para "expandir" a partição

Eu não tentei isso 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 somente os dados contidos na partição forem copiados via dd - os deslocamentos de leitura / escrita ( skip / seek opção de dd , respectivamente) seriam necessários conforme apropriado.

    
por 24.06.2016 / 10:19
0

A resposta aceita não está correta. Eu concordo com o comentário acima. Eu uso dd com o parâmetro count para fazer backup do meu disco em uma base regular. Basta substituir o BACKUP_FOLDER e a letra do seu dispositivo por "X":

Definir o último bloco usado do disco:

ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')

Em seguida, clonar o disco (excluindo o espaço vazio):

dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"
    
por 30.10.2018 / 04:27