# Creating Disk Images

## Floppy/CD/DVD drives

### Creating ISOs

The venerable dd is fantastic for this. Let’s say your device is /dev/cdrom:

dd if=/dev/cdrom of=new_cdrom.iso


This will create an ISO9660-compliant image.

### Mounting ISOs

ISO files can be loop mounted like so:

mount -o loop new_cdrom.iso /mount/point


## A random bunch of files/directories

For this example, I want to create an ISO9660-compliant image of a directory, /home/nikhil/Documents:

mkisofs -o /home/nikhil/Documents_backup.iso /home/nikhil/Documents


Important: mkisofs can only create ISOs from directory trees that are a maximum of 6 levels deep! Any more and it will croak.

## Hard Drives

This is quite tricky. You might want to consider Mondo for its awesomeness. While it does create ISOs, their contents are compressed and divvied up into many separate files. If you want an ‘image’ that you can carry around and mount, read on.

### Using dd

Let’s say your HDD is labeled /dev/sdb. You can use dd to create a block-by-block replica image of this drive like so:

dd if=/dev/sdb of=hard_drive_backup.img conv=sync,noerror


Simple, eh? What’s tricky is that dd will go through all blocks, even the unallocated ones. This means that if you have a 300GB drive with just 10GB of data, you’re going to get an image that’s 300GB in size (can you see why Mondo or Ghost make more sense?)

The conv=sync,noerror will tell dd to write ‘something’ to the image in case it encounters a bad block.

#### Speeding up the process

We could use a bigger block size. Using the default 512-byte block size can slow things down considerably.

dd if=/dev/sdb of=hard_drive_backup.img conv=sync,noerror bs=64K


#### Making the process space-efficient

We could also use good ‘ol gzip or bzip2 like so:

dd if=/dev/sdb conv=sync,noerror bs=64K | gzip -c > hard_drive_backup.img.gz


### Mounting a dd image

The resultant image from the previous steps is absolutely not ISO9660-compliant. Any attempts to mount it as such might result in mild embarrassment. To use the image, try fdisk:

[user@localhost mondo_archives]# fdisk -ul hard_drive_backup.img
last_lba(): I don't know how to handle files with mode 81a4
You must set cylinders.
You can do this from the extra functions menu.

Disk hard_drive_backup.img: 0 MB, 0 bytes
255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes

Device Boot           Start        End   Blocks   Id  System
hard_drive_backup.disk1             63      208844   104391   83  Linux
hard_drive_backup.disk2          208845    2313359  1052257+  82  Linux swap / Solaris
hard_drive_backup.disk3         2313360   78156224  37921432+ 83  Linux
Partition 3 has different physical/logical endings:
phys=(1023, 254, 63) logical=(4864, 254, 63)


#### The tricky part

To mount the third partition (you know, the one with all the data on it), you need some quick arithmetic: Multiply the starting cylinder by the block size and use it as the offset for the mount command.

For example: In the output above, the offset would be 512 x 2313360 = 1184440320. You would then use this value like so:

mount -o loop,offset=1184440320 hard_drive_backup.img /mount/point