dd命令还是有用的,但是因为是底层操作,更加危险,总结以备使用
1.命令格式:
dd OPTION
2.命令功能:
dd命令:convert and copy a file 转换复制一个文件
底层复制,从文件目录开始,以块为单位进行复制,当磁盘处于挂载的状态,不能使用dd命令直接删除,会造成系统错乱,使用dd要确保磁盘处于非挂载状态。
分为读入和输出两个方向,从哪个文件中读入,怎么读入,处理后输出到哪个文件,怎么输出
3.命令参数:
if=file 从所命名文件读取而不是从标准输入
of=file 写到所命名的文件而不是到标准输出
bs=size 指定块大小(byte)(既是ibs也是obs),这个是输入和输出使用相同的数据块大小
ibs=size 一次读size个byte,输入和输出使用不同大小的块,这里是输入块大小
obs=size 一次写size个byte,输入和输出使用不同大小的块,这里是输出块大小
skip=blocks 从开头忽略blocks个ibs大小的块,读取的时候跳过多少个块开始读数据
seek=blocks 从开头忽略blocks个obs大小的块,写入的时候跳过多少个块开始写数据
conv=conversion[,conversion…] 用指定的参数转换文件,转换条件
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
notrunc 不截短输出文件,意思是复制完成后是否截断后面的内容,截短即后面的内容删除,不截短不删除,如果只是覆盖特定的字符段,要不截短输出,
注意单位:bs and count may be followed by the following multiplicative suffixes: c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M=1024*1024, xM =M GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.
4.例子
f. 用法:d if-/PATH/FORM/SRC of-/PATH/TO/DEST bs=# count=#
i. bs=#:block size 复制单元 大小
ii. count=#: 复制多少个bs
g. 磁盘拷贝:
i. dd if=/dev/sda of=/dev/sdb
h. 备份MBR
i. dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
i. 破坏MBR中的bootloader
i. dd if=/dev/zero of=/tmp/mbr.bak bs=256 count=1
j. 销毁磁盘数据
i. dd if=/dev/urandom of=a bs=1024 count=1M 复制1Gbit的字节
ii. hexdump a -n 512 -v -C 查看具体信息
[root@localhost ~]#echo {a..z} | tr -d " "> b
[root@localhost ~]#cat b
abcdefghijklmnopqrstuvwxyz
[root@localhost ~]#echo {0..9} | tr -d " "> a
[root@localhost ~]#cat a
0123456789
[root@localhost ~]#dd if=a of=b bs=1 count=2 skip=4 seek=3 conv=notrunc
2+0 records in
2+0 records out
2 bytes (2 B) copied, 0.00099748 s, 2.0 kB/s
[root@localhost ~]#cat b
abc45fghijklmnopqrstuvwxyz
[root@localhost ~]#dd if=a of=b bs=1 count=2 skip=4 seek=3
2+0 records in
2+0 records out
2 bytes (2 B) copied, 0.000211554 s, 9.5 kB/s
[root@localhost ~]#cat b
abc45
notrunc 不截短输出文件
测试引导分区删除
新挂硬盘/dev/sdb,/dev/sda是linux系统的分区,引导和分区表完整,测试前要将sdb盘解挂,再操作
[root@localhost ~]#hexdump /dev/sdb -C -v -n 512 查看/dev/sdb分区开始的512个字节的详细数据,
先将其分区和引导码保存在系统盘的目录
[root@localhost ~]#dd if=/dev/sdb of=./mbr.bak bs=512 count=1
再将其分区和引导信息删除,填充66个字节,包括删除最后的两个字节55,aa。填充的时候跳过/dev/sdb盘的前446个字节,因为/dev/sdb盘不是启动盘,这段不起作用
[root@localhost ~]#dd if=/dev/zero of=/dev/sdb bs=1 count=66 skip=446
查看详细信息,/dev/sdb盘的后66个字节删除为0
[root@localhost ~]#hexdump /dev/sdb -C -v -n 512
可以看到/dev/sdb盘的分区信息消失
[root@localhost ~]#fdisk -l /dev/sdb
Disk /dev/sdb: 128.8 GB, 128849018880 bytes, 251658240 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
恢复系统分区信息
[root@localhost ~]#dd if=./mbr.bak of=/dev/sdb bs=1 count=512
当只删除/dev/sdb的最后两个字节的时候,分区表也会消失。
[root@localhost ~]#dd if=/dev/zero of=/dev/sdb bs=1 count=2 seek=510
恢复分区信息
[root@localhost ~]#dd if=./mbr.bak of=/dev/sdb bs=1 count=2 skip=510 seek=510
前446字节负责bootload,删除的话系统会启动不了
后64个字节负责分区,删除的话没有分区表,
后两个字节负责
lsmod查看加载的驱动模块,只有加载了支持的分区格式模块,系统才能使用该种分区
保存和恢复都只针对主分区,因为主分区的分区记录在最开的512个字节,可以保存下来,但是逻辑卷的分区表在后面,保存不了,所以即使有逻辑分区,保存的只能是主分区的
评论前必须登录!
注册