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