dd 详解及系统备份还原转移方案

来源:互联网 发布:我的人工智能贾维斯 编辑:程序博客网 时间:2024/06/07 04:44

dd 命令 
[root@linux ~]# dd if="input_file" of="outptu_file" bs="block_size" count="number"
参数:
if: 就是 input file 啰~也可以是装置喔!
of:就是 output file 喔~也可以是装置;
bs:规划的一个 block 的大小,如果没有设定时,预设是 512 bytes
count:多少个 bs 的意思。

范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
[root@linux ~]# dd if=/etc/passwd of=/tmp/passwd.back
3+1 records in
3+1 records out
[root@linux ~]# ll /etc/passwd /tmp/passwd.back
-rw-r--r-- 1 root root 1746 Aug 25 14:16 /etc/passwd
-rw-r--r-- 1 root root 1746 Aug 29 16:57 /tmp/passwd.back
# 仔细的看一下,我的 /etc/passwd 文件大小为 1746 bytes,因为没有设定 bs ,
# 所以预设是 512 bytes 为一个单位,因此,上面那个 3+1 表示有 3 个完整的
# 512 bytes,以及未满 512 bytes 的另一个 block 的意思啦!
# 事实上,感觉好像是 cp 这个指令啦~

范例二:备份 /dev/hda 的 MBR
[root@linux ~]# dd if=/dev/hda of=/tmp/mbr.back bs=512 count=1
1+0 records in
1+0 records out
# 这就得好好了解一下啰~我们知道整颗硬盘的 MBR 为 512 bytes,
# 就是放在硬盘的第一个 sector 啦,因此,我可以利用这个方式来将
# MBR 内的所有资料都纪录下来,真的很厉害吧! ^_^

范例三:将整个 /dev/hda1 partition 备份下来。
[root@linux ~]# dd if=/dev/hda1 of=/some/path/filenaem
# 这个指令很厉害啊,将整个 partition 的内容全部备份下来~
# 后面接的 of 必须要不是在 /dev/hda1 的目录内啊~否则,怎么读也读不完~
# 这个动作是很有效用的,如果改天你必须要完整的将整个 partition 的内容填回去,
# 则可以利用 dd if=/some/file of=/dev/hda1 来将资料写入到硬盘当中。
# 如果想要整个硬盘备份的话,就类似 Norton 的 ghost 软体一般,
# 由 disk 到 disk ,嘿嘿~利用 dd 就可以啦~厉害厉害!

cpio 命令 
[root@linux ~]# cpio -covB > [file|device] <==备份
[root@linux ~]# cpio -icduv < [file|device] <==还原
参数:
-o :将资料 copy 输出到文件或装置上
-i :将资料自文件或装置 copy 出来系统当中
-t :查看 cpio 建立的文件或装置的内容
-c :一种较新的 portable format 方式储存
-v :让储存的过程中文件名称可以在萤幕上显示
-B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes ;
   这样的好处是可以让大文件的储存速度加快 (请参考 i-nodes 的观念)
-d :自动建立目录,由於 cpio 的内容可能不是在同一个目录内,
         如此的话在反备份的过程会有问题, 这个时候加上 -d 的话,就可以自动的将需要的目录建立起来了;
-u :自动的将较新的文件覆盖较旧的文件
范例一:将所有系统上的资料通通写入磁带机内
[root@linux ~]# find / -print | cpio -covB > /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 ;
范例二:检查磁带机上面有什么文件
[root@linux ~]# cpio -icdvt < /dev/st0
[root@linux ~]# cpio -icdvt < /dev/st0 > /tmp/content
# 第一个动作当中,会将磁带机内的档名列出到萤幕上面,而我们可以透过第二个动作,
# 将所有的档名通通纪录到 /tmp/content 文件去
范例三:将磁带上的资料还原回来~
[root@linux ~]# cpio -icduv < /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 
范例四:将 /etc 底下的所有『文件』都备份到 /root/etc.cpio 
[root@linux ~]# find /etc -type f | cpio -o > /root/etc.cpio
# 这样就能够备份啰~您也可以将资料以 cpio -i < /root/etc.cpio
# 来将资料捉出来

-------------------------------------------------------------------------

使用 dd 做系统转移最近的一次 case 中,有客户的 Linux 发生了怪异现象,就是硬盘似乎变慢并且效能也不如之前,于是在考虑过后,决定更换一颗新的硬盘。做系统备份的方法其实有很多,像是 tar、cp、cipo ... 等工具都是很好的备份工具,但是这次我选择了 dd 工具来做两颗硬盘之间的备份,也就是说把 hda 的数据全都放到 hdb 去,然后再做交换。在实做的时候,我发现一个很有趣的现象,因为这台主机主要是用来放 source 专用的,虽然有做 RAID 1mirror,但是整个 hda2 居然吃了 70GB 如此大的空间。后来,推测应该是在建立主机之初没有把硬盘做适当的分割,所有的数据都放在同一个分割区里,当然 source 是会长大的东西,所以日子一久就慢慢的吃掉了很多空间 ...

我来说明一下这次的环境:

/dev/hda1:150MB,/boot
/dev/hda2:150GB,/
/dev/hda3:其它,swap

嗯 ... 所以说,知道了吧!全部只有两个分割区,若是使用 dd 来做系统转移的话,若是有两颗原本同型号、同容量的硬盘的的话当然是最好的,但是事实总是很残忍的,要找到一模一模型号的硬盘可不是这么容易的事,所以我当时决定使用一颗比目前还大的硬盘来做转换对像,于是乎客户就准备了一颗 200G 的硬盘来做转换了。

我先把第二颗硬盘放上去,装在 IDE1 的 slave,并且使用 Live CD 做开机,主要的目地就是确保在转移过程没有任何的信息再写入 /dev/hda 或 /dev/hdb。因为这次并不打算再做任何的其它分割,所以我就把新的 200 GB 硬盘分割为如下情况:

/dev/hdb1:170 MB,/boot
/dev/hdb2:170GB,/
/dev/hdb3:512 MB,swap
其余空闲

OK,做好了分割之后,再来就是 format 啦!

root # mke2fs -j /dev/hdb1
root # mke2fs -j /dev/hdb2
root # mkswap /dev/hdb3

接下来就是重头戏了,你可以很清楚的发现,我“故意”把每个分割区都切的比原本的还大,这是怕在 copy 的时候会发生容量不符的情况,所以才如此做,现在就准备来使复制的动作!

root # dd if=/dev/hda1 of=/dev/hdb1
root # dd if=/dev/hda2 of=/dev/hdb2

好了,小弟现在很认真的说,在 copy/dev/hda2 的时候,我一共等了快要四个小时,所以以后千万要记得做好系统规划,不然会等到死!

当完成了复制之后,要记得做系统 scan,而且是必做喔,因为等一下我们要修正磁盘容量:

root # e2ckfs -f /dev/hdb1
root # e2ckfs -f /dev/hdb2

一样的,在扫描 /dev/hdb2 的时候又是一长串时间 ...  当等待的时间过去之后,我们就可以来做磁盘容量调整了:

root # resize2fs /dev/hdb1
root # resize2fs /dev/hdb2

好了,各位观众,这时已经做好系统移转,但是有一个问题,就是这新的硬盘会无法开机,所以就必需安装 GRUB Loader 才行。

要重新安装 GRUB 有很多方法,小弟我是这么做的:

关掉计算机,把退役的 160 G 硬盘拿下来,并且把新的 200 G 硬盘 jump 调成 master,装到计算机里去;使用 RedHat 光盘开机,并以 rescue mode 进入:

boot: linux rescue

进入系统之后,重新 chroot 系统:

root # chroot /mnt/sysimage
root # grub-install /dev/hda

如此就完成安装 GRUB 的任务,接下来重新启动就大功告成!


原创粉丝点击