由于dd命令是对磁盘绝对位置进行备份,是对整个分区或者磁盘进行备份。不管磁盘或分区使用了多少,备份的是整个磁盘或分区,所以为节约备份文件的空间建议先建立一个相对较小的分区作为系统分区,然后先备份一份较小的系统,然后重新分区,再将系统还原回去。
注意:只要时运行备份,建议都使用Ubuntu的Live CD功能启动来操作(即启动盘下的试用Ubuntu而不安装的功能),因为这样可以减少资源占用造成的备份不完整。
说明:
1、使用DD进行硬盘备份可以实现类似Ghost的基本功能,比如整个硬盘备份(包括MBR),单分区备份,单备份MBR,硬盘对拷。
2、如果分区对分区进行拷贝时,当两个分区大小不一致的情况,在恢复完之后需要重新调整新分区大小。两个硬盘对拷的情况也需要这样去调整。
3、使用DD备份分区或整块硬盘时,如果分区是100G的容量,而只使用了20G的容量,那么备份后输出的文件大小是100G;这种情况可以使用压缩解决,不过不一定有效,结果可能还是一样很大。
4、DD不能解决文件排序,磁盘碎片整理等问题,所以在备份后文件的大小问题很难解决。
5、DD一般使用在本机的硬盘备份和还原上,也就是针对原分区的操作。或者硬盘对拷。因为这样完成后不需要修改任何东西。
6、如果使用DD把系统还原到另一个新硬件上,估计要修改很多东西,待实践。
7、DD还可以用做测试硬盘速度。
DD命令:
语法
dd [选项]
选项
#注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512;c=1;k=1024;w=2 if=文件名:输入文件名,缺省为标准输入。即指定源文件。of=文件名:输出文件名,缺省为标准输出。即指定目的文件。 ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。 obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。 bs=bytes:同时设置读入/输出的块大小为bytes个字节。 cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。 skip=blocks:从输入文件开头跳过blocks个块后再开始复制。 seek=blocks:从输出文件开头跳过blocks个块后再开始复制。 #注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。 count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。 conv=conversion:用指定的参数转换文件。 ascii:转换ebcdic为ascii ebcdic:转换ascii为ebcdic ibm:转换ascii为alternate ebcdic block:把每一行转换为长度为cbs,不足部分用空格填充 unblock:使每一行的长度都为cbs,不足部分用空格填充 lcase:把大写字符转换为小写字符 ucase:把小写字符转换为大写字符 swab:交换输入的每对字节 noerror:出错时不停止 notrunc:不截短输出文件 sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
使用实例:
说明:在Linux上,一块硬盘或者一个分区都由一个目录表示,一般存在于系统根目录的/dev/之下。例如/dev/hda代表你的第一块IDE硬盘,/dev/sdb代表第二块SCSI硬盘,/dev/fd0代表系统的软盘驱动器等等。同样每块硬盘上的分区也有独特的目录名,例如/dev/hda1表示你第一块硬盘上的第一个分区。
1、将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
2、将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image
3、将备份文件恢复到指定盘
dd if=/root/image of=/dev/hdb
4、备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd if=/dev/hdb | gzip > /root/image.gz
5、将压缩的备份文件恢复到指定盘
gzip -dc /root/image.gz | dd of=/dev/hdb
6、备份与恢复MBR
备份磁盘开始的512个字节大小的MBR信息到指定文件:
dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
恢复:
dd if=/root/image of=/dev/had
将备份的MBR信息写到磁盘开始部分。
7、备份软盘
dd if=/dev/fd0 of=disk.img count=1 bs=1440k (即块大小为1.44M)
8、拷贝内存内容到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)
9、拷贝光盘内容到指定文件夹,并保存为cd.iso文件
dd if=/dev/cdrom(hdc) of=/root/cd.iso
10、增加swap分区文件大小
第一步:创建一个大小为256M的文件:
dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件:
mkswap /swapfile
第三步:启用这个swap文件:
swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0
11、销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1
注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。
12、测试硬盘的读写速度
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file dd if=/root/1Gb.file bs=64k | dd of=/dev/null
通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。
13、确定硬盘的最佳块大小:
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
通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。
14、修复硬盘:
dd if=/dev/sda of=/dev/sda 或dd if=/dev/hda of=/dev/hda
当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据起死回生。并且这个过程是安全、高效的。
15、利用netcat远程备份
dd if=/dev/hda bs=16065b | netcat < targethost-ip > 1234
在源主机上执行此命令备份/dev/hda
netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc
netcat -l -p 1234 | bzip2 > partition.img netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2、gzip对数据进行压缩,并将备份文件保存在当前目录。
16、将一个很大的视频文件中的第i个字节的值改成0x41(也就是大写字母A的ASCII值)
echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc
17、备份分区
dd if=/dev/sda1 of=~/partition1.img
18、光盘备份
dd if=/dev/cdrom of=tgsservice.iso bs=2048
注意:如果光盘是自动挂载的,在使用dd命令创建iso映像之前最好umount掉以避免造成对CD ROM不必要的访问。
19、在上面的拷贝过程中,并不知道拷贝了多少,只有最终结束时才显示出时间、拷贝速度。为了查看进度,可以在另一个终端输入:
sudo watch -n 5 killall -USR1 dd
20、还原分区表,跳过主引导记录
dd if=/backup/mbr.img of=/dev/sda bs=1 count=64 skip=446 seek=446
使用技巧:
1、修复还原到大小不一样的分区时的设置:
sudo dd if=/dev/sda1 of=/dev/sdb1 sudo e2fsck -f /dev/sdb1 sudo resize2fs /dev/sdb1
2、硬盘和硬盘对拷时不需要上述设置。
3、在dd生成镜像之前,先umount所有if和of设备的分区。这样可以确保在dd的过程中文件系统没有被改变。
4、如果把镜像恢复到另一台计算机上,可能会发现网卡是eth1,而不是eth0。这是因为/etc/udev/rules.d/70-persistent-net.rules文件把做镜像的计算机的网卡作为eth0登记了。 如果网络脚本对eth0进行了处理,而没有对eth1进行处理,那么不修改网络脚本,可能就无法上网。也许会希望在做镜像之前,先删除/etc/udev/rules.d/70-persistent-net.rules文件。这样恢复镜像时,网卡的名字就是eth0。 就不会造成在恢复后的计算机上无法上网的问题。
5、如果硬件不一样的机器,可以尝试以下方法:
sudo chroot #更新grub sudo update-grub #更新fstab的UUID /etc/fstab