dd 詳解及系統備份還原轉移方案

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 的任務,接下來重新啓動就大功告成!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章