如果您從安裝一直殺到這裡﹐相信對 Linux 的恐懼感已經沒當初那樣嚴重了吧﹗或許您已經磨刀霍霍﹐躍躍欲試﹐準備進一步馴服這匹黑馬了。好﹗有志氣﹗﹗下面就讓我們按步就班的將 Linux 整治一翻﹐不要讓這匹良驅平白浪費了。
Setup 工具
在我們進行任何系統設定之前﹐先讓我們認識一個 RedHat 的設定工具﹕setup 。當您完成登錄並切換為 root 身份之後﹐輸入 setup 這個命令﹐您可以看到一列設定選單﹕
這裡﹐先看看怎麼操作這個界面好了。假如您已經完成了 kernel 的設定﹐而且是使用 menuconfig 的方式﹐那應該不用多說了。基本的操作方式如下﹕
按鍵 |
動作 |
按 Tab 鍵 |
循環式跳躍選擇各個項目 |
按方向鍵 |
上下或左右選擇項目 |
按 Enter 鍵 |
進入項目選單 |
按空白鍵 |
選擇或放棄選擇 |
Run Tool |
執行所選工具 |
Next |
到下一步驟 |
Customize |
自行設定項目 |
OK |
接受設定 |
Cancel |
放棄設定 |
Back |
返回 |
Quit |
退出 |
當您會得操作這個界面之後﹐接下來讓我們看看各個設定項目的內容是什麼﹕
- Authentication configuration
- 這是用來設定機器的驗證方式的﹐裡面有 NIS、LDAP、Hesiod 這三種選擇。至於它們各自的意思是什麼﹐我這裡暫時不解釋了﹐等日後您接觸到相關的 server 設定再回來。如果您確定您的機器有用到這些功能﹐可以設定起來﹐否則不要碰。
- Firewall configuration
- 這是主機的防火牆設定﹐裡面有 High、Medium、No firewall 三個選項﹐除此之外您還可以用 Customize 來自行設定。這裡暫時建議您設定為 No Firewall﹐等我們日後談到防火牆的時候﹐再回來修改。否則﹐可能會讓您無法使用系統上的一些服務。
- Keyboard configuration
- 就是前一章裡面我們介紹的 kbdconfig 命令。除非您換了鍵盤﹐否則不用設這個。如果您不確定您的鍵盤類型﹐選擇 us 就是了。
- Mouse configuration
- 同上﹐用 mouseconfig 也可以來到這裡。如果您換了滑鼠﹐可以來這裡設定。如果您不知道如何設定﹐請回到“安裝 Linux”那章參考。
- Network configuration
- 這是設定網路的﹗不過﹐我們暫時略過這裡﹐在 “Linux Servers”系列中﹐我們會專門討論網路的設定。
- System services
- 設定開機的時候要自動執行的服務項目。注意﹕不要貪心選擇太多哦﹗假如您不確定服務的內容是什麼﹐就不要碰﹐或是接受預設值則可。不過﹐我們日後學習到伺服器架設的時候﹐應該會經常會這裡打開或取消某些開機項目的。您也可以在 console 中輸入 ntsysv 命令直接跳到這裡。假如您確定某些服務用不到﹐那麼就不必多考慮了﹕一律取消。
- Sound card configuration
- 設定音效卡的好東西﹗您也可以在 console 中直接輸入 sndconfig 跳進這裡。不過﹐要注意的是﹕您必須在編譯核心的時候﹐將 Sound Device 設定為 module 才能使用這個功能哦~~~ 至於如何設定音效卡﹐需要您知道硬體的精確資訊﹐例如﹕Chipset、IRQ、IO﹐DMA 等等。如果您不清楚硬體的設定﹐那唯有多翻嘗試不同的組合了﹐不過﹐這可要靠運氣和耐心了﹐兩者缺一不可。很簡單﹐如果一張卡有四組設定﹐每組有兩個項目﹐那就一共有 16 個組合了﹗如果設定組和項目越多﹐那麼組合將是幾何級增加的。
如果以一個傳統的 non-pnp sound blaster 16 的設定來說﹐資源設定通常會是﹕
io=0x220 irq=5 dma=1 dma16=5 mpu_io=0x330
而需要的模組有﹕sb、sb_lib、uart401、sound、soundcore
假如 sndconfig 成功的話﹐會修改 /etc/modules.conf ﹕
alias sound-slot-0 sb
post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :
pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :
options sound dmabuf=1
alias synth0 opl3
options opl3 io=0x388
options sb io=0x220 irq=5 dma=1 dma16=5 mpu_io=0x330
|
我所用的 ISA sb 16 就是按上面設定的。如果真的設定不來﹐良心建議﹕換張 Creative 的音效卡﹐不要浪費時間在這上面﹔但如果是 build-in 或是 notebook 的話﹐那就沒辦法了。
- Timezone configuration
- 設定時區的。這個跟我們在安裝時碰到的界面一模一樣﹐如果忘了怎麼設﹐返回“設定 Linux”章節中參考﹐所以不用擔心。
- X configuration
- 這是 RedHat 特別提供的設定 X Window 的工具﹐我們在上一章已經接觸過了。
好了﹐相信大家對於這個 setup 工具已經非常了解了吧。哈哈﹐是了解到﹕“暫時什麼都不要碰”﹐而不是怎麼設定啦~~ ^_^
目前來說﹐的確沒什麼好碰的﹐但當我們日後進行系統維護和設定的時候﹐可能會經常使用到這個工具﹐到時候別說不會用就好了。
設定環境
在前面的章節中﹐我們已經知道什麼是 shell﹐什麼是環境變數﹐同時也知道相關的環境設定檔在哪裡。這裡﹐您可以運用您所學的知識﹐為自己打造一個適合自己的工作環境。
如果您打開 /etc/profile 這個檔案看看﹐您就可以發現一些系統環境設定了﹐這些設定通常都適合全部使用者﹐我們可以管它做公共設定。然而﹐每位使用者也可以設定自己喜歡的環境﹐有幾個設定檔存放於每個使用者的家目錄裡面﹐如果您只輸入 ls 是看不見的﹐您得改用﹕
從輸出結果中﹐您會發現一個 “.bash_profile” 的檔案。還記得第三章講述 ls -a 這個命令的時候提到的檔案前面的這個“.”嗎﹖它是用來將檔案隱藏起來的。
如果您喜歡﹐現在就看一看這個檔案內容﹕
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
BASH_ENV=$HOME/.bashrc
export BASH_ENV PATH
unset USERNAME
|
第一行表示出檔案本身的名字﹐接著是一些使用者自定的功能﹐這些設定通常會寫在 ~/.bashrc 這個檔案裡面﹐如果您的家目錄沒有這個檔案也不要緊﹐可以參考 /etc/bashrc 這個檔案。這裡先用一個 -f 測試檔案是否存在﹐然後執行一個特殊命令﹕“小數點﹐然後一檔案路徑為參數”。它是告訴當前的程式執行目標檔案﹐並讀入那裡產生的變數。
然後是一些使用者自定的環境設定﹐其中有一個關於 PATH 的設定﹐我們需要特別留意的。假設您在自己家目錄的 bin 裡面裝了一個程式﹐如果您要執行這個程式﹐那麼就要輸入絕對的路徑( PATH )才行。但如果您將‘$HOME/bin’這個路徑加在 PATH 裡面﹐然後您就可以只輸入該程式的檔案名稱就可以了。
有時候﹐當您自己寫好一個 script﹐然後興衝衝就忙著試一試﹐結果卻告訴您 command not found 什麼的﹐這可能是由於您忘了加上路徑﹐也就是忘了在檔案名字前面加上‘./’﹐這是告訴系統﹕檔案在當前的目錄之內。如果您覺得這樣太不方便了﹐可以在 ./bash_profile 裡面的 PATH 加上“:.”就可以了。在 PATH 中的路徑﹐都是用“:”來分隔的﹐所以﹐您的PATH看上去就應該有點像這樣﹕
不過﹗現在的Linux 都不建議您將當前目錄路徑(即“.”) 放進PATH中﹐為什麼﹖多謝 Neil Lee 兄的幫我們解釋﹕“如果某心存不良的 user 在自己的目錄下放了一個破壞系統的檔案(or病毒),又碰巧你用 root 去執行他,那不就完蛋了?舉個例子說,有個傢伙在他的目錄下寫了一隻叫做 ls 的病毒,如果你的 root 的 path設定了 ./ ,剛好你又 cd 到那個目錄下,一執行 ls 就中了那個傢伙的圈套了。”所以﹐不要貪圖這個方便﹐檢查您的 PATH 設定﹐將 " . " 拿掉吧﹗
用慣了 DOS 的朋友﹐在 Linux 裡面也常不自覺的輸入 DOS 的命令格式 (事實上﹐DOS 的命令都是改自 Unix 的)﹐現在的 Linux 為了照顧 DOS 的慣性使用者﹐也讓您可以輸入 DOS 命令的名稱來得到相類似的結果。我們前面已經學習過 alias 命令﹐應該知道要解決這個問題是非常簡單的。假如您覺得這樣很好用﹐那麼您可以自定您的 alias ﹐然後加進 ~/.bashrc 檔案裡面﹐這樣您下次登入之後﹐打 dir 就不用打 ls -al 了。
Tips﹕修改了環境設定檔後﹐通常會在您下次登錄的時候才生效。如果您想讓設定馬上生效﹐可以執行 soure 命令﹐例如 source ~/.bashrc﹐就可以了。
除此之外﹐許多程式都允許使用者在 home dir 裡面設定自己的初始設定檔﹐例如後面介紹的 x client、kde、netscape 等等。通常(並非全部)﹐這些初始設定檔都以 XXXXrc 來命名的﹐有些甚至會是隱藏檔。例如﹐您可以建立一個 ~/.vimrc 的檔案﹐來初始設定您的 vi 程式的一些項目。比方說﹕set tabstop=4﹐那麼您在 vi 的 insert 模式裡面按 tab 鍵﹐就會跳 4 格而已﹐預設是 8 個格的。
嗯﹐我們在第五章 “shell & shell script”中討論過許多環境設定﹐請您自己靈活運用吧﹐這裡就不再多說了。
Tips﹕正如我們一向強調的﹐儘量不要用 root 帳號進行登錄做日常的工作。您可以修改 root 的環境﹐故意製造一些麻煩﹐例如修改 /root/.bashrc﹐在最後加上一行﹐讓 prompt 提示變得長長的﹕
PS1='[\u@\h \W: You are logging as root!]\$'
|
然後﹐可以將您平時使用的帳號加到 /etc/sudoers 檔案中﹐複製那行 root 開頭的句子再進行修改就行了。這樣﹐如果您日後真有需要執行 root 的命令﹐那就在命令前面加上 sudo ﹐再輸入自己的密碼就可以了﹐如﹕
不過﹐我建議您 man sudoers 和 man sudo 詳細的參考 sudoers 的設定和 sudo 的用法。
認識 Daemon
在 Linux 系統下面﹐所有服務都以 deamon 的形式執行﹐我們通常有兩種方式來啟動 deamon。第一種我們管它叫 stand alone﹐也就是﹐該服務一旦執行﹐deamon 就自己監視特定通訊埠 (port) 的連線請求﹐直到服務程式結束為止﹐這樣比較適合一些常用的和非常繁忙的服務。不過﹐大多數的服務﹐都會以 super deamon 也就是 inetd 的方式載入﹐這個 super daemon 就好比是公司的接線生﹐它會不停的傾聽著傳給系統的請求﹐然後將請求轉給真正能解決問題的服務程式來處理。這樣有個好處是﹐服務程式本身就不用去傾聽系統請求了﹐也就不用一開始就載入一大堆的程式來佔用系統資源﹐但反應速度上當然沒有 stand alone 那麼迅速。各有利弊就是了。
Tips﹕當使用 inetd 的時候﹐ super daemon 最終還是將服務請求傳給正確的服務去執行。但是﹐daemon 又怎麼知道哪個請求該傳給誰呢﹖如果您沒忘記我們在“網路基礎”中討論 TCP 封包時提及的 ip 和 port 的話﹐應該知道 ip 是門牌﹐port 是門口。但我們不妨可以這樣想象﹕一個門牌可以有好幾個門口哦~~~。
如果沒有 super daemon﹐每一 service 各佔一個門口﹐它們得自己聽有沒有人來敲門。有了 daemon 之後﹐所有門口都由 daemon 來聽﹐各 service 在辦公室裡打麻將(像不像日前新聞報道的某海關啊﹖)﹐只有當 daemon 呼叫某某 service ﹐才會去處理工作。如果 daemon 打瞌睡了﹐或偷會情人去了﹐那麼各 service 就一直打麻將下去.... 當然﹐也有些 service 還是愛自己坐在門口的﹐因為外面的美女特多~~~
那麼﹐系統上面所提供的服務有哪些、以及各自相關的 port 又是哪些呢﹖您可以從 /etc/services 這個檔中找到﹐下面是其中一段內容﹕
ftp-data 20/tcp
ftp-data 20/udp
ftp 21/tcp
ftp 21/udp
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
telnet 23/udp
# 24 - private mail system
smtp 25/tcp mail
smtp 25/udp mail
|
從上面的例子﹐我們可以看到從 20 到 25 這段範圍的 port 所對應的服務各是哪些。其中的 ftp 和 ftp-data 請您多留意一下﹐日後我們介紹 ftp 的兩個模式的時候﹐要知道 port 21 和 port 20 的分別。這裡暫時不作詳細說明了。
事實上﹐只要您喜歡﹐可以隨便修改這個檔案裡面的 port 號碼。比方所﹐您要架一個地下 ftp 網站﹐但又不想使用 21 這個常用 port﹐那您可以將之改為 2001 或其它任何一個還沒被使用的 port 號碼。或是﹐保留原來的 21﹐用另外一個名稱﹐如 myftp ﹐來命名新指定的 service 也可以。當然了﹐您也必須修改服務程式(或後面介紹的 xinetd 設定)﹐能夠監聽新指定的 port。這樣﹐只有那些知道這個設定的朋友﹐告訴他們的 ftp client 程式使用新設定的 port 才能連上來。
不過﹐我們之所以使用標準的 port ﹐就是為了讓別人能順利連上這裡的 service。除非您要故意躲起來﹐然後只讓知到 port 號碼的人連進來﹐否則不要隨意修改這裡的數字﹗
Tips﹕在 Linux 系統上﹐只有 root 才能使用低於 1024 數值的 port 號碼。假如您修改了一個服務程式﹐但所使用的身份不是 root﹐那麼就確定它所對應的 port 要大於 1024 這個數值。而至於 client 端的程式﹐通常都是不固定的﹐系統按當時的使用情況隨機的選用 1024 到 65535 之間的 port 號碼。
這其實就是 TCP/IP 協定的 socket 概念﹐這個在“網路基礎”中有詳細說明。當您在瀏覽器上輸入一個 URL﹐例如 http://www.study-area.org ﹐事實上就是指定一個 server socket﹕其中的 www.study-area.org 會透過 DNS 轉換為 IP 位址﹐然後加上 http (port 80) 就是一個 socket 了。如果您將 http 改為 ftp﹐則是指定另外一個 socket (預設是 port 21)﹐假如您不想使用預設值﹐則可以在 URL 後面用 " : " 符號另行指定 port 號碼﹐例如﹕ftp://www.study-area.org:2001 。
當您知道 port 號碼和服務的對應關係之後﹐再讓我們回來看看 stand alone 和 inetd 這兩種 deamon 管理形式的不同﹕
- 當服務以 stand alone 啟動之後﹐它的 deamon 就會被執行﹐而且自己監聽 /etc/services 檔所指定的 port﹐如果有發現請求﹐則將請求接收下來讓服務程式進行處理﹐並將回應以同一 socket 送回 client 那端。在正常的狀態下﹐不管是否真正有服務請求要處理﹐服務的 deamon 都被載入到系統中﹐並佔用著一定的系統資源。
- 當服務以 inetd 啟動的時候﹐服務程式事實上並沒執行﹐取而代之的是 super deamon 程式在監聽服務所對應的 port。如果 inetd 發現有請求進入﹐然後會檢查 tcpd (正式名稱是 tcp wrapper )的設定檔﹐判斷是否要接受這個請求。如果可以通過﹐才載入真正的服務 deamon﹐並將請求交給服務程式處理。當整個連線結束之後﹐服務的 deamon 將會退出並釋放它所佔用的系統資源。
至於如何將服務 deamon 設定為 stand alone 或是 inetd 呢﹖則在服務程式進行編譯的時候選擇﹐有些則透過設定檔進行切換(例如 proftpd)。如果設定為 inetd 的話﹐inetd 是如何履行它的任務呢﹖下面就讓我們花些時間研究一下。
現在﹐請您觀測 /etc/xinetd.conf 這個檔案的內容﹕
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
}
includedir /etc/xinetd.d
|
這裡首先是定義了所有經過 inetd 提供服務的 deamon 設定﹐其中的 instances 是設定了單一的服務在同一時間內最多能提供的連線數目﹐如果設定為 UNLIMITED 則不進行限制。這個設定有助於抵擋 DoS 類的服務中斷攻擊。其後的三項是都是關於日誌記錄設定﹐它預設是透過 syslog 這個服務進行記錄(我們後面再介紹)﹕如果是成功的連線﹐則記錄遠端主機資訊和行程的 PID﹔如果失敗﹐則記錄遠端主機資訊。
最後一行﹐則指定了所有使用 inetd 服務的個別 deamon 設定檔所在的目錄位置。事實上﹐只要您喜歡﹐可以將全部設定都寫在 /etc/xinetd.conf 這個檔裡面﹐但為了管理方便和條理化﹐我們是建議按不同的檔案名稱來設定不同的 deamon 。下面﹐讓我們看看 /etc/xinetd.d/ 目錄中的 wu-ftpd 這個 deamon 的設定檔內容﹕
# default: on
# description: The wu-ftpd FTP server serves FTP connections. It uses \
# normal, unencrypted usernames and passwords for authentication.
service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.ftpd
server_args = -l -a
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
}
|
告訴您﹕檔案的名稱不重要﹐關鍵是檔案中的 service 後面所指定的服務名稱一定要跟 /etc/services 檔裡面定義的一致﹗然後在 { 和 } 之間是關於這個 service 的設定內容。假如這裡的設定和前面 xinetd.conf 之 default 設定有抵觸的話﹐則以這裡的為準。下面逐項說明一下這個服務的設定內容﹕
- 首先是 disable ﹕如果設定為 yes 的話﹐那麼系統就拒絕這個 service 的連線。換句話說﹐如果您的服務是透過 inetd 控制的﹐要關閉它的話﹐就將 disable 設為 yes﹐如果要打開﹐則設為 no 。
- 再來是 socket_type﹕這是服務的連線類型﹐通常來說﹐如果連線是 TCP﹐就是 stream﹔如果是 UDP 則是 datagram 。您可以從 /etc/services 找到服務的連線類型。
- 然後是 wait﹕當請求進入的時候﹐是否要‘等待’上一個請求的結束。換句話說﹐如果是 wait﹐那麼所有請求在同一個 deamon 中以‘串行’的方式處理﹔如果是 no wait﹐則以多個執行緒進行處理﹐每一個請求都有自己的執行緒。
- 至於 user﹕則指定以哪個身份去啟動服務程式。通常為 root﹐除非您有特別安排﹐尤其在系統安全上考量的時候。
- 然後是 server﹕這個很簡單﹐就是服務程式的所在位置。通常來說﹐都放在 /usr/sbin 裡面﹐如果是透過 inetd 啟動的話﹐檔案名稱大都以 in. 開頭。小心檢查看看﹐其中很多都是 link 而已。
- 接下來的 server_args﹕就是服務程式的參數。這裡的 -l 是讓 wu-ftpd 透過 syslog 進行日誌記錄﹐而 -a 則使用 /etc/ftpaccess 的設定。
- 至於 log_on_success 和 log_on_failure﹕這個剛纔已經說過了。但您是否發現 = 號左邊還有一個 + 號呢﹖這是在原有的(default)設定基礎上﹐再增加項目﹔如果是 -= 則從原有基礎上拿掉被指定的項目﹔如果單純的 = 號則重新設定這裡所使用的項目。
- 最後的 nice﹕相信大家都不會忘記第三章“基本命令操作”中的內容吧﹖這裡所設定的﹐就是服務程式的 nice level 啦。
如果您認為有必要﹐還可以設定一些額外的限制﹕
bind = 192.168.100.23
only_from = 192.168.100.0/24
no_access = 192.168.100.{10, 15, 30}
access_time = 08:00-18:00
|
這樣的話﹐假如您的機器有多張網路卡或 IP 的時候﹐只有送給 192.168.100.23 這個 IP 的請求才被執行﹐否則忽略。而且﹐也只限於 192.168.100.0/24 這個 subnet 的主機連上來﹐但 192.168.100.10、192.168.100.15、和 192.168.100.30 則被禁止連線。然後﹐服務只在早上 8 點到下午 6 點開放。
在 xinetd 中﹐不同的服務﹐其中的設定項目或許有所不同﹐您可以多參考幾個檔案來看看。如果想更詳細的了解 xinetd 的設定﹐可以 man xinetd.conf 慢慢看。我這裡不再詳細介紹了。
另外﹐就算同一個服務﹐您可以可以在相同的檔案中﹐用相同的 sevice 名稱再定義其它的設定項目﹐以針對不同的服務對象﹐例如界面、來源、時間、服務參數等等。比方剛纔的 ftp 服務﹐我就可以針對不同的界面分開不同的設定﹕
service ftp
{
socket_type = stream
wait = no
user = root
bind = 203.4.5.6
server = /usr/sbin/in.ftpd
server_args = -l -a
log_on_success += DURATION USERID EXIT
log_on_failure += RECORD USERID
nice = 15
}
service ftp
{
socket_type = stream
wait = no
user = root
bind = 192.168.100.23
only_from = 192.168.100.0/24
no_access = 192.168.100.{10, 15, 30}
access_time = 08:00-18:00
server = /usr/sbin/in.ftpd
server_args = -l -a
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
}
|
每次當您修改過 xinetd 的設定之後﹐不要忘記一點﹕只有當您重新執行 xinetd 這個 deamon 之後﹐才能讓設定生效。所以﹐每次您修改了任何一個 deamon 的服務設定﹐請執行如下命令﹕
Tips﹕在舊的版本中﹐例如 RedHat6.2﹐預設使用的 super deamon 並不是 xinetd ﹐而是 inetd。基本上﹐inetd 提供的功能要比 xinetd 少很多﹐不過﹐如果您沒仔細研究 xinetd 的話﹐這些額外功能您都很少使用。而且設定的語法上﹐也很不一樣。拿剛纔的 wu-ftpd 來看好了﹕
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
|
所有服務設定﹐全部集中寫在 /etc/inetd.conf 這個檔中﹐而每一個 service 則以單一句子作為設定。如果您了解 xinetd 的設定﹐相信要理解 inetd 的設定不難﹐可能只會覺得有些不儘完善而已。
然而﹐無論如何﹐有可能的話﹐就將全部的 inetd 換成 xinetd 吧。
前面介紹的﹐主要是了解 xinetd 如何將服務請求轉給真正的服務程式。事實上﹐super deamon 之所以越來越受歡迎﹐其實還有一項非常好用的功能﹐也就是他可以透過控制檔來集中管理連線來源和服務對象。您應該在 /etc/ 目錄下面會發現 hosts.allow 和 hosts.deny 這兩個檔案。您可以將接受的連線設定放在 hosts.allow 檔裡面﹐然後將拒絕的連線設定放在 hosts.deny 中。
當 xinetd 監聽到服務請求之後﹐會首先檢查 hosts.allow 檔﹐然後檢查 hosts.deny 檔﹐看看是否有相關設定﹐然後作出相應的動作﹕接受連線或拒絕連線。xinetd 預設上是採用 first match 原則的﹐也就是﹐一旦讀到符合的設定要求﹐就不再往下檢查。所以﹐如果您同時將一個相同的設定放在 allow 和 deny 檔中﹐當檢查到 allow 的時候就會被接受進來﹐而不再檢查其後和 deny 的設定了。而通常﹐我們的習慣做法﹐也是鼓勵的做法是﹕
除非明確接受的﹐否則一律拒絕﹗
所以﹐我們通常會將那些需要提供的服務寫到 /etc/hosts.allow 檔中﹐而在 /etc/hosts.deny 中則簡單的加上如下句子﹕
先讓我們解讀上面的句子好了。首先﹐每一行為一個服務設定﹐各欄位之間必須以 " : " 作分隔符號。主要的欄位有﹕
daemon [,daemon,...]: client[,client,...][: option: option ...]
|
其中的 [ ] 內容為 optional 的﹐可設可不設。而 daemon 的名稱必須和 xinetd 設定檔所指定的 server 名稱一致(移除路徑之後)﹐例如 service ftp 所指定的 server 是 /usr/sbin/in.ftpd ﹐那這裡也要用 in.ftpd﹐如果是 /usr/sbin/in.wu-ftpd ﹐那這裡就要用 in.wu-ftpd ﹐如此類推。
至於 client 的設定﹐可以是一個完整的 hostname 或 IP 位址﹔也可以是一個小數點後面接 domain_name (如 .mydomain.net )﹐或是 net_ip 後接一個小數點 (如 192.168.100.)﹔也可以用 net_id/mask (如 192.168.100.0/255.255.255.0﹐注意﹕不能用 mask bit ( /24 ) 來設哦﹗)﹔除此之外還可以是 @netgroup 的名字。另外﹐您還可以用一些特殊名稱來指定來源範圍﹕
名稱 |
含義 |
ALL |
任何範圍 |
LOCAL |
所有不帶小數點的主機名稱 |
UNKOWN |
不能查詢得到的使用者、IP、主機名稱 |
KNOWN |
能夠查詢得到的使用者、IP、主機名稱 |
PARANOID |
能被查詢得到但反查結果不卻不一致的
IP 或主機名稱﹐ |
而關於 option 的部份﹐則有許多許多﹐例如﹕nice value、keepalive、spawn、twist 等等﹐這裡不再詳細介紹了。
在 deamon 和 client 的欄位中﹐您可以同時設定多個對象﹐只要用 " , " 分隔就可以了。另外﹐您可以用 EXCEPT 來進行排它設定﹐例如 ALL EXCEPT in.ftpd 來指定除了 in.ftpd 之外的所有 daemon ﹔ALL EXCEPT .baddomain.net 則是除了 .baddomain.net 之外的所有來源。詳細的設定和語法﹐您可以 man hosts.deny 參考﹐其中還有一些範例可以參考的。
那麼﹐剛纔我們在 hosts.deny 的設定所針對的對象就是﹕所有服務和所有來源﹐並沒設定選項 (ALL: ALL)。換句話說﹐就是全部拒絕。回到我們的原則﹕“除非明確接受的﹐否則一律拒絕﹗”﹐那麼我們接下來是要設定明確接受的內容了﹐也就是在 /etc/hosts.allow 設定那些允許接受的服務﹐這裡還是以 ftp 服務為例子﹕
in.ftpd: PARANOID: spawn (/bin/echo "A connection from %u%h is denied by %d" | \
/bin/mail -s "Alert! Paranoid ftp connection occurred!" root@%H)& : deny
in.ftpd: UNKNOWN@KNOWN: spawn (/bin/echo "Please check user identification!" | \
/bin/mail -s "Please check: %h isn't running identd!" root@%H,root@%h)&
in.ftpd: LOCAL, 192.168.100., KNOWN@KNOWN
|
首先﹐檢查來源的主機名稱之正反解是否一致﹐否則拒絕連線﹐並且用 spawn 選項呼叫系統命令 echo 和 mail﹐送一封警告信件給服務主機的 root 信箱﹐說明連線來使用什麼使用者名稱﹐以及來自哪台主機。您是否留意到最後一個欄位是 deny 呢﹖沒錯﹐在 hosts.allow 檔中﹐您也可以設定 deny ﹗假如 hosts.allow 檔的最後一行是﹕"ALL: ALL: deny" 的話﹐那麼您就無需擔心 hosts.deny 這個檔案的設定了。
然後﹐檢查能否查詢對方的使用者名稱﹐以及主機名稱。這裡的檢查將會是如此﹕使用者查不到﹐但主機卻可以查到。那通常是連不上對方的 identd ﹐或是該服務並沒執行的緣故。假如是這樣﹐仍然允許登錄﹐但就用 spawn 選項調用 echo 和 mail 命令﹐送出簡短的信息給對方主機和本服務主機的 root 信箱﹐提醒 identd 的問題。
Tips﹕事實上﹐網路上越來越多的服務都會查詢連線端的 ident 服務﹐以查詢使用者的資訊。如果不能順完成這個步驟﹐可能會讓連線延遲一段時間(如上例設定就會導致如此)﹐或是甚至拒絕連線的請求。所以﹐假如您設定好您的 Linux 主機﹐別忘了將這個服務啟動﹐您可以執行 ntsysv 命令來確定該服務有啟動起來﹐而且沒有被防火牆程式擋掉。這個 identd 的服務是 port 113 的 auth 協定。
假如來源不屬於 PARANOID 或 UNKOWN@KNOWN 的話﹐再檢查它是否屬於 LOCAL 類別(也就是主機名稱沒有小數點)﹐或以 192.168.100 開頭的 IP﹐或是能夠同時查詢到使用者和主機名稱。只要符合前述三項之一﹐那麼就接受這個連線。
除了 in.ftpd 之外﹐您可以在 /etc/xinetd.d 目錄下面找到系統預設所使用 xinetd 的服務有哪些。假如服務已經設定為 inetd 模式﹐並且用 hosts.deny 將設定為拒絕一切原則的話﹐那您必須確定這些服務中的 server 名稱﹐在 hosts.allow 中有相應的設定﹐例如 ipop3、imap、time、time-udp、rsync 等等﹐您自己看著辦吧。
其中有一個關於 telnet 的設定﹐系統預設是設為 disable = yes 的。我建議您不要設為 no ﹐因為 telnet 所傳送的所有數據都沒有經過加密處理的。在開放的環境中﹐例如 internet 上﹐使用 telnet 是非常不明智的舉動。假如您真的有需要進行遠端連線﹐不管是來自內部網路還是透過 internet﹐請使用 ssh 程式。RH7.1 預設上就幫您裝好 OpenSSH 服務程式了﹐而您要做的﹐就是執行 ntsysv 確定 sshd 程式被選擇為開機啟動服務就行了。當然﹐您也可以在任何時候執行下面命令來啟動﹕
如果您的 /etc/hosts.deny 已經設定為 ALL: ALL 的話﹐您要確定 /etc/hosts.allow 裡面有關於 sshd 的設定﹐否則您連不上來﹕
sshd: ALL EXCEPT .baddomain.net, .bad.domain.net
|
然後﹐您只要從其它機器執行下面的命令就可以連線過來﹕
ssh -l user_name ssh.server.address
|
其中的 -l user_name 參數是讓您指定登錄所用的帳號﹐如果不指定﹐則使用當前執行 ssh 程式的用戶名稱。如果您的 client 端是 MS Windows 機器﹐那可以到如下網站下載 putty 程式﹕
http://www.chiark.greenend.org.uk/~sgtatham/putty/
然後在設定的時候﹐要記得將 Protocol 指定為 SSH (port 22) 就可以了﹕
Tips﹕如果您想限制哪些帳號可以從遠端 ssh 進來﹐那您可以用 PAM 來限制 。您只需在 /etc/pam.d/sshd 檔案前面前面插入如下句子﹕
auth required /lib/security/pam_listfile.so item=user \
sense=allow file=/etc/sshusers onerr=fail
|
然後建立 /etc/sshusers 檔﹐將允許 ssh 的名單(一行一個)寫到裡面就可以了。
假如您使用 RH6.2 或以前的版本﹐那可能需要自己手工安裝 ssh 服務﹐您可以到 rpmfind 找到相關的 RPM ﹐然後進行安裝﹐如有錯誤﹐根據提示修改﹐通常會是 dependences 的問題而已。或是﹐您可以從 這裡 下載 CLE-0.9 提供的套件﹐並按如下步驟安裝﹕
- tar zxvf ssh-pkgs.tgz
- cd ssh-pkgs
- rpm -Uvh openssl-0.9.5a-1.6.x.i386.rpm
- rpm -Uvh openssh-2.2.0p1-1.i386.rpm # 如失敗試補加 --nodeps 參數
- rpm -Uvh chkconfig-1.1.2-1.i386.rpm
- rpm -Uvh openssh-server-2.2.0p1-1.i386.rpm # 如失敗試補加 --nodeps 參數
- rpm -Uvh openssh-clients-2.2.0p1-1.i386.rpm
- rpm -Uvh openssh-askpass-2.2.0p1-1.i386.rpm
- /etc/rc.d/init.d/sshd start
從系統安全的角度來看﹐xinetd 的連線控管﹐是防火牆後的最基本的主機端防衛﹐應該好好設定以策安全。尤其是直接連線到 internet 的機器上面﹐都應該透過 hosts.allow 和 hosts.deny 的設定來提供最原始的連線保護。當然了﹐設定不良的話﹐或會造成連線控制過鬆或過緊的狀況。
Tips﹕當您設定新的服務程式的時候﹐往往因為過緊的設定而導致測試失敗。這樣的話﹐當您在開始測試的時候﹐建議先從寬鬆的條件開始﹐然後逐步過渡到嚴格的設定。如果您取消 hosts.deny 的 ALL: ALL 設定而突然讓服務成功﹐那可能是 hosts.allow 那邊並沒有關於這個服務的正確設定﹐那就需要仔細檢查和反復測試﹐直到您將 hosts.deny 設定為 ALL: ALL 都能提供服務為止﹐但當然要注意不能太過寬鬆啦。嗯﹐系統安全一向是一個大題目﹐我只能說﹕靠自己的經驗了。
現在﹐越來越多的服務程式﹐都支援 inetd 服務。但如果服務程式不支援 inetd﹐或是基於其它原因沒有設定為 inetd 模式的話﹐那麼您是無法透過 xinetd 進行控管了。例如在 RH7.1 的預設情況下﹐bind(domain)、apache(http)、sendmail(smtp)、這些服務﹐都沒有透過 xinetd 控管的﹐那您就只能透過這些服務本身的設定進行限制了﹐或是在編譯的時候將 tcpwrapper 功能打開。這些留待日後我們介紹 Servers 的時候再慢慢討論吧。
這裡﹐再提醒您一次﹕每次修改過 xinetd 的設定﹐別忘了從新跑 xinetd 服務哦。
日誌管理
基本上﹐在 Linux 系統上的每一個事件﹐例如使用者的登錄、服務的啟動和關閉、系統錯誤、突發事件、等等等等﹐都能夠透過系統日誌記錄下來。例如我們在第四章“基本命令操作”中所介紹的 dmesg 命令﹐其實就是顯示系統核心資訊記錄檔 /var/log/dmesg 的內容而已。沒錯﹐除非您另外設定﹐一般而言﹐系統的所有日誌記錄都存放在 /var/log 這個目錄裡面。除了 dmesg 之外﹐其它諸如 messages、maillog、secure、xferlog 等等檔案也經常被用來作檢查。某些服務程式﹐例如 httpd、samba、squid 等﹐還有專門獨立的目錄來管理它們的日誌檔案。
Tips﹕如果您想看看系統最近有哪些人登錄過進來、以及使用什麼服務進行登錄、逗留的時間多長、等等資訊﹐您可以執行 last 命令來獲得﹐不過﹐它的顯示順序是最古老的登錄顯示在最後面。如果顯示的資料超過一個熒幕﹐那您可能只看到最舊的登錄資訊。您可以將結果導到 more 或 less 命令慢慢看﹐也可以傳給 tac 命令將顯示順序顛倒過來﹕
這些資訊非常有用﹐尤其在您進行報告、除錯、事件追蹤、系統規劃、等等的時候。要分析這些資訊﹐其實滿累人的﹐因為大部份格式都不是很容易閱讀和理解。不過﹐您可以借助某些工具來幫忙檢查和整理這些記錄檔﹐例如 swatch 和 logcheck 之類的程式﹐假如它們發現有不尋常的現像﹐則透過設定形式通知管理員﹐有的甚至很能將信息送到 BB Call 或手機上面去。不過﹐我們這裡不是教您如何使用記錄檔的資訊﹐而是教您如何設定管理這些檔案的服務程式而已。
負責管理和提供系統日誌的服務叫 syslog﹐請務必用 ntsysv 確定它的服務程式 syslogd 在開機的時候能夠自動執行。和前面介紹的 xinetd 一樣﹐每當您修改過 syslog 的設定﹐也必須重新執行這個 deamon 才能生效。當然﹐要讓 syslog 能夠記錄服務程式所產生的資訊﹐您必須在編譯的時候或透過設定來告訴服務程式使用 syslog 服務才行。例如前面介紹的 wu-ftpd﹐其中的 -l 參數就是告訴服務程式使用 syslog 進行日誌記錄。現在的服務程式﹐大都預設上使用 syslog 進行日誌管理﹐但有些服務程式﹐例如自己手工編譯的 apache﹐除非您另行指定﹐否則是按照它自己的習性進行日誌記錄的。
至於 syslog 是如何進行記錄的﹐則是透過 /etc/syslog.conf 這個設定檔進行控制。在進一步討論這個檔案之前﹐先讓我們了解一下 syslog.conf 的設定語法﹕
(注意﹕action 前面必須使用 tab 而非空白鍵進行分隔﹗)
其中的 facility 主要是日誌系統所能管理的服務程式﹐例如﹕auth、cron、daemon、kernel、lpr、mail、以及 syslog 本身、等等。另外﹐facility 也接受 local0 到 local7 的定義﹐這可以讓您自行設定特定的記錄類別﹐比方說﹐ssh 預設會使用 local5 這個定義。還有﹐您甚至可以用 " * " 符號來泛指所有 facility 。
在 facility 後面是一個小數點﹐然後配合 log level 來指定一個 facility 的訊息重要程度﹐按重要程度來分、由低至高一共有如下這些 level﹕info、notice、err、crit、alert、emerg 或 panic ﹔另外﹐還有一些特殊的 level﹕debug 主要用來除錯時使用的﹐因為它產生的資訊實在太多了﹐除非真的有此必要﹐否則不要設定﹔和 facility 一樣﹐您也可以用 " * " 符號來泛指所有 level﹔另外﹐還有一個 none﹐它是當使用 * 的時候﹐進行排他設定的。
當您指定一個 level 的時候﹐syslog 會記錄這個 level 本身﹐以及所有高於它的其它 level 訊息﹔例如﹐crit 事實上會包含 crit、alert、emerg 這三個 level 所產生的資訊。但如果您在 level 名稱前面加上一個 " = " 符號﹐則僅僅指定該 level 本身的訊息而已﹔例如﹐=crit 只包含 crit 這個 level 產生的信息。
在設定行的最後部份﹐則是用一個或多個 tab 鍵分隔的 action。它可以是如下任何一個項目﹕
- 檔案絕對路徑﹕
通常以位於 /var/log 目錄裡面的檔案來記錄信息﹔
- terminal 或印表機名稱﹕
將信息顯示在 terminal 或印表機上﹐例如 /dev/console、/dev/tty1、/dev/lp0 等﹔
- 使用者名稱﹕
用 write 命令將訊息顯示在使用者登錄的第一個 console 上面﹐如設定為 " * " 符號則代表所有使用者 ﹔
- 遠端主機名稱﹕
必須冠以 " @ " 符號作開頭﹐通常是用來集中管理 syslog 的服務主機﹐其上必須有執行 syslogd 服務﹐並能接受這台主機所產生的 syslog 連線﹔
- 由 mkfifo 程式所產生的 name pipe ﹕
必須冠以 " | " 符號做開頭﹐通常給其它程式或 script 使用。
當您了解 syslog.conf 的設定語法之後﹐讓我們看看這個檔案的範例﹕
#kern.* /dev/console
# 上面這行是註解起來的﹐如果您將它打開的話﹐
# 那麼所有由 kern 產生的訊息都會顯示在熒幕上面。
*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages
# 上面用多個 " ; " 分隔多項設定﹐
# 除了 mail、news、authpriv、cron 這些之外﹐
# 所有 facility 的 info 以上的資訊﹐將記錄到 /var/log/messages 檔案。
authpriv.* /var/log/secure
# 關於 privileged 資訊的記錄全部寫到 /var/log/secure 檔裡面。
# 這通常是與帳號相關的資訊﹐例如 PAM 就通常會使用這個 facility。
mail.* /var/log/maillog
# 關於 mail 產生的所有資訊﹐記錄到 /var/log/maillog 檔案。
cron.* /var/log/cron
# 關於 cron 的所有資訊﹐記錄到 /var/log/cron 檔案。
*.emerg *
# 所有 emerg level 的資訊﹐將送給線上的所有使用者。
uucp,news.crit /var/log/spooler
# 關於 uucp 和 news 的 crit 及以上 level 的資訊﹐記錄到 /var/log/spooler 檔案。
local7.* /var/log/boot.log
# 自定義的 local7 所產生的所有資訊﹐都記錄到 /var/log/boot.log 檔案。
news.=crit /var/log/news/news.crit
# 僅將 news 產生的 crit level 資訊寫進 /var/log/news/news.crit 檔案。
news.=err /var/log/news/news.err
# 僅將 news 產生的 err level 資訊寫進 /var/log/news/news.err 檔案。
news.notice /var/log/news/news.notice
# 將 news 的 notice 及以上 level 所產生的資訊﹐記錄到 /var/log/news/news.notice 檔案。
|
Tips﹕如果您想把訊息記錄到遠端的日誌伺服器上(假設名稱為 doraemon )﹐您必須確定可以連上對方的 UDP port 514 。同時修改其上的 /etc/sysconfig/syslog﹐在原本的 SYSLOG_OPTIONS 增加一個 ' -r ' 參數﹕
然後在本機的 /etc/syslog.conf 上增加相應的設定﹐使之記錄到遠端機器上﹕
修改完別忘了雙方都要重新跑 syslog 服務哦。
有條件的話﹐我強烈建議您架設一台專用的日誌伺服器﹐用 486 機器就好了(如果您還能從雜物間找得到的話)。然後設定所有的 Linux 機器﹐讓記錄產生一個副本到集中的日誌伺服器上。當然﹐這台日誌伺服器的安全性就顯得非常重要了﹐您甚至可以將上面的所有遠端服務都關閉掉﹐只剩必要的 UDP 514 就好。
透過 syslog.conf 設定檔﹐您可以指定哪些資訊﹐以及何種等級的資訊﹐要記錄到哪裡去。假如您是使用檔案的形式進行記錄的話﹐您需要留意的一個問題是﹕每次有新的資訊產生﹐都會增加到這些檔案中。換句話說﹕這些檔案的體積會根據信息量的多寡而不斷增加﹐如果控制不宜﹐可能會將您檔案系統空間吃光﹗假如您還沒忘記第一章“安裝 Linux”裡面所提到的 partiton 和 mount point 的安排﹐那應該會知道為什麼人們通常會將 /var/log 掛在獨立的 partition 上面了。
而另外一個問題是﹕這些檔案通常會記錄到一些關於系統的敏感資料﹐記錄檔的真實程度就顯得非常重要了。假如您的系統糟到入侵﹐但同時被入侵者修改了記錄檔的話﹐那就丟失了稽查的證據﹐從而導致入侵的偵測與防範更顯困難。所以﹐如何設定檔案的權限和屬性﹐也非常講究。一般而言﹐這些記錄檔通常只允許 root 讀取得到﹐而最好還要加上 +a 的屬性(attribute)﹐讓它們只能增加而不能刪除或改名。不過﹐當您要刪除或改名的時候(例如進行 logrotate 的動作)﹐就要事先將 -a 屬性拿掉才能進行了。
Tips﹕記錄檔之所以能作為檢查依據﹐其中一個很重要的因素是它的時間記錄。在進行聯機日誌管理和查詢的時候﹐假如時間不同步的話會造成很大困繞﹐不過﹐您可以利用網路上的 time server 進行校時﹕
ntpdate time.stdtime.gov.tw
clock -w
|
當然﹐您必須確定您的機器可以連得上 Iternet。您可以用 cron (後面介紹) 幫您定期執行以上命令﹐以確保時間的準確性。如果您不執行 clock -w 的話﹐則不會寫入 CMOS﹐第一行命令僅更新系統自己的時間而已(如果執行失敗﹐不妨試試﹕rdate -s clock.nthu.edu.tw 或 rdate -s time.stdtime.gov.tw )。
不過﹐無論如何﹐要手工的控制這些記錄檔案的體積和屬性是非常不便的。下面介紹另外一個工具﹕logrotate﹐它可以幫您更好的管理這些記錄檔哦~~
logrotate 這隻程式﹐主要透過 cron 服務(後面再介紹)﹐定期的幫您更換設定檔。它可以根據您的設定要求﹐例如時間或體積﹐將記錄檔的名字換掉﹐然後再建立一個新的空白檔讓其後的記錄從新開始。
這樣說恐怕也不好理解﹐不如先讓我們看看 /etc/logrota.conf 這個設定檔的內容吧﹕
weekly
rotate 4
errors root
create
#compress
include /etc/logrotate.d
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
|
在前面的 5 行是屬於 global 設定﹐這些都是預設值。在後面的獨立單元設定中可以重新定義設定值﹐否則就使用 global 設定值。最後 5 行則是獨立單元的設定﹐待會再說明。在中間的 include 那行﹐類似 xinetd.conf 的設定一樣﹐也就是將其它個別單元設定以獨立的檔案形式集中存放在 /etc/logrotate.d 目錄中﹐當然﹐如果您喜歡﹐也可以全部寫在一個檔案上面。
讓我們先解讀前面的 global 設定吧﹕
- weekly﹕
進行記錄檔更換的時間間隔﹐這裡是每星期一次﹐您也可以改為 daily 或 monthly。除了以時間為標準之外﹐您還可以用檔案體積為標準﹐如 size=100K 。不管用哪種標準﹐只要條件成立﹐就進行 rotate 的動作。﹔
- rotate 4﹕
一共進行多少次更換。也就是說﹐一共要保存多少個舊的記錄檔。在 logroate 進行更換的時候﹐原本的記錄檔﹐例如 messages﹐會被更名為 messages.1﹔而 messages.1 則改名為 messages.2 ﹔如此類推﹐一直更換下去。這裡設定為 rotate 4 ﹐也就是說﹐最多將檔案更換為 messages.4 就不再更換了﹐那麼﹐如果原本已經有 messages.4 這個檔的話﹐就會被刪除﹐除非您有另外的備份﹐否則就永遠找不回來了。
- errors root﹕
當 lograote 程式在執行的時候﹐如果遇到錯誤﹐會將信息以 email 形式寄給 root 信箱。
- create﹕
檔原本的記錄檔被 rotate 之後﹐是否要建立一個新的空的原始記錄檔名稱。這個當然要啦﹐除非您確定不用﹐則可以用 nocreate 設定代替。
- compress﹕
經過 rotate 的檔案﹐是否使用 gzip 進行壓縮。目前是註解起來的﹐所以沒有使用這個功能
最後面的 5 行句子呢﹐則是關於 /var/log/wtmp 這個記錄檔的設定﹐它的更換標準改為 monthly﹐而不採用 global 的 weekly 設定﹔然後進行 rotate 之後以 0664 的 permission 建立空白原始檔﹐其 owner 身份是 root、goup 身份是 utmp。而且﹐它只進行一次 rotate 就夠了。
接下來﹐再讓我們看看 /etc/logroate.d 這個目錄裡面的設定檔之設定﹐這裡不再一一介紹了﹐我挑其中的 samba 進行說明吧﹕
/var/log/samba/*.log {
notifempty
missingok
sharedscripts
copytruncate
postrotate
/bin/kill -HUP `cat /var/lock/samba/*.pid 2> /dev/null` 2> /dev/null || true
endscript
}
|
首先﹐第一行定義的記錄檔是 /var/log/samba 目錄下所有以 .log 結尾的檔案。第二行﹕如果記錄檔是空白的話﹐就不進行更換。第三行﹕如果檔案不存在﹐可以接受﹐否則視為有錯誤。第四行﹕所使用的 logrotate script 只執行一次﹐並非每執行一個檔案的更換就執行一次。第五行﹕先以 copy 的方式將當前記錄檔複製為備份檔﹐然後再切除原來的部份﹐它的用處是允許記錄在進行 rotate 處理的時候還能繼續寫入當前檔案。
再下來的三行﹐是關於 postrotae 的設定﹐它必須以 edscript 結尾。仔細檢查其中的設定﹐其實是重新執行 samba 的服務程式而已。
Tips﹕您要知道的是﹐postrotate 是當所有記錄檔完成 rotate 之後要進行的動作。相對的﹐您也可以設定 prerotate ... endscript 的設定﹐則是在進行 logrotate 之前要進行的處理。
假如您將記錄檔的屬性設定為 +a 的話﹐那您就必須在 rotate 之前將 +a 屬性拿掉﹐然後在 rotate 結束之後﹐再加上 +a 屬性。然則﹐您可以這樣修改設定檔﹕
/var/log/samba/*.log {
prerotate
/usr/bin/chattr -a /var/log/samba/*.log
endscript
notifempty
missingok
sharedscripts
copytruncate
postrotate
/bin/kill -HUP `cat /var/lock/samba/*.pid 2> /dev/null` 2> /dev/null || true
/usr/bin/chattr +a /var/log/samba/*.log
endscript
}
|
如果其它設定檔也需要相同的設定﹐那您就花點時間﹐全部設定起來囉。例如 /etc/logrotate.d/syslog 這個檔﹐本身就包含了許多記錄檔的設定﹐一一搞定它們吧。假如您要注重系統安全的話﹐這些繁瑣的功夫免不了﹐同時也是您的責任。
當一切都設定完畢之後﹐接下來的工作則交給下面介紹的 cron 來完成。您只需確定 /etc/cron.daily/logratate 檔案的內容如下就可以了﹕
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
|
工作排程
相信許多用過 Windows 的朋友都使用過工作排程工具吧﹗尤其是病毒掃瞄和病毒碼下載之類的工作﹐別跟我說您用 Windows 居然沒這個習慣哦~~ 否則您還不懂得最基本的系統保護之道。
在 Linux 上面﹐當然也有類似的排程工具可以使用啦﹐這裡先介紹一個最簡單的 at 命令 (用過 NT 的朋友也應該知道這個命令吧﹖)﹕
at now +2 minute
> echo "Hello world!"
> ^D # 也就是按 Ctrl + D 鍵
|
以上命令是用 at 命令設定了兩分鐘後執行 echo 命令﹐其結果會以 email 形式傳送給執行這個 at 命令的使用者。然後等兩分鐘﹐您就會收到一封主旨為 “Output from your job #”的郵件了。以上的命令也可以用 at 4am Oct 08, 2001 這樣的格式來設定。
在任何時候﹐您可以執行 atq 命令來查詢當前已經安排的 at 命令﹐每一個排程都有一個編號﹐可以用 atrm 來取消一個 at 排程。
不過﹐用 at 命令有一個缺點﹕它只能在指定時間內執行一次﹗如果您遇到週期性的工作需要重複處理的話﹐用 at 命令可能不是您需要的﹐取而代之﹐您應該會使用 crontab 命令。
在 Linux 系統裡﹐有一個專門負責排程的 cron 服務﹐請您用 ntsysv 命令確定 crond 這個 deamon 選擇為開機服務。然後﹐您只要執行 crontab -e 就可以編排自己的工作排程了(預設以 vi 模式進行)。如果將 -e 換成 -l 參數﹐則會列出所有屬於您自己的工作排程﹔如果用 -r 參數﹐則可以移除一個既定排程。對於一般使用者來說﹐他只能編輯和刪除自己的排程﹐但作為 root ﹐您可以用 -u 參數再指定使用者名稱進行修改。
在我們進行真正的設定之前﹐先讓我們看看 crontab -e 的命令範例吧﹕
02 4 * * * ntpdate time.stdtime.gov.tw
|
這是最基本的 crontab 命令格式﹕時間 + 命令(及參數)。最後部份的命令應該不用多作解釋了吧﹖最難理解的是時間那部份而已。在 crontab 中﹐時間的設定一共用空白鍵分為 5 個欄位﹐它們分別代表﹕
分鐘 小時 日期 月份 星期(星期天為 0)
這 5 個欄位缺一不可﹐如果您不需要設定的話﹐則用 " * " 符號代替。而每一個欄位中﹐也可以用 " , " 符號或 " / " 再進行分隔﹐例如在小時欄中﹐您可以用 0,6,12,18 來指定其中四個小時﹐也可以用 */6 來指定每隔六個小時為單位。另外﹐您還可以用 " - " 符號來指定某一段數值。在前面給出的例子中﹐其意思是說﹕每天的凌晨 4 點 02 分 幫您進行網路校時 。
Tips﹕您也可以預先用文字編輯器寫好 crontab 的敘述﹐然後以這個檔案的路徑作為 crontab 的參數就可以了﹐如﹕
crontab /path/to/myjob.cron
|
一但工作排程設定好﹐所有設定將保存在 /var/spool/cron 目錄下﹐以使用者名稱作檔案名字。如果您將某一個帳號移除了﹐別忘了檢查這個目錄﹐確定與帳號相關的排程也一併移除。
不過﹐執行 crontab -e 僅是針對使用者而言的﹐當然﹐您可以在 root 帳號裡面設定好所有系統所需的排程。然而﹐Linux 有專門一套排程工具幫您維護系統相關的工作﹐我們不妨先從 /etc/crontab 這個設定檔開始﹕
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
|
一開始﹐檔案定義出排程工具所使用的 shell 程式﹐然後是 PATH 變數範圍﹐再來是管理員信箱(所有排程產生的錯誤或是結果﹐都將送給這個信箱。幹﹗難怪我每天都收到一堆 cron 寄來到郵件﹗原來是這裡搞的鬼~~)﹐最後還定義好家目錄位置。而真正的執行部份﹐則設定在 run-parts 後面。正如您所看到的﹐系統按每小時、每天、每星期、及每月為間隔﹐分別置於不同的目錄下面。待會我們再看各目錄下面有哪些設定﹐這裡﹐您不妨仔細看看每一行的時間設定﹐以及為什麼是這樣設定。
根據前面所介紹的設定格式﹐您應該不難看出﹕只要分鐘數值為 01 的時候﹐就會執行 cron.hourly 的工作﹔當時針針指向 4﹐分針指向 02 的時候﹐就會執行 cron.daily 的工作﹔而每星期天 ( 0 ) 的凌晨 4 點 22 分﹐則執行 cron.weekly 的工作﹔每月 1 號的凌晨 4 點 42 分則執行 cron.monthly 的工作。
假如您的機器不關閉﹐每到指定的時間﹐ crond 就會幫您運行目錄裡面各檔案的排程設定﹐您不妨用 ls 和 cat 命令看看各子目錄裡面有哪些檔案。我們拿 /etc/cron.daily/slocate.cron 來看好了﹕
#!/bin/sh
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" -e \
"/tmp,/var/tmp,/usr/tmp,/afs,/net"
|
還記得我們在第四章“基本命令操作”中所學到的 locate 命令嗎﹖它可以用來尋找檔案系統上的檔案﹐但事實上只是尋找一個特殊的資料庫而已﹐資料必須執行 updatedb 命令才能與實際的檔案系統同步。上面這個 cron 設定檔﹐就會每天凌晨 4 點 02 分幫您進行 locate 資料庫的更新。所以﹐如果您這時候剛巧還沒睡覺﹐忽然看到機器的硬碟在狂轉﹐可不必過於驚慌﹐那可能是 crond 在執行 updatedb 命令而已~~ ^_^
然而﹐您或許還有個問題﹕如果我的機器在設定的時間關機了呢﹖呵~~ 那當然沒辦法啦。不過﹐難道沒更好的辦法嗎﹖哈哈﹐當然有啦~~ (通常﹐我這樣問您的時候﹐都會自備答案的。)
您是否有留意到﹕在 cron.daily、cron.weekly、和 cron.monthly 目錄裡面﹐都有一個 0anacron 檔案呢﹖其內容如下(以 cron.daily 為例)﹕
#!/bin/sh
#
# anacron's cron script
#
# This script updates anacron time stamps. It is called through run-parts
# either by anacron itself or by cron.
#
# The script is called "0anacron" to assure that it will be executed
# _before_ all other scripts.
anacron -u cron.daily
|
Tsips﹕每次當您設定或修改過 /etc/crontab﹐一定要重新執行 crond 服務才有效﹕
這是另外一個排程程式叫 anacron 的設定檔﹐也請您用 ntsysv 確定它為開機服務哦。anacron 和 cron 的工作方式不一樣﹐我們不妨看看它的主要設定檔 /etc/anacrontab﹕
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# These entries are useful for a Red Hat Linux system.
1 5 cron.daily run-parts /etc/cron.daily
7 10 cron.weekly run-parts /etc/cron.weekly
30 15 cron.monthly run-parts /etc/cron.monthly
|
其它我不再介紹了﹐只針對它的時間設定說明一下。anacron 的時間設定有兩個欄位﹕時段 和 延遲時間。其中的時段以天數為單位﹐延遲時間以分鐘為單位。在您還沒搞混亂之前﹐先介紹一下 anacron 的時間依據原則吧﹕anacron 會檢查每一個排程是否在過去 n 天之內被執行﹐其中的 n 就是第一個欄位之設定值﹔如果已經被執行過﹐則不再理會﹔但如果沒被執行﹐則在 anacron 服務啟動(通常是開機的時候)之後的延遲 m 分鐘執行該排程﹐其中的 m 就是延遲時間這個欄位的設定。
哦~~ 原來如此﹐怪不得每天早上開機之後 10 分鐘左右就發現硬碟在那裡狂轉﹗哈哈﹐現在是否幫您解開了存疑已久的問題呢﹖I hope so ...
系統備份
好了﹐當您了解系統的排程工作原理﹐以及會得設定自己的或系統的排程之後。我建議您寫一個 script ﹐為您的系統進行定期備份。假如您有設定好磁帶機或其它專門備份設備﹐那最理想不過。然而﹐就算您沒有這些特殊設備﹐起碼也用硬碟或網路檔案系統﹐將系統的重要檔案備份起來。
許多人或許都曾問過﹕Linux 要樣進行備份啊﹖呵﹐說起來﹐Linux 的備份最簡單不過了﹗用 copy 不就好了﹖
沒錯﹐只要您知道系統有哪些目錄和檔案需要備份﹐用 cp 命令複製一份﹐然後存在別的地方就好了。但是﹐使用 cp 命令有一個地方要留意的﹐就是檔案的 permission 和 attribtue 。為了避免丟失檔案屬性﹐您必須使用 -a 或 -dpR 參數﹐無論是複製為備份或是從備份複製還原﹐都不要忽略這個參數﹗一定一定哦~~
除了用 cp 之外﹐另外一個最經典的 Linux 備份命令是 tar 或 dump 命令。我們這裡只介紹 tar 命令而已﹐事實上﹐tar 命令可以看成是一個檔案‘打包’工具﹕將好幾個檔案或目錄﹐包成單一一個檔案。當您進行打包的時候﹐命令格式如下﹕
tar zcvf 打包後檔案名稱 被打包檔案或目錄1 [被打包檔案或目錄2 ...]
|
注意哦﹐按照我們平時使用的檔案命令思維﹐例如 cp、mv 之類的﹐通常是將目標檔案參數放在最後面。不過﹐tar 在使用 -c (也就是 create 之意)參數時則有點特別﹐目標檔案放在前面﹐來源檔案至於後面。其中的 z 參數﹐在打包之後會使用 gzip 進行壓縮﹐而 v 參數則將命令的執行訊息顯示出來﹐最後的 f 參數是強制執行的意思﹐如果目標檔案已經存在﹐那就會被覆蓋掉。
Tips﹕通常﹐在打包的時候﹐來源檔如果使用絕對路徑的話﹐會拿掉 " / " 符號﹐而變為相對路徑(除非您使用 -P 參數)。因此在‘解包’的時候﹐就要留意所展開的檔案之存放位置是否正確﹐否則就用 cp -a 或 mv 命令放置到真正的路徑去。
不過﹐ tar 之所以這樣處理﹐目的之一就是避免意外地、或遭人惡意地覆蓋某些檔案。所以﹐如果要打包的檔案體積不太大的話﹐我建議您先建立一個空白目錄﹐然後將檔案或目錄複製到空白檔中(別忽略了檔案屬性哦﹗)﹐然後再將這個目錄打包為 tar 檔就是了。檔案的名稱沒什麼關係(因為是 Linux 嘛 ^_^)﹐然而﹐通常我們會以 .tar 為結尾﹐如果有壓縮的話﹐則會再加上 .gz 成為 .tar.gz (但也常併作 tgz)。
現實中﹐許多程式之安裝程式和原始碼﹐都以 tar 來打包的﹐我們通常稱這種形式所散佈的套件為 tarball﹐我們在第四章已經介紹過了。
當您產生好 tar 的打包檔案之後﹐只要將之存放到備份媒體上﹐或轉移到其它網路系統上﹐就擁有一個備份了。您甚至可以將整個系統﹐從 / 開始進行打包﹐這樣就擁有整個系統的備份了。我建議您在系統設定好之後﹐還沒連上網路之前﹐就為系統進行一個備份。我們稱這樣的備份為 Pristine Backup ﹐也就是一個乾淨的原始備份﹐每一個系統都最少有一份。
要製作整個系統的備份﹐您可以使用如下命令﹕
mkdir /backup
tar -zcvpPf /backup/full-`hostname`-`date '+%Y-%m-%d'`.tgz / \
--exclude=mnt --exclude=proc --exclude=backup
|
再提醒您﹕備份檔最好不要放在同一機器上﹐嚴格來說起碼要分開不同的建築物或地區(以汐沚東方科學園區為鑒)。
假如您要從備份中還原其中一個目錄的話﹐如 /home﹐那可以執行﹕
mkdir /backup
tar -zxvspPf /backup/full-xxx.xxx.xxx-xxxx-xx-xx.tgz /home
|
如果您只想進行部份備份﹐您可以用 --exclude 參數排除掉不需要進行備份的目錄。當然﹐您也可以逐個目錄進行﹐那我會建議您最少要包括 /etc、/home、/var、/boot 這些目錄﹐關於至於 /usr、/opt 這些﹐看您自己的意思了﹐因為這些通常是您的安裝套件存放之所﹐如果認為可以用重新安裝的方式還原﹐那可以省下﹐否則就最好備份﹐尤其是程式所產生的數據(無論放在那裡﹐都應該備份數據﹗)。至於 /bin、/sbin、/usr/bin、/usr/sbin 這些存放執行程式的地方﹐通常沒必要備份﹐因為都可以透過重新安裝得到﹐而且﹐如果系統糟到入侵﹐後門和木馬程式也通常會寫在這些目錄下面﹐或是提換掉原來的檔案。除非您非常確定﹐否則最好不要從最近的備份來還原這些程式﹐而應該用原始備份進行還原。
Tips﹕通常而言﹐我們在進行備份的時候﹐常會採用的策略有 full backup + incremental backup ﹐也就是在一定的時間間隔內(如每周)進行完整備份﹐然後在兩次完整備份之間﹐採用更小的時間間隔(如每天)再針對上次備份(不管是否為完整備份)之後修改過的檔案進行備份。
假如我們是用磁帶進行備份的話﹐您最少要準備 6 片磁帶﹐其中四片分別給星期一到星期四使用﹐以進行 incremental backup﹔另外兩片分別給單周和雙周的星期五進行 full backup﹔當然﹐如果您有更多的磁帶以保存每月、每季、每年的完整備份也是值得鼓勵的。
完整備份您可以參考前面的例子進行﹐而進行 incremental backup 的話﹐也很簡單﹕
tar -N "Oct 20 2001" -zcvpPf /bakup/incr-`hostname`-`date '+%Y-%m-%d'`.tgz / \
--exclude=mnt --exclude=proc --exclude=backup
|
不過﹐上面的命令比較適合用手工執行的方式進行。根據前面學習到的 cron 設定﹐我們應該很容易就設定出這樣的備份流程﹕
30 4 * * mon find / -mtime -3 \! -type d -print > /tmp/daily.bak ;
tar -zc -T /tmp/daily.bak -f /dev/ftape
--exclude=mnt --exclude=proc --exclude=backup ;
rm -f /tmp/daily.bak
30 4 * * tue,wed,thu find / -mtime -1 \! -typd d -print > /tmp/daily.bak ;
tar -zc -T /tmp/daily.bak -f /dev/ftape
--exclude=mnt --exclude=proc --exclude=backup;
rm -f /tmp/daily.bak
30 4 * * fri tar -zcf /dev/ftape /
--exclude=mnt --exclude=proc --exclude=backup
|
注意﹕上面的設定一共只有三個句子(敲 Enter 斷行)﹐上面是為因為版面的關係而斷成多行了。如果您真正在機器上操作的話﹐記住只有幾個 "30 4 " 才是是新句子的開始﹐其它全部接在一起輸入而不要按 Enter 斷行。否則﹐crontab 可能不接受﹗
當然了﹐如果您喜歡用 anacron 的話﹐略為修改第二句(拿掉前面的時間設定)﹐然後寫進 /etc/cron.daily 中的一個新檔案中﹔再如法炮製第三句﹐寫進 /etc/crond.weekly 中就是了。
透過這樣的設定﹐每星期一的凌晨 4:30am 就會將前三天修改過的檔案備份起來﹔而星期二至星期四只備份前一天修改的檔案﹔到了星期五﹐則對整個系統進行完整備份。而您需要確定的是﹕按照日前插入適當的磁帶﹐然妥善保管其它磁帶就好了。只要您的 script 寫得正確﹐您可以指定專門的人來換帶﹐而無需對方進行任何的系統操作﹗
更多的設定技巧﹐您可以參考 LDP 的文件﹕
Securing and Optimizing Linux: RedHat Edition -A Hands on Guide
關於 tar 命令的參數非常多﹐而且應用上也非常靈活﹐例如您可以用 -A 參數將檔案打包﹐然後附加在已經存在的 tar 檔﹐原來的內容依然保存﹔也可以用 -M 命令建立多卷備份檔案﹔用 -t 參數建立索引並進行輸出。很多很多﹐自己 man tar 慢慢看吧。
除了 tar 之外﹐您還能用來的備份命令有﹕cpio 和 dd 等。詳細的操作我這裡不介紹了﹐下面是他們的命令範例﹕
作為管理員﹐當要刪除一個帳號的時候﹐都會先將該使用者擁有的檔案備份起來﹐您可以用 find 和 cpio 配合做到﹕
find / -user kenny | cpio -ov > /backup/kenny.cpio
find / -user kenny -type f -exec rm -f {} \;
find / -user kenny -type d -exec rmdir {} \;
|
第一個 find 命令是進行備份﹐其後兩個命令是刪除使用者的所有檔案和目錄。日後﹐假如要進行還原的話﹐執行 cpio -id /backup/kenny.cpio 就可以了。
而至於 dd 命令﹐相信有些人在製作開機磁碟片的時候就用過了。它的基本命令參數有﹕
參數名稱 |
代表意思 |
if= |
指定輸入檔案路徑﹐預設為標準輸入。 |
of= |
指定輸出檔案路徑﹐預設為標準輸出。 |
bs=n |
設定 block 大小﹐預設為 512 byte。 |
skip=n |
忽略指定文件開頭的 n 個記錄進行讀取。 |
seek=n |
忽略讀入信息開頭的 n 個記錄進行輸出。 |
count=n |
僅複製 n 個記錄。 |
conv=swab |
進行字節轉換。 |
conv=lcase |
轉換為小寫字母。 |
conv=ucase |
轉換為大寫字母。 |
比方說﹐您將一個磁碟 image 寫到磁碟片上﹐或是將磁碟片的內容制成一個 image 檔案﹐您可以如此輸入﹕
dd if=disk.img of=/dev/fd0 bs=10240 # 將 image 寫到磁碟片
dd if=/dev/fd0 of=disk.img bs=10240 # 為磁碟片製作 image
|
現在﹐越來越多 Linux 的備份工具可供使用﹐有的功能之強大﹐遠勝 Windows 平臺的專屬軟體﹐這裡就不再介紹了﹐有空的話﹐自己找找看吧。您可以到網路上搜索﹐也可以到 freshmet.net 上看看﹐然後找一套自己喜歡的備份工具。如果要我推薦的話﹐您可以找 Amanda 、Arkeria 這兩個回來試試看﹐尤其後者﹐可以在 X window 上執行﹐甚至還提供 MS Windows 的客戶端程式﹗
設定印表機
如果您的 Linux 連接有印表機﹐或是需要使用網路上的印表機﹐那麼﹐接下來就教您如何在 Linux 上設定印表機﹐甚至向網路提供列印服務。
說真的﹐在文字模式下設定印表機恐怕不是一件好差事﹐如果有可能﹐我建議您到 X window 裡面設定﹐步驟如下﹕
- 進入 X window 並執行 printtools 命令﹐這樣會跑出一個 printconf-gui 的視窗。
- 然後點選‘New’圖標新增印表機。這樣會跑出另外一個視窗﹐首先會讓您設定‘Name ande Aliase’﹐您在 Queue Name: 欄位裡面填上適當的印表機名稱﹐例如第一台印表機為 lp0 之類的﹐沒硬性規定啦。然後選擇 ‘Add...’按鈕為印表機設定別名﹐如 Epson 之類的﹐您喜歡的話﹐可以設定多個別名來命名一台印表機。
- 下一步是選擇‘Queue Type’。如果您的印表機是直接與主機相連的﹐那就選擇 Local Printer ﹐預設在第一個列印埠 /dev/lp0 上面﹐您必須確定核心有支援 parport 設備(執行 dmesg | grep parport 就可以找得到)。假如您這裡要設定網路上的印表機﹐例如其它 Linux 分享出來的﹐可以選擇 Unix Priter (lpd Queue)﹐然後填上對方的 IP 或主機名稱﹐以及對方提供的印表機名稱。
or:
- 接下來是選擇‘Printer Driver’﹐例如 Epsopn -> Stylus 800 之類的。如果您找不到確切的型號﹐可以嘗試相近的型號﹐例如我的 Stylus 820 並沒有在選單中﹐使用 Stylus 800 也可以工作就是了﹐不過﹐這是不保證的啦。假如您的印表機是 laser 的﹐或是支援 postscript 功能的話﹐也可以嘗試選擇最頂上的 Postscript Printer 。
- 根據您所選擇的 Driver﹐其後的‘Driver Options’之內容或有不同﹐我這裡只修改了 Page Size 為 A4 ﹐並沒有改變其它。
- 當一切都設定妥當之後﹐按 OK 回到 printconf-gui 視窗﹐您會發現新增的印表機就在上面。不過﹐要真正讓印表機能被使用之前﹐您必須重新執行 lpd 服務才行﹐只要您按下‘Apply’圖標就行了。
- 當您看到 lpd 成功執行的信息﹐那您就可以從 Test 選單下面選擇項目進行測試。如果失敗﹐則按‘Edit’圖標進行修改﹐直到成功為止(每次修改完畢別忘了按 Apply 哦﹗)
在 Linux 負責管理列印服務的 deamon 叫 lpd ﹐您最好用 ntsysv 來確定它被選擇為開機服務。然而﹐lpd 主要參考的設定檔﹐則是 /etc/printcap 這個檔案。當您在沒有 X window 的情況下要設定印表機﹐就需要手工的確定這個檔的設定﹐以及 /var/spool/lpd 目錄下的相應設定。事實上﹐剛纔我們用 printtools 所進行的設定﹐就是幫我們修改這兩個地方而已。
讓我們先看看 /etc/printcap 的內容吧﹕
# /etc/printcap
#
# DO NOT EDIT! MANUAL CHANGES WILL BE LOST!
# This file is autogenerated by printconf-backend during lpd init.
#
# Hand edited changes can be put in /etc/printcap.local, and will be included.
lp0|epson:\
:sh:\
:ml=0:\
:mx=0:\
:sd=/var/spool/lpd/lp0:\
:lp=/dev/lp0:\
:lpd_bounce=true:\
:if=/usr/share/printconf/mf_wrapper:
lp1|hp|hp710|hpcolor:\
:sh:\
:ml=0:\
:mx=0:\
:sd=/var/spool/lpd/lp1:\
:rm=mdk.siyongc.domain:\
:rp=lp0:\
:lpd_bounce=true:\
:if=/usr/share/printconf/mf_wrapper:
###############################################################################
## Everything below here is included verbatim from /etc/printcap.local ##
###############################################################################
# printcap.local
#
# This file is included by printconf's generated printcap,
# and can be used to specify custom hand edited printers.
|
正如您從註解文字所看到的﹐這個檔是由 printconf-backend 工具產生的﹐請不要手工的修改這裡的內容﹐取而代之的﹐在 /etc/printcap.local 上面進行手工的設定。假如您真的需要手工設定﹐那您可以仿照這裡的設定﹐自行修改 printcap.local 就是了。您需要留意的設定如下﹕
- 首先﹐這個檔案的非註解部份﹐沒有縮排的那行就是每一台獨立的印表機設定之開始。
- 每台印表機的設定都以 " : " 符號分隔每一個欄位。您可以用 " \ " 符號跳脫斷行符號而讓設定行容易閱讀和理解。
- 第一個 " : " 符號左邊是印表機的名稱和別名﹐用 " | " 符號分隔即可。
- sh 設定是抑制每個列印工作的表頭﹐也就是不印出 banner 部份。
- ml 和 mx 是控制列印工作允許接受的體積。
- sd 是列印工作的佇列目錄所在﹐所有列印都先送到 sd﹐然後才由 lpd 進行列印。
- 如果您的印表機是連接在本接端的﹐那麼 lp 是用來指定列印埠口的﹔但如果是在遠端主機的話﹐rm 用來指定遠端主機的位址﹐而 rp 則是遠端的印表機佇列名稱。
- lpd_bounce 我也不知道 (哈﹐別打我~~)。
- if 是最重要的﹐因為它就是印表機的 driver 設定檔。哦﹐這個檔最好不要碰﹐否則會讓您萬劫不復﹗
再來﹐您仔細檢查 /var/spool/lpd 目錄下的所有子目錄﹐以及它們的權限設定﹐特別是 owner 和 group 。如果您不知道怎麼設定﹐那就先到其它一台有 X window 的機器上﹐增加和刪除印表機﹐然後對比這個目錄下面的內容﹐做好記錄﹐然後回來依樣畫葫蘆就是了。一點都不好玩哦﹐小心就是了。
Okay﹐等您已經會得設定印表機﹐並且通過了測試之後﹐下面再簡單介紹一下 Linux 上面的列印管理吧。
首先您要了解的是 queue 概念。每一台印表機都有一個 queue 名字﹐而且必須是 /etc/printcap 檔裡面關於該印表機的第一個設定﹐同時﹐也必須在 /var/spool/lpd 目錄下有相應的子目錄存在(根據 sd 設定而定)。當任何一個程式需要進行列印的時候﹐事實上會呼叫 lpr 程式產生一個列印工作 ( job )﹐然後佇列在指定的 queue 上面。如果要手工的列印一個文字檔﹐您可以執行﹕
lpr -Pepson /path/to/print.file
|
如果沒指定 -Pqueue_name 的話﹐則選擇 printcap 檔中的第一台印表機為預設值。您也可以用 pine ( | ) 將命令產生的 STDOUT 導入到 lpr 命令進行列印。
然後﹐lpd 服務會檢查所有 queue 上的 job 進行處理。您可以透過 lpc 命令來檢查各個 queue 的狀態﹕
除了檢查狀態外﹐lpc 還可以改變 job 的優先狀態、掛起或關閉某一個 queue 的佇列服務、等等。假如您不帶任何參數﹐則進入 lpc 的互動查詢模式中﹐請輸入 help 看看如何使用吧﹐我這裡不再介紹了。
lpc 命令是我們最常用的列印管理工具。除了它﹐您也可以用 lpq 來檢查 queue 狀態﹐也可以用 lprm 來強制移除某一個 job ﹐或清除某個及所有的 queue 工作﹐諸如此類的。老話一句﹕自己看 help 吧。(如果您能進入 KDE 的話﹐可以用 klpq 幫忙管理列印工作啦 )
哦﹐前不久發現了一個網站﹐那邊有很詳細的 Linux 列印服務設定說明﹕
http://www.imacat.idv.tw/linux/print.html
如果您真的搞不定您的印表機﹐不妨到這裡看看囉。
後話 / 廢話
作為一個 Linux 系統管理員﹐需要花很多時間和精力在於系統的了解上面﹐這是一個不斷的永無止境的學習過程。許多人在談到 Linux 的時候﹐只看到其上的應用程式和伺服器功能﹐而忽略了最基礎的學習和鍛煉﹐這無疑是本末倒置的現像。一般人所看到 Linux 能做這做那﹐它所展露的能力﹐僅是居於整個學習金字塔最小部份的頂端光芒而已﹐離開了堅實的基礎和建築﹐頂端的光芒是不存在的﹐也是虛幻的空中樓閣。
下面是我在新聞組上﹐跟網友們關於 Linux 操作界面上的幾篇討論﹐茲抄錄下來給大家參考一下﹕
"kid" 撰寫於郵件
news:3iKVKf$ILd@bbs.ee.ntu.edu.tw...
> 關於MailRelay的控制,如果您不是很熟的話,我會建議下列方式︰
>
> a. 下載webmin管理程式
> b. 利用webmin裡邊的sendmail設定界面,直接輸入relay區段
> 例如︰
> 192.168.1.0
> domain.com.tw
> 這樣就可以relay上述兩行的區段信件,接著點選套用就完成。
>
> 如果您要手動設定,包括sendmail.cf設定、access.db等等手動
> 模式,您就得看一下精華區裡邊的舊信。
>
> 利用webmin的管理界面實在是很簡單,就像利用汽車作為交通工具,
> 當然,於shell模式下的命令,也正如騎腳踏車。
>
> 沒有汽車的時候,只得自力更生、有汽車的快速、您當然可以利用。
嗯﹐怎麼說呢.. 我不怎麼認同這個比喻啦.. :)
如果要我來比喻﹐那我會這樣說﹕
用 webmin 或其它設定工具﹐是‘會開汽車’﹔
會得手工設定﹐是‘會開車﹐也會修理汽車’﹔
會得安裝和設定﹐是‘會開車、會修理汽車、還會組裝汽車’﹔
如果您連程式都是自己寫的﹐是‘會得設計汽車’。
如果您會自己設定系統平臺﹐那您‘還會修橋鋪路’﹔
如果您只會使用 client 端的軟體﹐那您只是個‘乘客 / 老闆’。
--------
"我要小小志" 撰寫於郵件
news:3D0WLN$LTV@bbs.ccu.edu.tw...
> ==> 於 ("網中人") 文中述及:
> : >
> : > 利用webmin的管理界面實在是很簡單,就像利用汽車作為交通工具,
> : > 當然,於shell模式下的命令,也正如騎腳踏車。
> : >
> : > 沒有汽車的時候,只得自力更生、有汽車的快速、您當然可以利用。
> : 嗯﹐怎麼說呢.. 我不怎麼認同這個比喻啦.. :)
> : 如果要我來比喻﹐那我會這樣說﹕
> : 用 webmin 或其它設定工具﹐是‘會開汽車’﹔
> : 會得手工設定﹐是‘會開車﹐也會修理汽車’﹔
> : 會得安裝和設定﹐是‘會開車、會修理汽車、還會組裝汽車’﹔
> : 如果您連程式都是自己寫的﹐是‘會得設計汽車’。
> : 如果您會自己設定系統平臺﹐那您‘還會修橋鋪路’﹔
> : 如果您只會使用 client 端的軟體﹐那您只是個‘乘客 / 老闆’。
>
> 嗯..我倒是比較喜歡當老闆...
呵呵~~ 我也很想當老闆咧~~~ (各位哪個不想的﹖)
> 只不過有時候會"修橋鋪路"好像也是不夠...
> 口能連那些沙粒,混料,水泥,鋼條都要了解...
太妙了﹗就是這樣說...
就算您精於橋樑設計和土木工程﹐
如果連材料關都過不了﹐別想鋪出好的路來。
要不然呢﹖繳納路稅就好﹐讓專業的人員來鋪路架橋。
如果學藝不精又硬要硬幹﹐
也不用等桃芝颱風了﹐只要上游多幾個小孩拉尿﹐
恐怕也會把橋沖垮... :)
> 不過...還是能當老闆就當老闆...
> 除非你覺得這座橋非自己蓋不可..
> 那麼再下海吧...
不過﹐當老闆未必不會開車和修車哦﹐
搞不好還可以下場比賽﹐車技一流﹐同時又精於調校﹐
引擎到輪胎都極端講究﹐
車箱裡除了 RECARO 座椅外﹐可能就剩防傾支架了 ....
然而﹐平時可能是由司機開著勞斯來斯待步﹐
車內極儘豪華、應有盡有﹐自己在後面指指點點就好﹐
不用擔心怎麼開車﹐更不用擔心會否修車﹐
可能遇到道路不好的時候﹐會略皺眉頭 ...
不過﹐不要忘記﹕養這樣的車子不便宜哦﹗
如果不是真的財大氣粗﹐否則不要硬充老闆。
那請問﹕
您的 Linux 是準備用來比賽的﹐還是用來享受的﹖
還是﹐僅作代步就好﹕
心情好﹐又有興趣﹐拆來玩玩﹔
弄壞了也沒什麼﹐從來就好﹔
有心得了﹐可能會越來越像跑車(或豪華房車)﹔
弄不好﹐有脾氣﹐還可以踢幾腳﹐然後罵道“爛車﹗”
不過﹐也有人越弄越著迷﹐不能自拔者甚多。
至於我自己嘛﹐雖然很想當老闆﹐
但實在不是那個料﹐也沒那麼多資本﹐所以﹐
隨便買輛自排檔、到處都有電動玩意的家庭房車來代步,
雖然大家都說這種車子很容易拋錨死火﹐
不過﹐開起來感覺還好啦﹐因為我沒有在它身上裝這改那的﹐
而且﹐採油門、殺車都輕輕的﹐愛惜有加就是了。
若興之所致﹐會找改裝性特強且又便宜穩定的車子回來 DIY。
呵~~ 真的很好玩哦~~~ ^_^ 個中樂趣﹐恐難言喻﹗
若有老闆請我幫它們調校這種車子﹐
當然不會拒絕﹗不過﹐如果老闆說要自己來開的話﹐
我會建議他先了解一下汽車原理﹐例如﹕
2 衝程和 4 衝程﹔
直列引擎和 V 引擎﹔
碟煞和鼓煞以及 ABS ﹔
......
同時﹐鼓勵他接受一些高級駕訓﹕
低轉速和高轉速引擎在加速時的不同應變﹔
四輪驅動和兩輪驅動在循跡性能上的分別﹔
前輪驅動和後輪驅動對轉向(過度/不足)的影響﹔
......
還有﹐就是從嚴要求整體性能﹕
瀝青、水泥、砂石、乾/濕路面要採用的輪胎、避震調整﹔
市區、山區、高速公路所採用的檔位、扭力配合﹔
車身重量和群邊、尾翼的取捨﹔
.....
最後﹐當然還要通過各種測試﹕
0-100 加速﹔
60 急煞﹔
50/60/70 麋鹿﹔(註﹕也就是障礙閃躲)
縱向/橫向撞擊﹔
呵~~~ 會不會太恐怖了﹖如果老闆覺得沒必要這麼辛苦﹐
那就算了﹐有問題再 call 我吧。
如果說﹐只用來代步而已﹐可開就好﹐
或許會加裝霧燈、音響、表板﹐
再掛個小毛球﹐堆一群 Kitty、Snoopy、Micky 什麼的﹐
那也未嘗不可。
不過﹐像其它房車所獨有的一些玩意﹐
如果找不到代替品的話﹐就不要強求了...
如果您很想學會這些技能﹐而且還想考到一張國際認可的證照﹐
甚至還想跟世界級的冠軍車手一較高下(有志氣﹗)﹐
Okay﹐那就一步一腳印﹐努力吧﹗
同時﹐也祝福您﹗
--------
"kid" 撰寫於郵件
news:3iLJTW$ILd@bbs.ee.ntu.edu.tw...
> 呵呵,這一個豬公題目竟然可以引起鼎鼎大名的網中人心底迴響
> 真是有點班門弄斧地慚愧 :D
慚愧~~~ 我所知的不會比您多﹐只是我敢將自己所知的說出來而已...
>
> Sorry, 我還是很建議很此類基本常見有問題的玩家,可以利用
> webmin來達成一些常見的問題,這樣的確不需要看著man說明,
> 花一堆時間才能搞定GUI輔助30秒即可達成的相同效果。
>
> 從NAT、Firewall、Proxy、sendmal、DNS等等,webmin實在是很方便。
>
>
> 有車開車是方便、沒車走路也自安、開車走路都不會、只得原地空自嘆。
>
> 會開車的人很多,套一句版上名言︰你會、我會、隔壁的老王也會,
> 但是要能搞清楚汽車零件基本原理、動力傳輸與內裝配備不是不可能
> ,就是你要花多少時間研究、有沒有必要研究。
很多人會開車是沒錯﹐但開車之前需要了解交通規則﹐例如﹕
紅燈要停、錄燈才可以走 (RELAY / REJECT)﹔
台灣要靠右邊行車、澳洲要靠左 (SMTP / POP)﹔
雙實線和單實線、虛線、虛/實線的分別是什麼 (192.168.1.1 / 203.4.5.6)﹖
60 外加一個圈是限速 60 公路 (x.x.x.x/24)﹔
而高速公路又有兩個圈﹐各是什麼意思﹖(x.x.x.x/24, x.x.x.x/29)
雖然您知道踏油門會前進﹐逆時針扭方向盤會左轉彎 (OK / Cancel / Reset)﹐
但如果連基本交通規則都不知道﹐那才是致命的。
在自己家的後園是沒問題的﹐但如果開在馬路上 (private / public)﹐
只能是﹕速度越快﹐死的越慘﹐傷及無辜越多...
開車的技術也很重要﹐總不能連方向盤都打不好﹐(IP/Subnet/Routing)
就學人家高速殺彎、甩尾、修偏這些高難度動作吧﹖(DNS/MAIL/NAT)
開個 webmin﹐點這設那﹐當然是沒問題 (會開車)﹐
但如果連 IP 和 MASK 的關係都不懂 (交通規則)﹐
卻要設 router 和 gateway (開車上馬路)﹐
那恐怕有點危險吧﹖
自己的車子明明不是特種車輛 (沒有獲得授權)﹐
卻在街道上橫衝直撞 (亂設 DNS)﹐
然後還要怪人家沒有避讓﹐也說不過去吧﹖(怎麼信件寄不進來﹖)
Okay﹐就算交通規則懂了﹐
但不想研究汽車基本原理 (TCP/IP)﹐
卻要表演高級駕駛技巧 (NAT)﹐
其結果也不難預料。(怎麼 ftp 和 netmeeting 不能用﹖)
會開車﹐是否要會得換零件呢﹖(package)
這可見人見智了。
無論是換備用輪胎 (upgrade sendmail) ﹐
還是改引擎 (kernel)﹐
如果不會就 call road service 吧 (專業的服務公司 / 朋友)。
如果要自己 DIY﹐
那需要您會使用工具 (RPM / make)﹐
有工具了怎麼使用(或工具本身怎麼用)﹐可以看手冊 (man / HOWTO)。
假如您不看手冊、不會用工具、不會換零件、不懂交通規則、
不鑽研汽車原理、不鍛煉駕駛技巧.... 僅會開車而已﹐
然後要 DIY (注意﹕不是請人來幫忙哦)﹐ 做出一輛自稱無敵的超級跑車﹐
還要表演最新最高的難度技巧﹐
如果還有乘客位置的話﹐請不要邀請我就是了。
但如果僅是換個方向盤 (linuxconfig)、
將儀表板換成白色 (theme)、
加裝高級音響 (sndconf)、
操作 GPS 導航 (File Manager)、
等等 .....
那就沒什麼關係了﹐看您自己喜歡怎麼弄就怎麼弄囉...
不過﹐遇到電路問題 (modules)﹐
總要知道怎麼區分正負兩極的電線吧(irq/io)?
然後﹐點火和熄火總也要會吧﹖(lilo / runlevel / shutdown)
如果還想知道如何改裝點火系統 (init / rc.x )
那可能比較複雜﹐有興趣不妨玩玩﹐
另外﹐不看地圖﹐可很容易迷路哦~~ (File System)
會看地圖還要知道怎麼走才行 (cd / pwd / mv)
如果城市是自己設計的 (fdisk / mount / umount)
那就要好好規劃了 (fstab)
不過﹐最容易的﹐就是出錢﹐請司機、送修理行了。
自己看著辦吧﹕
覺得自己有能力﹐就不妨 DIY﹔
如果能力不足﹐但有心要學﹐那多看手冊(上面都有說)﹔
如果力不足﹐而強為之﹐寧無不為﹔
先在家裡後園學﹐然後才到馬路上跑﹐經驗多了﹐技術也越好﹔
考駕照﹐可以到駕訓班﹐也可以自己學(但不要開太快﹐最好有朋友從旁指點。)
真要下場比賽﹐可和普通街頭飆車很不一樣哦﹐
您越了解車子性能和賽道特征﹐以及越多訓練和經驗﹐成勣越好﹔
相反﹐車子不好和技術不好﹐都很容易出意外﹐
把老闆的車子撞壞還好﹐如果影響到車隊的排名可就慘了。
當然﹐如果老闆請您下場之前沒看你試駕﹐那是他的錯。
>
> 有時間就多研究,沒時間就看人研究..........
這點我絕對同意﹗
我常跟朋友說﹕
學 Linux 就像交女朋友﹐您對她越真誠越用心﹐她對您越千依百順﹔
如果本來是抱著玩玩的心態﹐很容易始亂終棄﹔
假如您已經有一個要好的女朋友﹐只想找個代替品﹐
我勸您死了這條心。
當然﹐共享齊人者﹐也為數不少﹐
要看您怎麼對待您的眾位女朋友吧。
哀莫大於心死﹐別讓您的女朋友對您失望就是了...
>
> sorry, 我自認是懶加笨的那一種。
閣下謙虛了﹗
--
======= http://www.study-area.org =======
飛雪迎春到﹐風雨送春歸
已是寒崖百丈冰﹐尤有花枝俏
俏也不爭春﹐只把春來報
待得山花爛漫時﹐他在叢中笑﹗
(另﹐弟也曾在 Linuxfab 上展開過這論題的延伸討論﹐有興趣可以參考﹕
http://www.linuxfab.cx/indexNewsData.php?NID=4201&LISTMODE=1&DETAILTHREAD=6
)
|
所以﹐我希望讀者們首先要建立正確的學習態度與方法﹐然後加強 Linux 的系統基礎學習﹐然後才輪到應用程式開發和伺服器架設這些上層建築。在‘學習 Linux’之 system 系列中﹐我力圖將我所知的基礎知識與大家分享﹐好讓您儘快的累積自己的實作經驗而少走一些彎路。然而﹐說實在的﹐我本人對 Linux 這個深澳的系統﹐也僅知皮毛而已﹐如果說要帶領大家進入 Linux 的殿堂﹐未免太不自量力了﹐也從中印證了 Linux 系統的廣博與高深。
為此﹐我在這裡僅致意那些真正在 Linux 上面進行研究和努力的所有朋友以最深的祝福和崇高的尊敬。

www.study-area.org © 2001
Netman 網中人
Last Updated: July 31, 2002
|