undefined
undefined
8 內科手術室 之
初談核心與設備 Dec 1999
初學Linux的人會覺得莫名其妙,怎樣使用一片3吋半
磁碟呢!?光碟呢?硬碟分割呢?接好了的打引機、掃描
器、各類型SCSI裝置等,沒有反應!連數據器都未能接上
網!救命!新買回來的顯示卡未能設置X!!聲效卡靜悄
悄的,更不要說打互聯網長途電話!燒碟機打回原形變成
光碟機。嘩!若然鍵盤滑鼠都癱瘓,不需一分鐘,任何新
丁碰到這隻殘廢企鵝都會卻之不恭!
幸好有了坊間各大Distributions的易裝版,以上問題都
有方便的解答。新版的Corel、Caldera、RedHat等Linux都已
全採用圖像式安裝界面。RedHat 6.1的GNOME桌面做得更
妙,竟然學KDE一樣,有個磁片小圖像,放在左邊一列的
紅帽子之下,讓用戶輕易讀取磁碟。有改進!可是,這些
新手級別的技術支援,還有待各大Distributions公司拼力發
展。現今階段,倒不如認真地了解一下Linux系統的基本設
備概念,免得在一些沒有圖像介面的伺服器前,對著文字
熒幕而束手無策。尤其是新任的Linux系統管理員,不要單
靠圖案辦事,至少要能養一隻殘而不廢的企鵝!
圖像式安裝RedHat 6.1的時區設定
圖像式安裝RedHat 6.1的X設定
8.1 核心與驅動器
系統核心(kernel;屬軟件)的其中一項工作,就是要
間接驅動硬件裝置,免得軟件開發程式員在編寫資料輸入
和輸出程序時,處處要為各設備的數據存取問題而廢神。
所謂「間接」驅動周邊設備,是因為核心不會直接和
硬件溝通,而必須要經驅動器(device drivers;屬軟件)
把硬件獨有的數碼訊號,轉化為核心能統一辨認的數碼訊
息,才能正確地傳令指示去操作硬體。(不少硬件還要先
靠其內的電子零件和晶片把模擬訊號analog signals轉為數
碼訊號digital signals,但這是電子工程的事。)換言之,驅
動器有如系統核心與硬件之間的翻譯員。於是,硬件商開
發新的設備後,就要提供適當的驅動器,並針對某核心版
本而作相應的改良,才可在某作業系統上使用其產品。只
可惜,現時很多硬件商都沒有針對Linux市場來開發硬件,
其手下都難找人寫Linux的驅動器,結果又要靠一班自願人
士來編寫。這樣,自然沒有Windows版的驅動器那麼貼切
又細緻了。
「居住在南極的企鵝,一直被外界忽視。」
8.2 微內核
不知讀者有沒有發現?Windows的驅動器往往是跟著
Windows版本的更新而改良;相反,Linux的核心要跟著外
間新出的設備而升級!當然我們不會排除種種的商業和技
術原因,但其中有點值得注意的是,Windows的核心架構
與Linux的不同。
Windows核心結構的設計方針,尤其是NT核心,是邁
向較新的微內核(microkernel)理念而發展。不少名廠出
的新Unix系統核心亦然。微內核的設計中旨,是要儘量保
持一個細小的核心碼(kernel codes),專責處理記憶體分
配、程序編排、檔案管理、輸入輸出等四大事項;並儘可
能把部分核心碼由系統模式(system mode)編到用戶模
式(user mode)的層面去。此舉有助系統工程師改良內
核時,除去很多牽涉用戶層面程式碼的掛慮。特別是輸入
輸出和周邊設備之間,是以一組細心設計的溝通介面來連
接兩者。那些硬體日新月異,動不動就要修改整個核心來
迎合需求,很不化算;除了互聯網組織之外,沒有公司有
這樣大的人力。故此,微內核就較易維護。
微內核設計亦帶給系統管理員一大方便︰修改系統設
定後,無須重新編譯整個核心!(Compiling the kernel︰預
備好核心的原始碼,按系統需求設定妥當,再經編譯器生
成核心影像檔和起動檔等;幾乎等於系統重裝!)這點當
然有程度之分。接近完美的微內核設計,是要保證管理員
所能碰到的種種設定,對核心都不構成威脅。IBM的AIX系
統就是一例。相反,如SCO Unix、Linux、SunOS、Digital
Unix,想修改某些系統設定時,像用戶能使用程序數目的
上限、系統的緩衝快取大小等,就要重新編譯核心。此等
涉及內核設定的事,不同的系統有不統的限制。初級的系
統管理員都甚少理會這些優化問題。
核心編譯是中階課題;驅動器編寫是高階課題;編寫
核心更是超高階項目。閣下有志參與核心發展組嗎?也許
有天你會碰上!
8.3 Linux的核心
Linux核心檔案館http://www.kernel.org/
Linux核心的起步,並沒有像微內核的設計來得這麼幼
細。它一開始是採取較早期的獨石式核心(monolithic kernel)
結構概念來發展,意即系統內包含一大堆不分階級的核心
程序。這個取向,主要原因是太多程式員參與設計,故開始
時有點兒亂。然而,此等核心的效率可能比微內核設計較
易掌握,因為一大塊的程式優化起來比較線性兼直接。缺
點是改良時要顧慮很多。
獨石式Linux核心1.0版的硬件驅動器和內核是連成一大
塊,分不開的,像古老大石碑一樣。那個時期,安裝Linux
並不容易,玩家必須按不同需要來預設各系統項目,然後
編譯核心原始碼,為個別PC度「心」訂造!系統一起動後,
所有驅動器都活躍起來,並佔據記憶體空間。到了1.2版,
有重大改進︰眾多驅動器可以獨立於內核而另設成一些靜
態模組(modules),有必要時才被啟動,但要管理員自行
下令。其後2.0版有突破,加新了一項伺服程序kernel daemon,
自動監察用戶層面的需要,替核心決定何時啟動和關掉模組!
意思是,要使用哪一裝置時,才由內核啟動哪一模組,這
樣可以大幅度節省記憶體的用量,而同時又可保持應用效
率。當然有些設備是一開機後就時常由內核啟動著,如鍵
盤滑鼠。
讀者留意一下核心2.0的原始碼零件分佈,就知程式員
花了多少心血在驅動器方面:
核心零件 C碼行數 組合語言
(不包header檔) 指令行數
設備驅動器 377 000 100
網絡 25 000
VFS層面 13 500
13種檔案系統 50 000
開始設定 4 000 2 800
輔助處理器 3 550
其他 20 000
Linux 2.0核心所具有的動態模組架構(dynamic modular
structure),對大眾來說,十分方便。每當系統要加上新的
硬體,只要裝上適當的模組,或更新舊有的模組,不用重新
編譯整個核心,就可操作硬件。對於那經常更換硬件的PC平
台,這樣的設計極有必要。這樣,既方便了Linux發燒友專心
研究改良內核,又加速了Distributions公司加入新模組來支援
新產品。近來流行2.2版核心,周邊設備如光碟機,已不再是
只有主根才能存取,而是擴展到控制台用戶(console
users);此外,玩家亦可為個別電腦編譯出一個模組化核心
(modularized kernel)來提昇效能。RedHat 6.1更新增kudzu
daemon,起機時可偵察系統內新裝的硬件!倘若發現有新
硬件,會即時給用家作初步設定。
自此,以往經常要動心藏手術的企鵝,早已脫胎換骨
了。它不再是駭客的寵物,而是各商家所爭奪的對象。
「我們的祖先原來是一塊生滿青苔的大石?」
8.4 設備檔
系統上任何周邊裝置(peripherals)都用相應的設備檔
案(device files)來處理,是Unix架構的特徵。在/dev之下,
你會發現有很多設備檔案,數以百計!Linux所支援的硬體
出名多,此目錄下的東西自然多得驚人。設備檔的檔名都
是由字母和數字所組成。輸入︰
> ls -l /dev | more
會詳細列出一連串的設備檔︰
8.4.1
第一欄由10個字元組成的項目,代表檔案類型及其使
用權限。組內首一個字元代表檔案類型,有以下意思︰
b block mode device
區塊存取模式設備。此等設備每次讀入一區塊的資
料到緩衝,區塊可預設成512KB、1024KB等,大部
分都可作局限性的隨機存取(random access)。如
硬碟、光碟、磁帶。
c character mode device
字元存取模式設備。此等設備逐次讀入一字元的資
料來處理,屬連貫存取(sequential access)。如鍵
盤、終端機、打印機。注意某些設備有block和
character兩種模式。
d directory
目錄。注意以「ls -al」指令會見有「.」和「..」兩
個目錄;「檔案管理」那一期已提及。
l symbolic link
象徵鏈結。表示此檔指向另一檔的路徑;修改此檔
就等與修改彼檔。相當於Windows的shortcut捷徑。
以「ln -sf [source] [target]」指令建立。
- file
不屬以上類型的一般檔案。如文件、程式、多媒體、
壓縮檔等。
另外還有p和s,分別代表FIFO (first in first out) pipe和
local socket的特別設備,以後再提。其後9個字元代表使用
權限,分位3小組,每組佔3個字元︰
〔user〕〔group〕〔other〕
第一組user代表此檔的擁有者,第二組group代表此檔所屬
的組別,第三組other指其餘不屬前兩組的用戶。每一組所
列的3個字元,均表示該組對此檔所設有的控制權。字元
的次序是「rwx」,若其中的字元被「-」取代,表示該字
元所代表的控制權不付與改組的用戶。字元的意思如下︰
r read
可讀檔。若是目錄,表示目錄內容可經「ls」列出。
w write
檔案可以被寫入、更改。若是目錄,表示目錄內容
可被更改,即其下的檔案可被刪除、改名,或在目
錄下寫入新的檔案或子目錄。
e execute
檔案可被執行。當然要是二進檔或腳本方可執行。
若是目錄,表示目錄可經「cd」進入。
於是,一串「drwxr-xr-x」的字符就表示此目錄的內容可被
擁有者讀寫和執行,但同組用戶和其他用戶只能進入目錄、
讀取或執行檔案,沒有修改權。你所擁有的網頁,放到ISP
上的Unix網頁伺服器後,就應該設定此權限。假設你的網
頁都放在public_html目錄下,注意路徑,然後輸入︰
> chmod -R 755 ~/public_html
就可一次過把目錄內所有東西設成「rwxr-xr-x」的權限。
此外,還有s, S, t, T的字元代號,日後再提。詳細請參考
「chmod」指令。
8.4.2
第二欄只有一個數字,表示現存目錄下有多少子目
錄,計算並包括「.」和「..」目錄。
8.4.3
第三和第四欄就是檔案的擁有者和所屬組別。如圖
例的MAKEDEV檔案是屬於用戶root和組別root,bpcd設
備檔屬於用戶root和組別disk。只有擁有者或主根才可以
更改其相對檔案的所有權,如以主根身份輸入︰
> chown -R root.root /tmp
就會把/tmp目錄和其下所有內容設定成用戶root和組別
root的所有權。用戶可藉此把自己的檔案授權給別人。
通常是主根製作新檔,然後用「chown」授權給適當的
用戶。因為只有擁有者才可更改其檔案的權限,設定所
有權時務須小心。請參考「chown」和「chgrp」指令。
8.4.4
第五欄是檔案大小,以bytes單位計算。設備檔則有
所不同,此欄顯示它們的主號碼(major number)和副號
碼(minor number)。主號碼是給核心辨認設備檔是屬
於哪種裝置,以配搭適當的驅動模組;副號碼是用來指
定裝置本身,好比身份編號,協作核心編排適當的輸
入和輸出埠。如(6, 0)、(6, 1)、(6, 2)分別代表
lp0、lp1、lp2三個打印機佇列,主號碼(6)屬於打印
設備。
主副號碼的配置,是由核心發展組統一編排。在
{1} 有最新的設備列表,分內容如下︰
主 存取 設備
號碼 模式
1 c Memory devices
b RAM disk
2 c Pseudo-TTY masters
b Floppy disks
3 c Pseudo-TTY slaves
b First MFM, RLL and IDE hard disk
or CD-ROM interface
4 c TTY devices
5 c Alternate TTY devices
6 c Parallel printer devices
7 c Virtual console capture
b Loopback devices
8 b SCSI disk devices (0-15)
9 c SCSI tape devices
b Metadisk (RAID) devices
10 c Non-serial mice, misc features
11 c Raw keyboard device
b SCSI CD-ROM devices
要新增設備檔,用「mknod」指令,然後用「chown」設
定所有權。如要增加第四個打印機佇列︰
> mknod -m 620 /dev/lp3 c 6 3
> chown root.daemon /dev/lp3
「mknod」指令後的「-m 620」就是設定「rw--w----」權
限。(「rw-」的二進碼是「110」即是6;「-w-」的二進碼
是「010」即是2。這個謎語猜得到嗎?)「 /dev/lp3」檔名
後的「c 6 3」即代表字元存取模式設備,其主副號碼分別
是6和3。
8.5 後話
USB設備呢?仍在測試中。Linus在11月中的COMDEX
會展說快將推出的核心2.4版會支援USB。在主號碼107c一
行中,竟然看見有3Dfx Voodoo Graphics設備,但各大
Distributions都未能觸及,又要參考HOWTO文件了。企鵝要
趕快追上潮流啦!
粗略掌握了以上的概念之後,就可著手操作基本的周邊
設備。下期繼續。