如何在 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 条评论

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

“在所有这些时间里,没有任何东西能比它做得更好”

我想这是主观的,但我实际上认为 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

© . All rights reserved.