I have a disk image, it’s a “whole” disk image, e.g., contains multiple partitions, and I want to clone just one of them (not the first one..) onto a partition on an external drive with multiple partitions on it (I’m also not cloning it onto the first partition of the disk…)
FDisk’ing the image gives this:
# fdisk -l 2013-02-09-wheezy-raspbian.img
Disk 2013-02-09-wheezy-raspbian.img: 1939 MB, 1939865600 bytes
255 heads, 63 sectors/track, 235 cylinders, total 3788800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00014d34
Device Boot Start End Blocks Id System
2013-02-09-wheezy-raspbian.img1 8192 122879 57344 c W95 FAT32 (LBA)
2013-02-09-wheezy-raspbian.img2 122880 3788799 1832960 83 Linux
#
and the block device looks like this:
# fdisk -l /dev/sdc Disk /dev/sdc: 8014 MB, 8014266368 bytes 247 heads, 62 sectors/track, 1022 cylinders, total 15652864 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdc1 2048 131071 64512 e W95 FAT16 (LBA) /dev/sdc2 131072 15652863 7760896 83 Linux #
I want the second partition of the image to replace the second partition of the block device. Don’t worry about the trailing corrupted free space, I’ll use GParted to clean that up, and I need it for something else anyway.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
# losetup --find --show --partscan --read-only 2013-02-09-wheezy-raspbian.img /dev/loop7 # dd if=/dev/loop7p2 of=/dev/narnia bs=1M
If --partscan doesn’t work, you can also use one of:
# partx -a /dev/loop7 # kpartx /dev/loop7
or similar partition mapping solutions.
You should probably mount it first just to see if it’s the right thing or what.
Of course you can also read the fdisk output and give dd the skip=131072 or whatever directly, i.e. make it skip that many blocks of input so it starts reading at where the partition is located; but it’s nicer to see actual partitions with a loop device.
Method 2
Something like this should work:
dd if=/path/to/2013-02-09-wheezy-raspbian.img2 of=/dev/sdc2 bs=4096 conv=notrunc,noerror
if= sets the image you want to clone
of= sets the target partition where you want to clone the image
Method 3
- Mount the image as a loopback device:
losetup -fP yourImage.img - You may now access each partition of the image directly. If you must use
dd, you can dodd if=/dev/loop0p1 of=image.img, but I think that you would likecatbetter. In a root shell, simply docat /dev/loop0p1 > image.img. Both examples assume that you want the first partition, and the loopback device you were assigned was/dev/loop0 - Once you are done with the loopback device, you can detach it with
losetup -d /dev/loop0. Once again, this assumes that/dev/loop0is your loopback device.
Method 4
You could do:
sudo partx --add -v 2013-02-09-wheezy-raspbian.img # time sudo dd if=/dev/loop0p1 |pv -s 80M |sudo dd of=/dev/sdc1 time sudo dd if=/dev/loop0p2 |pv -s 4G |sudo dd of=/dev/sdc2 sudo partx --delete -v /dev/loop0
Method 5
You can copy just the second partition to a separate image with this
dd if=2013-02-09-wheezy-raspbian.img of=second.img bs=512 skip=122880
and after that you can copy it in place of the partition on the disk
dd if=second.img of=/dev/sdc2 bs=512
or you can even do it in one command
dd if=2013-02-09-wheezy-raspbian.img of=/dev/sdc2 bs=512 skip=122880
Just make sure that you unmount /dev/sdc2 before you write to it.
Method 6
Here is the easiest solution :
dd skip=122880 count=3788799 status=progress if=2013-02-09-wheezy-raspbian.img of=secondpartition.img
as it shows in the output of fdisk, fdisk is using 512 bytes as the default block size:
# fdisk -l 2013-02-09-wheezy-raspbian.img Disk 2013-02-09-wheezy-raspbian.img: 1939 MB, 1939865600 bytes 255 heads, 63 sectors/track, 235 cylinders, total 3788800 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00014d34
and as it says in the dd command help, 512 bytes is the default value for the switches “bs”, “cbs”, “ibs” and “obs”
bs=BYTES read and write up to BYTES bytes at a time (default: 512);
overrides ibs and obs
cbs=BYTES convert BYTES bytes at a time
conv=CONVS convert the file as per the comma separated symbol list
count=N copy only N input blocks
ibs=BYTES read up to BYTES bytes at a time (default: 512)
if=FILE read from FILE instead of stdin
iflag=FLAGS read as per the comma separated symbol list
obs=BYTES write BYTES bytes at a time (default: 512)
of=FILE write to FILE instead of stdout
oflag=FLAGS write as per the comma separated symbol list
seek=N skip N obs-sized blocks at start of output
skip=N skip N ibs-sized blocks at start of input
status=LEVEL The LEVEL of information to print to stderr;
'none' suppresses everything but error messages,
'noxfer' suppresses the final transfer statistics,
'progress' shows periodic transfer statistics
to confirm that you can use dd itself to create a one block file like this:
dd if=/dev/urandom of=test count=1
The file size should be 512 bytes.
So all you have to do to create an image of a partition or a group of partitions is to get the number of sectors for the start of the partition or first partition from the output of fdisk and use it as the value of the dd parameter “skip” and then the number of sectors for the End of the partition or last partition and set it as the value for the dd parameter “count”.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0