本文节选自 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 条评论