## 17.1 什么是 daemon 與服務 (service)
我們在[第十六章](../Text/index.html#the_daemon)就曾經談過“服務”這東西! 當時的說明是“常駐在記體體中的程序,且可以提供一些系統或網絡功能,那就是服務”。而服務一般的英文說法是“ service ”。
但如果你常常上網去查看一些數據的話,尤其是 Unix-Like 的相關操作系統,應該常常看到“請啟動某某 daemon 來提供某某功能”,唔!那么 daemon 與 service 有關啰?否則為什么都能夠提供某些系統或網絡功能?此外,這個 daemon 是什么東西呀? daemon 的字面上的意思就是“守護神、惡魔?”還真是有點奇怪呦!^_^""!
簡單的說,系統為了某些功能必須要提供一些服務 (不論是系統本身還是網絡方面),這個服務就稱為 service 。 但是 service 的提供總是需要程序的運行吧!否則如何執行呢?所以達成這個 service 的程序我們就稱呼他為 daemon 啰! 舉例來說,達成循環型例行性工作調度服務 (service) 的程序為 crond 這個 daemon 啦!這樣說比較容易理解了吧!

**Tips** 你不必去區分什么是 daemon 與 service !事實上,你可以將這兩者視為相同!因為達成某個服務是需要一支 daemon 在背景中運行, 沒有這支 daemon 就不會有 service !所以不需要分的太清楚啦!
一般來說,當我們以文字模式或圖形模式 (非單人維護模式) 完整開機進入 Linux 主機后, 系統已經提供我們很多的服務了!包括打印服務、工作調度服務、郵件管理服務等等; 那么這些服務是如何被啟動的?他們的工作型態如何?下面我們就來談一談啰!

**Tips** daemon 既然是一只程序執行后的程序,那么 daemon 所處的那個原本的程序通常是如何命名的呢 (daemon 程序的命名方式)。 每一個服務的開發者,當初在開發他們的服務時,都有特別的故事啦!不過,無論如何,這些服務的名稱被創建之后,被掛上 Linux 使用時,通常在服務的名稱之后會加上一個 d ,例如例行性命令的創建的 at, 與 cron 這兩個服務, 他的程序文件名會被取為 atd 與 crond,這個 d 代表的就是 daemon 的意思。所以,在[第十六章](../Text/index.html)中,我們使用了 ps 與 top 來觀察程序時,都會發現到很多的 {xxx}d 的程序,呵呵!通常那就是一些 daemon 的程序啰!
### 17.1.1 早期 System V 的 init 管理行為中 daemon 的主要分類 (Optional)
還記得我們在[第一章](../Text/index.html)談到過 Unix 的 system V 版本吧?那個很純種的 Unix 版本~ 在那種年代下面,我們啟動系統服務的管理方式被稱為 SysV 的 init 腳本程序的處理方式!亦即系統核心第一支調用的程序是 init , 然后 init 去喚起所有的系統所需要的服務,不論是本機服務還是網絡服務就是了。
基本上 init 的管理機制有幾個特色如下:
* 服務的啟動、關閉與觀察等方式:
所有的服務啟動腳本通通放置于 /etc/init.d/ 下面,基本上都是使用 bash shell script 所寫成的腳本程序,需要啟動、關閉、重新啟動、觀察狀態時, 可以通過如下的方式來處理:
* 啟動:/etc/init.d/daemon start
* 關閉:/etc/init.d/daemon stop
* 重新啟動:/etc/init.d/daemon restart
* 狀態觀察:/etc/init.d/daemon status
* 服務啟動的分類:
init 服務的分類中,依據服務是獨立啟動或被一只總管程序管理而分為兩大類:
* 獨立啟動模式 (stand alone):服務獨立啟動,該服務直接常駐于內存中,提供本機或用戶的服務行為,反應速度快。
* 總管程序 (super daemon):由特殊的 xinetd 或 inetd 這兩個總管程序提供 socket 對應或 port 對應的管理。當沒有用戶要求某 socket 或 port 時, 所需要的服務是不會被啟動的。若有用戶要求時, xinetd 總管才會去喚醒相對應的服務程序。當該要求結束時,這個服務也會被結束掉~ 因為通過 xinetd 所總管,因此這個家伙就被稱為 super daemon。好處是可以通過 super daemon 來進行服務的時程、連線需求等的控制,缺點是喚醒服務需要一點時間的延遲。
* 服務的相依性問題:
服務是可能會有相依性的~例如,你要啟動網絡服務,但是系統沒有網絡, 那怎么可能可以喚醒網絡服務呢?如果你需要連線到外部取得認證服務器的連線,但該連線需要另一個A服務的需求,問題是,A服務沒有啟動, 因此,你的認證服務就不可能會成功啟動的!這就是所謂的服務相依性問題。init 在管理員自己手動處理這些服務時,是沒有辦法協助相依服務的喚醒的!
* 執行等級的分類:
上面說到 init 是開機后核心主動調用的, 然后 init 可以根據使用者自訂的執行等級 (runlevel) 來喚醒不同的服務,以進入不同的操作界面。基本上 Linux 提供 7 個執行等級,分別是 0, 1, 2...6 , 比較重要的是 1)單人維護模式、3)純文本模式、5)文字加圖形界面。而各個執行等級的啟動腳本是通過 /etc/rc.d/rc[0-6]/SXXdaemon 鏈接到 /etc/init.d/daemon , 鏈接文件名 (SXXdaemon) 的功能為: S為啟動該服務,XX是數字,為啟動的順序。由于有 SXX 的設置,因此在開機時可以“依序執行”所有需要的服務, 同時也能解決相依服務的問題。這點與管理員自己手動處理不太一樣就是了。
* 制定執行等級默認要啟動的服務:
若要創建如上提到的 SXXdaemon 的話,不需要管理員手動創建鏈接文件, 通過如下的指令可以來處理默認啟動、默認不啟動、觀察默認啟動否的行為:
* 默認要啟動: chkconfig daemon on
* 默認不啟動: chkconfig daemon off
* 觀察默認為啟動否: chkconfig --list daemon
* 執行等級的切換行為:
當你要從純命令行 (runlevel 3) 切換到圖形界面 (runlevel 5), 不需要手動啟動、關閉該執行等級的相關服務,只要“ init 5 ”即可切換,init 這小子會主動去分析 /etc/rc.d/rc[35].d/ 這兩個目錄內的腳本, 然后啟動轉換 runlevel 中需要的服務~就完成整體的 runlevel 切換。
基本上 init 主要的功能都寫在上頭了,重要的指令包括 daemon 本身自己的腳本 (/etc/init.d/daemon) 、xinetd 這個特殊的總管程序 (super daemon)、設置默認開機啟動的 chkconfig, 以及會影響到執行等級的 init N 等。雖然 CentOS 7 已經不使用 init 來管理服務了,不過因為考慮到某些腳本沒有辦法直接塞入 systemd 的處理,因此這些腳本還是被保留下來, 所以,我們在這里還是稍微介紹了一下。更多更詳細的數據就請自己查詢舊版本啰!如下就是一個可以參考的版本:
* [http://linux.vbird.org/linux_basic/0560daemons/0560daemons-centos5.php](http://linux.vbird.org/linux_basic/0560daemons//0560daemons-centos5.php)
### 17.1.2 systemd 使用的 unit 分類
從 CentOS 7.x 以后,Red Hat 系列的 distribution 放棄沿用多年的 System V 開機啟動服務的流程,就是前一小節提到的 init 啟動腳本的方法, 改用 systemd 這個啟動服務管理機制~那么 systemd 有什么好處呢?
* 平行處理所有服務,加速開機流程:
舊的 init 啟動腳本是“一項一項任務依序啟動”的模式,因此不相依的服務也是得要一個一個的等待。但目前我們的硬件主機系統與操作系統幾乎都支持多核心架構了, 沒道理未相依的服務不能同時啟動啊!systemd 就是可以讓所有的服務同時啟動,因此你會發現到,系統啟動的速度變快了!
* 一經要求就回應的 on-demand 啟動方式:
systemd 全部就是僅有一只 systemd 服務搭配 systemctl 指令來處理,無須其他額外的指令來支持。不像 systemV 還要 init, chkconfig, service... 等等指令。 此外, systemd 由于常駐內存,因此任何要求 (on-demand) 都可以立即處理后續的 daemon 啟動的任務。
* 服務相依性的自我檢查:
由于 systemd 可以自訂服務相依性的檢查,因此如果 B 服務是架構在 A 服務上面啟動的,那當你在沒有啟動 A 服務的情況下僅手動啟動 B 服務時, systemd 會自動幫你啟動 A 服務喔!這樣就可以免去管理員得要一項一項服務去分析的麻煩~(如果讀者不是新手,應該會有印象,當你沒有啟動網絡, 但卻啟動 NIS/NFS 時,那個開機時的 timeout 甚至可達到 10~30 分鐘...)
* 依 daemon 功能分類:
systemd 旗下管理的服務非常多,包山包海啦~為了厘清所有服務的功能,因此,首先 systemd 先定義所有的服務為一個服務單位 (unit),并將該 unit 歸類到不同的服務類型 (type) 去。 舊的 init 僅分為 stand alone 與 super daemon 實在不夠看,systemd 將服務單位 (unit) 區分為 service, socket, target, path, snapshot, timer 等多種不同的類型(type), 方便管理員的分類與記憶。
* 將多個 daemons 集合成為一個群組:
如同 systemV 的 init 里頭有個 runlevel 的特色,systemd 亦將許多的功能集合成為一個所謂的 target 項目,這個項目主要在設計操作環境的創建, 所以是集合了許多的 daemons,亦即是執行某個 target 就是執行好多個 daemon 的意思!
* 向下相容舊有的 init 服務腳本:
基本上, systemd 是可以相容于 init 的啟動腳本的,因此,舊的 init 啟動腳本也能夠通過 systemd 來管理,只是更進階的 systemd 功能就沒有辦法支持就是了。
雖然如此,不過 systemd 也是有些地方無法完全取代 init 的!包括:
* 在 runlevel 的對應上,大概僅有 runlevel 1, 3, 5 有對應到 systemd 的某些 target 類型而已,沒有全部對應;
* 全部的 systemd 都用 systemctl 這個管理程序管理,而 systemctl 支持的語法有限制,不像 /etc/init.d/daemon 就是純腳本可以自訂參數,systemctl 不可自訂參數。;
* 如果某個服務啟動是管理員自己手動執行啟動,而不是使用 systemctl 去啟動的 (例如你自己手動輸入 crond 以啟動 crond 服務),那么 systemd 將無法偵測到該服務,而無法進一步管理。
* systemd 啟動過程中,無法與管理員通過 standard input 傳入訊息!因此,自行撰寫 systemd 的啟動設置時,務必要取消互動機制~(連通過啟動時傳進的標準輸入訊息也要避免!)
不過,光是同步啟動服務腳本這個功能就可以節省你很多開機的時間~同時 systemd 還有很多特殊的服務類型 (type) 可以提供更多有趣的功能!確實值得學一學~ 而且 CentOS 7 已經用了 systemd 了!想不學也不行啊~哈哈哈!好~既然要學,首先就得要針對 systemd 管理的 unit 來了解一下。
* systemd 的配置文件放置目錄
基本上, systemd 將過去所謂的 daemon 執行腳本通通稱為一個服務單位 (unit),而每種服務單位依據功能來區分時,就分類為不同的類型 (type)。 基本的類型有包括系統服務、數據監聽與交換的插槽檔服務 (socket)、儲存系統狀態的快照類型、提供不同類似執行等級分類的操作環境 (target) 等等。 哇!這么多類型,那設置時會不會很麻煩呢?其實還好,因為配置文件都放置在下面的目錄中:
* /usr/lib/systemd/system/:每個服務最主要的啟動腳本設置,有點類似以前的 /etc/init.d 下面的文件;
* /run/systemd/system/:系統執行過程中所產生的服務腳本,這些腳本的優先序要比 /usr/lib/systemd/system/ 高!
* /etc/systemd/system/:管理員依據主機系統的需求所創建的執行腳本,其實這個目錄有點像以前 /etc/rc.d/rc5.d/Sxx 之類的功能!執行優先序又比 /run/systemd/system/ 高喔!
也就是說,到底系統開機會不會執行某些服務其實是看 /etc/systemd/system/ 下面的設置,所以該目錄下面就是一大堆鏈接文件。而實際執行的 systemd 啟動腳本配置文件, 其實都是放置在 /usr/lib/systemd/system/ 下面的喔!因此如果你想要修改某個服務啟動的設置,應該要去 /usr/lib/systemd/system/ 下面修改才對! /etc/systemd/system/ 僅是鏈接到正確的執行腳本配置文件而已。所以想要看執行腳本設置,應該就得要到 /usr/lib/systemd/system/ 下面去查閱才對!
* systemd 的 unit 類型分類說明
那 /usr/lib/systemd/system/ 以下的數據如何區分上述所謂的不同的類型 (type) 呢?很簡單!看擴展名!舉例來說,我們來瞧瞧上一章談到的 vsftpd 這個范例的啟動腳本設置, 還有 crond 與純文本模式的 multi-user 設置:
```
[root@study ~]# ll /usr/lib/systemd/system/ | grep -E '(vsftpd|multi|cron)'
-rw-r--r--. 1 root root 284 7月 30 2014 crond.service
-rw-r--r--. 1 root root 567 3月 6 06:51 multipathd.service
-rw-r--r--. 1 root root 524 3月 6 13:48 multi-user.target
drwxr-xr-x. 2 root root 4096 5月 4 17:52 multi-user.target.wants
lrwxrwxrwx. 1 root root 17 5月 4 17:52 runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 5月 4 17:52 runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 5月 4 17:52 runlevel4.target -> multi-user.target
-rw-r--r--. 1 root root 171 6月 10 2014 vsftpd.service
-rw-r--r--. 1 root root 184 6月 10 2014 vsftpd@.service
-rw-r--r--. 1 root root 89 6月 10 2014 vsftpd.target
# 比較重要的是上頭提供的那三行特殊字體的部份!
```
所以我們可以知道 vsftpd 與 crond 其實算是系統服務 (service),而 multi-user 要算是執行環境相關的類型 (target type)。根據這些擴展名的類型, 我們大概可以找到幾種比較常見的 systemd 的服務類型如下:
| 擴展名 | 主要服務功能 |
| --- | --- |
| .service | 一般服務類型 (service unit):主要是系統服務,包括服務器本身所需要的本機服務以及網絡服務都是!比較經常被使用到的服務大多是這種類型! 所以,這也是最常見的類型了! |
| .socket | 內部程序數據交換的插槽服務 (socket unit):主要是 IPC (Inter-process communication) 的傳輸訊息插槽檔 (socket file) 功能。 這種類型的服務通常在監控訊息傳遞的插槽檔,當有通過此插槽檔傳遞訊息來說要鏈接服務時,就依據當時的狀態將該用戶的要求傳送到對應的 daemon, 若 daemon 尚未啟動,則啟動該 daemon 后再傳送用戶的要求。使用 socket 類型的服務一般是比較不會被用到的服務,因此在開機時通常會稍微延遲啟動的時間 (因為比較沒有這么常用嘛!)。一般用于本機服務比較多,例如我們的圖形界面很多的軟件都是通過 socket 來進行本機程序數據交換的行為。 (這與早期的 xinetd 這個 super daemon 有部份的相似喔!) |
| .target | 執行環境類型 (target unit):其實是一群 unit 的集合,例如上面表格中談到的 multi-user.target 其實就是一堆服務的集合~也就是說, 選擇執行 multi-user.target 就是執行一堆其他 .service 或/及 .socket 之類的服務就是了! |
| .mount .automount | 文件系統掛載相關的服務 (automount unit / mount unit):例如來自網絡的自動掛載、NFS 文件系統掛載等與文件系統相關性較高的程序管理。 |
| .path | 偵測特定文件或目錄類型 (path unit):某些服務需要偵測某些特定的目錄來提供佇列服務,例如最常見的打印服務,就是通過偵測打印佇列目錄來啟動打印功能! 這時就得要 .path 的服務類型支持了! |
| .timer | 循環執行的服務 (timer unit):這個東西有點類似 anacrontab 喔!不過是由 systemd 主動提供的,比 anacrontab 更加有彈性! |
其中又以 .service 的系統服務類型最常見了!因為我們一堆網絡服務都是通過這種類型來設計的啊!接下來,讓我們來談談如何管理這些服務的啟動與關閉。
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀