How can I split a drive image created with 'dd' into separate files for each partition?

I created an image of a failing drive with:

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

The drive had only two partitions:

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

How can I split the image (image001.dd) into two or three files (1: MBR; 2: Partition 1; 3: Partition 2) so that I can mount the filesystems in it?

A solution I've found that wouldn't work for me is to use split to create many 512K files, then cat them back together into three files (1: 512K, 2: 105M, 3: the rest), but I don't have the disk space for that.

History:
I have already copied the entire image to a new drive, and it boots and mostly works. It seems that the FS was corrupted on the old failing drive, and dd copied the corrupted parts (as it should), and I wrote them to the new drive. My solution is to mount the FS that I copied and the copy just the files (using rsync or something) so that hopefully I won't copy the bad bits.

UPDATE 1: I've tried dd if=/mnt/image001.dd of=/mnt/image001.part1.dd bs=512 count=204800 skip=1 but mount complains that NTFS signature is missing, so I think I didn't do it right.


You don't need to split this at all.

Use parted to get details about the partition table:

parted image001.dd

In parted, switch to byte units with the command u, then B. After that, issue the command print.

You will get an output that looks like this (output is from an actual system, not an image):

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)

You can use the Start number as an offset for a loopback mount:

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

would mount the third partition at /mnt/rescue.


It's much better to simply use kpartx tool.

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
    ...

Example:

# 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)

At this point I can mount /dev/mapper/loop0p2.

After unmounting call kpartx -d whole_disk to clean up.