Rock's Saying Logo1 border Rock's Saying Logo2
隨手行文 | 閒語集 | 過客留言 | 飛鴿傳書

本文之更新內容,改為發佈在我的部落格中,請點擊此處前往閱讀。

Linux系統備份與複製

主要用途在利用系統完整備份的技巧,進行系統的複製。重點在於不中斷系統服務的狀態下完成此工作。

把一台伺服器的系統(檔案、設定等等),在不中斷服務的狀態下,完全複製到另一台機器上。

Required: tar, ssh

主要伺服器: master ,假設 ip 是 192.168.1.1

備用伺服器: slave ,假設 ip 是 192.168.1.2

在讓 master 維持運作狀態的情形下,要更新這兩台主機的系統,在我的案例中,是要更新到 slackware 8.1,當然這方法並沒有版本限制,如 RedHat 、Mandrake也都可以用。

先把 slave 的系統更新到 slackware 8.1 ,安裝需要的軟體並完成設定,確定服務可以正常運作。

在我的設定上,有 apache2 with ssl + php4 + postgresql, named, dhcpd, sendmail這幾個主要服務,以及 openssh 這個必要的網路工具。

測試完成後,將這兩個機器的 ip 互換,等 master 也更新完成後再換回來。(因為我的 slave 機器設備比 master 差一級)

互換方式有很多種,例如:

1)直接修改 /etc/rc.d/rc.inet1 中的 IP address 後,同時重新啟動這兩台機器。

2)用 ifconfig ,如:

master# shutdown -h now 
slave# ifconfig eth0 192.168.1.1 netmask 255.255.255.0 

現在由 slave 上線接替 master 維持網路服務。

這次要更新 master 機器的系統了,但不用像更新 slave 那麼麻煩,只要安裝最基本的套件就好了 (A, N serials), A 系列套件是一定要裝的,而 N 系列只要裝 openssl 跟 openssh 就夠了。

安裝 master 的系統時, ip 先設為 192.168.1.2 ,等 master 安裝好重開後,就要開始利用 ssh 進行系統完全複製了。

現在 slave 跟 master 都跟網路連接了,但 master 只有最基本的軟體,在進行系統複製前,先確認在 master 上,可以用 ssh 以 root 帳號登入 slave ,因為要用 root 才能完全複製檔案。

/etc/ssh/sshd_config 中的 PermitRootLogin 要設為 yes ;建議複製完後再改回 no ,禁止直接以 root 登入。

接下來說明一下 ssh 的使用:

ssh userid@remote_host [remote_command] 

userid 是登入 remote host 時的帳號,而 remote_command 可用可無,如果有指定,就會直接在遠端主機上執行該指令,並將該指令的輸出結果,輸出到本地的 stdout (標準輸出設備,如終端機上)。

我就是利用 ssh 在遠端執行 tar ,把遠端的檔案系統直接複製過來。而為了完整複製所有檔案,所以需要用 root 登入遠端。

做法如下:

ps. 此時的 192.168.1.1 是指派給 slave 這台主機。

master# cd / 
master# ssh root@192.168.1.1 "tar czf - /var" | tar xzf - 
master# ssh root@192.168.1.1 "tar czf - /home" | tar xzf - 
master# ssh root@192.168.1.1 "tar czf - /usr" | tar xzf - 
master# ssh root@192.168.1.1 "tar czf - /etc" | tar xzf - 
   ... 

在遠端執行 tar czf - /path (注意中間那個 - 是有特別用意的),就會把 /path 下的檔案系統,完整 (連uid, gid, mode) 地讀取出來,並輸出到遠端的 stdout 。 而 ssh 會把輸出到遠端 stdout 的內容,傳送到本地端的 stdout ,故以 | tar xzf - (再次注意後面那個 - ) 讀取資料並寫入到本地的檔案系統中。

依序把重要的檔案目錄給複製過來。但像 /dev, /proc, /tmp 倒不用複製。複製完成後,兩台主機的內容就一致了。最後把 ip 再換回來就大功告成。

另外,像我是把 master 設為 Master DNS server, slave 設為 Slave DNS server, 更新完後的 /etc/named.conf 要分別再修改;而 /etc/dhcpd.conf 也要記得修改。喔,兩台主機的 HOSTNAME 與帳號的密碼也記得修改。並不建議兩台主機的帳號使用相同的密碼。

我在想,是不是還有更快的方法,連先安裝基本套件都不用就可以在不關機的狀態下複製整個主機到另一台上去??

上面說的技巧,也可以用在備份上 (通常是這個用途啦),把指令改成:

slave# ssh root@master "tar czf - /" > /mnt/master_backup.tgz  

甚至於也不用先儲存到檔案,直接用燒錄工具的指令,把資料燒進光碟也行 (或是操作磁帶,但我只聽過沒用過磁帶機 :p) 。

PS. Slackware 8.1 有幾個需要更新的套件,可以先更新後再複製。

OpenSSH 3.1 -> OpenSSH 3.4p1
Apache 1.3.24 -> Apache 1.3.26
到 slackware 的網站上,可以找到 binary 的套件。

PostgreSQL (7.2), Apache2(2.0.39) + PHP (4.2.2) 可以到
http://www.linuxpackages.net/ 上找到 binary 套件。
雖然我都是自己抓 source make .



隨手行文 | 閒語集 | 過客留言 | 飛鴿傳書 石頭閒語 (http://home.educities.edu.tw/shirock/)
Copyright (C) 1999 - 2002 遊手好閒的石頭成 更新日期: 91年 8月6日