從菜鳥到駭客/Linux
本節解釋了 Linux 系統啟動和關閉時發生的情況,以及如何正確地執行這些操作。如果未遵循正確的程式,檔案可能會損壞或丟失。
開啟計算機系統並載入其作業系統的行為稱為啟動。這個名字來源於計算機“自力更生”的形象,但實際操作略微現實一些。
在引導過程中,計算機首先載入一小段稱為引導載入程式的程式碼,該程式碼依次載入並啟動作業系統。引導載入程式通常儲存在硬碟或軟盤上的固定位置。採用這種兩步過程的原因是,作業系統龐大而複雜,但計算機載入的第一段程式碼必須非常小(幾百位元組),以避免使韌體不必要地複雜化。
不同的計算機以不同的方式進行引導。對於 PC,計算機(其 BIOS)讀取軟盤或硬碟上的第一個扇區(稱為引導扇區)。引導載入程式包含在此扇區中。它從磁碟上的其他位置(或其他位置)載入作業系統。
Linux 載入後,它會初始化硬體和裝置驅動程式,然後執行 init。init 啟動其他程序以允許使用者登入並執行操作。這部分的細節將在下面討論。
為了關閉 Linux 系統,首先會通知所有程序終止(這使它們關閉所有檔案並執行其他必要的操作以保持整潔),然後解除安裝檔案系統和交換區,最後向控制檯列印一條訊息,指示可以關閉電源。如果不遵循正確的程式,將會發生可怕的事情;最重要的是,檔案系統緩衝區快取可能不會被重新整理,這意味著其中的所有資料都會丟失,並且磁碟上的檔案系統不一致,因此可能無法使用。
當 PC 啟動時,BIOS 將執行各種測試以檢查一切是否正常,然後開始實際的啟動。此過程稱為開機自檢,簡稱 POST。它將選擇一個磁碟驅動器(通常是第一個軟盤驅動器,如果插入了軟盤,否則是第一個硬碟,如果計算機中安裝了硬碟;但是,順序可能是可配置的),然後讀取其第一個扇區。這稱為引導扇區;對於硬碟,也稱為主引導記錄,因為硬碟可以包含多個分割槽,每個分割槽都有自己的引導扇區。
引導扇區包含一個小程式(足夠小,可以放入一個扇區),其職責是從磁碟讀取實際的作業系統並啟動它。從軟盤啟動 Linux 時,引導扇區包含的程式碼僅將前幾百個塊(當然,取決於實際核心的大小)讀取到記憶體中的預定位置。在 Linux 啟動軟盤上,沒有檔案系統,核心只是儲存在連續的扇區中,因為這簡化了啟動過程。但是,可以透過使用 LILO(Linux 載入程式)或 GRUB(Grand Unifying Bootloader)從帶有檔案系統的軟盤啟動。
從硬碟啟動時,主引導記錄中的程式碼將檢查分割槽表(也在主引導記錄中),識別活動分割槽(標記為可引導的分割槽),從該分割槽讀取引導扇區,然後啟動該引導扇區中的程式碼。分割槽引導扇區中的程式碼執行軟盤引導扇區執行的操作:它將從分割槽讀取核心並啟動它。但是,細節有所不同,因為通常沒有必要為核心映像單獨設定一個分割槽,因此分割槽引導扇區中的程式碼不能只是按順序讀取磁碟,它必須找到檔案系統將它們放在任何地方的扇區。有幾種方法可以解決此問題,但最常見的方法是使用像 LILO 或 GRUB 這樣的引導載入程式。(但是,有關如何執行此操作的詳細資訊與本次討論無關;有關更多資訊,請參閱 LILO 或 GRUB 文件;它是最全面的。)
啟動時,引導載入程式通常會繼續讀取並啟動預設核心。也可以配置引導載入程式以能夠啟動多個核心中的一個,甚至啟動 Linux 之外的其他作業系統,並且使用者可以在啟動時選擇要啟動的核心或作業系統。例如,可以配置 LILO,以便如果在啟動時(載入 LILO 時)按住 Alt、Shift 或 Ctrl 鍵,LILO 將詢問要啟動的內容,而不是立即啟動預設值。或者,可以配置引導載入程式,使其始終詢問,並帶有一個可選的超時,這將導致啟動預設核心。
也可以在核心或作業系統的名稱之後提供核心命令列引數。有關可能選項的列表,您可以閱讀http://www.tldp.org/HOWTO/BootPrompt-HOWTO.html。
從軟盤和硬碟啟動都有其優點,但通常從硬碟啟動更好,因為它避免了使用軟盤的麻煩。它也更快。大多數 Linux 發行版將在安裝過程中為您設定引導載入程式。
無論使用何種方式,在 Linux 核心被讀取到記憶體中並真正啟動後,大致會發生以下情況
- Linux 核心以壓縮形式安裝,因此它將首先解壓縮自身。核心映像的開頭包含一個執行此操作的小程式。
- 如果您有一個 Linux 識別的超級 VGA 卡並且該卡具有一些特殊的文字模式(例如 100 列 x 40 行),Linux 會詢問您要使用哪種模式。在核心編譯期間,可以預設影片模式,以便永遠不會詢問。這也可以透過 LILO、GRUB 或 rdev 完成。
- 之後,核心會檢查還有哪些其他硬體(硬碟、軟盤、網路介面卡等),並相應地配置其一些裝置驅動程式;在此過程中,它會輸出有關其發現結果的訊息。例如,當我啟動時,它看起來像這樣
LILO boot: Loading linux. Console: colour EGA+ 80x25, 8 virtual consoles Serial driver version 3.94 with no serial options enabled tty00 at 0x03f8 (irq = 4) is a 16450 tty01 at 0x02f8 (irq = 3) is a 16450 lp_init: lp1 exists (0), using polling driver Memory: 7332k/8192k available (300k kernel code, 384k reserved, 176k data) Floppy drive(s): fd0 is 1.44M, fd1 is 1.2M Loopback device init Warning WD8013 board not found at i/o = 280. Math coprocessor using irq13 error reporting. Partition check: hda: hda1 hda2 hda3 VFS: Mounted root (ext filesystem). Linux version 0.99.pl9-1 (root@haven) 05/01/93 14:12:20
- 確切的文字在不同的系統上有所不同,具體取決於硬體、使用的 Linux 版本以及其配置方式。
- 然後,核心將嘗試掛載根檔案系統。該位置可以在編譯時或任何時候使用 rdev 或引導載入程式進行配置。檔案系統型別會自動檢測。如果掛載根檔案系統失敗,例如因為您忘記在核心中包含相應的磁碟檔案系統驅動程式,則核心會發生恐慌並停止系統(無論如何它無能為力)。
- 根檔案系統通常以只讀方式掛載(這可以透過與位置相同的方式設定)。這使得在掛載檔案系統時可以檢查檔案系統;檢查以讀寫方式掛載的檔案系統不是一個好主意。
- 之後,核心在後臺啟動程式 init(位於 /sbin/init)(這將始終成為程序號 1)。init 執行各種啟動任務。它執行的確切操作取決於它的配置方式;有關更多資訊,請參閱第 2.3.1 節(尚未編寫)。它至少會啟動一些必要的後臺守護程序。
- 然後,init 切換到多使用者模式,併為虛擬控制檯和序列線路啟動 getty。getty 是允許人們透過虛擬控制檯和序列終端登入的程式。init 還可以根據其配置方式啟動其他一些程式。
- 此後,啟動完成,系統正常執行。
有關 LILO 的更多資訊,您可以閱讀http://www.tldp.org/HOWTO/LILO.html
有關 GRUB 的更多資訊,您可以訪問http://www.gnu.org/software/grub/grub.html
在關閉 Linux 系統時,遵循正確的步驟非常重要。如果操作不當,您的檔案系統可能會損壞,檔案可能會變得混亂。這是因為 Linux 擁有一個磁碟快取,它不會立即將資料寫入磁碟,而是在一段時間間隔內寫入。這極大地提高了效能,但也意味著如果您隨意關閉電源,快取中可能儲存了大量資料,磁碟上的內容可能不是一個完整可用的檔案系統(因為只有一部分資料被寫入磁碟)。
另一個反對直接斷電的理由是,在多工系統中,後臺可能有很多操作正在進行,斷電可能會造成災難性的後果。透過使用正確的關機序列,您可以確保所有後臺程序都能儲存其資料。
正確關閉 Linux 系統的命令是 shutdown。它通常以兩種方式之一使用。
如果您正在執行一個只有您一個使用者的系統,則通常使用 shutdown 的方法是:退出所有正在執行的程式,登出所有虛擬控制檯,以 root 使用者身份登入其中一個控制檯(或者如果您已經以 root 使用者身份登入,則保持登入狀態,但您應該切換到 root 的主目錄或根目錄,以避免解除安裝時出現問題),然後執行命令 shutdown -h now(如果您需要延遲,可以將 now 替換為加號和分鐘數,不過在單使用者系統上通常不需要)。
或者,如果您的系統有多個使用者,請使用命令 shutdown -h +time message,其中 time 是系統停止執行前的分鐘數,message 是一個簡短的說明,解釋系統停止執行的原因。
- shutdown -h +10 '我們將安裝一個新的
磁碟。* 系統應該在三小時內恢復線上。'
這將警告每個人系統將在十分鐘內關閉,他們最好離開或丟失資料。警告將列印到每個人登入的每個終端上,包括所有 xterm。
來自 root (ttyp0) 的廣播訊息 1995 年 8 月 2 日星期三 01:03:25...
我們將安裝一個新的磁碟。* 系統應該在三小時內恢復線上。系統將在 10 分鐘內關閉以進行系統停止!!
在啟動之前,警告會自動重複幾次,隨著時間的推移,間隔會越來越短。
在任何延遲之後,當真正的關機開始時,所有檔案系統(根檔案系統除外)都將被解除安裝,使用者程序(如果有人仍然登入)將被終止,守護程序將被關閉,所有檔案系統都將被解除安裝,並且通常所有內容都將穩定下來。完成後,init 會列印一條訊息,提示您可以關閉機器電源。然後,也只有在然後,您才能將手指移向電源開關。
有時,儘管在任何良好的系統上都很少見,但無法正確關機。例如,如果核心出現恐慌並崩潰並燒燬並普遍出現故障,則可能完全無法發出任何新命令,因此正確關機有些困難,您能做的幾乎所有事情都希望沒有任何東西受到嚴重損壞並關閉電源。如果問題不那麼嚴重(例如,有人用斧頭敲擊您的鍵盤),並且核心和更新程式仍然正常執行,則最好等待幾分鐘,讓更新有機會重新整理緩衝區快取,然後再切斷電源。
在過去,有些人喜歡使用 sync 命令三次來關機,等待磁碟 I/O 停止,然後關閉電源。如果沒有正在執行的程式,這等同於使用 shutdown。但是,它不會解除安裝任何檔案系統,這會導致 ext2fs“乾淨檔案系統”標誌出現問題。不建議使用三次回顯的方法。
(如果您想知道:三次回顯的原因是在 UNIX 的早期,當命令是單獨鍵入時,這通常提供了足夠的時間來完成大多數磁碟 I/O。)
重新啟動意味著再次啟動系統。這可以透過先完全關閉系統,關閉電源,然後重新開啟電源來實現。更簡單的方法是讓 shutdown 重新啟動系統,而不是僅僅停止它。這是透過對 shutdown 使用 -r 選項來實現的,例如,透過執行命令 shutdown -r now。
大多數 Linux 系統在按下鍵盤上的 ctrl-alt-del 時執行 shutdown -r now。這將重新啟動系統。但是,ctrl-alt-del 上的操作是可配置的,在多使用者機器上,在重新啟動之前允許一些延遲可能會更好。在物理上可供任何人訪問的系統甚至可以配置為在按下 ctrl-alt-del 時不執行任何操作。
shutdown 命令也可用於將系統降級到單使用者模式,在這種模式下,沒有人可以登入,但 root 可以使用控制檯。這對於在系統正常執行時無法完成的系統管理任務很有用。
並非總是可以從硬碟啟動計算機。例如,如果您在配置 LILO 時出錯,可能會導致系統無法啟動。對於這些情況,您需要一種始終有效的替代啟動方式(只要硬體正常工作)。對於典型的 PC,這意味著從軟盤驅動器啟動。
大多數 Linux 發行版允許在安裝期間建立緊急啟動軟盤。這樣做是個好主意。但是,某些此類啟動磁碟僅包含核心,並假設您將使用發行版安裝磁碟上的程式來修復您遇到的任何問題。有時這些程式不夠用;例如,您可能需要從使用安裝磁碟上沒有的軟體建立的備份中恢復某些檔案。
因此,可能還需要建立一個自定義根軟盤。格雷厄姆·查普曼編寫的 Bootdisk HOWTO 包含執行此操作的說明。您可以在 http://www.tldp.org/HOWTO/Bootdisk-HOWTO/index.html 找到此 HOWTO。當然,您必須記住使您的緊急啟動和根軟盤保持最新。
您不能將用於掛載根軟盤的軟盤驅動器用於其他任何用途。如果您只有一個軟盤驅動器,這可能會造成不便。但是,如果您有足夠的記憶體,可以配置您的啟動軟盤將根磁碟載入到 ramdisk(啟動軟盤的核心需要為此進行特殊配置)。將根軟盤載入到 ramdisk 後,軟盤驅動器就可以掛載其他磁碟了。