linux入门之磁盘管理dd命令使用

author author     2022-08-01     763

关键词:

Linux入门之磁盘管理(5)dd命令使用

Linux中,经常需要一些数据读写等测试,还有文件以及其它数据的备份迁移,一般使用cp命令可以解决一部分,但是其无法进行控制数据的流向及动作,这时就可以使用dd命令,来进行灵活的数据流操作。

 

dd 命令用法:

dd  if=/PATH/FROM/SRC  of=/PATH/TO/DEST  

#解析:if表示inputfile,表示从if所指的文件读取数据流,然后输出到of所指的文件

 

详细解析:

bs=# block size,复制单元大小,默认不指定为byte,可以指定M

count=#:       #进行#bs指定大小复制

if=file:       #写到所命令的文件而不是到标准输入

bs=size:       #指定块大小,同时代表输入和输出设备

ibs=szie:     #一次读指定 size大小的byte

obs=size:      #一次写sizebyte

cbs=size:      #一次转化sizebyte

skip=block:     #if从开头跳过指定块数的ibs

seek=block:     #of从开头跳过指定块数的块

count=n:       #拷贝次数,及拷贝多少次块记录

conv=conversion[,conversion...] 用指定的参数转换文件。

转换参数:

ascii    #EBCDIC编码转换为ASCII

ebcidc   #ASCII编码转化为EBCDIC

block    #转换为长度为cbs的记录,不足部分用空格填充

unblock   #替代cbs长度的每一行尾的空格为新行。

lcase    #把大小字符转换为小写字符

ucase    #把小写字符转换为大写字符

swab     #交换输入的每对字节

noerror   #出错时不停止

notrunc   #不截断输出文件

sync     #把每个输入块填充到ibs个字节,不足部分用空(NULL)字符补齐

数据转化举例:

改变指定位数据

#这里生成2个文件,分别存放1到9的数字以及a到z的字母
[[email protected] ~]# echo {1..9} | tr -d ‘[:space:]‘ | tee  f1 
123456789
[[email protected] ~]# echo {a..z} | tr -d ‘[:space:]‘ | tee  f2
abcdefghijklmnopqrstuvwxyz

如何将f2文件中的cdef转换为 f1文件中的6789?

#使用dd命令指定跳过多少个bs指定的单位:字节,注意需要不截断
[[email protected] ~]# dd if=f1 of=f2 skip=5 seek=2 bs=1 conv=notrunc
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.000138904 s, 28.8 kB/s
[[email protected] ~]# cat f2
ab6789ghijklmnopqrstuvwxyz

解析:为什么需要不截断呢?如果不截断,f1从第6个字节数据位置进行写入,而f2在第2个字节后的5个字节被转换后,后面的数据也被删除掉,这就是截断:

[[email protected] ~]# dd if=f1 of=f2 skip=5 seek=2 bs=1 
4+0 records in
4+0 records out
4 bytes (4 B) copied, 0.000145405 s, 27.5 kB/s
[[email protected] ~]# cat f2
ab6789

 

大小写转换:

#再次生成一个f3文件来保存a-z小写字母
[[email protected] ~]# echo {a..z} | sed ‘s/[[:space:]]//g‘ | tee f3
abcdefghijklmnopqrstuvwxyz
#将f3中小写字母全部转换为大写字母
[[email protected] ~]# dd if=f3 of=f4 conv=ucase 
0+1 records in
0+1 records out
27 bytes (27 B) copied, 0.000122919 s, 220 kB/s
[[email protected] ~]# cat f4
ABCDEFGHIJKLMNOPQRSTUVWXYZ
#再将f3中的大小字母全部转换为小写字母
[[email protected] ~]# dd if=f4 of=f5 conv=lcase
0+1 records in
0+1 records out
27 bytes (27 B) copied, 0.000287493 s, 93.9 kB/s
[[email protected] ~]# cat f5
abcdefghijklmnopqrstuvwxyz
#不用写入新文件直接转换文件中数据别不修改源文件
[[email protected] ~]# cat f3
abcdefghijklmnopqrstuvwxyz
[[email protected] ~]# dd if=f3 conv=ucase 2> /dev/null
ABCDEFGHIJKLMNOPQRSTUVWXYZ
[[email protected] ~]# cat f3
abcdefghijklmnopqrstuvwxyz
#直接操作源文件数据进行转换
[[email protected] ~]# echo  `dd if=f3 conv=ucase 2> /dev/null`  >  f3

注意:这里想要直接操作源文件,if=f3 of=f3是万万不行的。

 

操作磁盘数据

备份mbr:

#查看/dev/sda下的分区
[[email protected] ~]# fdisk -l /dev/sda | grep ‘^/dev‘
/dev/sda1   *      1       26   204800      83  Linux
/dev/sda2         26      1332   10485760   83  Linux
/dev/sda3        1332      1593   2097152    82  Linux swap / Solaris
/dev/sda4        1593      2611   8182784    5  Extended
/dev/sda5        1593        1854     2103487+  83  Linux
/dev/sda6         855        2116     2104483+  83  Linux
#将/dev/sda下的mbr信息配分到文件中
[[email protected] ~]# dd if=/dev/sda of=/backup/mbr.bak bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000292654 s, 1.7 MB/s
#将/dev/sda下的mbr复制给其它空硬盘
[[email protected] ~]# dd if=/backup/mbr.bak of=/dev/sdc bs=512 count=1 2> /dev/null
[[email protected] ~]# fdisk -l /dev/sdc | grep ‘^/dev‘
Warning: invalid flag 0x0000 of partition table 5 will be corrected by w(rite)
/dev/sdc1   *   1        26      204800   83  Linux
/dev/sdc2      26       1332    10485760   83  Linux
/dev/sdc3      1332      1593     2097152   82  Linux swap / Solaris
/dev/sdc4      1593      2611     8182784    5  Extended

解析:这里分区表的信息为什么少了两个分区,这是因为,4号为扩展分区,扩展分区中会分配每个逻辑分区特定的lbr,因此无法从各个逻辑分区中直接拷贝其数据

 

只破坏硬盘的bootloader

[[email protected] ~]# dd if=/dev/zero of=/dev/sdc bs=446 count=1 conv=notrunc
1+0 records in
1+0 records out
446 bytes (446 B) copied, 0.0717781 s, 6.2 kB/s

#这里使用十六进制查看,前面446字节全被写入0,但是后面的分区信息以及55aa标示任然保留,当然,/dev/sdc并不是系统盘,bootloader是用于引导系统的,这里不影响存数据。

[[email protected] ~]# hexdump -C -n 512 /dev/sdc
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20  |............... |
000001c0  21 00 83 9f 06 19 00 08  00 00 00 40 06 00 00 9f  |[email protected]|
000001d0  07 19 83 fe ff ff 00 48  06 00 00 00 40 01 00 fe  |[email protected]|
000001e0  ff ff 82 fe ff ff 00 48  46 01 00 00 40 00 00 fe  |[email protected]|
000001f0  ff ff 05 fe ff ff 00 48  86 01 00 b8 f9 00 55 aa  |.......H......U.|
00000200
[[email protected] ~]# fdisk -l /dev/sdc 2> /dev/null | grep ‘^/dev‘
/dev/sdc1   *        1        26      204800   83  Linux
/dev/sdc2        26       1332     10485760   83  Linux
/dev/sdc3       1332       1593     2097152   82  Linux swap / Solaris
/dev/sdc4       1593       2611     8182784   5   Extended


小问题:

有二进制文件fileA,size>2K。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,请问如何实现?

[[email protected] ~]#dd if=fileA  of=fileB bs=128 skip=63 seek=31 count=1  conv=notrunc
[[email protected] ~]#dd if=fileA  of=fileB bs=1 skip=63 seek=31 count=128  conv=notrunc


磁盘数据备份:

提示:dd在对于不同的数据对象操作时,数据流可能会有所不同,比如,如果是对于一个文本文件,那么输出的流就很简单,就是一种字符流,当然内部是将字节流转换为字符流的过程,因此,在操作存文本数据时,dd命令输出的数据还是可以文本查看工具进行查看的,但是,如果操作的并非一个纯文本文件,比如说是某种设备上的数据,那么把一种设备对象当一个文件流来操作,就是直接操作数据最底层的二进制数据了。

 

#将本地的/dev/sdx整块磁盘备份到/dev/sdy
dd  if=/dev/sdx  of=/dev/sdy   
#将/dev/sdx全盘数据备份到指定路径的image文件
dd  if=/dev/sdx  of=/path/to/image
#备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd  if=/dev/sdx  | gzip > /path/to/image.gz


磁盘数据还原:

#将备份文件恢复到指定盘
dd  if=/path/to/image  of=/dev/sdx
#解压备份文件恢复到指定盘
gzip  -dc  /path/to/image.gz  |  dd  of=/dev/sdx

解析:这里的所有操作都是控制一种数据的流向,本质上原理是一样的。

 

其它数据拷贝:

#拷贝内存资料到硬盘
dd  if=/dev/mem  of=/root/mem.bin  bs=1024
#从光盘拷贝数据制作为iso镜像文件
dd  if=/dev/cdrom   of=/root/cd.iso
#销毁磁盘数据
dd  if=/dev/urandom   of=/dev/sda1

说明:利用数据数将磁盘填充满,用于销毁磁盘中数据,使其无法再恢复

 

 

测试最最快数据的bs大小输出

[[email protected] ~]# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 26.9279 s, 38.0 MB/s
[[email protected] ~]# dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
500000+0 records in
500000+0 records out
1024000000 bytes (1.0 GB) copied, 19.0141 s, 53.9 MB/s
[[email protected] ~]# dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
250000+0 records in
250000+0 records out
1024000000 bytes (1.0 GB) copied, 17.6197 s, 58.1 MB/s

说明:这里说明,如果写入一个G数据,使用bs=4096是最好的

 

测试磁盘的读写速度

[[email protected] ~]# dd if=/root/1Gb.file bs=64k | dd of=/dev/null
2000000+0 records in
2000000+0 records out
1024000000 bytes (1.0 GB) copied, 12.2354 s, 83.7 MB/s
15625+0 records in
15625+0 records out
1024000000 bytes (1.0 GB) copied, 12.2365 s, 83.7 MB/s

读数据:12.2365 s

[[email protected] ~]# dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 12.0643 s, 84.9 MB/s

写数据:12.0642s

 

修复硬盘:

dd if=/dev/sda of=/dev/sda  
#此操作只适用于硬盘设备文件,如果为文件则数据完全消失

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


本文出自 “神剑特兰克斯” 博客,请务必保留此出处http://mengzhaofu.blog.51cto.com/10085198/1844489

linux入门之磁盘管理文件系统挂载

Linux入门之磁盘管理(3)文件系统挂载当磁盘建立了分区,创建了文件系统,只是说明该设备可以用来存储,但是要想访问设备,就需要通过建立一个或多个挂载点,来提供给用户进行访问,在linux中,提供了强大的命令来用于实... 查看详情

linux入门之磁盘管理分区管理

Linux入门之磁盘管理(1)分区管理无论是windows还是linux,目前支持的分区结构只有两种,一种是基于blos检查启动的mbr结构,另一种是基于uefi(统一扩展固件接口)的opt分区结构。当然,目前广泛的还是使用的mbr结构。linux中有很多... 查看详情

linux入门之磁盘管理/etc/fstab与交换分区

Linux入门之磁盘管理(4)/etc/fstab与交换分区在linux通过挂载命令可以使用各种选项进行不同文件系统的设备文件进行挂载,当然不仅限于块设备,但是无论怎么挂载,一般默认新建的文件系统进行挂载开机是不会自动挂载的,每次... 查看详情

linux入门之磁盘管理lvm逻辑卷的使用

Linux入门之磁盘管理(8)LVM逻辑卷的使用在Linux中虽然有raid来保证数据的稳定以及磁盘性能的提高,但是其扩展性并不是很好,在很多生产环境中,都是数据正在使用中,在这时如果中断一段时间就会有很大的损失,因此Linux提供... 查看详情

linux入门之磁盘管理raid的实现

Linux入门之磁盘管理(7)RAID的实现RAID(RedundantArraysofInexpensiveIndependentDisks)被称为廉价冗余阵列,为了提高磁盘的性能或者保存数据完整,将多个磁盘合成一个“阵列”来提供更好的性能、冗余等。RAID一般使用硬件raid,并配合指定ra... 查看详情

磁盘管理命令

...inux系统的交换分区3、fdisk命令      设置linux系统磁盘分区4、df命令        显示linux系统磁盘空间使用信息5、mount命令      挂载文件系统 dd命令见  mkswap命令见 磁盘分区  fdisk命令... 查看详情

磁盘管理之挂载扩容交换分区及其dd命令

一、磁盘挂载回忆小结  1、挂载磁盘可用的方法1)设备名进行挂载    2)卷标挂载    3)UUID挂载(此方法常用,UUID为随机生成,唯一性确保挂载成功)  2、文件挂载配置文件详解 /et... 查看详情

linux入门之磁盘管理文件系统

Linux入门之磁盘管理(2)文件系统linux分区构成完成之后,一般需要进行对其创建指定的文件系统,也就是我们常说的格式化,然后对其进行分区挂载,提供指定分区的访问点。不同的分区格式会在文件系统内部提供不同的对该分... 查看详情

linux入门之磁盘管理lvm逻辑卷案例

Linux入门之磁盘管理(9)LVM逻辑卷案例案例介绍阶段(1):创建一个由两个物理卷组成的大小未20G的卷组myvg,要求其PE大小为16M;而在此卷组中创建一个大小未5G的逻辑卷lvtest,此逻辑卷要能在开机后自动挂载至/mnt/lvtest目录,且... 查看详情

linux磁盘管理进阶

Linux磁盘管理进阶dd命令SWAP与移动介质磁盘配额RAIDdd命令dd - convert and copy a fileCopy a file, converting and formatting according to the opera 查看详情

新手入门linux的步骤

新手想要快速入门学习Linux,要制定合适的学习路线,这样才可以达到事半功倍的效果。第一阶段:linux基础入门1.开班课程介绍-规章制度介绍-破冰活动;2.Linux硬件基础/Linux发展历史;3.Linux系统安装/xshell连接/xshell优化/SSH远程... 查看详情

linux下dd命令使用磁盘性能测试io测试

/dev/null?:在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),可以理解为linux中的黑洞文件,一般用于测试写入。/dev/zero?:在类UNIX操作系统中,/dev/zero是一个特... 查看详情

入门学习linux&&git命令大集合(代码片段)

文章目录LinuxLinux常识操作系统概述Linux发展史Linux版本Linux安装--安装步骤Linux常见目录介绍Linux常用命令基础+磁盘+文件管理命令进阶命令文本编辑vimLinux系统管理软件包管理网络管理进程管理磁盘管理GitGit常识Git常用基本... 查看详情

入门学习linux&&git命令大集合(代码片段)

文章目录LinuxLinux常识操作系统概述Linux发展史Linux版本Linux安装--安装步骤Linux常见目录介绍Linux常用命令基础+磁盘+文件管理命令进阶命令文本编辑vimLinux系统管理软件包管理网络管理进程管理磁盘管理GitGit常识Git常用基本... 查看详情

磁盘及文件管理系统入门

linux磁盘及文件系统管理初步目录    1.磁盘及文件系统管理    2.机械磁盘结构    3.mknod命令    4.parted命令    5.GPT分区&UEFI &n 查看详情

磁盘及文件管理系统入门

linux磁盘及文件系统管理初步目录    1.磁盘及文件系统管理    2.机械磁盘结构    3.mknod命令    4.parted命令    5.GPT分区&UEFI &n 查看详情

快速入门linux,按照分类整理的常用命令及其含义和作用,方便系统的学习和使用

linux命令是对Linux系统进行管理得命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心。线上查询及帮助命令(2个)man:查看命令帮助,命... 查看详情

linux命令之查看磁盘空间使用情况df(代码片段)

概述df命令可以用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。df是diskfree的缩写。注:与du命令不同,df命令是查看磁盘空间使用情况... 查看详情