dd命令

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512;c=1;k=1024;w=2

参数注释:

if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file > 
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file > 
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。 
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。 
bs=bytes:read and write up to BYTES bytes at a time (default: 512); overrides ibs and obs。 
cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。 
skip=blocks:从输入文件开头跳过blocks个块后再开始复制。 
seek=blocks:从输出文件开头跳过blocks个块后再开始复制。 
注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。 
count=N : copy only N input blocks 
conv=conversion:用指定的参数转换文件。 
ascii:转换ebcdic为ascii 
ebcdic:转换ascii为ebcdic 
ibm:转换ascii为alternate ebcdic 
block:把每一行转换为长度为cbs,不足部分用空格填充 
unblock:使每一行的长度都为cbs,不足部分用空格填充 
lcase:把大写字符转换为小写字符 
ucase:把小写字符转换为大写字符 
swab:交换输入的每对字节 
noerror:出错时不停止 
notrunc:不截短输出文件 
sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。 
————————————————
应用实例

数据丢失带来的损失是相当昂贵的。关键数据的丢失会对各种规模的企业带来影响。有几种方法来备份Linux系统,包括rsync的和rsnapshot等。本文提供有关使用dd命令备份Linux系统的6个实例。 dd是一个功能强大的UNIX工具,由Linux内核的makefile进行引导映像,它也可以用来复制数据。

备份整个硬盘

使用dd命令备份整个硬盘。在这个例子中,源硬盘的设备名为/ dev/ sda的,目标硬盘的设备名是/ dev/ sdb。执行dd命令,备份整个硬盘/dev/sha到同一系统的另一个硬盘/dev/sdb。如下所示:

[root]# dd if=/dev/sda of=/dev/sdb
- "if"后跟输入文件,“of”后跟输出文件。
- 上述命令在执行过程中如有任何错误都会失败。但若加入参数“CONV= NOERROR”,则即使执行过程中有错误,它也会继续复制。
- 输入文件和输出文件在执行前必须检查再三,如果两者顺序颠倒,你可能会损失所有数据。

在备份整个硬盘时,我们也可以加入sync参数来同步I/O。 如下所示:

[root~]# dd if=/dev/sda of=/dev/sdb conv=noerror,sync
创建硬盘的映像

使用dd命令为硬盘创建一个图像文件并将其保存在其他存储设备。这种备份方式有很多好处:一是易于使用,二是这种备份方法的速度快于其他方法的备份,也能让你更快速的恢复数据。
创建一个硬盘/dev/sda的image命令:

[roo ~]# dd if=/dev/sda of=~/sdadisk.img
恢复硬盘映像文件恢复数据

使用dd命令将硬盘的映像文件恢复数据到另一个硬盘。如下所示:

[root ~]# dd if=sdadisk.img of=/dev/sdb

Sdadisk.img文件是/dev/sda的映像,所以上面的命令将恢复/dev/had的映像到/dev/sdb

创建软盘映像

使用dd命令创建软盘的映像备份。输入文件填写软盘机设备的位置,输出文件写软盘映像文件的名称,如下所示。

[root~]# dd if=/dev/fd0 of=myfloppy.img
备份分区

使用dd命令备份硬盘分区。输入文件填写分区的设备名称,输出文件填写你指定的目标路径或映像文件。 dd命令示例所示如下:

[root~]# dd if=/dev/sda1 of=~/partition1.img
光盘备份

dd命令允许我们创建源文件的iso文件,所以我们可以插入CD,输入dd命令来创建一个CD的iso文件内容。

[root ~]# dd if=/dev/cdrom of=tgsservice.iso bs=2048

dd命令从输入中读取一个块并将其写入输出文件。你可以指定输入和输出文件的块大小。参数“bs”指定输入和输出文件的块大小。上面的dd命令使用的块大小为2048 bytes.
注意:如果光盘是自动挂载的,在使用dd命令创建iso映像之前最好umount掉以避免造成对CD ROM不必要的访问。

将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
创建指定大小文件
[root ~]# dd if=/dev/zero of=/tmp/1G.txt bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 31.19 s, 34.4 MB/s
[root ~]# ll -h /tmp/
total 1.0G
磁盘分区备份
dd if=/dev/sda1 of=/root/sda1.bak
磁盘分区还原
dd if=/root/sda1.bak of=/dev/sda1
将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image
将image备份文件恢复到指定盘
dd if=/root/image of=/dev/hdb
备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd if=/dev/hdb | gzip >/root/image.gz
将压缩的备份文件恢复到指定盘
gzip -dc /root/image.gz | dd of=/dev/hdb
贝光盘内容到指定文件夹,并保存为cd.iso文件'
dd if=/dev/cdrom(hdc) of=/root/cd.iso
清空磁盘
[root@192 ~]#  dd if=/dev/zero of=/dev/sdb
磁盘备份
[root@192 ~]# dd if=/dev/sda  of=/dev/sdb
还原磁盘
dd if=/dev/sdb  of=/dev/sda
备份分区表
dd  if=/dev/sda of=/root/mbr.bak bs=512 count=1
还原分区表
d  if=/root/mbr.bak of=/dev/sda
销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1

注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。

测试硬盘的读写速度
# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

# dd if=/root/1Gb.file bs=64k | dd of=/dev/null

通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。

确定硬盘的最佳块大小
#: dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
 
#: dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
 
#: dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
 
#: dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。

修复硬盘
dd if=/dev/sda of=/dev/sda 
或
dd if=/dev/hda of=/dev/hda

当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据起死回生。并且这个过程是安全、高效的。

最后修改:2023 年 06 月 01 日
如果觉得我的文章对你有用,请随意赞赏