Sun公司的Solaris系統能提供完整的端到端服務,Solaris建立在高端的SPARC CPU體系結構上,那是專為Solaris工作而設計的。其他的硬件改進,包括開發OpenBoot監視器和集成的電源管理,其能力遠遠超過PC機的 BIOS。另外,Solaris的早期版本引入了對于對稱多處理機的支持,并且實現了網絡文件系統,以及基于X11圖形系統的OpenWindows圖形用戶環境。后來,Solaris通過遵循相關的標準,以及改善NFS性能,開發高可用性和集群解決方案,并提供增強的卷管理,從而站在UNIX業界趨勢的前列。此外,隨著64位內核、Java和JumpStart安裝的引入,以及將Kerberos認證集成到其安全體系結構中,Solaris用戶和管理員得到了極大的好處。Solaris目前開發一系列的標準工具,比如數據包、補丁和存儲管理,它們由POSIX兼容的開發環境所支持。
Solaris從磁盤啟動的方式和其他的操作系統差別很大,這個差別在軟件和硬件層次上都有所表現。SPARC系統有一個啟動監視應用程序(即所謂的OpenBoot監視器),可以讓用戶使用boot命令來啟動系統;但是實際上它內置了Forth語言解釋器,以及一系列的診斷工具。因此,就可以構建小型的程序,使用獨立于操作系統的固件,進行各種標準測試。所以,即使決定在SPARC系統上安裝Linux系統,仍然需要理解 OpenBoot監視器及其操作過程。
在PC的BIOS中,一般可以自動檢測硬盤并進行一些系統配置任務。使用OpenBoot監視器可以完成比這更多的工作,比如使用本地磁盤、磁帶或CD-ROM以及通過網絡啟動??梢允褂脀atch-net命令截獲和檢查來自任何一個以太網接口的通信量。
就軟件來說,Solaris和Microsoft Windows及Linux有一些相似的地方,盡管它沒有AUTOEXEC.BAT或者CONFIG.SYS文件。Solaris有一些腳本文件,它們以某種特定的順序執行來啟動服務。這些腳本一般在/etc/init.d目錄中創建,如Bourne shell腳本,然后,符號鏈接到“運行級別”目錄。正如Microsoft的Windows有“安全模式”一樣,Solaris支持一些不同的操作模式,從嚴格的單用戶模式到完全的多用戶運行級別。
Soalris 9啟動過程和Linux有許多相似。首先,從硬盤讀取內核代碼,在初始進程中運行,它是所有其他系統和用戶進程的最終父進程。其次,為了確定在運行級別 1、2、3上執行啟動腳本的規則,需要讀取/etc/inittab中的定義。最后,當系統執行完第3級運行的啟動腳本時,將授予NFS的多用戶訪問權。如下圖1(①→②→③→④→⑤)所示。
![]() |
圖1 Soalris 9啟動過程 |
從上面我們可以看出,Solaris 啟動管理器與Linux有許多相似之處,它們都啟動一個內核,這將創建一個init進程,作為其他所有系統進程的父進程,還將讀取/etc目錄中的rc腳本文件(圖2),以自動啟動所有系統服務,這個過程與windows是很不相同的,盡管為了引導各自的系統,Soalris和Windows都讀取并執行引導區代碼。
![]() |
圖2 |
在任意一個時刻,一個Solaris系統都有一個特定的初始狀態或者運行級別。運行級別是由初始程序控制的----超級用戶可以執行初始程序來改變運行級別或者可以在啟動過程中被調用。當系統改變運行級別時,存儲在目錄中的對應于相應運行級別的腳本會被調用。這些腳本是典型的符號鏈接指向存儲在 /etc/init.d目錄中的其他腳本,如圖3所示;完整的運行級別以及它們相應的運行控制腳本目錄如表1所示。
![]() |
圖3 |
![]() |
表1 |
inittab 文件說明
/etc/inittab定義了系統缺省運行級別,系統進入新運行級別需要做什么。Solaris中init進程的主要任務是按照inittab文件所提供的信息創建進程,由于進行系統初始化的那些進程都由init創建,所以init進程也稱為系統初始化進程(圖8)。
![]() |
圖8 |
inittab文件的格式:inittab文件中每一記錄都從新的一行開始,每個記錄項最多可有512個字符,每一項的格式通常如下:id:rstate:action:process,下面分別解釋。其中id字段是最多4個字符的字符串,用來唯一標志表項。
rstate(run state)字段定義該記錄項被調用時的運行級別,rstate可以由一個或多個運行級別構成,也可以是空,空則代表運行級別0~6。當請求init改變運行級別時,那些rstate字段中不包括新運行級別的進程將收到SIGTERM警告信號,并且最后被殺死;只有a、b、c啟動的命令外(a、b、c不是真正的運行級別)。
action字段告訴init執行的動作,即如何處理process字段指定的進程,action字段允許的值及對應的動作分別為:
1)respawn:如果process字段指定的進程不存在,則啟動該進程,init不等待處理結束,而是繼續掃描inittab文件中的后續進程,當這樣的進程終止時,init會重新啟動它,如果這樣的進程已存在,則什么也不做。
2)wait:啟動process字段指定的進程,并等到處理結束才去處理inittab中的下一記錄項。
3)once:啟動process字段指定的進程,不等待處理結束就去處理下一記錄項。當這樣的進程終止時,也不再重新啟動它,在進入新的運行級別時,如果這樣的進程仍在運行,init也不重新啟動它。
4)boot:只有在系統啟動時,init才處理這樣的記錄項,啟動相應進程,并不等待處理結束就去處理下一個記錄項。當這樣的進程終止時,系統也不重啟它。
5)bootwait:系統啟動后,當第一次從單用戶模式進入多用戶模式時處理這樣的記錄項,init啟動這樣的進程,并且等待它的處理結束,然后再進行下一個記錄項的處理,當這樣的進程終止時,系統也不重啟它。
6)powerfail:當init接到斷電的信號(SIGPWR)時,處理指定的進程。
7)powerwait:當init接到斷電的信號(SIGPWR)時,處理指定的進程,并且等到處理結束才去檢查其他的記錄項。
8)off:如果指定的進程正在運行,init就給它發SIGTERM警告信號,在向它發出信號SIGKILL強制其結束之前等待5秒,如果這樣的進程不存在,則忽略這一項。
9)ondemand:功能通respawn,不同的是,與具體的運行級別無關,只用于rstate字段是a、b、c的那些記錄項。
10)sysinit:指定的進程在訪問控制臺之前執行,這樣的記錄項僅用于對某些設備的初始化,目的是為了使init在這樣的設備上向用戶提問有關運行級別的問題,init需要等待進程運行結束后才繼續。
11)initdefault:指定一個默認的運行級別,只有當init一開始被調用時才掃描這一項,如果rstate字段指定了多個運行級別,其中最大的數字是默認的運行級別,如果rstate字段是空的,init認為字段是0123456,于是進入級別6,這樣便陷入了一個循環,如果inittab文件中沒有包含initdefault的記錄項,則在系統啟動時請求用戶為它指定一個初始運行級別。
Process字段中進程可以是任意的守候進程、可執行腳本或程序。另外,在任何時候,可以在文件inittab中添加新的記錄項,級別Q/q不改變當前的運行級別,重新檢查inittab文件,可以通過命令init Q或init q使init進程立即重新讀取并處理文件inittab。