通過網絡完全復制你的電腦



通過網絡完全復制你的電腦




提要


盡管克隆動物(“多莉羊“)甚至人類胚胎的研究依然是一個充滿爭議和風險的領域,而掌握一些關於“克隆”電腦的知識不但沒有害(正確的操作為前提),反而會使你仔細書寫配置腳本的能力得到提升。 根據摩爾定律以及計算機生產的快速進程,我們在使用電腦時很可能會遇到需要“克隆”我們的電腦的情況——不管是臺式機被筆記本取代還是換一臺更快的機子。而我們就需要將電腦A 上的所有文件分區 復制到電腦B 上而且使它正常工作。通常有兩種做法:一種就是直接打開機箱,然後將硬盤換掉就可以瞭——但是但打開機箱通常意味著失去質保,而且這通常很危險——一個沒 有經驗的用戶可能會給硬件帶來機械的或者電子上的損傷。另一種方法要求兩臺電腦都有網卡(現在即使是在傢用電腦中通常也滿足),這種在下面會詳細介紹的方 法更安全。



下面描述的所有方法都是建立在網絡連接的基礎上,即,需要在“”電腦(就是那臺有數據要被復制的電腦)和“目標”電腦(就是需要數據的那臺電腦)之間有網絡連接。可以直接通過集線器連接,或者通過特殊連接線(crossover cable)將 兩張網卡連接起來(註意:一般的網線是不行的)。 對目標電腦來說,需要一張Live-CD(如Knoppix 或 LNX-BBC)或一個最小安裝,以保證可對網卡進行操作而且使ssh 和/或 netcat能用。甚至有的軟盤上的系統(就像我用tomsrtb也能很好工作),而且如果你想安裝另一個全新的發行版,這是一個很不錯的選擇。兩臺電腦的IP 要在同一個網段,以便他們能相互進行“會話”,如上圖。



可能的方案


通過基本的準備,有幾種方法來進行復制:



  • 通過 dd復制


  • tar / cpio 管道


  • rsync


  • dumprestore


如果你的兩塊硬盤不是同樣的型號和大小,第一種方法是不可行的或非常復雜的(復制iso 鏡像(dd if=/dev/cdrom of=the.iso)或者軟盤通過dd很不錯。這裡 (diskcopy 腳本)是一個使用dd的腳本diskcopy)。使用dd的另一個缺點是:你未使用的空間也會被復制,從而浪費很多無謂的時間。 通過tarcpio的管道會花費很長的時間(長達數小時),而且對文件名和符號連接會有一些限制,在/dev時會被阻塞,等等。因此,不推薦此法。 如果你的源電腦和目標電腦上的文件系統不一樣,那麼rsync(1)可能是最好的選擇。這隻需要有ssh正常的運行且文件傳輸協議正常。 而且它還有針對設備文件的-D選項以及其他很多針對各種場合各種需求的選項。這是對每天的備份、作鏡像或其他任務來說很有用的一個工具,它的手冊上還有很多值得學習的例子。通過rsync復制的例子在[1]可以找到。


這裡,我們使用dumprestore,這樣還可以重新分配整個文件系統。這是一個快速、有效且可以通過最少的努力達到我們的目的——簡直是理想的解決方法。 我需要操作這個過程兩次,因為有兩臺目標電腦。兩臺目標電腦都能很好的啟動、工作,而且復制那些成G 的數據大概隻花瞭我一個小時。這個方法要求源電腦和目標電腦有同樣的文件系統。在此,我們假定是ext2ext3,因為這是現在最廣泛的使用的兩種文件系統()(參見 下面).



配置ssh


一旦配置好最小安裝的系統或者Live-CD,下一步就是配置ssh(如果你沒有像下面描述的使用netcat來傳送文件)。這需要源電腦運行sshd(the secure shell daemon)。如果不確定,請檢查 /etc/init.d/。在目標電腦上輸入(root帳戶):


ssh-keygen -t rsa

為簡便起見,不要輸入密碼。公鑰就會保存在/root/.ssh/id_rsa.pub文件裡。復制此文件到源電腦上



scp /root/.ssh/id_rsa SourcePC:/tmp

在此 SourcePC 是你源電腦的IP 地址,當提示你是否確認時,輸入完整的“yes”(單獨的“y” 有時會不行)。在源電腦上你還會被要求輸入root 的密碼。現在把目標電腦加入你源電腦的可信任網絡節點裡去



cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys

為檢查是否成功完成,重復上面的復制命令,應該不會再要求你輸入密碼瞭!



在目標電腦上創建文件系統


通常第一步都是對你的硬盤分區,然後創建ext2/ext3文件系統。 ext3 的需要在mke2fs 命令裡加一個-j (journalling)的選項(需要內核對ext3的支持)。你甚至可以將ext2的分區轉化為 ext3的, 參見tune2fs(8)。 假設我們的源電腦上有如下的分區:























































Filesystem

Size

Used

Use%

Mounted on

/dev/hda3

2.7G

552M

22%

/

/dev/hda5

7.8G

1.6G

22%

/usr

/dev/hda7

6.3G

1.7G

28%

/usr/share

/dev/hda8

3.4G

601M

19%

/home

/dev/hda12

5.3G

1.9G

37%

/opt

/dev/hda1

587M

70M

13%

/var/backup

我推薦大傢一定要做一些分區,否則,文件系統的錯誤使用或者硬盤磁道的一點損壞就會完全破壞掉你所有的數據。而且根據Murphy 定律,在事先沒有做好硬盤分區而是直接使用整塊硬盤的時候,這通常就會發生。我最近就遇到過這樣的情況,如果事先沒有做好分區的話,就會由於主分區的一點問題而丟失掉我的所有數據。上面的文件表明/usr 分區增長的太大瞭,所以/usr/share必須被加入。是該換一個大點的硬盤的時候瞭。


在目標電腦上,使用parted (推薦) 或者你喜愛的分區工具(Qtparted 是一個很好的圖形界面的工具,據說是Partition Magic 克隆版)。創建的分區不能比源電腦上對應的分區小。另外,別忘瞭 swap 分區。保存好分區表,在剛創建的分區上創建文件系統,可以使用



mke2fs -j -L <label> /dev/xxx

這裡 xxx 是你的分區名,然後用<label>設置卷標號。我經常使用如 “/usr”一類的作為卷標。你也可以通過tune2fs(8)來設置各種任務,比如周期性的文件系統檢查。



傳送文件系統


首先你需要加載所有新創建的分區,我們先從主文件系統(“/”)開始,其他的按順序依次進行。當然可以將源電腦上的兩個分區整合到目標電腦上的一個分區上去,事實上,這正是我們要做的——將上例中/usr//usr/share合並為一個分區。 我們加載未來的主文件系統



mount /dev/xxx /mnt

在復制的時候,轉到目標目錄裡面去是很必要的



cd /mnt

在目標電腦上鍵入



ssh sourcePC 'dump -0 -f - /' | restore -r -f -

這裡 targetPC 是你目標電腦的 IP 地址。參數“-0” 表示完全備份,“-f -”表示使用stdin/stdout做為文件描述符,而“-r”意思是指示 restore 去重新創建通過網絡傳送的文件系統到目標電腦上去。更多內容請參考dump(8)restore(8)。 下面你看到的是傳送主文件系統的輸出。



$ ssh 10.42.3.42 'dump -0 -f - /' | restore -r -f -DUMP: Date of this level 0 dump: Tue Feb 22 15:50:12 2005DUMP: Dumping /dev/hda3 (/) to standard outputDUMP: Label: debianDUMP: Writing 10 Kilobyte recordsDUMP: mapping (Pass I) [regular files]DUMP: mapping (Pass II) [directories]DUMP: estimated 547312 blocks.DUMP: Volume 1 started with block 1 at: Tue Feb 22 15:50:14 2005DUMP: dumping (Pass III) [directories]DUMP: dumping (Pass IV) [regular files]DUMP: Volume 1 completed at: Tue Feb 22 15:51:43 2005DUMP: Volume 1 546590 blocks (533.78MB)DUMP: Volume 1 took 0:01:29DUMP: Volume 1 transfer rate: 6141 kB/sDUMP: 546590 blocks (533.78MB)DUMP: finished in 89 seconds, throughput 6141 kBytes/secDUMP: Date of this level 0 dump: Tue Feb 22 15:50:12 2005DUMP: Date this dump completed: Tue Feb 22 15:51:43 2005DUMP: Average transfer rate: 6141 kB/sDUMP: DUMP IS DONE

Restore 通常會創建一個名叫 restoresymtable的文件,如果你確信在文件系統重建過程中沒有錯誤發生,你可以將這個文件刪掉。 完成主文件系統的復制,下面我們依次完成其他子分區的復制。從 /usr開始吧(假定你現在的工作目錄是未來的主文件系統)。



mount /dev/xxx ./usr

cd ./usr

ssh targetPC 'dump -0 -f - /usr' | restore -r -f -

這個 mount-cd-dump/restore 循環現在可以對你的所有目錄重復進行操作。上面提到的對 /usr/share(在源電腦上是個獨立的分區)的處理, 可以簡單的通過切換目錄到 ./usr/share (註意這個“.”),然後簡單的重復



ssh targetPC 'dump -0 -f - /usr/share' | restore -r -f -

在目標文件系統有你要 restore 的文件時,Restore 會報錯。通過 ssh 復制一整臺電腦的數據會花費大概一個小時和100MB 網卡(也許還要特殊數據線crossover cable)。



註意: 轉儲文件系統時,並不需要加載,你可以僅僅通過給定 分區名, 如 /dev/hda6,而非加載後的目錄名。



另一個選擇 netcat


另一個種方法不使用 ssh,而使用 netcat(1), netcat 簡稱 nc. Netcat 是一把非常簡單易用的基於 TCP/IP 協議(C/S模型的)的“瑞士軍刀”,它能允許我們通過網絡創建管道(pipe)。上面的例子隻需像下面一樣改一點點東西就可以用瞭。我們假設加載在 /var/backup 上的分區是我們要通過dump/restore 來傳送的。


在接收端(目標電腦),創建一個 netcat 的監聽例程(-l),這個監聽例程將管道輸出到 restore



nc -l -p 2000 -q 1 | restore -r -f -

源電腦, 創建另一個 netcat 的例程,這個例程將它從管道裡得到的輸入發給目標電腦,這裡 target-IP 是目標電腦的 IP 地址。



dump -0 -f - /var/backup | nc <target-ip> 2000

-q 選項是讓 nc 在到達文件結束(EOF)時停止運行,但我是手動結束 nc 的。不過,仍然建議大傢使用ssh



後期工作


恭喜你!到目前為止,你已經成功的復制瞭你的系統。剩下的問題就是讓它好好的工作起來。首先,就是更新你的 /etc/fstab 文件。如果你的目標電腦的 IP 地址變瞭,那麼網絡配置文件 (Debian 裡面是/etc/hosts/etc/network/interfaces 兩個文件)。然後就是非常重要的 啟動配置 文件,這個是無論如何都需要更新的。對lilo 來說, 就是需要修改 /etc/lilo.conf文件(特別是 root=... 選項) 然後運行 lilo -v)。 對 grub 來說, 編輯 /boot/grub/menu.lst(或 /boot/grub/grub.conf,取決於哪個是符號鏈接)然後運行 grub,



grub> root (hd0,xxx)

... filesystem is ...

grub> setup (hd0)

... lots of output here

grub> quit

或運行 grub-install /dev/xxx 其中 xxx 是你的硬盤。在此,檢查你的root (hdn,xx) ,並加上 root=/dev/xxx 的設置。



可能的情況是,你現在復制好的電腦有瞭一些更好的硬件,因此可能需要修改你 內核的配置 。如果你的系統有很多預先配置的好的模塊(如 RedHat, SuSe, Mandrake, Fedora ...) ,那麼很可能已經有瞭合適的模塊(module)瞭。否則, lspci -vv 並自己重新編譯內核。如果你的顯卡不同瞭,更新 /etc/X11/XF86Config-4(或者在 RH/Fedora 中xorg.conf )。如果可能,啟動到運行級別 3 並使用工具來配置你的 X。在 debian 裡,一些調查是必要的,我就很幸運的發現我的驅動從r128 變為瞭radeon



其他系統


這篇文章講解瞭克隆 ext2/ext3 文件系統的全過程。很多類似的命令可以在很多其他的 *nix 系統上,諸如 FreeBSD, HP-UX, IRIX 等也提供 dump/restore 這些命令; 在 Solaris 中,這被稱作 ufsdump/ufsrestore。當然也有的文件系統不提供 dump 功能,例如 ReiserFS,這種情況就最好使用 rsync瞭。關於使用 rsync 成功復制Linux 系統的問題,參見 [1]。



References




[1] ''Replicating a Linux System - Yet Another Method.'' Ben Okopnik, Linux Gazette Issue 83, October 2002.

0 個評論

要回覆文章請先登錄註冊