路漫漫其修远兮
吾将上下而求索

linux磁盘操作:dd命令

        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个字节,可以保存下来,但是逻辑卷的分区表在后面,保存不了,所以即使有逻辑分区,保存的只能是主分区的   

未经允许不得转载:江哥架构师笔记 » linux磁盘操作:dd命令

分享到:更多 ()

评论 抢沙发

评论前必须登录!