在Linux中,文件是系统核心,当然也包括块设备。通常情况下,我们需要经常使用块设备。而作为Linux用户,可以对块设备执行各种操作,例如,备份磁盘或分区、备份主引导记录 (MBR)、制作可引导USB驱动器等等。
当然,我们可以使用图形工具来执行所有这些操作。然而,大多数Linux用户更喜欢使用dd命令,因为它具有丰富的功能和健壮性。在本文中,小编简单介绍用于转换和复制文件的dd命令。与cp命令不同的是,dd命令大多时候与块设备一起使用。
dd命令语法
dd命令最常见的语法如下:
$ dd [if=] [of=]
在上面的语法中:
- if–表示输入或源文件。
- of–表示输出或目标文件。
1、如何在Linux中复制文件
dd命令的基本用途之一是将文件复制到当前目录中。下面通过创建一个简单的文本文件来理解:
$ echo "this is a sample text file" > file-1.txt
现在,使用dd命令创建它的副本:
$ dd if=file-1.txt of=file-2.txt
在此示例中,if
参数表示源文件,而of
参数表示目标文件。
它不是与cp命令完全相似吗,那么dd命令有什么特别之处?
其实,dd命令比常规的cp命令强大得多。接下来小编将介绍它的一些高级用例。
2、如何将文本从小写转换为大写
dd命令允许我们执行大小写转换。为此,可以使用conv参数。要理解这一点,首先,显示file-1.txt文件的内容:
$ cat file-1.txt this is a sample text file
现在,使用以下命令将文件内容转换为大写:
$ dd if=file-1.txt of=upper-case.txt conv=ucase
在此示例中,conv=ucase
选项用于将小写字母转换为大写字母。
最后,验证新建文件的内容:
$ cat upper-case.txt THIS IS A SAMPLE TEXT FILE
3、如何将文本从大写转换为小写
类似的,也可以使用dd命令将大写字母转换为小写字母。可以使用conv=lcase
将大写字母转换为小写字母的选项:
$ dd if=upper-case.txt of=lower-case.txt conv=lcase
现在,显示新创建文件的内容并验证转换是否正确完成:
$ cat lower-case.txt this is a sample text file
4、避免在Linux中覆盖目标文件
默认情况下,dd命令会替换目标文件,这意味着如果目标文件中存在同名文件,它将覆盖该文件。
但是,我们可以使用如下所示的conv=excl
选项禁用此默认行为。
$ dd if=file-1.txt of=file-2.txt conv=excl dd: failed to open ‘file-2.txt’ File exists
在这里,我们可以看到dd命令已中止操作,因为目标位置存在同名文件。
5、使用dd命令在文件中追加数据
有时候,我们希望以附加方式更新文件,这意味着新内容应该添加到目标文件的末尾。这个可以通过组合这两个标志来实现这一点——oflag=append
和conv=notrunc
。此处,oflag
代表输出标志,而notrunc
选项用于禁用目标处的截断。
为了理解这一点,首先创建一个新的文本文件:
$ echo "append example demo" > dest.txt
接下来,使用以下命令将内容附加到dest.txt文件:
$ dd if=file-1.txt of=dest.txt oflag=append conv=notrunc
现在,让我们检查dest.txt文件的内容:
$ cat dest.txt append example demo this is a sample text file
6、读取输入文件时跳过字节或字符
我们可以指示dd命令在使用ibs和skip选项读取输入文件时跳过前几个字符。首先,显示file-1.txt文件的内容:
$ cat file-1.txt this is a sample text file
接下来,使用以下命令跳过前8个字符:
$ dd if=file-1.txt of=file-2.txt ibs=8 skip=1
现在,让我们验证file-2.txt文件的内容:
$ cat file-2.txt a sample text file
在上面的输出中,可以看到该命令跳过了前8个字符。
7、使用dd命令备份Linux磁盘分区
到目前为止,主要介绍了不需要root访问权限的dd命令的基本示例。现在来看看一些高级用例。
和文件操作一样,可以使用dd命令对磁盘分区进行备份。例如,以下命令将/dev/sda1分区备份到partition-bkp.img:
$ sudo dd if=/dev/sda1 of=partition-bkp.img
8、使用dd命令恢复Linux磁盘分区
在前面的示例中,我们将/dev/sda1分区备份到partition-bkp.img文件中。
现在,让使用以下命令将其恢复到/dev/sdb1分区:
$ sudo dd if=partition-bkp.img of=/dev/sdb1
务必注意,目标分区的大小必须等于或大于备份大小。
9.、使用dd命令备份整个Linux硬盘
磁盘驱动器可以有多个分区。因此,随着分区数量的增加,对每个分区进行备份和恢复备份会变得非常耗时。为了克服这个限制,可以像备份分区一样备份整个磁盘驱动器。
因此,可以使用以下命令备份/dev/sda磁盘:
$ sudo dd if=/dev/sda of=disk-bkp.img
上面的命令备份整个磁盘,包括它的分区。
10、使用dd命令恢复Linux硬盘
就像分区一样,我们可以恢复整个磁盘的备份。在前面的示例中,小编将整个磁盘备份到disk-bkp.img文件中。现在,使用相同的方法将其还原到/dev/sdb磁盘上。
首先,从/dev/sdb磁盘中删除所有分区,并验证所有分区都已删除:
$ lsblk /dev/sdb
接下来,使用以下命令恢复/dev/sdb驱动器上的备份:
$ sudo dd if=disk-bkp.img of=/dev/sdb
最后,验证分区是否已在/dev/sdb磁盘上创建:
$ lsblk /dev/sdb
11、使用dd命令备份主引导记录
主引导记录 (MBR) 位于引导盘的第一个扇区。它存储有关磁盘分区的信息,这里可以使用dd命令,如下所示:
$ sudo dd if=/dev/sda of=mbr.img bs=512 count=1
上面的命令取回前512个字节,即一个扇区。
需要注意的是,以上命令必须在启动盘上执行。
12、使用dd命令恢复主引导记录
在前面的示例中,小编备份了主引导记录 (MBR)。现在,使用以下命令将其恢复到/dev/sdb磁盘上:
$ sudo dd if=mbr.img of=/dev/sdb
13、使用dd命令复制CD/DVD驱动器内容
与分区和磁盘类似,可以使用dd命令从CD或DVD驱动器中复制内容,这里可以使用下面的命令来做同样的事情:
$ sudo dd if=/dev/cdrom of=alma-minimal.iso
在Linux系统中,CD/DVD驱动器由/dev/cdrom设备表示。因此将其用作源文件。
现在,通过验证其校验和命令来验证内容是否已成功复制:
$ sha256sum alma-minimal.is
14、使用dd命令创建可启动USB驱动器
在前面的示例中,创建了Alma Linux的iso映像。现在让我们用它来创建一个可引导的USB驱动器:
$ sudo dd if=alma-minimal.iso of=/dev/sdb
需要注意的是,上述命令必须使用正确的U盘执行。
15、如何显示进度条
默认情况下,dd命令在执行复制操作时不显示进度。但是,我们可以使用status选项覆盖此默认行为。
因此,下面使用带有dd命令的status=progress
选项来显示进度条:
$ sudo dd if=alma-minimal.iso of=/dev/sdb status=progress
16、测试硬盘的读写速度
- time dd if=/dev/zero of=/tmp/test bs=8k count=1000000
- time dd if=/tmp/test of=/dev/null bs=8k
- time dd if=/tmp/test of=/var/test bs=64k
参数说明
- time有计时作用,dd用于复制,从if读出,写到of;
- if=/dev/zero不产生IO,因此可以用来测试纯写速度;
- of=/dev/null不产生IO,可以用来测试纯读速度;
- 将/tmp/test拷贝到/var则同时测试了读写速度;
- bs是每次读或写的大小,即一个块的大小,count是读写块的数量。
总结
在本文中,小编简单介绍讨dd命令的一些实际示例。高级用户可以在日常生活中使用Linux系统时参考这些示例。但是,在执行这些命令时必须非常小心。因为一个小错误就可以覆盖整个磁盘的内容。