本章概述Linux系統。首先描述操作系統提供的主要服務。然後說明實現這些服務的程序 with a considerable lack of detail。本章的目的是理解系統整體,以後再詳細說明每個部分。
一個操作系統的不同部分
一個UNIX操作系統包括一個核心程序kernel和一些系統程序system programs。還有一些做某件事情的應用程序application programs。核心是操作系統的心髒 。它跟蹤磁盤上的文件,啟動程序並運行它們,給不同的進程分配內存和其他資源,從網絡接收和向網絡發送包,等等。核心很少自己干活,但它提供工具,用這些工具可以建立所有服務。它還阻止任何人直接存取硬件,強制每個人使用它提供的工具。這樣,核心給每個用戶與其他用戶之間提供保護。核心提供的工具通過系統調用system calls使用;要了解關於這的更多的信息,看手冊頁第二節。
系統程序使用核心提供的工具實現操作系統要求的不同的服務。系統程序和所有其他程序運行在核心之上,叫做用戶模式user mode。系統程序和應用程序的區別是目的:應用程序意圖完成一些有用的工作(或游戲),而系統程序則為系統工作而需要。字處理器是應用;telnet 是系統程序。區別經常有些模糊,也許,只是為了強制分類。
雖然編程語言不必是操作系統的一部分,操作系統也可以包括編譯器及其相關的庫(Linux下是gcc和C庫)。文檔、有時甚至游戲,可以是操作系統的一部分。傳統上,操作系統被定義為安裝磁帶或磁盤上的內容;對於Linux就更不清楚,因為它分布在全世界的FTP站點上。
核心的重要部件
Linux核心包括幾個重要部分:進程管理、存儲器管理、硬件設備驅動、文件系統驅動、網絡管理和其他不同的部分。圖2.1顯示了它們的一些。
可能核心最重要的部分(沒有它們什麼也不能工作)是存儲器管理和進程管理。存儲器管理負責分配進程的存儲器區域和對換空間區域、核心的部件及buffer cache。進程管理產生進程,用切換處理器上的活動進程來實現多任務。
在最低級,核心對它支持的每種硬件包含一個硬件設備驅動。因為世界上存在大量不同的硬件,硬件設備驅動的數量極大。有許多不同的硬件,因此軟件控制方法不同。但其相似性可能分類驅動,支持相似的操作;每類的每個成員有相同的與核心其他部分接口,但具體實現是不同的。例如,所有的硬盤驅動與核心其他部分接口相同,即他們都有初始化驅動器、讀N扇區、寫N扇區。
核心自己提供的有些軟件服務有類似的抽象屬性,因此可以抽象分類。例如,不同的網絡協議已經被抽象為一個編程接口:BSD socket庫。另一個例子是虛擬文件系統virtual filesystem(VFS)層,它從文件系統操作實現中抽象出文件系統操作。每個文件系統類型提供了每個文件系統操作的實現。當一些實體企圖使用一個文件系統時,請求通過VFS送出,它將請求發送到適當的文件系統驅動。
UNIX系統的主要服務
本節說明一些最重要的UNIX服務,但不太詳細。以後的章節中將更詳細地說明。
init
UNIX系統裡最重要的服務是由init 提供的。 init 是每個UNIX系統在核心引導最後啟動的第一個進程。 init 啟動後,它做不同的啟動工作繼續引導過程(檢查和mount文件系統、啟動守侯程序等)
init 做的具體事情的列表依賴於用戶意願; init 有多個啟動選擇。通常提供單用戶模式single user mode的概念,此時沒有用戶能登錄,root 在控制台使用一個shell;通常的模式叫多用戶模式multiuser mode。一般說來這稱為運行級run levels;單用戶和多用戶模式可以理解為2個運行級,還可以有其他運行級,例如,在控制台上運行X。
在普通操作中,init 確認getty 正常運行(允許用戶登錄),並收養孤兒進程(父進程已死的進程;UNIX中,所有進程 必須在一棵樹中,因此孤兒進程必須收養)。
當系統關閉時,init 負責殺死所有其他進程,unmount所有文件系統並停止處理器,根據設置。
從終端登錄
從終端登錄(通過串行線)和控制台(當不運行X時)是由getty 程序提供的。 init 為每個允許登錄的終端啟動一個單獨的getty 實例 getty 讀用戶名並運行login 程序,由它讀口令。如果用戶名和口令正確,login 就運行shell。當shell終止時,即用戶注銷,或login 因用戶名和口令不對而終止時, init 知道並啟動一個新的getty 實例。核心沒有登錄的概念,這都由系統程序處理。
Syslog
核心和許多系統程序會產生錯誤、警告和其他信息。這些信息在以後能看經常是很重要的,甚至很久以後,所以它們應該被寫到一個文件。這個程序是syslog 。它能設置成根據輸出信息的程序或重要程度將信息排序到不同的文件。例如,核心信息經常與其他信息分開,單獨定向到一個分離的文件,因為核心信息經常更重要且需要有規律地閱讀以確定問題。
定時執行命令: cron 和at
用戶和系統管理員經常需要定時運行命令。例如,系統管理員可能想運行一個程序從老文件中清除暫存文件的目錄 (/tmp 和/var/tmp ),以免磁盤滿,因為並非所有程序都正確地清除自己的暫存文件。
cron 服務是做這個的。每個用戶有個crontab ,在這裡列出他要執行的命令和想執行的時間。 cron 守侯進程負責在特定的時間啟動命令。
at 服務與cron 類似,但它只執行一次:命令在給定的時間執行,但不可自動重復。
圖形用戶接口GUI
UNIX和Linux不將用戶接口合在核心中,而是用用戶級程序實現。用戶接口同時提供文本和圖形環境。
這樣的安排使系統更靈活,但有容易對每個程序實現不同的用戶接口的缺點,使系統較難學。
Linux使用的主要的圖形環境叫X Window系統(簡稱X)。 X也不實現用戶接口;它只實現一個窗口系統,即可以實現圖形用戶接口的工具。 3種最流行的基於X實現的用戶接口風格是Athena、Motif和Open Look。
網絡
網絡連接2台或更多的計算機使之能互相通信。連接和通信的實際方法有些復雜,但結果非常有用。
UNIX操作系統具有許多網絡特征。最基本的服務:文件系統、打印、備份等都可以通過網絡完成。這可使系統管理更簡單,因為它允許集中管理,同時獲得小型機和分布計算的優點,例如降低成本和更好的容錯能力。
然而,本書只概述網絡;更多的信息請見《Linux網絡管理員指南》,包括一個網絡如何操作的基本說明。
網絡登錄
網絡登錄與普通登錄有一點不同。可以登錄的每個終端各有一條單獨的物理串行線。從網絡登錄的每個人,有一條單獨的虛擬網絡連接,並且可以有任意數量 。因此不可能為每個可能的虛擬連接運行單獨的getty 。通過網絡登錄有若干不同的方法, telnet 和rlogin 是TCP/IP網絡中的主要方法。
網絡登錄為每種登錄方法提供一個單獨的守侯程序(telnet 和rlogin 使用不同的守侯程序),而不是使用一群getty ,來偵聽所有的輸入的登錄企圖。當發現一個登錄企圖,就啟動一個自己的新實例來處理這個企圖;原來的實例繼續偵聽其他企圖。新實例的工作和getty 類似。
網絡文件系統
網絡服務的一個最有用的東西是通過網絡文件系統network file system共享文件。這個服務一般用Sun公司開發的網絡文件系統Network File System,或NFS。
通過網絡文件系統,任何文件操作可以由一台機器的一個程序通過網絡發送到其他任何機器。這愚弄了程序,使它以為其他機器上的所有文件是在程序運行的機器上。這極大地簡化了信息共享,因為它對程序無須任何修改。
郵件
電子郵件通常是通過計算機通信的最重要的方法。一封電子信件用特定的格式存儲在一個文件中,使用特定的郵件程序來收發郵件。
每個用戶有一個收件箱incoming mailbox(一個特定格式的文件),所有新郵件存在這裡。當什麼人發送郵件時,郵件程序定位收件人的郵箱,並在郵箱文件中添加信件。如果收件人的郵箱在另一台機器上,信件就被發送到那台機器,由它用它覺得最合適的方法來投遞郵箱。
郵件系統包括很多程序。投遞郵件到本地或遠程郵箱使用一個程序(mail transfer agent或MTA,例如,sendmail 或smail ),而用戶使用的則有很多不同的程序(mail user agent或MUA,例如pine 或elm )。郵箱一般存在/var/spool/mail 中。
打印
同時只能有一個人使用某一台打印機,但各用戶不共享打印機是不經濟的。因此打印機由軟件來管理,實現一個打印隊列print queue:所有的打印任務放進一個隊列,打印機完成一個任務後,自動再打印下一個。這無須用戶來組織打印隊列,回避了直接控制打印機。
打印隊列軟件也把打印輸出spools到磁盤,即,當任務在隊列中時,打印輸出存在一個文件中。這允許應用程序快速地完成一個打印任務到打印隊列程序,應用程序無須等到打印任務真正完成就可以繼續下去。這真的很方便,因為它允許打印出一個版本,無須打印完成,就繼續修改一個新版本。
文件系統布局
文件系統分為許多部分,通常從根文件系統有: /bin , /lib , /etc , /dev , 及一些其他; /usr 文件系統包含程序和不改變的數據; /var 文件系統包含改變的數據(例如log文件); /home 文件系統包含每個用戶的個人文件。依賴於硬件配置和系統管理員的決定,方法不同,甚至所有東西可能在一個文件系統中。
3章將更詳細地說明文件系統布局,Linux文件系統標准(Linux Fil