Creating Disk Images Raw

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](http://en.wikipedia.org/wiki/Loop_device) 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](http://www.mondorescue.org/) 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`:

```bash
[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