Site hosted by Angelfire.com: Build your free website today!


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文件了。企鵝要 趕快追上潮流啦!   粗略掌握了以上的概念之後,就可著手操作基本的周邊 設備。下期繼續。