6.12 用dd克隆磁盘

同硬盘和分区打交道时,我们可能需要创建所有分区的副本或备份,而不仅仅是复制内容(不仅是各个硬盘分区,而且包括引导记录、分区表等信息)。这时,我们就可以使用dd命令,它能够用于克隆任何类型的磁盘,如硬盘、闪存、CD、DVD以及软盘等。

6.12.1 预备知识

dd命令原意是Data Definiton。由于不正确的使用会导致数据丢失,因此它获得了Data Destroyer这一谑称。使用dd的时候,要留意参数的顺序。错误的参数会损毁全部数据。dd基本上算是一个比特流复制器(bitstream duplicator),它可以将来自磁盘的比特流写入文件,也可以将来自文件的比特流写入磁盘。让我们来看看dd的用法。

6.12.2 实战演练

dd的语法如下:

  1. $ dd if=SOURCE of=TARGET bs=BLOCK_SIZE count=COUNT

其中:

  • if代表输入文件或输入设备路径;

  • of代表目标文件或目标设备路径;

  • bs代表块大小(通常以2的幂数形式给出,如512、1024、2048等)。COUNT是需要复制的块数(整数)。

需要复制的字节总数 = 块大小 * COUNT

bscount都是可选的。

通过指定COUNT,我们可以限制从输入文件复制到目标的字节数。如果不指定COUNTdd会对输入文件进行复制,直到遇见文件结束标志(EOF)为止。

要将一个分区复制到文件中,可以使用:

  1. # dd if=/dev/sda1 of=sda1_partition.img

该命令中的 /dev/sda1是该分区的设备路径。

用备份恢复分区:

  1. # dd if=sda1_partition.img of=/dev/sda1

要留心ifof参数。错误使用会造成数据丢失。

将设备路径 /dev/sda1修改成适合的路径,就可以复制或恢复任何磁盘。

如果要永久性删除一个分区中所有的数据,我们可以用dd向该分区中写入0值,命令如下:

  1. # dd if=/dev/zero of=/dev/sda1

/dev/zero是一个字符设备。它总是返回字符 '\0'

在容量相同的硬盘间进行克隆:

  1. # dd if=/dev/sda of=/dev/sdb

其中,/dev/sdb是第二个硬盘。

要制作CD ROM的镜像(ISO文件),方法如下:

  1. # dd if=/dev/cdrom of=cdrom.iso

6.12.3 补充内容

如果将文件系统创建在一个由dd生成的文件中,那么我们可以将它挂载到挂载点上。下面让我们看看使用方法。

挂载镜像文件

用环回(loopback)的方法可以将任何由dd生成的文件镜像进行挂载,这是用mount命令的-o loop实现的。

  1. # mkdir /mnt/mount_point
  2. # mount -o loop file.img /mnt/mount_point

这样,我们就可以通过 /mnt/mount_point来访问镜像文件的内容了。

6.12.4 参考

3.12节讲解了如何利用dd从CD中创建一个ISO文件。