2009-04-29

Debian 的安裝與設定 (下)

(接續前篇)順利登入後,接下來要替新裝好的 Debian 系統做一些軟體安裝和更新。在安裝軟體之前,由於 Debian 是用 apt-get 來管理程式安裝,我們要先確定下載的伺服器位置。接下來編輯下載伺服器的列表:

nano /etc/apt/sources.list

裡面的資料都刪掉,直接取代成下面這一段:

# 完整列表參考 http://www.debian.org/mirrors/list
deb http://security.debian.org/ oldstable/updates main contrib non-free
# 國家高速網路與計算中心
deb ftp://opensource.nchc.org.tw/debian/ oldstable main contrib non-free
deb-src ftp://opensource.nchc.org.tw/debian/ oldstable main contrib non-free
# 交大
deb http://debian.nctu.edu.tw/debian/ stable main contrib non-free
deb-src http://debian.nctu.edu.tw/debian/ stable main contrib non-free
# 台大
deb ftp://ftp.tw.debian.org/debian/ oldstable main contrib non-free
deb-src ftp://ftp.tw.debian.org/debian/ oldstable main contrib non-free

隨著時間更迭,以上的列表常常可能失效或是更新,所以在使用上有發生類似下載不到或是伺服器沒有回應,可以再去找找看最新的 apt-get 伺服器列表並且更新(上面的註解裡有完整列表參考的連結)。

伺服器很多,要挑那個當作自己的優先伺服器呢?可以先裝 netselect 這個工具:

apt-get install netselect

然後用以下命令比較每個伺服器哪個比較快(數字越小表示反應速度越快,這個命令會列出最快的伺服器):

netselect host1 host2 host3 host4

有了列表,接下來第一件事情是更新已知的 Package List,用以下命令進行更新列表,並更新系統現有的元件:

apt-get update
apt-get upgrade

問題來啦,更新系統所有現存元件並不一定會很順利,不是部份依存的元件沒裝、導致更新失敗,不然就是模組之間的依存關係沒建好,就算裝好也不能動,在排除這些問題之前,系統都不能算是穩定和最新的,除了上面用的命令 apt-get upgrade,也可以換用 apt-get dist-upgrade 來試試看(這兩個命令的差異比較可以參考這篇文章)。如果還有問題,可以根據錯誤訊息 Google 一下解法來處理,例如我在更新系統時,碰到下面的訊息「dpkg: error processing .. trying to overwrite `/usr/sbin/add-shell’」,參照網路上的說法,這應該是權限的問題,只要用下面的命令開放權限、並強迫安裝和更新,就能迎刃而解:

dpkg -r --force all passwd
apt-get -f install

如果過程還有短少什麼元件,那就補安裝 (apt-get install '元件名稱') 再繼續,補到 apt-get upgrade 都沒東西要更新,那就搞定了(有點像 Windows Update 一樣)。不知道有沒有注意到上面的 source list 裡,我用的是 oldstable 的 package?原因是如果一口氣上 stable,更新過程會很不順利(因為內含的 debian 版本是 sarge 3.1,直上最新版差異太大很多套件會相互干擾),所以算是階段性更新系統,先用 oldstable(目前的 oldstable 是 lenny 5.0),一切更新都順利搞定後,再去修改 list、把 oldstable 字樣都改成 stable,接著再 update、upgrade 到沒有錯誤為此。照我的經驗,系統元件升級完畢後 Debian 也會被推到最穩定的新版(從原來的 sarge 3.1、etch 4.0,到 oldstable 的 lenny 5.0,到最新的穩定版 squeeze 6.0),一樣可以用以下命令檢查升級後的 Debian 版本:

cat /etc/debian_version

系統更新完畢就可以安裝軟體了,這裡安裝的第一套軟體是 SSH Server,用以下的命令:

apt-get install ssh

安裝過程會要求你安裝其他相關套件,或是更新 Library,都用 Y 確認就是了,有不懂的設置問題也都直接按 Enter 繼續就好。

裝好 SSH,建議最好重開系統測試一下(重新開機記得選對分割區,要開在 Debian 上),這時候不管 root 或是新開的帳號,應該都要能夠用 SSH 登入。登入順利的話,為了安全,預設的那個 Telnet Daemon 就該關掉了,可以用下面的命令移除預設的 Telnet daemon:

update-rc.d -f utelnetd remove
rm -f /etc/init.d/utelnetd

現在只剩 SSH 了,如果想改登入的提示訊息,可以編輯 /etc/issue.net 的內容,不過預設 SSH 會關閉,因此還要編輯 SSH 的設定檔 (/etc/ssh/sshd_config),找到這一行:Banner /etc/issue.net,移掉前面的 # 標記。如果想馬上生效,可以 kill 掉 SSH 的 Daemon (sshd),然後重跑 /usr/sbin/sshd 即可。

接下來開始安裝基本軟體和服務,安裝軟體前都要有好習慣,先更新最新的軟體列表,然後安裝基本工具(安裝中如果有 [Y/n] 一律按 y 然後 Enter,有不確定的選項就都用預設值):

apt-get update
apt-get upgrade
apt-get install screen nmap less w3m lynx bzip2 zip unzip host make gcc ncftp tzdata ntpdate

以後可以用 dpkg -l 來查看到底系統裡裝了哪些套件。如果想知道還有哪些套件 Package 能夠安裝,可以上官網的連結,有很詳細的分類。接下來是設定台北時區,先刪除舊的時區設定,再連結台北的,最後一個 date 命令會顯示目前日期和時間,檢查看看對不對:

cd /etc
rm -f localtime
ln -s /usr/share/zoneinfo/Asia/Taipei localtime
date

接下來是設定 Host 記錄,讓 Domain Name 能讓系統認得(有自己 Domain 的可以加進去,或是當作手動的 DNS record)

nano /etc/hosts

基本內容如下:

127.0.0.1 LinkStation localhost localhost.localdomain

# The following lines are desirable for IPv6 capable hosts
# (added automatically by netbase upgrade)

::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

再來還有一個重要的設定,就是語系和中文化支援。目前的狀況應該連打中文、顯示中文都有問題,因此要做調整、能夠完整處理中文目錄和檔名。為了支援全中文和 UTF-8 (Unicode) 的套件和環境,這裡建議預設用中文 UTF-8(不用 Big5 了),首先,要先安裝中文相對應的 Locale (語系):

apt-get install locales localepurge

這樣會跳出一個文字選單,裡面記得至少要選擇 en_US.UTF-8 UTF-8、en_US ISO-8859-1、zh_TW BIG5 和 zh_TW.UTF-8 UTF-8(用空白鍵選擇、Tab 鍵切換到 OK、Default Locale 選 zh_TW.UTF-8)。安裝完畢,可以 cat /etc/locale.gen 這個檔案內容對不對(如果要新增刪除其他語系,請用 dpkg-reconfigure locales)。有注意到除了 locales,上面還另外安裝了 localepurge?因為語系檔預設會全裝到系統裡(以上設定只是設了預設用的),甚至以後安裝軟體,語系支援也會全裝,localepurge 裝完後直接執行,會幫忙清掉系統裡用不著的 locale、藉此節省不必要的空間浪費,而往後安裝軟體時一安裝完,localepurge 也會馬上啟動主動幫忙清「垃圾」,真算得上是有用 locales 時也必裝的工具。接下來設定使用者預設的 Locale,輸入 nano ~/.bashrc,增加下面這兩行:

export LANGUAGE=zh_TW.UTF-8
export LC_ALL=zh_TW.UTF-8
export LANG=zh_TW.UTF-8

登出再登入一次(可以用 locale 這個命令確認是否系統已經更改,SSH Client 程式連線前記得也要換編碼成 UTF-8 unicode 才行,PuTTY 有支援),如此,在登入後命令列的操作就可以看到中文字了。如果 Shell 裡面還是不能輸入,這時候更改使用者的輸入設定,建立檔案 nano ~/.inputrc,確定有下列四行:

set input-meta on
set output-meta on
set convert-meta off
set meta-flag on

同樣登出再登入後就生效了。以上兩個檔案 .bashrc & .inputrc 都是針對一個特定使用者的,如果希望每個新增的帳號都可以免去手動建立的話,那可以去改 /etc/profile 和 /etc/inputrc,可以順便加入一些 alias 和顯示設定(不過記住,在此之前已經建立的帳號,還是會用已經存在的 .bashrc 和 .profile,除非都砍掉才會套用系統的設定),以下是我在預設 /etc/profile 裡面新增的範例(主要是改提示符號、設定別名和中文語系輸出):

export PS1='\u@\h[\w]:'
umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
alias ls='ls --color=auto'

# Some more alias to avoid making mistakes:
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Added aliases
alias cls='clear'
alias dir='ls -al'
alias lo="exit"
alias md="mkdir"
alias rd="rmdir"

# Added for Chinese supported
export LANGUAGE=zh_TW.UTF-8
export LC_ALL=zh_TW.UTF-8
export LANG=zh_TW.UTF-8

搞定中文、語系和登入問題,最後別忘了系統時間的同步。Debian 是一台伺服器,所有的 Log 紀錄都有參考意義,所以紀錄裡的系統時間同步與否就額外重要。和一般電腦一樣,LinkStation 有兩種時間,一個是硬體的 BIOS Clock,另外一個是作業系統的時間日期。你可以用命令 date 來看系統時間,還可以用 hwclock 來看 BIOS 時間(兩邊不一定會一模一樣),手動調整很麻煩,不過只要網路是通的,我們可以直接透過網路來對時。上面裝的基本軟體裡有一項叫 ntpdate,作用就是提供你做網路對時的,只要用下列命令:

ntpdate clock.stdtime.gov.tw

就會幫你連到中央標準局的 Time Server 取得正確時間,並且自動調整。如果此時還想把該時間「同步」到 BIOS 裡,也可以用命令:

hwclock -w

剛剛更新的系統時間就會和 BIOS 同步了。當然沒事要手動做以上動作其實也很累,我們可以做一個時間同步的程式,讓系統每天執行一次,那麼時間不就會一天更新一次保持同步了?首先建立一個程式:timesync

nano /etc/cron.daily/timesync

填入以下的程式碼:

#!/bin/sh
# Synchronize time via NTP daily
/usr/sbin/ntpdate clock.stdtime.gov.tw && /sbin/hwclock -w

最後記得改執行檔屬性:

chmod a+x /etc/cron.daily/timesync

這樣系統每天就會自己同步一次系統和 BIOS 時間了。同樣的,也可以像上一篇修改主機名稱(用 hostname 指定名稱、在 /etc/hosts 加一行記錄、修改 /etc/hostname 檔案裡的字串)、更改登入後訊息(登入後畫面 Telnet 用 /etc/issue、SSH 登入用 /etc/motd)。如果未來 Debian 有開放對外服務,偏偏那個服務的 Port 在韌體分割區開機也有提供(像是 Web、SSH),為求安全、怕機器重開被人家連進韌體,建議這兩個分割區指定不同的 IP 位址(都用固定 IP),這樣就可以避免機器因故重開卻讓外面使用者連到另一個分割區去。

到這裡基本的 Debian 環境就完成了。如果和我一樣有舊資料在 USB 硬碟裡、打算全部複製回來,那就可以開始做資料復原的工作。首先準備你的硬碟,插入 USB,先檢查看看 USB 硬碟有沒有抓到,可以用 dmesg 來檢視:

dmesg | grep sda

以上命令是從 dmesg 裡找出所有的硬碟分割出來,內接的硬碟應該都是 hda (hda1, hda2, hda3 ..),外接的 USB 碟則會用 sda。接下來決定你要掛載的分割區,因為我的 USB 碟裝的是之前拿來裝 LinkStation 的 500GB 硬碟,資料都在 hda3,因此我就要 Mount 第三個分割區(這時候變 sda3),掛載的目錄是 /usb/ (沒這個目錄的話要自己建立):

mount /dev/sda3 /usb/

我隨身碟裡面用的檔案系統是 ext3,如果 Format 成 NTFS 或 FAT32,上面就不能用 ext3 這個參數囉!因為現在已經完全改用 UTF-8 的環境,原來有中文的資料大多還是用 Big5 的(目錄、檔名),所以接下來要準備編碼轉換程式,把 Big5 的目錄和檔名都改成 UTF-8 的格式,這裡安裝的工具是 convmv:

apt-get install convmv

裝好後就有這個編碼轉換工具了。只要指定編碼,指定的目錄檔名就可以轉換成你要的格式,假設要從 Big5 轉成 UTF-8,命令如下:

convmv -f big5-eten -t utf8 -r --notest /目錄名稱

這個命令會把指定目錄下原來是 Big5 (ANSI 中文) 的中文目錄和檔名,直接改編碼轉換成對應的 UTF-8 名稱。改完檔名,如果有些檔案內容的註解文字以前是 Big5 的中文(舊的中文文字檔),也可以手動針對檔案內容編碼做轉換,讓你在 UTF-8 的環境下能看到轉換過的正確中文字:

iconv -f big5 -t utf-8 檔案名稱 -o 轉換後另存新檔名稱

這個動作完成之後,整個檔案系統環境就都是純的 UTF-8 了。把所有資料還原前,你可能也會想對整個系統先做備份,因為現在是用 Debian 開機,所以比較好備份的是位於 hda1 的原廠韌體,可以先把 /dev/hda1 Mount 到 /mnt 上,然後備份整個原廠韌體到一個檔案(就是把整個 /mnt TAR 起來壓縮),接下來用原廠韌體開機 (hda1),然後 Mount hda3 到 /mnt,就可以備份整個 Debian 了!動作大同小異,端看你想備份哪個分割區,步驟如下:

mkdir /backups
cd /mnt
tar -zcvp -f /backups/backup_hda1.tgz *

備註:備份前,你應該不希望浪費空間去備份不必要的檔案吧!首先是那些透過 apt-get 安裝的軟體套件暫存檔,這些檔案應該在安裝完就清掉才是,如果之前都沒清,備份前記得下命令清掉:

apt-get clean

這個命令會清掉 /var/cache/apt/archives 目錄下用不著的安裝套件暫存檔。上面有提到,如果有裝 locales,記得用 localepurge 清掉無用的語系檔。如果想手動處理、找出系統裡佔用空間最多的目錄或檔案,可以在根目錄下用下面的命令依佔用空間大小排序列出,讓你想辦法縮小備份壓縮檔的大小。

du -x | sort -n

以上是在根目錄下建立一個 backups 目錄,然後把整個 /mnt 目錄壓縮備份成一個檔案:backup_hda1.tgz(顧名思義這是 hda1 的備份,請依樣畫葫蘆備份 hda3),壓縮完可以用命令 tar -ztv -f 來測試和檢視壓縮檔內容。要注意備份前要放備份檔的地方空間夠不夠,假設你想備份整個 Debian,那麼想必 hda1 下所剩的空間一定不夠,這時候你可能要備份到外接硬碟上才行了!不想備份的特定目錄可以用參數 --exclude '目錄名稱' 來排除。有了備份檔未來要怎麼重灌還原呢?只要用韌體分割區開機,砍掉整個要還原的根目錄 (rm -r /mnt/*,不想砍的目錄可以先改目錄名稱像是 mv /mnt/share /mnt/.share,這樣就砍不到,還原完再把目錄名稱改回來)、或是用 Web 介面進行 Format(hda1 的官方韌體有提供,會清除整個 hda3 分割區),這樣就清掉了整個分割區,再用剛剛的備份檔,在根目錄下解壓縮進行還原:

cd /mnt
tar -zxv -f /backups/backup_hda1.tgz

以上就是整個備份和還原的步驟(要很清楚的知道,你開機的分割去是哪一個,然後去 Mount 你要備份或還原的分割區到 /mnt,接著進行備份或還原的再操作,做完再切換開機分割區用你要的分割區開機來使用)。

至此,我們更新了軟體列表、並讓系統元件都維持在最新的版本,安裝了 SSH 和一些基本工具、移掉 Telnet Daemon、修改 Local Host 紀錄、解決語系和中文環境設定(使用 UTF-8),最後還有搞定登入和網路對時的問題,連資料備份還原的步驟都交代清楚,這樣總算是完成重灌及還原的工作了。

回應: 9