本文节选自 Manning 出版的 Linux in Action 第 4 章。
无论您是尝试从即将报废的存储驱动器中抢救数据、将存档备份到远程存储,还是在其他地方制作活动分区的完美副本,您都需要知道如何安全可靠地复制驱动器和文件系统。幸运的是,dd
是一个简单而强大的镜像复制工具,它已经存在很长时间了,几乎是永远。在所有这些时间里,没有出现任何能更好地完成这项工作的工具。
制作驱动器和分区的完美副本
如果您深入研究,您可以使用 dd
做各种各样的事情,但它最擅长的是让您玩转分区的方式。您当然可以使用 tar
甚至 scp
通过从一台计算机复制文件,然后将它们原样粘贴到另一台计算机上的全新 Linux 安装上来复制整个文件系统。但是,由于这些文件系统存档不是完整的镜像,它们需要在两端都有运行的主机操作系统作为基础。
另一方面,使用 dd
可以制作几乎任何数字内容的完美字节对字节的镜像。但是在您开始将分区从地球的一端扔到另一端之前,我应该提到一个古老的 Unix 管理员笑话是有一定道理的:“dd 代表 disk destroyer(磁盘破坏者)。” 如果您在 dd
命令中输入哪怕一个错误的字符,您都可以立即永久地擦除整个驱动器上的宝贵数据。是的,拼写很重要。
请记住:在按下 Enter 键调用 dd
之前,请暂停并非常仔细地思考!
基本 dd 操作
现在您已经得到了充分的警告,我们将从一些简单的事情开始。假设您想要创建指定为 /dev/
sda
的整个数据磁盘的精确镜像。您已经插入了一个空驱动器(理想情况下具有与您的 /dev/
sda
系统相同的容量)。语法很简单:if=
定义源驱动器,of=
定义您要保存数据的文件或位置
# dd if=/dev/sda of=/dev/sdb
下一个示例将创建 /dev/
sda
驱动器的 .img 存档,并将其保存到您的用户帐户的主目录
# dd if=/dev/sda of=/home/username/sdadisk.img
这些命令创建了整个驱动器的镜像。您也可以专注于驱动器中的单个分区。下一个示例就是这样做的,并且还使用 bs
来设置一次复制的字节数(在本例中为 4,096)。调整 bs
值可能会影响 dd
操作的整体速度,尽管理想的设置将取决于您的硬件配置和其他考虑因素。
# dd if=/dev/sda2 of=/home/username/partition2.img bs=4096
恢复很简单:实际上,您颠倒了 if
和 of
的值。在这种情况下,if=
采用您要恢复的镜像,of=
采用您要将镜像写入的目标驱动器
# dd if=sdadisk.img of=/dev/sdb
您还可以一步完成创建和复制操作。例如,此示例将使用 SSH 创建远程驱动器的压缩镜像,并将生成的存档保存到您的本地计算机
# ssh username@54.98.132.10 "dd if=/dev/sda | gzip -1 -" | dd of=backup.gz
您应该始终测试您的存档以确认它们是否正常工作。如果您创建的是启动盘,请将其插入计算机并查看它是否按预期启动。如果是普通数据分区,请挂载它以确保文件既存在又可以适当访问。
使用 dd 擦除磁盘
多年前,我有一个朋友负责其政府海外大使馆的安全。他曾经告诉我,在他监管下的每个大使馆都配备了官方政府配发的锤子。为什么?以防万一该设施有被不友好人员占领的风险,锤子用来摧毁他们所有的硬盘驱动器。
什么?为什么不直接删除数据?您在开玩笑吧?每个人都知道,从存储设备中删除包含敏感数据的文件实际上并不会删除数据。如果有足够的时间和动机,几乎任何东西都可以从几乎任何数字媒体中检索出来,可能只有那些被好好锤过的除外。
但是,您可以使用 dd
使坏人更难获取您的旧数据。此命令将花费一些时间在 /dev/sda1
分区的每个角落和缝隙中写入数百万个零
# dd if=/dev/zero of=/dev/sda1
但这会变得更好。使用 /dev/
urandom
文件作为您的源,您可以使用随机字符覆盖磁盘
# dd if=/dev/urandom of=/dev/sda1
监控 dd 操作
由于磁盘或分区归档可能需要很长时间,您可能想要为您的命令添加一个进度监视器。安装 Pipe Viewer(在 Ubuntu 上使用 sudo apt install pv
),并将其插入 dd
。使用 pv
,最后一个命令可能看起来像这样
# dd if=/dev/urandom | pv | dd of=/dev/sda1
4,14MB 0:00:05 [ 98kB/s] [ <=> ]
推迟备份和磁盘管理?有了 dd,您就没有太多借口了。这真的不难,但要小心。祝你好运!
11 条评论