最近更新: 2005-07-18

Linux System Backup and Clone

主要用於系統持續服務的狀態下 (不關機狀態) ,進行系統備份工作,將運作中系統的內容,複製到遠端系統上儲存。都是可利用此備份技巧,進行系統的複製。重點在於不中斷系統服務的狀態 (不需要關機與重開機) 下完成此工作。

窮人版的備援系統建置方法,於系統持續服務的狀態下 (不關機狀態) ,進行系統備份工作,將運作中系統的內容,複製到遠端系統上儲存。作法為設置至少二台主機同時運作,並互相將自身的資料內容複製到另一台主機上,互為備援。主機平時可以各自負責不同的服務,但當任一主機故障停擺時,則其他主機便可先接下故障主機的服務工作。企業有企業的作法。企業級的作法,是購置具有系統鏡射及自動負載平衡的設備,直接將任何更動鏡射到所有主機上。再者,這是針對檔案系統的完整複製動作,對於系統上運作的資料庫,還是建議另外再用資料庫本身提供的備份方式,備份資料庫內容。

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

  • 主要伺服器: master ,假設 ip 是 192.168.1.1
  • 備用伺服器: slave ,假設 ip 是 192.168.1.2

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

先把 slave 的系統更新到 slackware 8.1 ,安裝需要的軟體並完成設定,確定服務可以正常運作。在我的設定上,有 apache2 with ssl + php4 + postgresql, named, dhcpd, sendmail這幾個主要服務,以及 openssh 這個必要的網路工具。測試完成後,將這兩個機器的 ip 互換,等 master 也更新完成後再換回來。(因為我的 slave 機器設備比 master 差一級) 用 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 登入遠端。做法如下: (此時的 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 與帳號的密碼也記得修改。並不建議兩台主機的帳號使用相同的密碼。

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

上面說的技巧,也可以用在備份上 (通常是這個用途啦) ,把要備份的內容,用上面的複製方式寫入 crontab ,就可以系統定時複製資料到遠端主機上。例如完整的複製資料,可以把指令改成:

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

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

樂多舊網址: http://blog.roodo.com/rocksaying/archives/280052.html