linux命令学习1---dd(Disk Dump)

参考连接

1. 概念和用途

根据man手册解释,dd命令用途是转换和复制文件,在这个过程中可以改变输入输出流中块的大小。相比较于简单的copy命令,其用途更加广泛。

利用强大的dd命令,可以完成下列任务:

  复制文件
  格式文件
  备份数据
  烧录镜像
  测试硬盘
  销毁数据
  创建分区
  读写串口
  截取屏幕
  ......

 

2. 命令详解

linux 命令往往带有很多参数,dd命令也不例外。下面对dd命令的参数进行具体解释。


[sudo]   dd  [count=?, bs=?, conv=?, seek=?, skip=?, flag=?, status=?]  if=

of=


if=file 输入文件名或设备地址,如文件、目录、挂载盘、镜像、闪存、键盘等。

文件:/home/hujia/.bashrc  目录:/etc

SD卡:/dec/mmcblk0          硬盘:/dev/hhd1

of=file 输出文件名或设备地址,如文件、硬盘、U盘、闪存、显示屏、串口等。

文件:/tmp/etc.bak              目录: /dev/sdc1/

串口:/dev/ttyS0                  

ibs=bytes 一次读取块大小,默认b=512字节。

ibs={c、w、b、K、M、G......}

obs=bytes

一次写入块大小,默认b=512字节。

conv=notrunc 给定条件下,输出文件会被截断到开头变为0字节或者截断到seek=n 处。

obs={c、w、b、K、M、G......}
bs=bytes

一次读取和写入块大小,默认b=512字节。

在未在conv中规定数据读写要求时,输入数据会尽快的复制到输出端,即使数据大小小于块大小。

bs={c、w、b、K、M、G......}
cbs=bytes 一次转换块大小,默认b=512字节,可将拥有不同块大小的文件转化为同一块大小文件。 cbs={c、w、b、K、M、G......}
skip=n

输出文件跳过n个块大小后复制。

iflag=skip_bytes条件下,跳过n个字节后复制。

 
seek=n

从头截断输出文件到n个块大小处,再在末尾写入内容。

oflag=skip_bytes条件下,跳过n个字节后复制

 
count=n

不是完全读取输入文件,读取前n个块大小。

iflag=count_bytes条件下,读取单位为字节。

注:从管道读取数据可以减少,因为读取操作标准不同。

 
status=level 信息传输状态的显示,none、noxfer、progress

none 、        不打印错误信息

noxfer 、      不打印传输速率与大小

progress  、 每读取一个块打印,有延迟

conv=conversion

[,conversion]

转换文件的格式等,

ascii、ebcdic、ibm、block、unblock、

lcase、ucase、sparse、swab、sync、

excl、nocreat、notrunc、noerror、

fdatasyn、fsync

ascii、将ebcdic转化为ascii,会默认删除转化               块的尾部空格

ebcdic、 将ascii转化为ebcdic,会默认增 加转              化块的尾部空格

ibm、 把ASCIl码转换为alternate EBCDIC码

block、固定块输出

unblock、不固定块输出

lcase、字母转化为小写

ucase、字母转化为大写

sparse、寻找文件中\0字符,用于稀疏文件

swab、交换输出字节

sync、把每个输入记录的大小都调到ibs的大小           (用NUL填充)

excl、输出文件存在时失败

nocreat、输出文件必须事先存在

notrunc、不截断输出文件

noerror、错误后继续执行

fdatasyn、完成之前输出数据同步

fsync、完成之前输出数据和元数据同步

iflag=flag[,flag]… 输入数据的控制

append、 在现有文件末尾添加输入数据,须和                    conv=notrunc连用

cio、        并发IO

direct、    直接IO,绕开系统缓存,读取单位为                   系统定义块的

directory、不能读写目录

dsync、     同步IO读写数据

sync、       同步IO读写数据和元数据

nocache、清空数据缓存

nonblock、使用非阻塞I / O

noatime、  不更新文件的访问时间戳

noctty、      不要将文件指定为dd的控制终端

nofollow、   不要遵循符号链接

nolinks、     如果文件有多个硬链接,则失败。

binary、       使用二进制I / O

text、           使用文本I / O

fullblock、    从输入中累积完整的块后写入

count_bytes、count字节计数

skip_bytes、skip字节计数

seek_bytes、seek字节计数

oflag=flag[,flag]… 输出数据的控制

3.应用实例

[1] 烧录镜像文件:作系统盘时需要将镜像文件(*.img、*.iso等)烧录到移动设备,下面就举例将Raspberry Pi的raspbian.img镜像烧录到SD卡和将ubuntu镜像ubuntu18.04.iso烧录到U盘的步骤。

#显示所有设备,SD /dev/mmcblk0,U盘 /dev/sdb
ls /dev/ 

#烧录镜像到SD卡
sudo umount /dev/mmcblk0   
sudo dd if=~/Downloads/raspbian.img of=/dev/mmcblk0 bs=32M

#烧录镜像到U盘
sudo umount /dev/sdb  
sudo dd if=~/Downloads/ubuntu18.04.iso of=/dev/sdb bs=32M

注:在烧录前需要卸载设备,另外需要有对设备操作的权限。

[2] 备份文件:linux文件中最需要备份的部分是/etc,通常我们对其目录下的文件误操作后如果没有备份往往面临重装系统的局面,因为很多重要的系统设置都在这个目录下,笔者曾经误删过/etc/default/grub,但是后来重新安装GRUB就找回了这个文件。总之,这个文件夹很重要。

#整个系统备份,移动硬盘/dev/sdb
sudo umount /dev/sdb
sudo dd if=/dev/sda of=/dev/sdb bs=32M

#/etc的备份,整个U盘作备份
sudo umount /dev/sdb
sudo dd if=/etc of=/dev/sdb bs=32M

#/etc创建一个备份文件
sudo dd if=/etc | gzip < /media/ai/backup/ubuntu_bankup/etc.zip

[3] 数据操作:要处理偏移量或大小不是I / O块大小的倍数的数据,可以使用“skip_bytes”,“seek_bytes”和“count_bytes”标志。以下shell命令在磁盘和磁带之间的512 KiB块中复制数据,但不在磁盘的开头保存或恢复4 KiB标签。

disk=/dev/rdsk/c0t1d0s2
tape=/dev/rmt/0

# Copy all but the label from disk to tape.
(dd bs=4k skip=1 count=0 && dd bs=512k) <$disk >$tape

# Copy from tape back to disk, but leave the disk label alone.
(dd bs=4k seek=1 count=0 && dd bs=512k) <$tape >$disk

[4] 硬盘恢复:硬盘有固态硬盘、机械硬盘等,其虽然是非易失性存储介质,但是放置和使用时间久,难免会出现数据失真和硬盘坏道等一系列问题。这是,我们可以采用dd命令恢复硬盘数据,处理硬盘坏道。同时dd命令也可以测试硬盘的读写速度。

#恢复磁盘数据
dd if=/dev/sda of=/dev/sda 或dd if=/dev/hda of=/dev/hda

#用\0填充磁盘坏道,获得最大有效存储量
dd conv=noerror,sync iflag=fullblock  /mnt/rescue.img

[5] 读写串口:

#dd命令写串口
sudo dd /tmp/command.txt /dev/ttyS0

待续:/dev/zero 和 /dev/null 两个虚拟设备的使用

 

 

 

注:以上内容来自官方解释、其他博客和个人经验。

 

你可能感兴趣的:(Linux命令)