Linux 伺服器資料移轉實戰範例

作者:徐秉義(Albert Hsu)

Linux 伺服器用了幾年以後,難免會面臨到轉換的需求,如何順利地舊機換到新機,該注意到的地方許許多多,一不小心就會出狀況。所以本文是以筆者自身經驗,將轉換伺服器需要注意到的事項,記錄下來提供讀者參考。底下先以「升級轉換的必要性」「升級轉換前注意事項」來探討移轉伺服器軟硬體時,轉移前該準備的注意事項與思考方向。

接著介紹轉換帳號密碼、使用者資料、應用程式設定與資料庫轉換重點等等,期間穿插著 Windows 平台儲存 Linux 資料應該要注意的關鍵,並且針對 Windows/Linux 相互傳輸資料的一些常見問題來做示範,最後提到 Linux 全系統備份還原所需注意的事項。

升級轉換必要性

轉換的原因眾多,列舉如下:

使用量變大導致舊的硬體不堪負荷變得執行緩慢,期望更新硬體可以解決執行緩慢問題。

硬體運行多年過舊,使用者擔心發生(或已經發生)硬體故障服務停擺,期待更新硬體可以降低硬體故障造成服務停擺的機率。

軟體版本過舊,發生資訊安全問題,假設更新軟體版本可以解決資安問題。

軟體版本過舊,缺少使用者要求的新功能,假設更新軟體版本可以提供使用者要求的新功能。

伺服器硬體已經故障,硬體更換後仍需重灌倒回備份資料才能恢復正常服務。

駭客已經入侵狀況嚴重,必須重灌整理以後才能恢復正常運作。

由上述這些原因不難發現,更新分成軟體與硬體,終極目標則是伺服器「永續的服務」,對於伺服器管理員來說,能夠不重灌就不去重灌伺服器,能採用維修或故障排除的方式解決較省時又省力。對於能夠全盤掌握的伺服器,可以軟體硬體升級重灌一起來;而對於不太熟悉的伺服主機,則僅僅希望恢復原狀就好(或是相同版本複製一台)。

避免原機升級轉換

升級轉換在 Linux/Windows 都是一件繁瑣的事,非必要的話最好不要在原機做軟體的升級轉換,較好的替代方式是轉換至另一台主機(或是複製一台測試機模擬升級轉換一次以上)這樣就算是升級轉換不成功,還好有舊的機器可以提供服務,這樣子就不會因為升級轉換失敗導致服務停擺而讓自己像是熱鍋上的螞蟻。

帳號密碼轉移注意事項

要移到新的伺服器,帳號密碼轉移是很基礎的工作,倘若直接覆蓋設定檔極有可能衍生出額外的問題,通常我們會用『匯入』方式來轉移帳號密碼,這樣才比較不會出問題。

溫馨提示:覆蓋設定檔方式遇到『不同版本』 Linux 轉移時,出現衍生問題的機率極高;『同一版本』Linux 覆蓋式轉移,出的狀況會少些。

要移轉就需要先認識該轉哪些檔案以及明暸資料內容,列表如下:

 

/etc/passwd使用者資訊
/etc/group 群組資訊
/etc/shadow使用者密碼

針對使用者與群組 id 的範圍,一般使用者帳號 uid 會從 500(或是 1000)以後依序建立,至於最高權限的 root 帳號以及一些系統帳號(例如:mail、man、daemon 等等)則盡量不要匯進去(以免重複還要再後續處理)。

使用者帳號密碼及群組轉換範例

案例是將一台 Fedora Core 4 帳號密碼及群組轉換到 CentOS 5

先將舊機上面這三個檔案傳送到新機,筆者使用 rsync 將檔案拷貝到 /root/old/ 目錄使用以下指令

「rsync -av 172.18.9.41:"/etc/{passwd,group,shadow}" old/」(其中 172.18.9.41 是舊機 IP)

r

拿到這三個檔案,要先稍微整理一下這樣問題會少些,整理的方式是將第一行 root 以及一堆不需匯入的系統帳號清掉,這些系統帳號一般來說她的 UID、GID 範圍介於 1~500 或 1~1000 之間,處理好了以後剩下的就是我們要匯入的帳號。

這些檔案會依照帳號建立順序排列,若是想要依照 UID 或 GID 來排序的話,可使用 sort 指令來預先處理,例如:「sort -t : -k 3 -n passwd > passwd.sort」)。

指令 sort 選項 -t : 是以冒號作為分隔符號; -k 3 以第三欄來做排序(也就是 UID);-n 數字方式排序(例如:5 會排在 20 前面)

r

圖例是分界點 UID 500 所在位置故其上的帳號可以刪除(筆者使用 vim 「d : 1」刪至第一行),排序後的最後一筆 UID 65534 帳號名稱 nfsnobody(上圖)則手動刪除即可。

r

處理好的檔案則應用導向符號做匯入的動作,例:「 cat passwd.sort >> /etc/passwd」,接著使用指令「id 帳號名稱」確認帳號是否匯入成功。

r

group 檔案的轉換流程與 passwd 檔案類似,下圖是分界點 GID 500 所在位置。

r

類似的匯入流程(用於 group 檔案)如下圖:

r

shadow 檔案特徵與特性並沒有那麼明顯,也因此挑出使用者的方法會比較困難些;若一定要以特徵來看的話,就是不需要匯入的帳號「密碼欄位」通常是「!!」或「*」吧!

r

所幸 Linux 有個 pwck 指令,可以幫忙我們檢查並且處理不正確的 passwd 與 shadow 檔案內資料,下圖為 pwck 指令執行的情況,範例中 shadow 內 apache 帳號重複、squid 帳號只出現在 shadow 沒出現在 passwd 其他則是沒有使用者家目錄的訊息。

r

溫馨提示:除了 pwck 檢查 passwd 與 shadow;另有 grpck 檢查 group 檔案以及 gshadow。

與 pwck 相關指令較知名的有 pwconv / pwunconv,她們主要是用來轉換密碼存放的位置,利用這兩個指令可使得帳號轉移時只要處理 passwd 檔案,不用去處理 shadow 檔案(因為密碼被轉到 passwd 檔案去了);順道一提 grpconv / grpunconv 則是用在 group 檔案。

r

溫馨提示:若要針對 passwd 以及 shadow 檔案做細部修正的話,建議使用 vipw 指令來做;另外 vigr 則是用來處理 group 檔案的。

使用者資料轉換範例

我們方才已將使用者帳號、群組以及使用者密碼轉移成功至新的主機,使用 pwck 指令會回報許多使用者沒有家目錄的訊息,接著就是將使用者家目錄轉移過來,才算是比較完整的主機移轉。

轉移主機資料時特別要注意轉移後的檔案與目錄『權限、擁有人、群組』是否正確(也就是 ls -l 顯示出來的資訊)不正確的檔案權限會導致後續很多問題,使用 rsync 搭配 -a 選項或是使用 NFS 掛載後再拷貝(cp 搭配 -a 選項)皆能夠保持原有的 Linux 檔案權限,也是筆者較喜歡使用的方式。

使用 rsync 同步資料

例如:指令「rsync -av 172.18.9.41:/home /」將 172.18.9.41 的 /home 資料 sync 到這台電腦。

r

開 NFS 分享搭配 cp 拷貝

若是使用 NFS 開分享來轉移資料的話,需注意預設值的 NFS client 端 root 身份會被 squash(轉換)成 nobody(或 nfsnobody)下圖為 man exports 最後幾行(也就是範例),其中 no_root_squash 參數就是不轉換 root 身份之意。

r

圖例為轉換前的舊 server 開放 NFS 分享給 172.18.0.0/255.255.192.0 這個網段的所有主機,參數選項分別為 ro(唯讀模式)、sync(資料同步寫入)、no_root_squash(關閉 root 身份轉換功能)

修改檔案 /etc/exports 內容「/home  172.18.0.0/255.255.192.0(ro,sync,no_root_squash)」

修改後記得重新啟動 NFS Daemon 使用指令「/etc/init.d/nfs restart」

NFS Server 防火牆相關設定比較複雜,簡單處理的話就先把防火牆關閉,使用指令「/etc/init.d/iptables stop」

r

NFS Client 端(也就是轉換後的新主機)新一代的 Linux 通常會內建 autofs 功能,就不用手動地下達掛載與卸載的指令,這個 autofs 功能使用起來相當的方便,只要到 /net/ 目錄下列出對方的 IP 或是解析得出來的主機名稱,就會將 NFS Server 開放出來的分享掛載起來,接下來使用指令 cp 搭配 -a 選項來拷貝資料,檔案權限也不會出錯。

指令「/etc/init.d/autofs」是用來控制 autofs 服務的啟停 script。

指令「ls /net/172.18.9.41」就會自動掛載 172.18.9.41 開啟給我們這台主機的 NFS 分享。

指令「cp -a /net/db42m/home/jameslin .」測試拷貝測試資料 jameslin 到當下(也就是一個點 . )

指令「ls -ld jameslin/」用來觀察拷貝後的測試資料 jameslin 檔案權限有無異常。

指令「df」用於觀察自動掛載的情況。

r

將資料存放在 Windows 磁區注意事項

將 Linux 備份資料存放在 Linux 檔案系統內,這是最好也是最方便的解決方案。倘若 IT/MIS 人員對於 Linux 比較不熟悉,希望將 Linux 資料存放在 Windows 磁區的話,最好是將「資料先行打包」再傳輸到微軟磁區存放,這樣問題會比較少。

Linux 與 Windows 檔案系統明顯差異

Linux 檔案系統與 Windows 主要差異在於 Unix POSIX 檔案權限(Owner、Group 與 rwx 等等)以及檔案名稱有區分大小寫。

以下圖為例:列出 /home/ 目錄底下檔案與目錄皆分屬於不同的擁有者(Owner)、群組(Group)及 rwx(Read、Write、eXec)權限並且檔案名稱大小寫分屬不同檔案(例:test、TEST)。

r

Linux 打包(tar)範例

為了避免放到 Windows 時,Unix 檔案權限特性跑掉的問題,最好是先在 Linux 打包,再傳輸到 Windows 存放;至於 Linux 上面最常用的打包程式非 tar 莫屬了,接下來以一個簡單的例子,來介紹 tar 的基本用法。

指令「tar cf home.tar /home/」建立(-c create 之意)一個 tar 檔案(-f file)名為 home.tar 內容是將 /home 打包。

溫馨提示:訊息「Removing leading / from member names」意思是打包進去的沒有 /(根目錄)所以列出或解開時不會有根目錄。

指令「tar tvf home.tar」(-t list)只列出(尚未解開)包裹 home.tar 包了哪些檔案目錄。

指令「tar xvf home.tar」(-x extract)解開 home.tar 到當下目錄。

若要解開到非當下目錄的話,可使用 -C 參數(大寫的 C),例如:指令「tar xvf home.tar -C /tmp/」則是解開至 /tmp/ 目錄下。

r

以下列舉 tar 指令的常見問題與注意事項:

tar 的選項前,可打 - 或不打 - 皆可,例如:tar cvf ... 與 tar -cvf ... 結果一樣。

tar 的選項中『c』建立,『t』列出『x』解開這三個選項「相斥」意思是不會同時使用,例如:tar cxf ... 會失敗(如上圖)。

tar 搭配 z 選項可順便做 gzip 壓縮(副檔名取做 tar.gz);搭配 j 選項做 bzip2 壓縮(副檔名取做 tar.bz2)例如:指令「tar zcvf home.tar.gz /home」打包 /home 並壓縮成 home.tar.gz 檔。

按照過往的經驗,打包用的 tar 檔是有可能損壞地(雖然損壞的機率不是很高,筆者遇過一、兩次)至於 tar.gz/tar.bz2 損壞的機率也許會提高一些,所以備份時要不要壓縮就看個人喜好囉!

放到 Windows 各類方式

將打包好的資料傳輸到 Windows 磁碟放置,方式像是 FTP、scp/sftp(透過 ssh 傳輸)、Rsync 以及網路芳鄰(Samba)等等,至於 Windows 比較適合當 Client 端,建議的客戶端軟體則是 FileZilla 可至 http://filezilla.sourceforge.net/ 下載。

r

至於 Linux 當 Server 一直以來就是她的強項,像是 FTP Server、ssh Daemon、Rsync Daemon、NFS Server 與網路芳鄰 Samba Server 等等,都是相當方便好用的。

Linux 使用 Windows 開放的分享資料夾

若遇到 Windows 主機開放分享給 Linux 的話,可設定 Linux 掛載 Windows 分享當成網路磁碟機來寫入備份資料,例如:

Windows 主機(IP:172.18.0.5)開放分享 backupLinux 目錄給 Linux 存取。

使用指令「smbclient -L 172.18.0.5 -U administrator」-L 選項列出 172.18.0.5 這台主機所提供的分享(會看到 backupLinux 這個分享)-U 選項使用 administrator 帳號登入(輸入正確的 administrator 密碼)。

r

指令「smbclient //172.18.0.5/backupLinux -U administrator」輸入正確密碼後,使用類似 ftp 的方式上傳下載(put/get)檔案。

中文的檔案名稱正確無誤,若是檔案名稱有『空白』或特殊字元的,可使用雙引號 " 包住使用。

r

使用 smbclient 存取少量檔案還算方便,但是存取的檔案目錄數量一多,smbclient 就會顯得不方便用了,比較好的方式是掛載起來再用 cp/mv/rm 與 rsync 這些指令來做檔案存取會好用很多,例如使用指令「mount -o username=administrator,iocharset=utf8,codepage=cp950 //172.18.0.5/backupLinux /alberthsu」輸入正確密碼就可以將網路磁碟機掛載在 /alberthsu 目錄(卸載則是 umount /alberthsu)。

r

如果下次開機依然要掛載的話,就需要撰寫 /etc/fstab 例如:「//172.18.0.5/backupLinux /alberthsu cifs username=administrator,password=123456,iocharset=utf8,codepage=cp950 0 0」的新增一行寫在 fstab 中,接著輸入「mount -a」指令就可以測試正不正常。

r

範例中 172.18.0.5 也可以使用 netbios 名稱(也就是 Windows 網路芳鄰主機名稱)但未來最好是使用 dns 主機名稱(或是短的 dns 主機名稱);因為新一代 Linux/Windows 較建議使用 cifs 檔案系統來取代先前的 smbfs,且 cifs 使用的主機名稱是 dns 主機名稱而非 smbfs 所用的 netbios 主機名稱。

應用程式移轉重點介紹

在轉移好使用者帳號密碼,並且使用者資料也已經順利移轉後,接下來介紹的是有關於應用程式移轉的部份,像是網頁服務、郵件服務、檔案伺服器、名稱解析服務以及資料庫伺服器等等。

大部分的應用程式服務都是「應用程式」「設定檔」「相關資料與 log」「相關帳號」架構,以 RedHat 為例列表如下:

 

伺服器類型應用程式主要設定檔相關資料(僅列舉)相關帳號
網頁服務httpdhttpd.conf/var/www/htmlapache
郵件服務sendmailsendmail.cf/var/spool/mailmail
郵件服務postfixmain.cf/var/spool/postfixpostfix
郵件服務dovecotdovecot.conf/var/spool/maildovecot
檔案伺服器smbd/nmbdsmb.conf使用者預設存取/homeroot
檔案伺服器nfsd/mountdexports管理者自訂root
檔案伺服器vsftpdvsftpd.conf匿名存取 /var/ftpftp
名稱解析namednamed.conf/var/namednamed
資料庫伺服器mysqldmy.cnf/var/lib/mysqlmysql

套件管理「列出此套件相關檔案」能夠幫助我們了解這些應用程式有哪些相關資料需要被移轉,以 Apache 為例,指令「rpm -ql httpd」由下圖中整理出來的資料,可觀察出 /etc/httpd/ 目錄放設定檔案、/var/www/ 放的是網頁資料以及 /var/log/httpd/ 放的是 log 資料。

r

溫馨提示:log 大多會放置在 /var/log 下,並分門別類擺放。

移轉時先安裝應用程式(「相關帳號」可能會在這個時候被建立出來),接著移植主要設定檔案、相關設定檔案與資料,例如:/etc/httpd/conf/httpd.conf 與 /etc/httpd/ 目錄下的設定檔案都要拷貝過去且權限也要對應到,至於自行客制化的設定檔案,就要特別小心及注意,一不小心就會漏掉;移轉後若發生運行不正常,很有可能是檔案權限(擁有者、群組)設定失當所致,使用 chmod、chown、chgrp 這些指令調整正確即可。

移轉時同時進行應用程式版本升級

倘若移轉期間還牽涉到應用程式版本升級,移轉的難度就會拉高。舉例來說將移轉名稱解析伺服器時,順便由舊版 bind 8 升級到 bind 9 新版,此時舊版的設定檔案不見得會被新版的應用程式相容,因此遇到要拿舊版的檔案覆蓋新版的時候,最好還是將新版的資料備一份,這樣若是升級失敗,還原回來的步驟會比較簡單。

溫馨提示:依照筆者經驗,運行在 Linux 上面的應用程式,小版本的升級更新,新舊版本的設定檔案及資料相容機率很高。

資料庫伺服器移轉重點介紹

資料庫伺服器為了確保資料正確,最好不要在資料庫運行(執行)的期間,施以拷貝資料的動作;主因是備份資料庫的時候,若資料還有異動與讀寫,拷貝出來的資料庫檔案可能會損壞(也就無法使用)。

因為上述原因,在備份資料庫的時候,方法有二:一個方式就是先將資料庫離線(offline)也就是停止運作,再拷貝其資料即可;其二則是遇到 7 x 24 運行的資料庫時,建議使用資料庫內建的工具來將資料倒(dump)出來。

溫馨提示:LDAP 伺服器的資料也是類似資料庫型態的檔案,最好也用對待資料庫的方式去做備份。

下圖是以 MySQL 為例,來做 online 與 offline 資料庫備份。

指令 /etc/init.d/mysqld 用來控制 MySQL 啟停。

指令「cp -a /var/lib/mysql mysql`date +%F`.bak/」其中利用反引號 `(按鍵位於 Esc 下方)搭配「date +%格式」這個方式來做檔案或目錄的日期,配合排程(crontab)與介殼手稿檔案(shell scripts)以期達到自動化備份的效果。

r

MySQL 內建備份工具為 mysqldump 簡介如下:

備份的指令用法,例如:「mysqldump 資料庫名稱 > 文字檔案」。

溫馨提示:下圖中 $(date +%F) 與先前使用反引號 ` 結果一樣且功能相同。

r

至於要倒回資料庫的話,需先使用建立資料庫,再使用「mysql 資料庫 < 文字檔案」匯入,如下圖範例:

r

溫馨提示:關於 MySQL 詳細說明請參考相關文件(例:如何使用有帳號密碼的 mysqldump 與回存)。

只換硬體的全系統轉移

若只是要更換硬體的轉移,一般 IT/MIS 人員直覺會想到用 Ghost、Acronis 及 Clonezilla 這一類的系統備份還原軟體,其實 Linux 本身就有工具可以做到整個系統的備份與還原,只是需要比較多的觀念與 Linux 基本操作功夫;至於 Ghost、Acronis、Clonezilla 這些全系統備份還原軟體的使用方法,筆者就不多加介紹,僅針對 Linux 還原後有可能無法正常開機的現象稍做說明。

利用對拷軟體全系統複製硬碟資料後,不論硬體是否有異動,開機程式那段一定要正常才可以載入核心,所以開機程式故障就會造成全系統轉移失敗,這部份可以透過重新安裝開機程式來解決;在開機程式的問題解決後,Linux 載入核心接著需要掛載根目錄,有可能因為硬體的異動,造成無法掛載根目錄的狀況,這個時候需要使用指令 mkinitrd 重新產生 initrd(Initial RAM disk),製作符合新硬體的 initrd。針對這兩者的故障排除說明如下:

開機程式無法載入

針對開機程式故障的部份,需要重新安裝開機程式即可,通常使用安裝光碟開機,執行救援模式(linux rescue)重新安裝開機程式即可(grub-install 指令)。

在光碟開機後,按下「F2」鍵,依照畫面上指示輸入「linux rescue」後按下 Enter

r

依照精靈指示,大部分按下「下一步」

來到待會要執行的指令「chroot /mnt/sysimage/」是顯示在這個畫面

r

使用「df」指令觀察『磁碟代號』(例:/dev/hda)與『磁碟是否掛載』(例:正確掛在 /mnt/sysimage)

溫馨提示:若沒有正確掛載,需先行處理掛載硬碟根目錄的事情。

使用指令「chroot /mnt/sysimage」由救援光碟的根目錄(/)切換至硬碟的根目錄(/mnt/sysimage)

執行指令「grub-install /dev/hda」重新安裝開機程式至 /dev/hda

r

核心載入後卻無法掛載根目錄

這有可能是硬體更換後,造成 initrd(Initial RAM disk)內沒有新硬體掛載根目錄的核心模組(驅動程式),需要重新製作 initrd 才行,這部份救援的動作前半段與開機程式重新安裝類似,就從 chroot /mnt/sysimage 後開始說起,相關指令如下:

initrd 通常位於 /boot/ 下,使用 mkinitrd 指令來製作。

核心模組位於 /lib/modules 下,現在正在運行的核心版本由指令「uname -r」來顯示。

例:「mkinitrd /boot/initrd-2.6.18-53.el5.img.test 2.6.18-53.el5」製作出一個測試版 initrd

若真的要使用測試版的 initrd 開機,須更改 /boo/grub/menu.lst(grub 開機設定檔)內容。

r

 

Valid XHTML 1.0! Valid CSS! Get Firefox

Creative Commons License
This site is licensed under a Creative Commons Attribution 2.5 Taiwan License.