如何在 Linux 中安全使用 dd 命令,避免磁盘数据丢失

使用 Linux dd 工具安全可靠地制作驱动器、分区和文件系统的完美副本。
286 位读者喜欢这篇文章。
Perl tricks for system administrators

Opensource.com

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

恢复很简单:实际上,您只需反转 ifof 的值即可。在本例中,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,您就没剩下太多借口了。它真的不难,但要小心。祝你好运!

标签
David Clinton
DAVID CLINTON 是一位系统管理员、教师和作家。他管理、撰写并创建了许多重要技术主题的培训材料,包括 Linux 系统、云计算(尤其是 AWS)和 Docker 等容器技术。

11 条评论

我使用 dd 的 "status=progress" 命令行选项来监控进度,而不是使用 Pipe Viewer。

“在所有这些时间里,没有任何工具能比它更好地完成这项工作”

我猜这很主观,但我实际上认为 GNU ddrescue (https://gnu.ac.cn/software/ddrescue/) 和 dd_rescue (http://www.garloff.de/kurt/linux/ddrescue/) 比普通的 dd 更好用。

我对 GNU ddrescue 更熟悉,但两者都使用了比 dd 更合理的默认块大小,在发生错误时会继续运行,显示进度,并在您尝试覆盖磁盘或分区时发出警告。

而且,如果您喜欢更可视化的工具,那么可以使用 Clonezilla (http://clonezilla.sourceforge.net/)。

话虽如此,由于我通常坚持使用 dd,因为它默认安装在我们的大多数系统中,我想分享一个技巧:如果您已经启动了 dd,并且不想停止它并使用 pv 再次启动它,您可以从另一个控制台让它告诉您运行到哪里了 'kill -USR1 $(pidof dd)'。

干杯。

关于 status=progress 的观点很好 - 我之前没有注意到。
谢谢,

status=progress 仅在较新版本的 dd 上可用。在较旧的发行版中,该选项不存在。

LVM 卷有什么特别的注意事项吗?谢谢。

当然还有 count= 选项。对于清除以前是 raid 阵列一部分或 Linux 无法识别的格式的驱动器上的分区表非常方便。

dd bs=512 if=/dev/zero count=4 of=/dev/sdb

在过去,当备份到磁带时,我们曾经使用 dd 作为 tar 或 cpio 的输出管道。流式磁带就像连续的数据流,而 tar、cpio 等在处理大量小文件时效果不佳。
当数据流耗尽时,这会导致磁带驱动器“鞋油式抛光”磁带头,因为它需要停止磁带、倒带并在每次数据流开始时重新启动。(由于磨损和拉伸,这对驱动器和磁带都不利。)

cpio -ov --format=crc

糟糕!上面的命令行被截断了,因为它有一个小于重定向符号,对输入进行了清理。

cpio -ov --format=crc (小于符号在此)/tmp/dumplist | dd obs=128k of=/dev/st0

我希望这能通过。

强烈建议在执行此命令之前将要备份的磁盘以只读方式挂载。否则,您可能会在备份运行时(由于同步操作)在 lost and found 中最终得到大量文件

强烈建议添加

mount -o ro,remount /dev/partitionwhateveryouwanttobackup

嗨,

home 不能与设备 (sda) 在同一设备上

# dd if=/dev/sda of=/home/username/sdadisk.img

这是一个很好的观点。但是当前的根设备不一定是 sda。我遇到过一些工作站,由于各种原因,根设备是 sdb 甚至更高。

回复 ,作者 Jalal

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.