如何使用 dd 备份 Linux / UNIX 文件系统?
dd 命令是一款集复制文件、转换和格式化于一体的工具,可根据选项进行操作。由于 Linux(和其他 UNIX 版本)将所有内容视为文件,因此 dd 的效果非常好。请注意,dd 并非专门为备份目的而创建,但它是一款非常方便的工具。几个月前,我刚接触 HP-UX,无法理解 HP-UX 磁带设备,因此我使用 dd 创建备份。后来,当我获得磁带设备名称的信息时,我改用古老的 tar 和其他转储命令
dd 命令语法
dd 的语法如下:
dd if=输入文件名 of=输出文件名
dd 命令示例
因此,在 Linux 下备份 /dev/hda3 的命令应如下,即使用 dd 进行 Linux 文件系统备份:
# dd if=/dev/hda3 of=/backup/myhostname-15-nov-05-hda3.bak.dd
但是,如果您计划在后台运行 dd,并且希望终止它或想要向正在运行的 dd 进程发送 SIGUSR1 信号,那么您需要按如下方式启动 dd(这非常有用):
# dd if=/dev/hda3 of=/backup/myhostname-15-nov-05-hda3.bak.dd; dpid=$!
现在使用 kill 命令如下:
# kill -USR1 $dpid; sleep 5; kill $dpid
dd 命令备份引导加载程序/MBR
dd 也可用于备份您的引导加载程序(如果您在 Linux 之后安装 Windows,它将破坏 grub/lilo 引导加载程序):
# dd if=/dev/hdX of=/backup/mbr.bak bs=512 count=1
您可以使用以下 dd 命令恢复 MBR:
# dd if=/backup/mbr.bak of=/dev/hdX bs=512 count=1
注意将 hdX 替换为您的实际设备名称。但我更喜欢使用grub-install。
请注意,dd 还能够读取在其他 UNIX 上创建或以非 Unix 格式编写的磁带(例如 Windows 2000 服务器)。
以下是 Solaris UNIX 的一个实际示例:
将除标签之外的所有内容从磁盘复制到磁带,即在磁盘和磁带之间以 512 KiB 块为单位复制数据,但不保存或恢复:
# (dd bs=4k skip=1 count=0 && dd bs=512k) </dev/rdsk/c0t1d0s2 >/dev/rmt/0
从磁带复制回磁盘,但保留磁盘标签(恢复):
# (dd bs=4k seek=1 count=0 && dd bs=512k) < /dev/rmt/0 >/dev/rdsk/c0t1d0s2
使用 dd 命令备份整个磁盘/分区
将 /dev/hda 备份到 /dev/hdb:
# dd if=/dev/hda of=/dev/hdb conv=noerror,sync
其中,
- /dev/hda:源磁盘
- /dev/hdb:目标磁盘
- sync:对数据和元数据使用同步 I/O
- noerror:读取错误后继续复制操作
上述命令仅在两个磁盘大小和 C/H/S 几何结构相同时才有效。我强烈建议使用分区级备份。dd 是一个易于使用(真正救命的)命令。请阅读 dd 的手册页以了解更多信息。
$ man dd