您的位置:首页 > 运维架构 > Linux

Linux dd命令操作磁盘

2020-07-26 15:13 489 查看

Linux dd命令操作磁盘

  • 磁盘镜像克隆
  • 数据备份与恢复
  • 备份MBR
  • 其它实例分析
  • 用dd命令制作硬盘镜像的特点
  • 显示dd命令进度
  • Linux dd命令操作磁盘

    dd所执行的是简单粗暴的按字节复制,什么分区表啊,MBR啊统统照搬

    dd参数说明

    if =输入文件(或设备名称)。

    of =输出文件(或设备名称)。

    ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。

    skip = blocks 跳过读入缓冲区开头的ibs*blocks块。

    obs = bytes 一次写入bytes字节,即写 入缓冲区的字节数。

    bs = bytes 同时设置读/写缓冲区的字节数(等于设置obs和obs)。

    cbs = bytes 一次转换bytes字节。

    count = blocks 只拷贝输入的blocks块。

    conv = ASCII 把EBCDIC码转换为ASCII码。

    conv = ebcdic 把ASCII码转换为EBCDIC码。

    conv = ibm 把ASCII码转换为alternate EBCDIC码。

    conv = blick 把变动位转换成固定字符。

    conv = ublock 把固定们转换成变动位

    conv = ucase 把字母由小写变为大写。

    conv = lcase 把字母由大写变为小写。

    conv = notrunc 不截短输出文件。

    conv = swab 交换每一对输入字节。

    conv = noerror 出错时不停止处理。

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

    fdformat命令 低级格式化软盘。

    实例:创建一个100M的空文件

    dd if=/dev/zero of=hello.txt bs=100M count=1

    磁盘镜像克隆

    全部克隆

    也就是把整个硬盘复制一份。当然你首先需要在计算机上在接上一块新硬盘,并让系统识别。例如这块硬盘可能被识别为/dev/sdb,原有硬盘叫/dev/sda. 然后你可以在linux命令行上简单地执行:

    dd if=/dev/sda of=/dev/sdb

    此命令完成后,你的第二块硬盘上(/dev/sdb)将有一个和第一块硬盘一模一样的副本,也是可以启动的。因为dd操作就是简单的按字节复制,什么分区表啊,MBR啊统统照搬。

    当然你也可以做一些微调,来定制一下克隆操作。例如你可能希望把硬盘上的内容全部备份到一个磁盘文件中,而不是另一块新硬盘,你可以

    dd if=/dev/sda of=~/disk1.img

    之后,disk1.img就是备份好的磁盘映像文件,你可以复制或转移到其他介质也可以压缩一下:

    gzip disk1.img #generates disk1.img.gz

    或者在创建磁盘映像文件的同时就执行压缩:

    dd if=/dev/sda | gzip > disk.img.gzdd if=/dev/sda | bzip2 > disk.img.bz2

    分区克隆

    如果我们不想克隆整块磁盘,只想把某些存放数据的分区备份一下,你会需要克隆一个分区。正如预备知识所述,分区在linux下也是一个文件。例如

    dd if=/dev/sda1 of=~/part1.img

    将把第一块磁盘的第一个分区备份到名为part1.img的文件中。
    也可以进行分区复制:

    dd if=/dev/hda1 of=/dev/hda3

    将把分区一原样复制到分区3.

    从镜像文件恢复磁盘或分区

    很简单,把上面命令中,of和if指向的文件名互换一下即可实现恢复。例如

    dd if=disk1.img of=/dev/sda

    把保存在disk1.img中的映像恢复到第一块磁盘

    dd if=part1.img of=/dev/hda2

    把保存在part1.img中的映像恢复到第一块硬盘的第二个分区

    最后,需要注意一点是,无论备份还是恢复,都需要保证 of 指向的文件或磁盘空间要大于 if 指向的内容,因为是按字节复制 如果没有足够的空间去存储内容,备份自然会失败。

    数据备份与恢复

    备份

    将本地的/dev/hdx整盘备份到/dev/hdy :

    dd if=/dev/hdx of=/dev/hdy

    将/dev/hdx全盘数据备份到指定路径的image文件:

    dd if=/dev/hdx of=/path/to/image

    备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径:

    dd if=/dev/hdx | gzip >/path/to/image.gz

    恢复

    将备份文件恢复到指定盘:

    dd if=/path/to/image of=/dev/hdx

    将压缩的备份文件恢复到指定盘 :

    gzip -dc /path/to/image.gz | dd of=/dev/hdx

    备份MBR

    备份:

    备份磁盘开始的512Byte大小的MBR信息到指定文件:

    dd if=/dev/hdx of=/path/to/image count=1 bs=512

    恢复:

    将备份的MBR信息写到磁盘开始部分:

    dd if=/path/to/image of=/dev/hdx

    其它实例分析

    备份软盘

    dd if=/dev/fd0 of=disk.img count=1 bs=1440k

    将软驱数据备份到当前目录的disk.img文件

    拷贝内存资料到硬盘

    dd if=/dev/mem of=/root/mem.bin bs=1024

    将内存里的数据拷贝到root目录下的mem.bin文件

    从光盘拷贝iso镜像

    dd if=/dev/cdrom of=/root/cd.iso

    拷贝光盘数据到root文件夹下,并保存为cd.iso文件

    得到最恰当的block size

    dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
    dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
    dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
    dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

    通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小

    测试硬盘读写速度

    dd if=/root/1Gb.file bs=64k | dd of=/dev/null
    dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

    通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度

    修复硬盘

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

    dd if=/dev/sda of=/dev/sda

    销毁磁盘数据

    dd if=/dev/urandom of=/dev/hda1

    利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。

    用dd命令制作硬盘镜像的特点

    1. 在制作镜像时,不能对需要进行备份的硬盘进行写操作,可以只读挂载或者不挂载
    2. 在制作镜像时,MBR、硬盘的分区表、bootloader也会被备份
    3. 生成的镜像文件用于恢复时,目标硬盘的容量必须等于或大于源硬盘的容量
    4. 使用硬盘镜像完成恢复后,由于目标硬盘的分区表跟源硬盘的分区表是一样的,所以会造成目标硬盘的空间浪费。这个问题可以通过使用硬盘分区大小调整工具解决。
    5. 在dd生成或恢复镜像时,默认没有显示进度,但这个问题可以解决。解决方法请看下文。

    显示dd命令进度

    想要查看上面的dd命令的执行进度,可以使用下面几种方法:
    比如:每5秒输出dd的进度
    方法一:

    watch -n 5 pkill -USR1 ^dd$

    方法二:

    watch -n 5 killall -USR1 dd

    方法三:

    while killall -USR1 dd; do sleep 5; done

    方法四:

    while (ps auxww |grep " dd " |grep -v grep |awk '{print $2}' |while read pid; do kill -USR1 $pid; done) ; do sleep 5; done

    上述四种方法中使用三个命令:pkill、killall、kill向dd命令发送SIGUSR1信息,dd命令进程接收到信号之后就打印出自己当前的进度。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: