Linux DD命令
Linux DD命令是最强大的实用程序之一,可以以各种方式使用。
此工具主要用于复制和转换数据,因此它代表数据复制器。
此工具可用于:
- 备份并恢复整个硬盘驱动器或者分区。
- 创建虚拟文件系统和CD或者DVD的备份镜像称为ISO文件
- 复制原始设备文件的区域,如备份MBR(主引导记录)。
- 将像ASCII的数据格式转换为EBCDIC。
- 将小写转换为大写,反之亦然。
只有超级用户可以执行此命令。
使用此命令时,我们应该非常小心,因为使用不当可能导致巨大的数据丢失。
因此,有些人认为这个工具作为数据驱逐者。
DD命令的语法
DD命令的基本使用相当容易,因为它只需两个参数:if =指定输入文件和=指定输出文件。
这些选项的参数可以是文件或者块设备。
但是,我不建议使用DD复制文件,因为CP以更简单的方式执行。
但是,我们可以使用它来克隆硬盘。
语法是
dd if=<source file name> of=<target file name> [Options]
通过DD命令示例,我们将学习各种选项。
1.备份并恢复整个磁盘或者分区
可以将所有数据从整个磁盘/分区保存到另一个磁盘/分区。
不是一个简单的副本作为cp命令,而是块大小副本。
将整个磁盘备份到磁盘
我们可以将磁盘/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
仅当第二设备与第一个一样大或者大于第一个设备时才有效。
否则,我们将在第二个中获得截断和无价值的分区。
其中如果代表输入文件,则输出文件的代表,BS代表块大小(一次读/写的字节数)。
确保在等于1KB的1024个字节的倍数中使用块大小。
如果未指定块大小,则DD使用512字节的默认块大小。
"CONC"(CONC)参数参数NoError允许该工具继续复制数据,即使它遇到任何错误也是如此。
Sync选项允许使用同步I/O.
创建DD磁盘镜像(文件镜像)
我们可以创建磁盘或者文件镜像的图像。
将磁盘备份到图像将比复制确切数据更快。
此外,磁盘镜像使恢复更容易。
# dd if=/dev/sda of=/tmp/sdadisk.img
我们可以存储所需的输出文件,但我们必须提供以上面的方式结尾的文件名。
而不是"/tmp/sdadisk.img",例如,如果我们愿意,可以将其存储在"/sdadisk.img""。
创建压缩磁盘镜像
因为DD创建了整个磁盘的确切内容,所以它意味着它需要太大尺寸。
我们可以决定使用以下命令压缩磁盘镜像
# dd if=/dev/vda | gzip -c >/tmp/vdadisk.img.gz
管道|运算符使左命令的输出成为右命令的输入。
"-C"选项在标准输出上写入输出,并保持原始文件不变。
将分区备份或者克隆一个分区
而不是整个磁盘,只能备份一个简单的分区。
我们只需指示输入文件中的分区名称如下所示
# 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
恢复磁盘或者分区图像
保存磁盘或者分区有助于恢复所有数据,如果我们的原始驱动器有任何问题。
要恢复,我们需要使用如下备份操作期间指示的输出文件中输入文件。
# dd if=/tmp/sdadisk.img of=/dev/sda
我们将检索在备份操作之前存在的数据,而不是操作之后
恢复压缩图像
我们需要首先指示压缩的文件和输出文件,该文件是之前压缩的磁盘。
# gzip -dc /tmp/vdadisk.img.gz | dd of=/dev/vda
这里的-D选项是解除介绍。
注意输出文件。
我们可以安装已恢复的磁盘以查看内容。
请注意,我们将在最后一个压缩备份操作后添加数据。
2.将CD或者DVD的虚拟文件系统/备份图像创建为ISO文件
我们可能需要在Linux上创建虚拟文件系统,因为某些原因是在Linux主机上创建虚拟机。
我们还需要创建CD或者DVD的备份ISO镜像
创建虚拟文件系统
虚拟文件系统是一个文件中存在的文件系统,其存在于物理磁盘上。
我们可以需要它来创建另外的交换或者循环设备或者虚拟机。
我们需要/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`给出尺寸= 1024k * 500 = 524288000字节= 524MB
现在让我们检查我们的文件的大小
# ls -lh /file -rw-r--r-- 1 root root 500M Jan 17 18:57 /file
我们可以看到我们拥有我们的虚拟文件系统,其中规模指示。
我们现在可以使用它来创建循环设备或者虚拟磁盘或者其他任何内容。
用空数据修改文件的前512个字节
如果在操作期间我们指示现有的输出文件,则会失去其数据。
由于某种原因,我们需要替换输出文件的块大小。
dd if=/dev/zero of=file1 bs=512 count=1 conv=notrunc
notrunc
选项是指不截断文件,只替换前512字节,如果存在。
否则,我们将获得512字节文件
创建CD或者DVD的备份ISO镜像
我们可能想知道为什么不只是将CD的内容复制到目录。
我们如何处理CD的引导扇区?
我们无法找到该设备上的文件,因为它只是第一个扇区。
因为DD拷贝扇区由扇区,另一方面,它也将复制该信息。
# dd if=/dev/cdrom of=/mycd.iso
我们需要知道我们必须使用"-o循环"选项,允许我们像任何正常设备一样安装文件。
所以,在"/mnt/cd"目录上登上/mycd.iso
,如下所示
# mount -o loop /mycd.iso /mnt/cd
创建可启动的U盘
让我们假设我们在此处下载了Centos Iso Image,到了此目录"~//lowlows /"。
如果=~/下载/centos-8-x86_64-1905-dvd1.iso输入文件位于路径'~/下载/centos-8-x86_64-1905-dvd1.iso'
=/dev/sdb输出文件位于路径'/dev/sdb'中
BS = 1M从'~/下载/centos-8-x86_64-1905-dvd1.iso'读取,并一次写入'/dev/sdb'1兆字节的数据。
DD IF =~/下载/centOS-8-x86_64-1905-DVD1.iso of =/dev/sdb bs = 1m
3.备份和恢复MBR
GRUB引导加载程序最常存储在可引导驱动器的MBR中。
MBR构成了磁盘的前512字节,允许最多466个字节的引导加载程序存储。
添加空间将用于存储该驱动器的分区表。
如果MBR被损坏,我们将无法启动到Linux。
备份mbr.
因为MBR构成了磁盘的前512字节,所以我们只需要复制该块大小
# dd if=/dev/sda of=/tmp/sdambr.img bs=512 count=1
使用count = 1
和bs = 512
,将被复制512个字节,其对应于我们的MBR大小。
我们可以使用OD命令显示已保存的MBR,该命令将八进制和其他格式转储文件如下
# od -xa /tmp/sdambr.img 0000000 bf52 81f4 8b66 832d 087d 0f00 e284 8000 R ? 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 M eot f 1 @ 0
-a
选项选择命名字符和-x
选择十六进制2字节单位
备份MBR的引导数据,不包括分区表
MBR 512字节数据位于硬盘的第一扇区。
它由446字节引导,64个字节分区表和2个字节签名组成。
这意味着我们可以在备份MBR时排除分区表和字节签名,仅通过节省等于引导大小的块大小。
# dd if=/dev/sda of=/tmp/sdambr2.img bs=446 count=1
从MBR镜像恢复MBR
我们可以将MBR恢复,如前一个命令所示
# dd if=/tmp/sdambr.img of=/dev/sda
3. 转换数据格式
如果输入文件使用不是主计算机的本机字符集的字符集,则导入运算符必须执行转换。
例如,如果ASCII是主计算机上字符串的本机格式,但是输入数据文件表示使用EBCDIC表示字符串,则必须将EBCDIC转换为ASCII,反之亦然。
将文件的数据格式从EBCDIC转换为ASCII
如果我们有一个EBCDIC文件,那么大多从大型机系统中检索,那么,我们想要将它们转换为ASCII,以便在UNIX服务器上使用文本编辑器进行修改
# dd if=textfile.ebcdic of=textfile.ascii conv=ascii
现在的"conv"值参数是ASCII,因为我们从EBCDIC转换为ASCII
将文件的数据格式从ASCII转换为EBCDIC
修改ASCII版本并完成后,我们可以将其转换回EBCDIC以由应用程序使用。
# dd if=textfile.ascii of=textfile.ebcdic conv=ebcdic
"CONC"(CONC)现在是EBCDIC,因为我们从ASCII转换为EBCDIC。
如果我们只需用具有不同字符的等效字节数替换特定数量的字节,转换将是平滑的并且应用程序读取文件不应有任何问题。
4.转换文件的情况
DD命令也可以用于令人惊叹的事情。
它可以将文件中的所有文本(字母表)转换为大写或者小写,反之亦然。
对于下面的示例,我们将有一个文件进行测试。
# cat file10 test dd convert
将文件转换为大写
因为我们的文本文件示例是小写,所以我们会将其转换为大写
# dd if=~/file10 of=~/file20 conv=ucase
该命令将创建指示的新文件。
请参阅现在"CONC"选项取UCASE"值。
让我们检查结果
# cat file20 TEST DD CONVERT
将文件转换为小写
现在我们将执行反向操作,该操作将转换为小写
# dd if=~/file20 of=~/file30 conv=lcase
请参阅,我们使用Lcase的"conv""选项可从大写转换为小写。
# cat file30 test dd convert
DD命令不会转换文件名,只有其内容。