Linux 中的 'dd' 命令9 2024年10月 | 阅读 9 分钟 引言在传统的 Unix 和类 Unix 操作系统中,'dd' 是一个通过命令行进行接口的实用程序,它提供了转换和复制的功能。值得注意的是 'dd' 命令的一个特性,它区别于大多数 Unix 命令,即命令行中指定的选项是通过将待定选项与值相等来设置的。 'dd' 是一个适用于 Unix、Plan 9、Inferno、类 Unix 操作系统等的工具;其目标是转换和复制文件。在 Unix 系统中,任何与硬件相关的东西,如硬盘驱动器和特定的设备文件,在操作系统看来都像文件一样;为此,即使是 dd 也可以读写上述文件,前提是该功能在驱动程序级别实现。 ![]() 因此,dd 可用于诸如备份硬盘启动扇区或获取一定量的随机数据等操作。dd 程序还能够在复制数据时进行转换,如字节交换和 ASCII/EBCDIC 文本转换。 历史后来,在 1974 年,dd 命令成为 1974 年版本 5 Unix 的一部分,其规范也已开发完成。Dennis Ritchie 本人表示,这个名字来源于 IBM 作业控制语言 (JCL) 中的 DD 语句,其中 DD 代表“数据定义”。 根据 Douglas McIlroy 的说法,可以得出结论:“dd 最初是为了将文件从 DEC 计算机的 ASCII、小端、字节流环境转换为 IBM 的 EBCDIC、大端、阻塞环境”;这就是为什么该实用程序的语法反映了其文化背景。Eric S. Raymond 说,“界面设计显然是一个玩笑”,因为其代码编写方式在语法上比其他 Unix 命令更像 JCL 语句。 1987 年,该命令 dd 在 1987 年 X/Open 可移植性指南第二版中被描述。这被 IEEE Std 1003. POSIX 1-2008,或简称 POSIX,即单一 UNIX 规范的基础规范所继承。David MacKenzie 于 1990 年宣布了 GNU fileutils,并演变成了 coreutils,其中包含了 dd 命令。 它由 Paul Rubin、David MacKenzie 和 Stuart Kemp 完成。因此,1991 年之后,它的维护者一直是 Jim Meyering。Plan 9 的第二版于 1995 年发布,新版本提供了一个常规 shell 接口来访问 dd 命令,这与 Plan 9 第一版中类 JCL 语句的语法不同。至少自 1999 年以来,就有适用于 UnxUtils 下 Microsoft Windows 的原生 Win32 移植版本。dd 有时被称为“磁盘毁灭者”。借助这个实用程序,用户可以通过输入错误来删除驱动器。 用途从硬盘驱动器开始的硬件的每一个低级和高级设备驱动程序,以及其他特定的设备文件,如 '/dev/zero' 和 '/dev/random',都与其他普通的 Unix 系统树文件一样。只要使用这些由文件驱动程序开发出来的文件,并且 'dd' 实用程序能够对其进行读写,那么它就能有效工作。 因此,它成为一个多功能工具,可用于复制硬盘的引导扇区或生成所需大小的二进制文件,其中填充了随机字节。还应指出的是,借助 'dd',数据在复制过程中至少可以进行一次转换,并且在传输过程中进行。 ![]() 其中一些是字节序交换,用于不同字节序的系统,以及从 ASCII 到 EBCDIC 的文本转换。因此,'dd' 适用于数据传输、磁盘克隆以及所有其他需要对传输数据格式进行合理控制的进程。因此,'dd' 成为系统管理员和其他可能需要对 Unix 进行低级二进制数据操作的用户的一个便捷工具。 块大小块是数据单元,它计算一次读取、写入或转换的字节数。Obs 可以与 ibs 一起指定,其中 obs 代表输入/读取的块大小,而 obs 是输出/写入的块大小,尽管 bs 会优先于 ibs 和 obs。输入和输出块的大小默认定义为 512 字节 - 这当然是磁盘最初的块大小以及 POSIX 的“块”大小。 复制计数选项是以块为单位的,读取跳过计数和写入查找计数也是如此。系统的另一个特性是所谓的“转换块大小”或 cbs。提供给指定块大小功能的选项值被视为十进制基数下的字节数。它还可以包含表示块大小为大于字节的整数倍的后缀。POSIX 只组织了符号 b,代表 512,以及 k 代表 1024。 实现对其他后缀的支持有所不同:例如,BSD 在定义小写 m(兆字节)、g(吉字节)等代表十倍字节、艾字节、拍字节、泽字节和尧字节时,GN 使用 M(兆字节)和 G(吉字节),并使用 kB、MB 和 GB 来表示它们等效的 SI 单位(千字节)。例如,块大小 16M 表示 GNU dd 以兆字节计算,为 16777216 字节,而“3kB”表示块大小为 3000 字节。 ![]() 此外,一些实现使用 x 字符作为块大小和计数参数的乘法运算符。例如,bs=2x80x18b 的含义是 2×80×18×512 = 1474560 字节,这实际上是正确的,等于软盘的 1440 KiB。这在 POSIX 中是必需的,因为标准要求解决方案可衡量。否则,我们可以采用 POSIX shell 算术,它存在于某些实现中,例如 bs=$((2*80*18))b。 就地修改 这意味着我们可以在块设备上使用 'dd 命令' 进行就地写入以更改数据。例如,这会将文件的前 512 字节替换为 null 字节:例如,它会将文件的前 512 字节更改为 null 字节。 所有大小为 512 字节的复杂输入数据都将写入指定的文件路径,并保留文件的初始内容。在这里,我们将指定。 命令 实际上,如果输出文件存在,trunk 选项指示您只写入指定字节的输出文件,并保持其余字节不变。如果未选择此选项,则 dd 将写入一个长度为 512 字节的输出文件。 主引导记录备份和恢复它可用于备份和恢复任何设备区域,包括主引导记录,到文件。复制软盘的前两个扇区 命令 磁盘擦除为了加强安全问题,有时可能需要擦除废弃设备的磁盘。这可以通过从 Unix 特定的文件中“传输数据”来完成。 用于向磁盘写入零。 命令 'dd' 命令用于向磁盘写入随机数据。 命令 与上面示例中显示的数据修改相比,这不正确,因此不需要运行转换选项,因为当 dd 的输出文件是块设备时,它没有影响。 信息检索另一方面,数据恢复是从驱动器读取数据的过程,其中一些区域可能无法读取。dd 非常适合这项工作,因为它提供了灵活的 seek 跳过和其他低级选项。然而,标准的 dd 有一个缺点,即用户必须阅读错误消息,并且可读区域需要用户自己计算。单个块大小同样限制了恢复的粒度,因为必须进行权衡:使用较小的块以获得更好的数据恢复,还是使用较大的块以获得更好的数据恢复速度。 dd_rescue C 程序于 1999 年 10 月开发。它消除了 dd 的转换功能,并支持两个块大小来解决这个问题。如果使用大尺寸读取失败,它将尝试使用小尺寸读取以尽可能多地收集数据。它甚至可以反向运行,“这是 George V. Higgins 的一句话,“技术设备很像汽车;它们也可以反向运行。2003 年,为了执行 dd_rescue,开发了一个 dd_rhelp 脚本来帮助记录已读取的区域。 基准测试驱动器性能创建驱动器基准测试,并以顺序(通常是单线程)方式检查系统对 1024 字节块的读写性能。 写性能 命令 读性能 命令 创建包含随机信息的空文件 使用内核随机驱动程序创建一个包含 100 个随机字节的文件。更准确地说,已生成以下变体: 命令 将文件转换为大写形式 将文件全部大写 命令 进度指示器然而,dd 通常是一个主要用作过滤器的程序,因此它通常不会显示正在进行的进程的进度。它并不总是显示传输的块数,这可以通过向正在运行的 GNU dd 进程发送 USR1 信号来解决。一旦进程 ID dd 替换为 dd-pid,下面的一行命令就会在传输完成之前每十秒输出一次进度。 命令 需要注意的是,GNU dd 较新版本中的 status=progress 选项偶尔会将传输统计信息写入 stderr。 分叉在 Linux 中,当明确提及使用 `dd` 时,分叉是指创建子进程以同时执行多个 'dd' 命令的概念。这种技术可以帮助获得更高的性能,表明使用 CPU 的多个核心的计算可以并行进行,即复制或写入数据。 dcfldddcfldd 是 GNU dd 的一个副本,它是 Nick Harbour 或 DoD 计算机取证实验室(当时是防御性黑客)开发的更高级版本。dcfldd 程序的主要功能包括:
![]() dc3dddc3dd 是美国国防部网络犯罪中心 (DC3) 的 GNU dd 软件的一个分支。它可以被视为 dcfldd 的发展,它规定了在 GNU 上游更新时进行更新的意图。可用的最新版本是 7.0,将于 2023 年 6 月发布,版本 3.1 于 2023 年 4 月发布。 结论'dd' 命令是一个在 Linux 和其他类 Unix 操作系统中可用的应用程序,其一些用途包括磁盘映像创建、备份、在原始设备上写入数据等等。因此,它适用于系统管理领域,因为它非常灵活,但使用时,数据丢失的风险是不可避免的。 下一主题Linux 文本编辑器 |
我们请求您订阅我们的新闻通讯以获取最新更新。