Linux dd 命令是最强大的实用程序之一,可以以多种方式使用。该工具主要用于复制和转换数据,因此它代表数据复制器。该工具可用于:
- 备份和恢复整个硬盘驱动器或分区。
- 创建称为 ISO 文件的 CD 或 DVD 的虚拟文件系统和备份映像
- 复制原始设备文件的区域,例如备份 MBR(主引导记录)。
- 将 ASCII 等数据格式转换为 EBCDIC。
- 将小写转换为大写,反之亦然。
只有超级用户才能执行此命令。使用此命令时应非常小心,因为使用不当可能会导致大量数据丢失。所以,有些人认为这个工具是数据破坏者。
dd 命令的语法
dd 命令的基本用法相当简单,因为它只需要两个参数:if = 指定输入文件和of = 指定输出文件。这些选项的参数可以是文件或块设备。但是,我不建议使用 dd 来复制文件,因为 cp 以更简单的方式进行。但是,您可以使用它来克隆硬盘。语法是
dd if=<source file name> of=<target file name> [Options]
我们将通过 dd 命令示例学习各种选项。
1.备份和恢复整个磁盘或分区
可以将整个磁盘/分区中的所有数据保存到另一个磁盘/分区。不是 cp 命令的简单副本,而是块大小的副本。
a。将整个磁盘备份到磁盘
您可以将所有数据(整个磁盘)从磁盘复制/dev/sda
到/dev/sdb
. dd 对文件系统或分区一无所知;它只会将所有内容从 复制/dev/sda
到/dev/sdb
。您需要使用选项指示要在时间复制的块大小bs
。因此,这将在同一分区上克隆具有相同数据的磁盘。
# dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync
97281+0 records in
97280+0 records out
99614720 bytes (100 MB) copied, 2.75838 s, 36.1 MB/s
这仅在第二个设备与第一个设备一样大或大于第一个设备时才有效。否则,您会在第二个分区上得到截断且毫无价值的分区。这里,if 代表输入文件,of 代表输出文件,bs 代表块大小(一次要读取/写入的字节数)。确保您使用的块大小为 1024 字节的倍数,即 1KB。如果不指定块大小,则 dd 使用 512 字节的默认块大小。conv
值参数noerror允许工具在遇到任何错误时继续复制数据。同步选项允许使用同步 I/O。
b。创建 dd 磁盘映像(文件映像)
您可以创建磁盘映像或文件映像。将磁盘备份到映像将比复制确切的数据更快。此外,磁盘映像使恢复更加容易。
# dd if=/dev/sda of=/tmp/sdadisk.img
您可以将输出文件存储在您想要的地方,但您必须像上面一样给出一个以.img扩展名结尾的文件名。而不是/tmp/sdadisk.img,如果你想,你可以把它存储在/sdadisk.img。
C。创建压缩磁盘映像
因为 dd 创建了整个磁盘的确切内容,这意味着它占用了太多的大小。您可以决定使用以下命令压缩磁盘映像
# dd if=/dev/vda | gzip -c >/tmp/vdadisk.img.gz
管道 | 运算符使左侧命令的输出成为右侧命令的输入。该-c
选项将输出写入标准输出并保持原始文件不变。
d。备份分区或将一个分区克隆到另一个分区
您只能备份一个简单分区,而不是整个磁盘。您只需要在输入文件中指明分区名称,如下所示
# dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror,sync
这会将分区同步/dev/sda1
到/dev/sdb1
. 您必须验证 的大小/dev/sdb1
应大于/dev/sda1
。或者您可以创建一个分区映像,如下所示
# dd if=/dev/sda1 of=/tmp/sda1.img
e. 恢复磁盘或分区映像
如果我们的原始驱动器有任何问题,保存磁盘或分区有助于恢复所有数据。要恢复,您需要将输入文件与备份操作期间指示的输出文件反转,如下所示。
# dd if=/tmp/sdadisk.img of=/dev/sda
您将检索备份操作之前而不是操作之后存在的数据
e. 恢复压缩图像
您需要先指明压缩文件和输出文件是之前压缩过的磁盘。
# gzip -dc /tmp/vdadisk.img.gz | dd of=/dev/vda
这里的 -d 选项是解压缩。注意输出文件。您可以挂载恢复的磁盘以查看内容。请注意,您将在最后一次压缩备份操作之后添加数据。
2. 将 CD 或 DVD 的虚拟文件系统/备份映像创建为 iso 文件
由于某些原因,您可能需要在 Linux 上创建虚拟文件系统,例如在 Linux 主机上创建虚拟机。您可能还需要创建CD 或 DVD的备份iso 映像
a。创建虚拟文件系统
虚拟文件系统是存在于文件中的文件系统,而文件又存在于物理磁盘上。例如,您可能需要它来创建额外的交换或循环设备或虚拟机。我们需要/dev/zero
一个文件,用于创建一个没有数据但具有所需大小的文件(一个全为零的文件)。换句话说,这将创建一个文件中全为零的数据文件,这将为文件提供大小。
# dd if=/dev/zero of=/file bs=1024K count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 1.21755 s, 431 MB/s
该选项count
是指要复制的输入块的数量。结合块大小值,它表示要复制的总大小。例如bs=1024k
并count=500
给出一个size=1024K*500 =524288000 bytes =524MB
现在让我们检查文件的大小
# ls -lh /file
-rw-r--r-- 1 root root 500M May 17 18:57 /file
您可以看到我们创建了具有指定大小的虚拟文件系统。您现在可以使用它来创建循环设备或虚拟磁盘或其他任何东西。
b。用空数据修改文件的前 512 个字节
如果在操作期间您指示现有的输出文件,您将丢失其数据。由于某些原因,您可能需要替换输出文件的块大小。
dd if=/dev/zero of=file1 bs=512 count=1 conv=notrunc
该notrunc
选项是指不截断文件,仅替换前 512 个字节(如果存在)。否则,你会得到一个 512 字节的文件
C。创建 CD 或 DVD 的备份 iso 映像
您可能想知道为什么不直接将 CD 的内容复制到目录中。您将如何处理 CD 的引导扇区?您无法在设备上找到它作为文件,因为它只是第一个扇区。因为 dd 逐扇区复制,另一方面,它也会复制该信息。
# dd if=/dev/cdrom of=/mycd.iso
您需要知道您必须使用该-o loop
选项,它允许您像任何普通设备一样挂载文件。因此,要挂载/mycd.iso
在/mnt/cd
目录上,请执行以下操作
# mount -o loop /mycd.iso /mnt/cd
d) 创建一个可启动的 USB 驱动器
假设我们已经在这里下载了 centos iso 镜像到这个目录“~/Downloads/”。
if=~/Downloads/CentOS-8-x86_64-1905-dvd1.iso - 输入文件在路径 '~/Downloads/CentOS-8-x86_64-1905-dvd1.iso'
of=/dev/sdb - 输出文件位于路径“/dev/sdb”中
bs=1M - 从 '~/Downloads/CentOS-8-x86_64-1905-dvd1.iso' 读取并写入 '/dev/sdb' 一次 1 兆字节的数据。
#dd if =~ / Downloads /CentOS-8-x86_64-1905-dvd1.iso of = / dev / sdb bs = 1M
3.备份和恢复MBR
GRUB 引导加载程序最常存储在可引导驱动器的 MBR 中。MBR 构成磁盘的前 512 字节,最多允许 466 字节的存储空间用于引导加载程序。额外的空间将用于存储该驱动器的分区表。如果 MBR 损坏,我们将无法启动到 Linux。
a。备份 MBR
因为 MBR 构成了磁盘的前 512 个字节,所以我们只需要复制那个块大小
# dd if=/dev/sda of=/tmp/sdambr.img bs=512 count=1
使用count=1
and bs=512
,只会复制与我们的 MBR 大小相对应的 512 个字节。
您可以使用 od 命令显示保存的 MBR,该命令以八进制和其他格式转储文件,如下所示
# od -xa /tmp/sdambr.img
0000000 bf52 81f4 8b66 832d 087d 0f00 e284 8000
? t soh f vt - etx } bs nul si eot b nul nul
0000020 ff7c 7400 6646 1d8b 8b66 044d 3166 b0c0
| del nul t F f vt gs f vt Meot f 1 @ 0
-a
选项选择命名字符并-x
选择十六进制 2 字节单位
b。备份除分区表外的MBR启动数据
MBR 512 字节数据位于硬盘的第一个扇区。它由 446 字节的引导程序、64 字节的分区表和 2 字节的签名组成。这意味着我们可以在备份 MBR 时排除分区表和字节签名,只保留等于引导程序大小的块大小。
# dd if=/dev/sda of=/tmp/sdambr2.img bs=446 count=1
C。从 MBR 映像恢复 MBR
您可以使用前面的命令恢复 MBR
# dd if=/tmp/sdambr.img of=/dev/sda
3.转换数据格式
如果输入文件使用的字符集不是主机的本机字符集,则导入操作员必须执行转换。例如,如果 ASCII 是主机上字符串的本机格式,但输入数据文件使用 EBCDIC 表示字符串,则必须将 EBCDIC 转换为 ASCII,反之亦然。
a。将文件的数据格式从 EBCDIC 转换为 ASCII
如果您有一个 ebcdic 文件,主要是从大型机系统中检索到的,那么您希望将它们转换为 ASCII 以便使用 UNIX 服务器上的文本编辑器进行修改
# dd if=textfile.ebcdic of=textfile.ascii conv=ascii
conv
value 参数现在是 ascii , 因为我们从 EBCDIC 转换为 ASCII
b。将文件的数据格式从 ASCII 转换为 EBCDIC
修改 ASCII 版本并完成后,您可以将其转换回 EBCDIC 以供您的应用程序使用。
# dd if=textfile.ascii of=textfile.ebcdic conv=ebcdic
conv
value 参数现在是e bcdic , 因为我们将 ASCII 转换为 EBCDIC。如果您只是用具有不同字符的等效字节数替换特定数量的字节,则转换将是顺利的,并且读取文件的应用程序应该没有任何问题。
4.转换文件大小写
DD命令也可以用来做一件了不起的事情。它可以将文件中的所有文本(字母)转换为大写或小写,反之亦然。对于下面的示例,我们将有一个用于测试的文件。
# cat file10
test dd convert
a。将文件转换为大写
因为我们的文本文件示例是小写的,所以我们将其转换为大写
# dd if=~/file10 of=~/file20 conv=ucase
该命令将创建指定的新文件。看到 nowconv
选项采用ucase值。让我们检查一下结果
# cat file20
TEST DD CONVERT
b。将文件转换为小写
现在我们将进行反向操作,将转换为小写
# dd if=~/file20 of=~/file30 conv=lcase
看到我们使用选项的lcase 将conv
大写转换为小写。
# cat file30
test dd convert
dd 命令不转换文件名,只转换其内容。
结论
dd 命令虽然在技术上不是归档命令,但在某些方面是相似的,因为它可以将整个分区或磁盘复制到文件中,反之亦然。