最全面的关于LINUX与UNIX下的dd命令详解

简介:
dd 命令功能很强大的,对于一些比较底层的问题,使用 dd 命令往往可以得到出人意料的效果。用的比较多的还是用 dd 来备份裸设备。但是不推荐,如果需要备份 oracle 裸设备,可以使用 rman 备份,或使用第三方软件备份,使用 dd 的话,管理起来不太方便。
   建议 在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。
  另外,使用dd对磁盘操作时,最好使用块设备文件。

Description



The dd command reads the InFile parameter or standard input, does the


specified conversions, then copies the converted data to the OutFile


parameter or standard output. The input and output block size can be


specified to take advantage of raw physical I/O. Note: The term Block


refers to the quantity of data read or written by the dd command in one


operation and is not necessarily the same size as a disk block.



if=file         输入文件名 标准输入确省
of=file        
输出文件名,标准输出确省
ibs=n        
输入块大小, n 字节(默认 512
obs=n        
输出块大小 ,n 字节(默认 512
bs=n        
同时设置输入输出块大小
cbs=n        
转换缓冲区大小
files=n        
在中断之前拷贝和转换 n 个输入文件
skip=n        
拷贝之前越过 n 个输入块
oseek=n        
拷贝之前从输出文件开始查找 n 个块
iseek        
拷贝之前从输入文件开始查找 n 个块
seek=n        
等同于 oseek
cono=ascic        
EBCDIC 码转换为 ASCII

ebcdic        ASCII->;EBCDIC
      ibm        ASCII
转换为 EBCDIC 码时轻微不同的映象

blolk         将新栈中断的 ASCII 码记录转换为固定长度

unblock         将固定长度的 ASCII 码记录转换为新行中断记录

lcase         变换字将至低等情况

ucase         变换字将至高等情况

swab         交换每对字节

noerrir         出错时不停止处理

sync         将每个块填充到 ibs


输入设备:infile参数指定或标准输入
实施指定的转换,然后复制转换数据到 outfile 参数指定 或标准输出。
输入块和输出块大小可以自己指定,但必须是磁盘物理块大小的倍数。



1
Usually, you need only write access to the output file. However,


when the output file is not on a direct-access device and you use


the seek flag, you also need read access to the file.


2
The dd command inserts new-line characters only when converting



with the conv=ascii or conv=unblock flags set; it pads only when


converting with the conv=ebcdic, conv=ibm, or conv=block flags


set.


3
Use the backup, tar, or cpio command instead of the dd command


whenever possible to copy files to tape. These commands are


designed for use with tape devices. For more information on using

tape devices, see the rmt special file.

4
The block size values specified with the bs, ibs and obs flags


must always be a multiple of the physical block size for the media


being used.


参数说明:
bs=BlockSize

Specifies both the input and output block sizesuperseding the


ibs and obs flags
. The block size values specified with the bs


flag must always be a multiple of the physical block size for the


media being used.

同时指定输入输出块大小,代替ibsobs参数,块大小必须是 物理块的倍数。


cbs=BlockSize

Specifies the conversion block size for variable-length to fixed-


length and fixed-length to variable-length conversions, such as


conv=block.

用于转换缓冲区大小

count=InputBlocks

Copies only the number of input blocks specified by the


InputBlocks variable.

只复制由count参数指定数量的输入块

conv= Conversion,....

Specifies one or more conversion options. Multiple conversions


should be separated by commas. The following list describes the


possible options:


ascii


Converts EBCDIC to ASCII. This option is incompatible with


the ebcdic, ibm, block, and unblock options.


block



Converts variable-length records to fixed-length. The


length is determined by the conversion block size (cbs).


This option is incompatible with the ascii, ebcdic, ibm,


and unblock options.


ebcdic


Converts ASCII to standard EBCDIC. This option is


incompatible with the ascii, ibm, block, and unblock


options.


ibm


Converts ASCII to an IBM version of EBCDIC. This option is


incompatible with the ascii, ebcdic, block, and unblock



options.


iblock, oblock


Minimize data loss resulting from a read or write error on



direct access devices. If you specify the iblock variable


and an error occurs during a block read (where the block


size is 512 or the size specified by the ibs=InputBlockSize


variable), the dd command attempts to reread the data block


in smaller size units. If the dd command can determine the


sector size of the input device, it reads the damaged block


one sector at a time. Otherwise, it reads it 512 bytes at a


time. The input block size ( ibs) must be a multiple of


this retry size. This option contains data loss associated


with a read error to a single sector. The oblock conversion



works similarly on output.


lcase


Makes all alphabetic characters lowercase.


noerror


Does not stop processing on an error.


notrunc


Does not truncate the output file. Instead, blocks not


explicitly written to output are preserved.


ucase


Makes all alphabetic characters uppercase.


swab


Swaps every pair of bytes.


sync



Pads every input block to the ibs value.


unblock


Converts fixed-length blocks to variable-length. The length


is determined by the conversion block size (cbs). This


option is incompatible with the ascii, ebcdic, ibm, and


block options.

files=InputFiles

Copies the number of files specified by the InputFiles variable


value of input files before ending (makes sense only where input



is a magnetic tape or similar device
).

复制由inputfile指定的文件,在中断之前,对磁带设备有意义


fskip=SkipEOFs


Skips past the number of end-of-file characters specified by the


SkipEOFs variable before starting to copy; this SkipEOFs variable


is useful for positioning on multifile magnetic tapes.

跳过磁带上的多个记录

ibs=InputBlockSize

Specifies the input-block size; the default is 512 bytes or one


block. The block-size values specified with the ibs flag must


always be a multiple of the physical block size for the media


being used.

bs参数,但如果bs参数指定,就不需要再使用ibs参数


if=InFile


Specifies the input file name; standard input is the default.



obs=OutputBlockSize


Specifies the output-block size; the default is 512 bytes or one


block. The block size values specified with the obs flag must


always be a multiple of the physical block size for the media


being used.

指定输出块大小


of=OutFile



Specifies the output file name; standard output is the default.



seek=RecordNumber


Seeks the record specified by the RecordNumber variable from the


beginning of output file before copying.

在复制到of文件之前先查找由recordnumber指定的记录,一个记录的大小由bs参数指定,
注意是在of 上查找



skip=SkipInputBlocks


Skips the specified SkipInputBlocks value of input blocks before


starting to copy.

在复制之前跳过skipinputblocks指定的块,块大小由bs参数指定。
注意是在if上跳过

span=yes|no

Allows spanning across devices if specified yes and works as


default if specified as no. See Spanning Across Devices, for more


information..


以下列几个例子:

标准输入到标准输出
F50:[/]#echo "123" | dd
123
0+1 records in.
0+1 records out.

先创建几个裸设备
F50:[/]#mkvg -y datavg hdisk1
Datavg
F50:[/]#mklv -y raw -t raw datavg 5
raw
F50:[/]#lsvg -l datavg
datavg:
LV NAME
TYPE
LPs
PPs
PVs
LV STATE
MOUNT POINT

raw
raw
5
5
1
closed/syncd
N/A

F50:[/]#mklv -y raw1 -t raw datavg 5
raw1
查看逻辑卷lvcb块信息,标准输入为逻辑卷raw,输出到标准输出
以下块大小为512字节,只复制1个块
F50:[/]#dd if=/dev/rraw count=1 | od -x
1+0 records in.
1+0 records out.
0000000 
4149 5820 4c56 4342 0000 7261 7700 0000

0000020
0000 0000 0000 0000 0000 0000 0000 0000

0000040
0000 0000 0000 0000 0000 3030 3061 6637

0000060
3064 3030 3030 3463 3030 3030 3030 3031

0000100
3061 0072 6177 0000 0000 0000 0000 0000

0000120
0000 0000 0000 0000 0000 0000 0000 0000

*
0000200
0000 0054 6875 2041 7072 2032 3720 3134

0000220
3a35 343a 3539 2032 3030 360a 0000 0000

0000240
0054 6875 2041 7072 2032 3720 3134 3a35

0000260
343a 3539 2032 3030 360a 0000 0000 0041

0000300
4637 3044 3443 3030 0079 6d6d 0079 0020

0000320
0005 0001 4e6f 6e65 0000 0000 0000 0000

0000340
0000 0000 0000 0000 0000 0000 0000 0000

*
0000720
0000 0000 0000 0000 0000 6461 3230 3066

0000740
3233 2e31 0000 0000 0000 0000 0000 0000

0000760
0000 0000 0000 0000 0000 0000 0000 0000

0001000
F50:[/]#dd if=/dev/raw bs=1 skip=80 count=8 |od –x
跳过80个字节且复制8个字节

0000000
0000

0000002
0000 0000 0000

0000010
8+0 records in.
8+0 records out.

使用dd在裸设备之间进行数据复制
F50:[/]#dd if=/dev/raw count=1
逻辑卷raw lvcb信息

AIX LVCBraw000af70d00004c000000010arawThu Apr 27 14:54:59 2006
Thu Apr 27 14:54:59 2006
AF70D4C00ymmy Noneda200f23.1
1+0 records in.
1+0 records out.

F50:[/]#dd if=/dev/raw1 count=1
逻辑卷raw1lvcb信息

AIX LVCBraw000af70d00004c000000010araw1Thu Apr 27 14:55:22 2006
Thu Apr 27 14:55:22 2006
AF70D4C00ymmy Noneda200f23.2
1+0 records in.
1+0 records out.

F50:[/]#dd if=/dev/raw1 skip=1 count=1
2个块没有信息

1+0 records in.
1+0 records out.

跳过raw1的第1个块,将raw的第lvcb信息复制到raw1的第2个块
F50:[/]#dd if=/dev/raw count=1 of=/dev/raw1 seek=1

1+0 records in.
1+0 records out.
F50:[/]#dd if=/dev/raw1 skip=1 count=1
AIX LVCBraw000af70d00004c000000010arawThu Apr 27 14:54:59 2006
Thu Apr 27 14:54:59 2006
AF70D4C00ymmy Noneda200f23.1
1+0 records in.
1+0 records out.
F50:[/]#dd if=/dev/raw1 count=1
AIX LVCBraw000af70d00004c000000010araw1Thu Apr 27 14:55:22 2006
Thu Apr 27 14:55:22 2006
AF70D4C00ymmy Noneda200f23.2
1+0 records in.
1+0 records out.


使用dd破坏lvcb信息,以此 验证dd 顺序读取磁盘
F50:[/]#more pvid.txt
#!/usr/bin/ksh
pvid=$1
disk=$2
set -A a `echo $pvid|\
awk ' {
for (f=1; f <= length($0); f=f+2) {
print "ibase=16\nobase=8\n"toupper(substr($0,f,2))
}
}'|\
bc 2>/dev/null`
/usr/bin/echo "\0"${a[0]}"\0"${a[1]}"\0"${a[2]}"\0"${a[3]}"\0"\
${a[4]}"\0"${a[5]}"\0"${a[6]}"\0"${a[7]}"\0\0\0\0\0\0\0\0\c"|\
dd bs=1 seek=128 of=/dev/$disk
F50:[/]#ls -al pvid.txt
-rw-r-----
1 root
system
341 Apr 21 18:07 pvid.txt

由于该文件只有341个字节,可以考虑大点的文件操作
F50:[/]#dd if=/pvid.txt bs=1024 of=/dev/raw 
0+1 records in.
0+1 records out.
F50:[/]#dd if=/dev/raw count=1
#!/usr/bin/ksh
pvid=$1
disk=$2
set -A a `echo $pvid|\
awk ' {
for (f=1; f <= length($0); f=f+2) {
print "ibase=16\nobase=8\n"toupper(substr($0,f,2))
}
}'|\
bc 2>/dev/null`
/usr/bin/echo "\0"${a[0]}"\0"${a[1]}"\0"${a[2]}"\0"${a[3]}"\0"\
${a[4]}"\0"${a[5]}"\0"${a[6]}"\0"${a[7]}"\0\0\0\0\0\0\0\0\c"|\
dd bs=1 seek=128 of=/dev/$diskda200f23.1
1+0 records in.
1+0 records out.
F50:[/]#lsvg -l datavg
datavg:
LV NAME
TYPE
LPs
PPs
PVs
LV STATE
MOUNT POINT

raw
5
5
1
closed/syncd
N/A

raw1
raw
5
5
1
closed/syncd
N/A

由上看出 裸设备rawlvcb信息已经被破坏,在下次importvg的时候将出现报警信息。
F50:[/]#importvg -y datavg hdisk1
0516-622 synclvodm: Warning, cannot write lv control block data.
Datavg
这在许多数据库中 经常出现这种情况,数据库会直接去读写裸设备的前512个字节,所以就容易导致出现以上的错误,但是并不影响数据库的运行。
可以再次使用dd 将其从raw1上的第2块上复制回来,
F50:[/]#dd if=/dev/raw1 skip=1 count=1
AIX LVCBraw000af70d00004c000000010arawThu Apr 27 14:54:59 2006
Thu Apr 27 14:54:59 2006
AF70D4C00ymmy Noneda200f23.1
1+0 records in.
1+0 records out.
F50:[/]#dd if=/dev/raw1 skip=1 count=1 of=/dev/raw
1+0 records in.
1+0 records out.
F50:[/]#varyoffvg datavg
F50:[/]#exportvg datavg
F50:[/]#importvg -y datavg hdisk1
Datavg
没有出现报警信息


dd备份裸设备到磁带
需要注意的几个方面:
1,
磁带的块大小
2,
恢复的时候注意不要把lvcb覆盖
偷点懒,直接复制ibm的··
1. 备份裸的逻辑卷的步骤:
(1)
设定磁带备份设备的合适的块大小:
使用下述命令查看当前的块大小:
# tctl -f /dev/rmt0 status
使用下述命令设置块大小:
# chdev -l rmt0 -a block_size=<
块的字节数 >
(2)
不经过软件压缩进行备份,使用下述命令:
# dd if=<
逻辑卷名 > of=/dev/rmt0 ibs=512 obs=< 块的字节数 > conv=sync
(3)
备份并进行软件压缩,使用下述命令:
# dd if=<
逻辑卷名 > bs=512 | compress | dd of=/dev/rmt0 ibs=512 obs=< 块的字节数 > conv=sync 
2. 恢复备份的裸逻辑卷数据的步骤:
(1)
在恢复备份的逻辑卷数据之前需要确定是否保留当前的逻辑卷控制块信息
(2)
若保留当前的逻辑卷控制块信息,使用下面的命令恢复数据:
a.
恢复未经过软件压缩的数据:
# dd if=/dev/rmt0 ibs=<
块的字节数 > obs=512 | dd of=/dev/< 逻辑卷名 > bs=512 skip=1 seek=1
b.
恢复经过软件压缩的数据:
# dd if=/dev/rmt0 ibs=<
块的字节数 > obs=512 | uncompress | dd of=/dev/< 逻辑卷名 > bs=512 skip=1 seek=1 
(3)
若覆盖当前的逻辑卷控制块信息,使用下面的命令恢复数据:
a.
恢复未经过软件压缩的数据:
# dd if=/dev/rmt0 of=/dev/<
逻辑卷名 > ibs=< 块的字节数 > obs=512
b.
恢复经过软件压缩的数据:
# dd if=/dev/rmt0 ibs=<
块的字节数 > obs=512 | uncompress | dd of=/dev/< 逻辑卷名 > bs=512
张宇加:
在对文件系统或物理存储设备进行dd时,bs的大小不可太小,通常建议4MB或1MB,可以实际测试后确定。




本文转自 张宇 51CTO博客,原文链接:http://blog.51cto.com/zhangyu/137069,如需转载请自行联系原作者
相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章
|
2月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
421 1
二、Linux文本处理与文件操作核心命令
|
2月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
291 137
|
2月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
679 57
|
5月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
504 143
linux命令—tree
|
1月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
405 2
|
2月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
274 0
Linux内存问题排查命令详解
|
2月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
274 16
|
4月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
818 13
|
5月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
953 21
|
5月前
|
监控 Linux
Linux系统中使用df命令详解磁盘使用情况。
`df`命令是Linux系统管理员和用户监控和管理磁盘空间使用的重要工具。掌握它的基本使用方法和选项可以帮助在必要时分析和解决空间相关问题。简洁但功能丰富,`df`命令确保了用户可以快速有效地识别和管理文件系统的空间使用情况。
431 13