- RHCSARHCE 紅帽Linux認證學習指南(第7版)EX200 & EX300
- (美)Michael Jang等
- 4668字
- 2020-11-29 00:30:09
證書目標5.03 GRUB 2與登錄
本節(jié)對GRUB 2引導程序在找到內核之后的引導過程做簡單介紹。理解在此期間發(fā)生的事情有助于我們對引導過程出現(xiàn)的問題進行診斷。與內核相關的信息讓我們更好理解這期間的每一步操作。
Linux的加載依賴于一個臨時文件系統(tǒng),即所謂的初始RAM硬盤(Initial RAM Disk)。當引導過程完成后,則控制權就交給systemd,即所謂的第一進程。本節(jié)將通過配置單元和目標,詳細介紹Upstart文件的內容。
實際經(jīng)驗
大部分Linux發(fā)行版(包括RHEL 7)都用新的systemd服務管理器取代了Upstart和SysVinit。
本節(jié)還將介紹重新引導系統(tǒng)和正常關閉系統(tǒng)的命令。
實際經(jīng)驗
在systemd中,可將Unix中的理念(“一切都是文件”)重新表述為“一切都是單元”。單元是systemd的基本構成模塊。
5.3.1 內核與初始RAM磁盤
從GRUB 2配置菜單選擇了一個內核后,借助于初始RAM磁盤(Initial RAM Disk), Linux把引導任務交給內核。初始RAM磁盤實際上是一個文件系統(tǒng),這可以從它在/boot目錄中的文件名(initramfs)看出。
在引導過程中,Linux會把該臨時文件系統(tǒng)加載到RAM中。然后,Linux加載硬件驅動程序,并啟動第一個進程systemd。
接下來,systemd為initrd.target激活所有系統(tǒng)單元,并將根文件系統(tǒng)掛載到/sysroot下。最后,systemd在新的根目錄中重新啟動自己,并激活默認目標的所有單元(下一節(jié)將更詳細地介紹單元和目標)。
為了解更多內容,首先在GRUB配置文件中禁用目標內核的quiet指令。引導系統(tǒng)。觀察在屏幕上快速翻卷的消息。登錄后,也可以在/var/log/dmesg文件中檢查這些消息或者執(zhí)行dmesg命令。
在systemd日志中可看到更多日志信息。使用journalctl命令顯示其內容。我們實際看到的消息與本地系統(tǒng)的硬件和配置有關,關鍵消息有:
● 內核的版本號。
● SELinux的狀態(tài)(假如它已激活)。默認情況下,SELinux第一次是以許可模式啟動的,直到在引導過程快要完成時系統(tǒng)載入設定的策略(強制模式)為止。
● 可識別內存的大小(這個值不必與系統(tǒng)實際內存的大小相匹配)。
● CPU。
● 內核命令行,指定邏輯卷或根文件系統(tǒng)。
● 釋放初始RAM磁盤(initramfs)占用的內存。
● 硬盤驅動器和分區(qū)(由它們的設備文件名定義,如/dev/sda或/dev/vda1)。
● 活動的文件系統(tǒng)。
● 交換分區(qū)。
這個日志文件還包含一些有用的信息。當系統(tǒng)載入錯誤的內核時,在這個文件中可看到這個信息。如果Linux沒有使用我們配置好的分區(qū),則這個文件也有這方面的信息(間接的)。如果SELinux無法正確載入,我們也會從該文件末尾的消息看出來。
考試提示
記住,Red Hat考試不是硬件考試。如果發(fā)現(xiàn)一個重要硬件配件(如網(wǎng)卡)出現(xiàn)了一個問題無法用Linux命令解決,要通知你的指導老師或監(jiān)考人員。但如果他回答這不是一個硬件問題,也不要大驚小怪。
5.3.2 第一個進程、目標和單元
Linux內核通過調用第一個進程systemd繼續(xù)此引導過程。在RHEL 7中,使用systemd的符號鏈接來配置遺留的init進程。
單元是systemd的基本組成模塊。最常見的是服務單元,它們的擴展名為.service,負責激活某個系統(tǒng)服務。執(zhí)行下面的命令可顯示所有服務單元的一個列表:
# systemctl list-units --type=service --all
--all標志包含所有單元,而不只是活動的單元。還有其他類型的單元,如掛載單元和自動掛載單元,它們管理掛載點;路徑單元,當文件系統(tǒng)路徑發(fā)生變化時(如spool目錄),它們激活服務;套接字單元,只有當客戶端建立連接時,它們才啟動服務(如果使用了xinetd守護進程,這類似于xinetd根據(jù)需要啟動服務);除此之外還有其他許多單元。
目標單元是一種特殊類型的單元,用于將其他系統(tǒng)單元分組到一起,以及將系統(tǒng)切換到另一個狀態(tài)。執(zhí)行下面的命令可顯示所有目標單元:
# systemctl list-units --type=target --all
表5-1說明了最重要的目標單元。
表5-1 systemd目標單元

在systemd中,目標的功能與以前的RHEL發(fā)行版中的運行級相同。在RHEL 6中,有7個運行級(從0到6)。Linux服務是按運行級進行組織的。每個運行級對應一個功能級。
例如,在運行級1中,只允許一個用戶登錄到該Linux系統(tǒng)。X11模式也稱為運行級5,如果已經(jīng)安裝了相應的程序包,則它把Linux啟動到GUI登錄屏幕。表5-2對systemd目標和RHEL 6中定義的運行級做了一個比較。
表5-2 RHEL 6的運行級和RHEL 7的systemd目標

執(zhí)行下面的命令:
# ls -l /usr/lib/systemd/system/runlevel? .target
注意輸出中的符號鏈接。觀察runlevel0.target、runlevel1.target等文件如何鏈接到systemd目標,如poweroff.target和rescue.target。這些鏈接提供了與原來的SysV運行級向后兼容的能力。可以用runlevel5.target表示graphical.target,用runlevel3.target表示multi-user.target。
目標受單元控制,并被組織為單元文件。雖然默認目標定義在/etc/systemd/system中,但是在引導過程中可以使用GRUB 2菜單覆蓋默認目標。
每個目標可能關聯(lián)著多個systemd單元。每個單元可啟動或停止Linux服務,如打印(cupsd)、調度(crond)、Apache Web服務器(httpd)、Samba文件服務器(smbd)等。完成配置后,引導進程將啟動和停止我們選擇的systemd單元。這些單元稱為依賴項。執(zhí)行下面的命令可列出默認的graphical.target單元的所有依賴項:
# systemctl list-dependencies graphical.target
默認目標被指定為從/etc/systemd/system/default.target文件到multi-user.target或graphical. target的符號鏈接。還可以使用systemctl命令獲取當前的默認目標或者修改當前的設置,如下所示:
# systemctl get-default graphical.target # systemctl set-default multi-user.target rm '/etc/systemd/system/default.target' ln -s '/usr/lib/systemd/system/multi-user.target'? '/etc/systemd/system/default.target'
從輸出中可以看到,systemctl set-default multi-user.target命令創(chuàng)建了/etc/systemd/system/default.target的一個符號鏈接。
5.3.3 目標之間的切換
既然我們已經(jīng)討論了RHEL 7中各種不同的目標,現(xiàn)在來討論目標之間如何切換。在RHEL的早期版本中,這在功能上等效于運行級的切換。首先,用下面的命令建立默認目標:
# systemctl get-default graphical.target
RHEL 7通常引導到graphical.target或multi-user.target。在作為管理員用戶登錄后,可以使用systemctl isolate命令移動到不同的目標。例如,下面的命令將系統(tǒng)移動到多用戶目標:
# systemctl isolate multi-user.target
執(zhí)行該命令后,重新運行systemctl get-default命令。輸出確認默認目標沒有改變:
graphical.target
現(xiàn)在嘗試其他操作。執(zhí)行下面的命令后,你認為會發(fā)生什么情況?
# systemctl isolate poweroff.target
5.3.4 重新啟動和正常關閉系統(tǒng)
重新啟動和關閉系統(tǒng)所需的命令十分直觀。如前一節(jié)所述,下面的命令分別提供了關閉和重新啟動系統(tǒng)的方法:
# systemctl poweroff
# systemctl reboot
考慮到遺留系統(tǒng),Red Hat創(chuàng)建了從下面的命令到systemctl的符號鏈接。這些命令的使用與在RHEL的先前版本中相同。
# shutdown # reboot
5.3.5 systemd取代了Upstart和SysVInit
systemd是在引導時第一個啟動的進程,它負責激活所有服務。systemd取代了傳統(tǒng)的init守護進程和Upstart系統(tǒng),后者取代了init,是RHEL 6中的默認init守護進程。Upstart的設計和理念非常類似于原來的SysVinit系統(tǒng),依賴于init腳本來激活服務,也依賴于運行級的概念(前面已經(jīng)介紹過)。
與之相對,systemd引入了許多新工具,可以實現(xiàn)的功能也更多,同時保留了與SysVinit的兼容性。systemd的設計基于最優(yōu)效率。首先,在引導時,systemd僅激活嚴格需要的服務,而其他服務則根據(jù)需要啟動。例如,只有向/var/spool/cups隊列發(fā)送了打印作業(yè)后,systemd才會啟動CUPS打印服務。另外,systemd會并行處理服務的初始化。
其結果是,使用systemd后的引導過程變得更快。執(zhí)行下面的命令可顯示系統(tǒng)引導所需的時間:
# systemd-analyze time Startup finished in 506ms(kernel)+ 1.144s? (initrd)+ 6.441s(userspace)= 8.092s.
輸出顯示了初始化內核所需的時間,以及加載初始RAM磁盤(initrd)的時間和激活systemd單元(userspace)的時間。總時間為8.092秒。但是不止如此。通過運行systemd-analyze blame命令,還可以顯示激活每個systemd單元所需的詳細時間。圖5-7給出了一個例子。

圖5-7 systemd單元的初始化時間
圖5-7中的數(shù)字與systemdanalyze time報告的總userspace時間不相等。這是因為systemd會同時啟動多個服務。
RHCSA考試沒有要求深入理解systemd的所有功能,但是它的一些功能可被系統(tǒng)管理員利用。
一些Linux開發(fā)人員認為,systemd做的工作太多,破壞了Unix中的程序編寫理念:“只做一件事并把它做好。”但是,如今大部分主流Linux發(fā)行版都已經(jīng)采用了systemd。
1.日志記錄
systemd進程包含了一個強大的日志系統(tǒng)。使用journalctl命令可以顯示收集到的所有日志。默認情況下,日志文件臨時存儲在RAM中,或者/run/log/journal目錄的環(huán)形緩沖區(qū)中。執(zhí)行下面的命令后,Linux將把日志文件持久寫入硬盤:
# mkdir /var/log/journal # chgrp systemd-journal /var/log/journal # chmod 2775 /var/log/journal # systemctl restart systemd-journald.service
一旦啟用了持久日志,就可以使用-b開關選項顯示特定一次引導中的日志消息:journalctl -b 0顯示自上次引導以來的日志消息,journalctl -b 1顯示上次引導之前的一次引導的日志消息,依此類推。journalctl會自動聚合當前日志文件和所有輪轉日志文件中的可用數(shù)據(jù),所以我們不需要在不同的日志文件中切換。
使用-p命令選項,可根據(jù)日志消息的優(yōu)先級對其進行過濾。例如,journalctl -p warning顯示優(yōu)先級為“警告”或更高的所有消息。“警告”優(yōu)先級的日志消息以粗體字符顯示,“錯誤”或更高優(yōu)先級的消息則顯示為紅色。
2. cgroups
控制組(cgroups)是Linux內核的一項功能,可將進程分組到一起,并控制或限制它們的資源使用(如CPU、內存等)。在systemd中,cgroups主要用于跟蹤進程,確保當一個服務停止時,屬于該服務的所有進程也被終止。
在傳統(tǒng)的SysVinit系統(tǒng)中,難以確認與進程關聯(lián)的服務。事實上,服務常常啟動多個進程。當停止一個SysVinit服務時,該服務可能無法終止所有依賴的(子)進程。此時要么手動停止所有依賴服務(使用ps和kill命令),要么接受系統(tǒng)中在下次重新引導之前,存在狀態(tài)未知的孤立進程。
為解決這種限制,systemd使用cgroup來標簽與服務關聯(lián)的進程。這樣一來,如有必要,systemd會使用cgroups來殺死組中的所有進程。
systemd-cgls命令以樹狀格式顯示cgroups的層次結構,如圖5-8所示。在圖5-8顯示的片段中,可以看到rsyslog.service和avahi-daemon.service等cgroups,以及它們派生的進程。注意,cgroups和systemd服務單元之間存在一對一對應關系。

圖5-8 cgoups的層次結構
3.依賴項
傳統(tǒng)的SysVinit系統(tǒng)按順序啟動服務。與之不同,systemd通過跟蹤單元之間的全部依賴關系,并行地激活服務。systemctl list-dependencies命令以樹的形式顯示單元之間的所有依賴關系,圖5-9是其輸出的一個節(jié)選。

圖5-9 systemd單元之間的依賴關系
可以顯示任意可用單元的依賴項。必須先啟動依賴單元。例如,下面的命令顯示了在啟動rsyslog服務之前必須先啟動的單元:
# systemctl list-dependencies rsyslog.service
5.3.6 systemd單元
systemd是第一個進程,該進程使用不同的配置文件來啟動其他進程。這些配置文件保存在下面的目錄中:/etc/systemd/system和/usr/lib/systemd/system。
默認配置文件存儲在/usr/lib/systemd/system目錄中。存儲在/etc/systemd/system中的自定義文件可以覆蓋這些文件。不要修改/usr/lib/systemd/system目錄中的文件。任何軟件更新都可能覆蓋這些文件。
我們已經(jīng)討論了服務和目標單元,但是還有更多單元。表5-3簡要說明了所有可用的單元類型。
表5-3 systemd單元類型

查看/usr/lib/systemd/system目錄的內容。每個文件都包含一個systemd單元的配置,其類型與文件擴展名匹配。例如,文件graphical.target定義了圖形登錄目標單元的配置,而文件rsyslog.service則包含了rsyslog服務單元的配置。
執(zhí)行下面的命令可列出所有活動的systemd單元:
# systemctl list-units
list-units關鍵字是可選的,因為它是默認選項。如果想要保護非活動單元、維護單元和失敗的單元,需要添加--all命令開關。圖5-10顯示了此命令的輸出節(jié)選。

圖5-10 systemd的單元
在輸出中,第一列顯示了單元名稱,第二列顯示了該單元是否被正確加載。第三列顯示了單元的狀態(tài):活動、非活動、失敗或維護。第四列包含了更多細節(jié)。最后一列簡單描述了該單元。
systemctl list-units命令給出了每個單元的狀態(tài)的運行時快照,下面的命令則顯示了一個單元在啟動時被啟用還是禁用:
# systemctl list-unit-files
圖5-11顯示了該命令的輸出。可以看到,單元可被“啟用”(enabled)或“禁用”(disabled)。另外還有一個static狀態(tài),表示該單元已被啟用且不能被手動修改。

圖5-11 已安裝的單元文件
5.3.7 虛擬終端與登錄界面
在Linux中的登錄終端通常是虛擬終端。大多數(shù)Linux系統(tǒng)(包括RHEL 7)都配置了6個標準的命令行虛擬終端。這些控制臺用1~6數(shù)字表示。如果配置了一個GUI和一個登錄管理器,RHEL 7將用圖形登錄界面取代第一個虛擬終端。
所有這一切意味著什么呢?在Linux中,用ALT+功能鍵可以在各個虛擬終端之間切換。例如,ALT+F2可以切換到第2個虛擬終端。按下ALT+右向方向鍵和ALT+左向方向鍵可以在相鄰的虛擬終端之間進行切換。例如,從第2個虛擬終端切換到第3個虛擬終端,按下ALT+右向方向鍵。如果用戶正處在GUI虛擬終端中,則增加一個CTRL鍵。因此在RHEL 7中,如果已經(jīng)安裝GUI而且當前正處于第一個虛擬終端中,要切換到第2個虛擬終端必須按下CTRL+ALT+F2。
如果我們登錄到一個普通的虛擬終端,則Linux返回一個命令行shell。默認的shell定義在/etc/passwd文件中,這將在第6章介紹。當我們登錄到一個GUI虛擬終端中,則Linux返回已配置的GUI桌面。有關Linux GUI的更多信息請閱讀第8章。
在RHEL 6中,虛擬終端是在/etc/sysconfig/init和/etc/init目錄的文件中配置的。因為systemd已經(jīng)取代了Upstart,現(xiàn)在它們在/etc/systemd目錄的logind.conf文件中定義。
虛擬終端使Linux的多用戶功能起死回生。在工作中(或在Red Hat考試期間),我們可以在一個終端上瀏覽man文檔,在另一個終端中編譯一個程序,在第三個終端中編輯一個配置文件等。其他通過網(wǎng)絡連接的用戶也可以在同一個時刻做相同的事情。
- 無蘋果不生活 OS X Mountain Lion隨身寶典
- Linux網(wǎng)絡操作系統(tǒng)與實訓(第三版)
- 精通Linux內核開發(fā)
- 混沌工程:復雜系統(tǒng)韌性實現(xiàn)之道
- 高性能Linux服務器構建實戰(zhàn):系統(tǒng)安全、故障排查、自動化運維與集群架構
- Linux系統(tǒng)安全基礎:二進制代碼安全性分析基礎與實踐
- Mobile First Design with HTML5 and CSS3
- Microsoft Operations Management Suite Cookbook
- Linux內核設計的藝術:圖解Linux操作系統(tǒng)架構設計與實現(xiàn)原理
- Linux命令行大全(第2版)
- VMware Horizon View Essentials
- Linux基礎使用與案例
- Windows 7實戰(zhàn)從入門到精通
- Learn CUDA Programming
- Linux操作系統(tǒng)