Como posso dividir uma imagem de unidade criada com 'dd' em arquivos separados para cada partição?

9

Criei uma imagem de uma unidade com falha com:

dd if=/dev/sde of=/mnt/image001.dd

A unidade tinha apenas duas partições:

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1   *           1          13      102400    7  HPFS/NTFS
/dev/sde2              13       60802   488282112    7  HPFS/NTFS

Como posso dividir a imagem (image001.dd) em dois ou três arquivos (1: MBR; 2: Partição 1; 3: Partição 2) para que eu possa montar os sistemas de arquivos nela?

Uma solução que eu descobri que não funcionaria para mim é usar splitpara criar muitos arquivos de 512K e catjuntá-los novamente em três arquivos (1: 512K, 2: 105M, 3: o resto), mas não tenho o espaço em disco para isso.

Histórico:
eu já copiei a imagem inteira em uma nova unidade, e ela inicializa e geralmente funciona. Parece que o FS foi corrompido na unidade antiga com falha e ddcopiou as partes corrompidas (como deveria), e eu as escrevi na nova unidade. Minha solução é montar o FS que copiei e copiar apenas os arquivos (usando rsyncou algo assim) para que, esperançosamente , não copie os bits ruins.

ATUALIZAÇÃO 1 : Eu tentei, dd if=/mnt/image001.dd of=/mnt/image001.part1.dd bs=512 count=204800 skip=1mas mountreclamo disso NTFS signature is missing, então acho que não fiz direito.

Joe A
fonte

Respostas:

17

Você não precisa dividir isso.

Use partedpara obter detalhes sobre a tabela de partição:

parted image001.dd

Em parted, alterne para unidades de bytes com o comando u, então B. Depois disso, emita o comando print.

Você obterá uma saída semelhante a esta (a saída é de um sistema real, não de uma imagem):

Model: Virtio Block Device (virtblk)
Disk /dev/vda: 25165824000B
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start         End           Size          Type     File system     Flags
 2      1048576B      400556031B    399507456B    primary  ext4            boot
 3      400556032B    21165506559B  20764950528B  primary  ext4
 1      21165506560B  25164775423B  3999268864B   primary  linux-swap(v1)

Você pode usar o Startnúmero como um deslocamento para uma montagem de loopback:

mount -o loop,ro,offset=400556032 image001.dd /mnt/rescue

montaria a terceira partição em /mnt/rescue.

Sven
fonte
Isso e kpartxresolve meu problema. Eu escolhi essa resposta porque eu imagino que isso partedé mais comum do que kpartx, no entanto, kpartxé um pouco mais fácil.
31512 Joe
16

É muito melhor simplesmente usar a kpartxferramenta.

usage : kpartx [-a|-d|-l] [-v] wholedisk
    -a add partition devmappings
    -d del partition devmappings
    -l list partitions devmappings that would be added by -a
    ...

Exemplo:

# kpartx -l whole_disk # only listing
loop0p1 : 0 518144 /dev/loop0 2048
loop0p2 : 0 3674112 /dev/loop0 520192
# kpartx -a whole_disk 
# file -sL /dev/mapper/loop0p*
/dev/mapper/loop0p1: Linux/i386 swap file (new style), version 1 (4K pages), size 64767 pages, no label, UUID=e4990860-c87d-4850-9e8d-ecb0a0506516
/dev/mapper/loop0p2: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)

Neste ponto eu posso montar /dev/mapper/loop0p2.

Após a desmontagem, ligue kpartx -d whole_diskpara limpar.

Kupson
fonte
1
+1 Isso é bom, nunca ouvi falar dessa ferramenta.
Sven
Tanto esta resposta do SvenW abaixo funciona muito bem! Ambos me permitem montar uma partição na imagem da unidade.
31512 Joe