Linux的靴子


事實證明,引導過程沒有太多內容:

1. 引導加載程序查找磁盤上的內核映像,將其加載到內存中,並啟動它。
2. 內核初始化的設備和性病司機。
3. 內核掛載根目錄 filesystem.
4. 內核啟動init稱為計劃。
5. 初始化設置其餘的運動過程中。
6. 最後進程init啟動引導順序的一部分,允許您登錄。

確定啟動過程的每個階段對於解決啟動問題和了解啟動過程非常重要。 system 整體上首先,在引導加載程序上進行零輸入,這是初始屏幕,或者在計算機執行開機自檢後詢問您是否進行以下操作時提示您 system 跑步。 選擇後,引導加載程序將運行Linux內核,將控制權交給 system 到內核。

本文摘自在這本書中,這在其他地方的內核有一個詳細的討論。 本文介紹了 內核初始化階段,這是內核打印一堆有關硬件存在的消息的階段。 system。 內核會在顯示一條消息,表明內核已掛載內核後立即啟動init。 根 filesystem:

VFS:安裝 根(ext2 filesystem) 只讀。

不久之後,您將看到有關init啟動的消息,然後是 system 服務啟動消息,最後您得到某種登錄提示。

注意 :在 Red Hat Linux的,它的初始說明特別明顯,因為它“歡迎”您使用“ Red Hat Linux”。 此後所有消息均在屏幕右側的括號中顯示成功或失敗。

本章的大部分處理初始化,因為它是WHERE部分你有控制的引導順序。
初始化

初始化沒有什麼特別的。 就像Linux上的其他程序一樣 system,您會在/ sbin中找到它,以及其他 system 二進製文件。 init的主要目的是按特定順序啟動和停止其他程序。 您只需要知道此序列是如何工作的即可。

有幾種不同的變體,但是大多數Linux發行版都使用 System V型在這裡討論。 Some distributions use a simpler version that resembles the BSD init, but you are unlikely to encounter this.有些發行版使用的是類似於BSD init的簡單版本,但是您不太可能遇到這種情況。

運行級別

在Linux上的任何給定時間 system,某個基本的進程集正在運行。 這種狀態 machine稱為其運行級別,並用0到6之間的數字表示。 system 它的大部分時間都花在單個運行級別上。 但是,當您關閉 mac降低,init切換到不同的運行級別以終止 system 有序的服務並告訴內核停止。 另一個運行級別適用於單用戶模式,稍後將進行討論。

獲取運行級別的最簡單方法是檢查init配置 file,/ etc / inittab。 Look for a line like the following:查找類似以下內容的行:

ID:5:initdefault:

這行表示 default 運行級別 system 是5。inittab中的所有行 file 採用這種形式,四個字段之間用冒號隔開,順序如下:
#唯一標識符(一個簡短的字符串,如ID在前面的例子)
#適用的運行級別的數字(S)
#init應該執行的操作(在前面的示例中,該操作是設置 default 運行級別到5)
#要執行的命令(可選)

在前面的init中沒有要執行的命令default 例子,因為在設置上下文中命令沒有意義 default 運行級別。 在inittab中往下看一點,直到看到這樣的行:

l5:5:等待等:/ /的rc.d / RC 5的的

這條線觸發了大多數 system 通過rc * .d和init.d目錄進行配置和服務。 您可以看到init設置為在運行級別5時執行一個名為/etc/rc.d/rc 5的命令。wait操作說明了init運行命令的時間和方式:何時運行rc 5 enter進入運行級別5,然後等待此命令完成,然後再執行其他操作。

有幾種不同的動作 add初始化default 然後等待,尤其是與電源管理有關的內容,inittab(5)手冊頁將為您提供所有相關信息。 以下幾節說明了您最有可能遇到的問題。

重生

respawn操作使init運行後面的命令,如果命令執行完畢,則再次運行它。 您可能會在inittab中看到類似於此行的內容 file:

1:2345:重生:/ sbin目錄/的mingetty tty1的的

蓋蒂程序提供的登錄提示。 上線的第一個虛擬的控制台(/ dev / tty1的),你看,當你按下ALT或CONTROL-ALT F1的F1的。 重生行動帶來的登錄提示回來後,你退出。

ctrlAltdel

ctrlaltdel操作可控制 system 在虛擬控制台上按CONTROL-ALT-DELETE時執行此操作。 在大多數 systems,這是使用shutdown命令的某種重新引導命令。

SYSINIT

sysinit操作是init啟動時應首先運行的第一件事, enter在任何運行級別。

如何在運行級別的進程開始

您現在準備好學習如何啟動 system 服務,然後再讓您登錄。 回顧一下先前的inittab行:

l5:5:等待等:/ /的rc.d / RC 5的的

這個小行會觸發許多其他程序。 RC代表執行命令,你會聽到人們提到腳本,程序或服務的命令。 所以,這些命令在哪裡呢?

For runlevel 5, in this example, the commands are probably either in /etc/rc.d/rc5.d or /etc/rc5.d.對於運行級別1,在此示例中,命令可能在/etc/rc.d/rc1.d或/etc/rc2.d中。 Runlevel 2 uses rcXNUMX.d, runlevel XNUMX uses rcXNUMX.d, and so on.運行級別XNUMX使用rcXNUMX.d,運行級別XNUMX使用rcXNUMX.d,依此類推。 You might find the following您可能會發現以下內容 items 在rc5.d目錄中:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

的RC 5命令啟動程序在這個運行級別目錄運行北京時間命令:

S10sysklogd家
S12kerneld家
S15netstd_init家
S18netbase家
...
S99sshd家

注意,開始在每個命令的參數。 S在命令名字的意思是,應該在啟動模式運行命令,和(00通過99)確定序列中的RC啟動命令。

RC * D命令shell腳本,通常啟動程序在/ sbin或/ usr / sbin目錄。 通常情況下,你可以弄清楚什麼命令實際上是通過尋找小於或尋呼機另一個程序的腳本。

您可以手動啟動這些服務之一。 例如,如果要手動啟動httpd Web服務器程序,請運行S99httpd start。 同樣,如果您需要在 machine處於打開狀態,您可以使用stop參數(例如,S99httpd stop)在rc * .d目錄中運行命令。

某些rc * .d目錄包含以K開頭的命令(“ kill”或“ stop”模式)。 在這種情況下,rc使用stop參數而不是start運行命令。 您最有可能在運行級別遇到K個命令,這些命令會關閉 system 下。

Add刪除和刪除服務

如果你想 add、刪除或修改rc * .d目錄中的服務,需要仔細查看 files inside.在裡面。 A long listing reveals a structure like this:長長的清單揭示了這樣的結構:

lrwxrwxrwx。 。 。 S10sysklogd - > .. / init.d /的sysklogd的
lrwxrwxrwx。 。 。 S12kerneld - > .. / init.d /的核心模式
lrwxrwxrwx。 。 。 S15netstd_init - > .. / init.d /的netstd_init
lrwxrwxrwx。 。 。 S18netbase - > .. / init.d /的netbas的
...

rc * .d目錄中的命令實際上是指向的符號鏈接 fileLinux發行版包含這些鏈接,因此它們可以對所有運行級別使用相同的啟動腳本。 This convention is by no means a requirement, but it often makes organization a little easier.這個約定絕不是必需的,但是它通常使組織變得容易一些。

為了防止 init.d 目錄中的命令之一在特定運行級別中運行,您可能會考慮刪除相應 rc * .d 目錄中的符號鏈接。 這確實有效,但如果您犯了錯誤並且需要將鏈接放回原處,您可能無法記住鏈接的確切名稱。 因此,您不應該刪除 rc * .d 目錄中的鏈接,而是, add 鏈接名稱開頭的下劃線 (_),如下所示:

MV S99httpd _S99httpd

在啟動時,rc忽略_S99httpd,因為它不是以S或K開頭。此外,原始名稱仍然很明顯,如果您需要手動啟動它,可以快速訪問該命令。

至 add 一個服務,你必須像其他人一樣在 init.d 目錄中創建一個腳本,然後在正確的 rc * .d 目錄中創建一個符號鏈接。 編寫腳本的最簡單方法是檢查 init.d 中已有的腳本,複製一份您理解的腳本,然後修改該副本。

时间 add在啟動服務時,請確保在啟動順序中選擇合適的位置來啟動服務。 如果服務啟動得太快,它可能無法工作,因為它依賴於某些其他服務。 對於非必要服務,大多數 systems administrators 更喜歡 90 年代的數字,在大多數服務之後 system.

Linux 發行版通常帶有一個命令來啟用和禁用 rc * .d 目錄中的服務。 例如,在 Debian 中,命令是 update-rc.d,在 Red Hat Linux 中,命令是 chkconfig。 圖形用戶界面也可用。 使用這些程序有助於保持啟動目錄一致並有助於升級。

提示: 最常見的 Linux 之一 install問題是配置不正確的 XFree86 服務器時常閃爍,使 system 在控制台上無法使用。 要停止此行為,請引導至單用戶模式並更改您的運行級別或運行級別服務。 在rc * .d目錄或/ etc / inittab中查找包含xdm,gdm或kdm的內容。

控制初始化

有時,您需要給init一個小小的腳踢,告訴它切換運行級別,以重新讀取inittab。 file,或只是為了 shut down system。 因為init始終是 system,其進程ID始終為1。

你可以控制的init使用telinit。 例如,如果你想要切換到的runlevel 3的,使用這個命令:

telinit的3的

切換運行級別時,init試圖殺死inittab中沒有的任何進程 file for the new runlevel.對於新的運行級別。 Therefore, you should be careful about changing runlevels.因此,在更改運行級別時應謹慎。

當您需要 add 或刪除重生作業或對 inittab 進行任何其他更改 file,您必須告知init更改,並使其重新讀取 file。 Some people use kill -HUP 1 to tell init to do this.某些人使用kill -HUP XNUMX告訴init執行此操作。 This traditional method works on most versions of Unix, as long as you type it correctly.只要您正確鍵入,該傳統方法就可以在大多數Unix版本上使用。 However, you can also run this telinit command:但是,您也可以運行以下telinit命令:

使用telinit q

你也可以使用使用telinit s到切換到單用戶模式。

關閉

初始化還控制 system 關閉並重新啟動。 正確的方法 shut down 和Linux machine是使用shutdown命令。

有兩種使用關機的基本方法。 如果您停止 system,它會關閉 mac放鬆下來,保持冷靜。 為了使 mac立即停止運行,請使用以下命令:

現在關機-H

在最現代的 mac由於使用了合理的最新版本的Linux,因此停止運行會降低電源的能力。 macine 您也可以重新啟動 macine 要重新引導,請使用-r而不是-h。

關閉過程需要幾秒鐘。 您切勿重設或關閉電源 mac在這個階段

在前面的示例中,現在是時候 shut down。 此參數是強制性的,但是有很多方法可以指定它。 如果你想要 mac要在將來某個時間關閉,一種方法是使用 + n,其中 n 是關閉在執行其工作之前應該等待的分鐘數。 對於其他 options,看關機(8)手冊頁。

製作 system 在10分鐘內重新啟動,運行以下命令:

執行shutdown-r + 10

在Linux上,關機會通知登錄的任何人 mac欣欣向榮,但實際工作卻很少。 如果您指定的時間不是現在,關機將創建一個 file called /etc/nologin.叫做/ etc / nologin。 When this當這個 file 存在, system 禁止除超級用戶以外的任何人登錄。

时间 system 關閉時間終於到了,shutdown告訴init切換到運行級別0來停止,而運行級別6來重新啟動。 初始化時 enters運行級別0或6,將執行以下所有操作,您可以通過查看rc0.d和rc6.d中的腳本來進行驗證:

1。 初始化殺死每一個過程,它可以(因為它會轉換成任何其他runlevel時)。

#初始rc0.d / rc6.d命令運行並鎖定 system file到位,並為關機做其他準備。
#接下來的rc0.d / rc6.d命令全部卸載 filesystem除了根以外。
#進一步的rc0.d / rc6.d命令重新掛載根目錄 filesystem 只讀。
#還有更多rc0.d / rc6.d命令將所有緩衝的數據寫到 filesystem 與同步程序。
#的最終rc0.d / rc6.d的命令告訴內核重啟或停止使用reboot,halt或關機程序。

對於每個運行級別,重新引導和停止程序的行為都不同,從而可能引起混亂。 通過 default, 這些程序使用 -r 或 -h 調用關閉 options,但如果 system 已經處於停止或重新啟動運行級別,程序告訴內核立即關閉自身。 如果您真的想關閉您的 mac急著下來(不考慮因不正常關機而造成的任何損壞),請使用-f選項。

對技術充滿熱情,我喜歡測試和編寫有關操作系統的教程 macOS,Linux, Windows, 關於 WordPress, WooCommerce 和配置 LEMP 網絡服務器(Linux、NGINX、MySQL 和 PHP)。 我寫在 StealthSettings.com 自 2006 年以來,幾年後我開始撰寫 iHowTo.Tips 教程和有關生態系統中設備的新聞 Apple: iPhone,iPad, Apple 手錶,HomePod, iMac, MacBook、AirPods 和配件。

發表評論