一、前言
? ? 計算機開機是一個神秘的過程。我們只是按了開機鍵,就看到屏幕上的進度條或者一行行的輸出,直到我們到達登錄界面。然而,計算機開機又是個異常脆弱的過程,我們滿心期望的登錄界面可能并不會出現,而是一個命令行或者錯誤信息。了解計算機開機過程有助于我們修復開機可能出現的問題。
二、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/initcp?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 重啟
轉載于:https://blog.51cto.com/13869720/2164266