dd是device driver的缩写,也可以说是“Linux世界的搬运工”。 用于读取设备、文件的内容,直接复制到指定位置。
可以通过使用dd命令读取/dev/null文件来创建空文件。 如果磁盘足够大,还可以制造宇宙黑洞。
磁盘备份和恢复
记忆力比坏笔头好,硬盘不比经常备份好。 硬盘损坏是一个小概率事件,但一旦发生,将会带来灾难性的后果。 备份重要数据不仅是一个好习惯,而且体现了别人对自己负责的态度。
写到这里,突然发现我的硬盘里有很多宝贵的资料,一想到磁盘故障可能会永远失去它们,我的心就颤抖起来。 赶紧把数据的备份提上日程吧。
我以前读过介绍dd的报道。 在例子中几乎都是使用hda、hdb这样的IDE接口的硬盘,其实现在的主流硬盘已经是SATA接口的了。 下一个要备份的硬盘是dev/sda,它是块SATA磁盘。
[ root @ roclinux~~ ] # ddif=/dev/sda of=/root/sda.img
此命令将sda磁盘备份到指定的文件/root/sda.img。 在此使用以下两个选项:
if=文件名:如果指定输入文件名或设备名,省略“if=文件名”,则表示从标准输入读取。
of=文件名:指定输出文件名或设备名,如果省略“of=文件名”,则表示写入标准输出。
使用上面的dd命令,获得了sda.img文件。 这是一个备份的磁盘映像文件,其中包含整个/dev/sda硬盘的内容。
如果将来的某一天/dev/sda硬盘实际发生故障,您可以将备份的sda.img复制到另一台计算机,然后恢复到指定的sdb磁盘。
[ root @ roclinux~~ ] # ddif=/root/sda.imgof=/dev/sdb
如果您可以将目标硬盘直接连接到当前计算机并使系统识别为新硬盘(如/dev/sdc ),则可以使用dd命令将sda磁盘直接复制到sdc。 此用法既可用于完全备份,也可用于快速复制系统环境。 让我们看看具体的命令:
[ root @ roclinux~~ ] # ddif=/dev/sda of=/dev/SDC
对dd来说,所有设备和文件都被视为一视同仁。 所谓的“备份”和“恢复”认为dd是内容的副本。 dd操作是一个简单的逐字节副本。 简单直观,是我对dd最直接的感受。
备份时压缩
如果在不压缩数据的情况下备份整个磁盘,则需要很大的备份空间,并且备份成本会上升。 这在备份场景中是低性能的。
如果磁盘空间不足,备份操作也无法顺利完成。
#看,报告了磁盘空间不足的警告
[ root @ roclinux~~ ] # ddif=/dev/sda of=/root/sda.img
DD : writing to '/root/sda.img ' : nospaceleftondevice
事实上,使用dd进行备份时,可以使用gzip或bzip2压缩算法进行数据压缩处理。 这将大大减少磁盘空间使用量,并降低备份成本。
使用gzip压缩算法和dd命令备份/dev/sda磁盘。
未指定#of时输出到标准输出
[ root @ roclinux~~ ] # ddif=/dev/sda|gzip/root/sda.img.gz
然后恢复到/dev/sdb磁盘。 方法如下。
如果未指定#if,则表示从标准输入读取
让我们交换bzip2压缩算法和dd命令,再次实现以上示例的效果。
[ root @ roclinux~~ ] # ddif=/dev/sda|bzip2disk.img.bz2
[ root @ roclinux~~ ] # bzip2- DC/root/sda.img.gz|ddof=/dev/SDC
分区、内存、软盘一个也不能少
以上内容介绍了备份整个磁盘的知识,如果只想备份某个分区中的数据,该怎么办?
卖了关子,其实从dd命令来看,完整磁盘备份和分区备份在命令格式上没有区别。 请看以下示例:
[ root @ roclinux~~ ] # ddif=/dev/sda2of=/root/sda _ part1. img
同样,也可以用同样的方法备份内存中的整个数据。
[ root @ roclinux~~ ] # ddif=/dev/memof=/root/mem.img
随着科学技术的飞速发展,台式机和笔记本电脑都取消了光驱和光驱的设备,光驱和光驱也濒临灭绝,很多九零后们不知道光驱是什么。
所以我想接下来介绍的软盘、CD的备份方法是回忆过去。 通过这个内容我会怀念起我们逝去的青春
。#备份软盘
[root@roclinux ~]# dd if=/dev/fd0 of=/root/fd0.img count=1 bs=1440k
#备份光盘
[root@roclinux ~]# dd if=/dev/cdrom of=/root/cd.img
对于 dd 命令来说,除了 if、of 两个选项之外,还应该掌握下面这两个重要选项:
bs=N:设置单次读入或单次输出的数据块(block)的大小为 N 个字节。当然也可以使用 ibs 和 obs 选项来分别设置。
ibs=N:单次读入的数据块(block)的大小为 N 个字节,默认为 512 字节。
obs=N:单次输出的数据块(block)的大小为 N 个字节,默认为 512 字节。
count=N:表示总共要复制 N 个数据块(block)。
所以这里备份的软盘大小是 1440kB,可以看出这是一块 3 寸盘,其大小为 1.44MB。为了追忆青春,我们再来一起看看软盘的样子。
备份磁盘的 MBR
MBR,是 Master Boot Record,即硬盘的主引导记录,MBR 一旦损坏,分区表也就被破坏,数据大量丢失,系统就再也无法正常引导了,真是不堪设想啊!所以,对 MBR 的定期备份是十分必要的,在紧急关头,把它比喻成一颗救死扶伤的速效救心丸,也绝不为过。
一块磁盘的第一个扇区的 512 个字节所存储的正是这块磁盘的 MBR 信息,我们尝试用 dd 命令备份 MBR:
[root@roclinux ~]# dd if=/dev/sda of=/root/sda_mbr.img count=1 bs=512
如果未来遇到分区表损坏的情况,我们用曾经备份的 MBR 信息写回磁盘,就能起到立竿见影的效果。下面来一起看看如何将 MBR 写回硬盘:
[root@roclinux ~]# dd if=/root/sda_mbr.img of=/dev/sda
方法是不是比你想象得要简单,即使是面对 MBR 如此重要的敏感数据,dd 命令也是闲庭信步,信手拈来。
使用 /dev/zero 和 /dev/null 来测试磁盘
本段落开始前,我们要为大家介绍两位新朋友:
/dev/null,也叫空设备,小名“无底洞”。任何写入它的数据都会被无情抛弃。
/dev/zero,可以产生连续不断的 null 的流(二进制的零流),用于向设备或文件写入 null 数据,一般用它来对设备或文件进行初始化。
我们可以观察下面两个命令的执行时间,来计算出硬盘的读、写性能:
#向磁盘上写一个大文件,来看写性能
[root@roclinux ~]# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
#从磁盘上读取一个大文件,来看读性能
[root@roclinux ~]# dd if=/root/1Gb.file bs=64k | dd of=/dev/null
上面命令生成了一个 1GB 的文件 1Gb.file,下面我们配合 time 命令,可以看出不同的块大小数据的写入时间,从而可以测算出到底块大小为多少时可以实现最佳的写入性能。
[root@roclinux ~]# time dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
[root@roclinux ~]# time dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
[root@roclinux ~]# time dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
[root@roclinux ~]# time dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
利用 /dev/urandom 进行格式化
除了 /dev/null 和 /dev/zero 之外,还有一个很重要的文件,即 /dev/urandom,它是“随机数设备”,它的本领就是可以生成理论意义上的随机数。
如果我们想清除硬盘里的某些机密数据,就可以使用 /dev/urandom 这个随机数生成器来产生随机数据,写到磁盘上,以确保将磁盘原始数据完全覆盖掉。
[root@roclinux ~]# dd if=/dev/urandom of=/dev/sda
好了,有关 dd 的故事就介绍到这里了。虽然我们不能创造出真正的宇宙黑洞,但学习了这么多的实用技能,也算不虚此行啦!