一、前言
計算機開機是一個神祕的過程。我們只是按了開機鍵,就看到屏幕上的進度條或者一行行的輸出,直到我們到達登錄界面。然而,計算機開機又是個異常脆弱的過程,我們滿心期望的登錄界面可能並不會出現,而是一個命令行或者錯誤信息。瞭解計算機開機過程有助於我們修復開機可能出現的問題。
二、Linux啓動流程
linux啓動時我們會看到許多啓動信息,大致可分爲:BIOS > MBR > 引導加載程序 > 內核 > init process > login
init程序的類型:
SysV: init, CentOS 5之前, 配置文件: /etc/inittab。
Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。
Systemd:systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。
1、加電自檢
當我們打開計算機電源,計算機會自動從主板的BIOS讀取其中所存儲的程序。這一程序通常知道一些直接連接在主板上的硬件(硬盤,網絡接口,鍵盤,串口,並口)。現在大部分的BIOS允許從軟盤、光盤或者硬盤中選擇一個來啓動計算機。
2、計算機從所選擇的存儲設備中讀取起始的512 bytes
前512 bytes叫做主引導記錄MBR (master boot record)。MBR會告訴電腦從該設備的某一個分區(partition)來裝載引導加載程序(boot loader)。加載程序儲存有操作系統(OS)的相關信息,比如操作系統名稱,操作系統內核所在位置等。常用的boot loader有GRUB和LILO。
GRUB有幾個重要的文件,引導順序: stage 1 > stage 1.5 > stage 2
stage 1:它只有512字節,通常放在MBR中,它的作用很簡單,就是在系統啓動時用於裝載STAGE2並將控制權交給它。
stage 2:GRUB的核心,所有的功能都是由它實現。
stage 1.5:介於 stage 1和 stage 2之間,是它們的橋樑,因爲 stage 2較大,通常都是放在一個文件系統當中的,但是 stage 1並不能識別文件系統格式,所以才需要 stage 1.5來引導位於某個文件系統當中的 stage 2。
根據文件系統格式的不同, stage 1.5也需要相應的文件,如:e2fs_stage1_5,fat_stage1_5,分別用於識別ext和fat的文件系統格式。它存放於1-63的柱面之間。
主要的配置文件爲 grub.conf
裏面選項含義:
title : 一個操作系統引動的標頭,可以使多個
root : 指明所需文件存在於哪個磁盤哪個分區上 (hd0,0)表示第一個硬盤,第一個分區,可參考/boot/grub/device.map
kernel : 內核文件的名字,並且會有一些加載內核時的參數 or代表以只讀方式加載
initrd : 包含一些附加的驅動程序
3、boot loader加載內核(kernel)
內核實際上是一個用來操作計算機的程序,它是計算機操作系統的內核,主要的任務是管理計算機的硬件資源,充當軟件和硬件的接口。操作系統上的任何操作都要通過內核傳達給硬件。Windows和Linux各自有自己內核。狹義的操作系統就是指內核,廣義的操作系統包括內核以及內核之上的各種應用。我們可以在多個分區安裝boot loader,每個引導加載程序對應不同的操作系統,在讀取MBR的時候選擇我們想要啓動的引導加載程序。這就是多操作系統的原理。
4、若加載的是Linux內核,Linux內核開始工作
內核會首先預留自己運行所需的內存空間,然後通過驅動程序(driver)檢測計算機硬件。這樣,操作系統就可以知道自己有哪些硬件可用。隨後,內核會啓動一個init進程。它是Linux系統中的1號進程(Linux系統沒有0號進程)。到此,內核就完成了在計算機啓動階段的工作,交接給init來管理。
Linux系統有7個運行級別(runlevel):
運行級別0:系統關機狀態,系統默認運行級別不能設爲0,否則不能正常啓動
運行級別1:單用戶工作狀態,root權限,用於系統維護,禁止遠程登陸,可以破譯密碼
運行級別2:多用戶狀態(沒有NFS)
運行級別3:完全的多用戶狀態(有NFS),登陸後進入控制檯命令行模式
運行級別4:系統未使用,保留
運行級別5:有圖形化的完全多用戶模式,X11控制檯,登陸後進入圖形GUI模式
運行級別6:系統正常關閉並重啓,默認運行級別不能設爲6,否則不能正常啓動
通常使用較多的默認級別爲 3 或 5 ,服務器基本上默認使用 3 級別,即文本界面。不同級別之間可以進行切換。
查看init運行級別:runlevel
切換級別:init 5
5、根據boot loader的選項,Linux此時可以進入單用戶模式(single user mode)
在此模式下,初始腳本還沒有開始執行,我們可以檢測並修復計算機可能存在的錯誤;隨後,init會運行一系列的初始腳本(startup scripts),這些腳本是Linux中常見的shell scripts。這些腳本執行如下功能:
設置計算機名稱,時區,檢測文件系統,掛載硬盤,清空臨時文件,設置網絡等;
當執行完這些初始腳本,操作系統已經完全準備好了。
6、在此後的過程中,你將以用戶(user)的身份操作電腦。此外,根據創建用戶時的設定,Linux還會將其用戶歸到某個組(group)中。
三、常見問題及其解決方法
實驗一、 刪除/boot/grub/下除了grub.conf外的其他文件
cd /boot 進入boot,除了grub,刪除所有文件 ls cd /grub 進入grub,除了grub.conf ,刪除所有文件 ls
刪除/boot下所有,除了grub.conf
重啓;
結果 : 正常啓動
實驗二、dd if=/dev/zero of=/dev/sda bs=1 count=446 清空stage1
if=/dev/zero 從文件/dev/zero讀取 (全部寫零的意思)
of=/dev/sda 輸出到文件/dev/sda
bs=1 同時設置讀寫塊的大小爲1bytes
count=446 僅讀取446個數據塊數
結果 : 無法啓動,直接進入了光盤引導
處理方法 : 進入Rescue救援模式
根據下圖的指示,幾乎全部默認選項來進行操作;
在此處可以救援模式中的shell進行操作;
df 顯示目前在系統上的文件系統的磁盤使用情況統計
chroot /mnt/sysimage 用來在指定的根目錄下運行指令,把根目錄換成指定的根目錄 grub-install /dev/sda 把grub安裝到/dev/sda
實驗三、dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512 破壞stage1.5
if=/dev/zero 從文件/dev/zero讀取 (全部寫零的意思)
of=/dev/sda 輸出到文件/dev/sda
bs=1 同時設置讀寫塊的大小爲1bytes
count=10240 僅讀取10240個數據塊數
seek=512 從輸出文件/dev/sda 開頭跳過512個塊後再開始複製
處理方法 : 進入Rescue救援模式
重啓 reboot
實驗四、刪除 /etc/fstab /boot /etc/inittab(centos6 /etc/init/rcS.conf) /etc/rc.d/rc.sysinit
結果 : 無法啓動,直接進入了光盤引導
處理方法 : 進入Rescue救援模式
因爲fstab文件已刪除,fstab文件:存放檔案系統與目錄結構對應資料的檔案
mount /dev/sda2 /mnt/sysimage
進入/boot目錄中,首先恢復丟失的/etc/fstab文件,從假根環境中通過blkid命令將結果輸出重定向到真根環境中/etc/fstab中
blkid >> /mnt/sysimage/etc/fstab blkid命令將結果輸出重定向到真根環境中/etc/fstab
chroot /mnt/sysimage 把根目錄換成指定的根目錄
vim /etc/fstab 編譯 /etc/fstab 文件
blkid >> /mnt/sysimage/etc/fstab blkid命令將結果輸出重定向到真根環境中/etc/fstab chroot /mnt/sysimage 把根目錄換成指定的根目錄
重啓 init 0
再次進入Rescue救援模式
chroot /mnt/sysimage 把根目錄換成指定的根目錄 grub-install /dev/sda 把grub安裝到/dev/sda
mount /dev/cdrom /media 將光盤掛載到/media rpm -ivh /media/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force 強力安裝內核
vim /boot/grub/grub.conf
default=0
timeout=5
hiddenmenu
title CentOS 6 一個操作系統引動的標頭,可以使多個
root (hd0,0) 指明所需文件存在於哪個磁盤哪個分區上 (hd0,0)表示第一個硬盤,第一個分區
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=b2b27503-0a08-4a84-95fc-97c9eb769b1a rhgb quiet 內核文件的名字,並且會有一些加載內核時的參數 ro 代表以只讀方式加載
initrd /initramfs-2.6.32-696.el6.x86_64.img 包含一些附加的驅動程序
rpm -qf /etc/init/rcS.conf 查詢指定文件rcS.conf來自於哪一個已安裝的rpm包 rpm -qf /etc/rc.d/rc.sysinit 查詢指定文件rc.sysinit 來自於哪一個已安裝的rpm包
cd /app 進入/app目錄 (該目錄可任意選擇) cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app/ 將依賴包下載,複製到/app/ rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id 將rpm格式的文件轉換爲cpio格式的文件 cp etc/init/rcS.conf /etc/init cp etc/rc.d/rc.sysinit /etc/rc.d
重啓 reboot
四、小總結
最後總結一下,不管是重啓系統還是關閉系統,首先要運行sync命令,把內存中的數據寫到磁盤中。
sync 將數據由內存同步到硬盤中。
關機指令:
shutdown –h 10 計算機將在10分鐘後關機,並且會顯示在登陸用戶的當前屏幕中。
shutdown –h now 立馬關機
shutdown –h 20:25 系統會在今天20:25關機
shutdown –h +10 十分鐘後關機
halt 關閉系統
poweroff 關機
init 0 關機
重啓指令:
shutdown –r now 系統立馬重啓
shutdown –r +10 系統十分鐘後重啓
reboot 就是重啓,等同於 shutdown –r now
init 6 重啓