首页 > 编程笔记 > Linux笔记

Linux dd命令详解

Linux 操作系统管理员的最主要的工作就是保证 Linux 系统在工作期间能够正常的运行。但是要做到这样,并不是那么容易,因为 Linux 系统的运行环境十分复杂,会有很多因素导致 Linux 系统崩溃。一旦系统崩溃,Linux 系统管理员就需要在最快的时间内恢复 Linux 系统,并做到在最大限度内不丢失数据,这对于系统管理员来说是一个不小的挑战。

为达到这个目的,我们能做的唯一办法就是数据的备份、再备份。而 dd 命令行实用程序就是在 Linux 系统上使用频率非常高的系统备份和恢复的工具。

dd 是一个在 UNIX 和 Linux 操作系统上的命令行实用程序,它的主要目的就是转换和复制文件。因为一个硬盘启动扇区的内容是在安装文件系统之前就已经生成的,所以它无法进行操作系统的复制命令来备份。这时候我们就需要使用 dd 程序来完成硬盘的启动扇区的备份工作,也可以使用 dd 命令将一个硬盘上的数据彻底的清除掉,还可以在复制数据的时候完成数据的转换工作。

dd 的名字来源于 IBM 的作业控制语言(Job Control Language JCL)中的 DD 语句,dd 代表的是 Data Definition(数据定义)两个字的首字母。因此与大多数其他的 UNIX 命令的语法格式的不同,dd 命令更像是 IBM 的 JCL 语句,而不像是 UNIX 命令。

在 dd 命令中可以使用很多选项,这些选项的语法格式如下:

选项=选项值...

每个选项之间需要使用空格分割。

如表 1 所示,这里给大家列举了几种常见的选项。
表 1 dd 命令常用选项
选 项 含 义
if=文件名 输入文件名,缺省为标准输入,即指定源文件,如< if=input file >。
of=文件名 输出文件名,缺省为标准输出,即指定目的文件,如< of=output file >。
ibs=bytes
obs=bytes
bs=bytes
一次读入bytes字节,即指定一个块大小为 bytes 字节。
一次输出 bytes 字节,即指定一个块大小为 bytes 字节。
同时设置读入/输出的块大小为 bytes 个字节。
cbs=bytes 一次转换 bytes 字节,即指定转换缓冲区大小。
skip=blocks 从输入文件开头跳过 blocks 个块后再开始复制。
seek=blocks 从输出文件开头跳过 blocks 个块后再开始复制。注意,通常只有当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
count=blocks 仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
conv=conversion 用指定的参数转换文件:
  • ascii:转换ebcdic为ascii。
  • ebcdic:转换ascii为ebcdic。
  • ibm:转换ascii为alternate ebcdic。
  • block:把每一行转换为长度为cbs,不足部分用空格填充。
  • unblock:使每一行的长度都为cbs,不足部分用空格填充。
  • lcase:把大写字符转换为小写字符。
  • ucase:把小写字符转换为大写字符。
  • swab:交换输入的每对字节。
  • noerror:出错时不停止。
  • notrunc:不截短输出文件。
  • sync:将每个输入块填充ibs个字节,不足部分用空(NUL)字符补齐。

以上是一些使用 dd 命令行程序进行 Linux 系统维护工作的一些例子,其中包括了整个硬盘的备份与恢复、光盘的刻录及清除磁盘或者文件中所有的数据和将内存中的数据复制到硬盘上。

dd命令的应用实例

对于一个刚接触的系统,如果我们要想知道硬盘的读写速度。那我们就可以用下面介绍的方法来进行测试和分析系统顺序读和写的速度,首先我们通过例  1 中的命令进行测试硬盘上的读速度。

【例 1】测试硬盘上的读速度。命令如下:

[root@bogon ~]# dd if=/dev/zero bs=1024 count=1000000 of=file_1GB
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 36.2072 s, 28.3 MB/s

其中:
我们还可以利用在 root 目录中刚刚生成的file=1GB来测试硬盘的读速度,也可以通过例 2 中的命令进行测试。

【例 2】测试读速度。命令如下:

[root@bogon ~]# dd if=file_1GB of=/dev/null bs=1024
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 1.20325 s, 851 MB/s

file_1GB 这个文件很大,我们可以通过 ls -l file* 命令进行验证。

在操作完成之后,要使用例 3 中的 rm 命令删除这一文件。最后,我们最好能够使用 ls -l file* 命令再次进行验证,防止出现错误。

【例 3】删除。命令如下:

[root@bogon ~]# rm -f file_1GB

接下来需要将硬盘上重要的分区克隆到另一个硬盘的分区上,即系统上的一个 boot 分区。

首先,我们需要通过例 4 中的 ls 命令显示出 /boot 目录下的全部内容。

【例 4】显示目录的内容。命令如下:

[root@bogon ~]# ls /boot
config-2.6.32-431.el6.x86_64           lost+found
efi                                    symvers-2.6.32-431.el6.x86_64.gz
grub                                   System.map-2.6.32-431.el6.x86_64
initramfs-2.6.32-431.el6.x86_64.img    vmlinuz-2.6.32-431.el6.x86_64
initrd-2.6.32-431.el6.x86_64kdump.img


为了确定 /boot 所在具体设备的文件名,我们可以通过例 5 中的 df 命令列出 /boot 所在设备以及其状态的信息。

【例 5】设备状态信息。命令如下:

[root@bogon ~]# df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       291M   39M  238M  14% /boot


当确认了 /boot 所在的设备之后,通过例 6 中的 dd 命令将 /dev/sdal 分区克隆到另一个硬盘的 /dev/sdbl 分区。

【例 6】克隆操作。命令如下:

[root@bogon ~]# dd if=/dev/sdal of=/dev/sdbl bs=4096 conv=noerror


然后通过【例 7】中的 mkdir 命令创建一个加载 /dev/sdbl 分区的目录(为了便于记忆我们使用了 /boot2)。

【例 7】创建加载分区。命令如下:

[root@bogon ~]# mkdir .boot2


最后,我们就可以使用例 8 中的 mount 命令加载 /dev/sdbl 分区了。

【例 8】加载 /dev/sdbl 分区。命令如下:

[root@bogon ~]# mount /dev/sdbl /boot2


声明:《Linux系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。