溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

發(fā)布時(shí)間:2020-07-16 13:48:14 來源:網(wǎng)絡(luò) 閱讀:11005 作者:fengliang123 欄目:移動(dòng)開發(fā)

一、CentOS 6 的啟動(dòng)流程

  • 第一步:加電自檢(POST)

    主要檢查硬件設(shè)備是否存在并能正常運(yùn)行,如:CPU、內(nèi)存、硬盤、風(fēng)扇、輸入輸出設(shè)備等。自檢功能主要是通過BIOS來實(shí)現(xiàn)的,BIOS程序是裝載在一個(gè)硬件芯片CMOS上的,加電過程就是給CMOS通電,然后啟動(dòng)BIOS程序,BIOS程序會(huì)根據(jù)CMOS上面的一些配置信息區(qū)讀取其他的硬件設(shè)備信息并檢測其是否存在并能正常運(yùn)行,之后進(jìn)行硬件設(shè)備的初始化。


  • 第二步:選擇啟動(dòng)順序,加載MBR

    按照BIOS中設(shè)置的Boot Sequence查找Boot Loader程序所在的設(shè)備。Boot Loader是一個(gè)程序,它依賴于一個(gè)硬件之上,這個(gè)硬件就是硬盤,準(zhǔn)確的說為第一個(gè)可以啟動(dòng)的硬盤的第一個(gè)扇區(qū)內(nèi),即MBR(Master Boot Record,主引導(dǎo)記錄)。

    Boot Loader的主要功能就是去識(shí)別、加載操作系統(tǒng)中的核心文件,并提交到內(nèi)存中運(yùn)行,進(jìn)而來啟動(dòng)對(duì)應(yīng)的操作系統(tǒng)。另一個(gè)主要功能是提供菜單信息(可以提供不同的啟動(dòng)項(xiàng)來加載不同的操作系統(tǒng)),并將啟動(dòng)管理功能轉(zhuǎn)交給其他的加載程序。


  • 第三步:加載系統(tǒng)內(nèi)核(Kernel)文件,執(zhí)行系統(tǒng)初始化信息

    Boot Loader程序讀取操作系統(tǒng)的內(nèi)核文件后,會(huì)將其解壓后裝載到內(nèi)存當(dāng)中,然后接管BIOS的工作開始測試并加載各個(gè)設(shè)備(CPU、硬盤、網(wǎng)卡等)。

    因?yàn)閮?nèi)核文件(Kernel)通常是存放在系統(tǒng)上的/boot目錄中,并且是以vmlinuz開頭的文件,此時(shí)內(nèi)存程序還沒有加載到硬盤,因此無法讀取系統(tǒng)上的內(nèi)核文件,而如果先去加載硬盤則必須有硬盤的驅(qū)動(dòng)程序,因此這將會(huì)產(chǎn)生一個(gè)先后順序的問題,為了解決這個(gè)問題,Linux采用GRUB啟動(dòng)管理程序來識(shí)別硬盤信息,RTUB程序的執(zhí)行過程需要三個(gè)階段,具體的執(zhí)行過程將在下面的第二章節(jié)介紹。


  • 第四步:啟動(dòng)第一個(gè)執(zhí)行程序/sbin/init

    在內(nèi)核、硬件及驅(qū)動(dòng)信息加載完畢后,內(nèi)核會(huì)呼叫用戶控件的第一個(gè)執(zhí)行程序/sbin/init,init程序主要功能是準(zhǔn)備軟件運(yùn)行環(huán)境,包括系統(tǒng)的主機(jī)名稱、網(wǎng)絡(luò)配置、文件系統(tǒng)格式等其他服務(wù)的啟動(dòng)管理。而這些所有的操作都是通過init的配置文件來定義的。

    CentOS 5 中 init 的配置文件為:/etc/inittab

    CentOS 6 中 init 的配置文件為:/etc/inittab,/etc/init/*.conf

    在init的配置文件中有個(gè)一非常重要的配置項(xiàng)目,那就是默認(rèn)的系統(tǒng)啟動(dòng)級(jí)別。啟動(dòng)級(jí)別是為系統(tǒng)維護(hù)的目的而設(shè)定的,其實(shí)現(xiàn)方式是關(guān)閉或啟動(dòng)對(duì)應(yīng)級(jí)別下的服務(wù)。以下為init的7個(gè)運(yùn)行級(jí)別:

    • 0:halt,關(guān)機(jī)

    • 1:Single user,單用戶模式,此級(jí)別允許以root用戶身份登錄,而無需認(rèn)證,相當(dāng)于windows的安全模式

    • 2:Multiuser,多用戶模式,需要用戶認(rèn)證,會(huì)啟動(dòng)網(wǎng)絡(luò)功能,但不會(huì)啟動(dòng)NFS

    • 3:Full multiuser,完全多用戶模式,文本界面

    • 4:unused,預(yù)留級(jí)別,目前無特別的使用目的

    • 5:X11,正常級(jí)別,也是完全多用戶模式,圖形界面

    • 6:reboot,重啟

通常使用較多的默認(rèn)級(jí)別為35服務(wù)器上一般默認(rèn)使用3級(jí)別,不同級(jí)別之間是可以進(jìn)行切換的,切換方式為:init [0-6],可以使用 who -r 或 run_leave命令查看運(yùn)行級(jí)別。

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)


  • 第五步:運(yùn)行系統(tǒng)初始化腳本

    根據(jù) init 的配置文件,先獲取默認(rèn)的 runlevel,然后再執(zhí)行 /etc/rc.d/rc.sysinit 腳本完成系統(tǒng)初始化。

    系統(tǒng)初始化腳本所做的事情主要有:

        1、設(shè)定主機(jī)名(讀取/etc/sysconfig/network文件)

        2、激活 SELinux 和 udev

        3、打印文本歡迎信息

        4、掛載所有定義在/etc/fstab文件中的文件系統(tǒng)

        5、激活 swap 設(shè)備

        6、檢測跟文件系統(tǒng),并實(shí)現(xiàn)以讀寫方式重新掛載

        7、設(shè)置系統(tǒng)時(shí)鐘

        8、根據(jù) /etc/sysctl.conf 文件設(shè)定內(nèi)核參數(shù)的值

        9、激活LVM和RAID設(shè)備

        10、加載額外的設(shè)備驅(qū)動(dòng)程序

        11、清理操作


  • 第六步:啟動(dòng)系統(tǒng)服務(wù)

    按照默認(rèn)級(jí)別的參數(shù)N,執(zhí)行 /etc/rcN.d/ 目錄下設(shè)定的關(guān)閉和啟動(dòng)相應(yīng)的服務(wù)。


  • 第七步:打印登錄提示符


二、GRUB程序的三個(gè)階段

  • stage1:運(yùn)行Boot Loader主程序,這個(gè)程序必須要被安裝在啟動(dòng)區(qū)(MBR)。因?yàn)镸BR空間有限,因此在MBR當(dāng)中僅安裝Boot Loader的最小主程序,并沒有安裝Boot Loader的相關(guān)配置文件。

  • stage1_5:存放在MBR隨后的扇區(qū)中,主要用于與stage2所在分區(qū)的文件系統(tǒng)進(jìn)行交互。

  • stage2:通過Boot Loader加載所有配置文件及相關(guān)的環(huán)境參數(shù)信息,這些配置文件及相關(guān)的環(huán)境參數(shù)都存放于磁盤分區(qū)上的/boot目錄下。

grup的配置文件路徑為:/boot/grub/grub.conf,內(nèi)容如下:

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • default:設(shè)定默認(rèn)啟動(dòng)的內(nèi)核和操作系統(tǒng),如果同時(shí)安裝了多個(gè)操作系統(tǒng)或內(nèi)核,0表示定義的第一個(gè)title系統(tǒng),1表示定義的第二個(gè)title系統(tǒng),依次類推;

  • timeout:設(shè)定系統(tǒng)啟動(dòng)時(shí)選擇操作系統(tǒng)菜單的等待時(shí)間,單位是秒(s);

  • splashp_w_picpath:設(shè)定系統(tǒng)啟動(dòng)時(shí)grub菜單的背景圖片。圖片格式為xpm,14bits顏色,大小為640*480,需要gzip壓縮;

  • hiddenmenu:隱藏選擇菜單,默認(rèn)情況下是不顯示菜單信息,如果想要顯示菜單,將該配置注釋即可;

  • title:定義一個(gè)操作系統(tǒng)或系統(tǒng)內(nèi)核,且包括下面內(nèi)容:

        root:指明引導(dǎo)當(dāng)前操作系統(tǒng)或內(nèi)核文件所在的分區(qū);

        kernel:指定文件路徑、根文件系統(tǒng)所在設(shè)備,以及傳遞給內(nèi)核的參數(shù)。由于啟動(dòng)過程中需要掛載跟目錄,因此需要指定根目錄所在的分區(qū)。內(nèi)核參數(shù) rhgb表示色彩顯示,quiet表示靜默模式加載內(nèi)核;

        initrd:指定用于輔助內(nèi)核完成系統(tǒng)啟動(dòng)的ramdisk文件路徑;


三、關(guān)于GRUB的調(diào)試

1、破解root用戶密碼

  • 第一步:系統(tǒng)啟動(dòng)時(shí)按任意鍵進(jìn)入GRUB菜單,動(dòng)作一定要快,默認(rèn)是5s的倒計(jì)時(shí)

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

如上圖所示,可以使用上下鍵選擇要啟動(dòng)的操作系統(tǒng)(這里只用一個(gè));

e可以對(duì)選擇的項(xiàng)進(jìn)行編輯;

按“a”可以對(duì)選擇的項(xiàng)進(jìn)行內(nèi)核參數(shù)修改;

按“c”可以進(jìn)入命令行模式;

  • 第二步:根據(jù)提示,選擇相應(yīng)的菜單,然后按“a”,在原有內(nèi)核參數(shù)的最后加上“1sSsingle”的任意一個(gè)參數(shù),表示進(jìn)入單用戶模式,然后按回車鍵啟動(dòng)系統(tǒng)


    CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第三步:以單用戶模式進(jìn)入系統(tǒng)后,使用passwd命令修改root用戶密碼,修改完之后重啟系統(tǒng)即可使用新的root用戶密碼登錄系統(tǒng)。


2、為GRUB菜單設(shè)置保護(hù)密碼

默認(rèn)情況下進(jìn)入GRUB菜單后不需要任何密碼就可以進(jìn)行編輯,相對(duì)來說是比較危險(xiǎn)的,因此可以修改 grub.conf 配置文件為GRUB菜單設(shè)置密碼保護(hù),在 grub.conf 文件中的title字段上面新增一行pwssword PASSWD,password支持命令口令和加密口令,具體設(shè)置如下圖所示:

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

md5加密口令的生成命令為:grub-md5-crypt

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

grub.conf文件中新增password后,再次進(jìn)入GRUB菜單時(shí)如果想要編輯則必須按“p”鍵,然后通過密碼驗(yàn)證后才能編輯,如下圖所示:

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

同理,在grub.conf 配置文件中的title內(nèi)添加password,可以保護(hù)內(nèi)核,即進(jìn)入系統(tǒng)時(shí)需要輸入密碼驗(yàn)證后才能啟動(dòng)。


3、取消圖形界面的啟動(dòng),使用文本界面啟動(dòng)

系統(tǒng)默認(rèn)的啟動(dòng)方式是圖形界面啟動(dòng),因此看不到系統(tǒng)的啟動(dòng)過程,可以通過修改 grub.conf 配置文件設(shè)置成文本界面啟動(dòng),生產(chǎn)環(huán)境下也建議使用文本界面啟動(dòng),因?yàn)檫@種啟動(dòng)方式可以看到整個(gè)過程,如果哪個(gè)服務(wù)在啟動(dòng)過程中出錯(cuò)可以及時(shí)發(fā)現(xiàn)。修改方法是把kernel參數(shù)中的rhgbquiet刪除。

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)


4、如果/boot下的文件損壞或丟失的恢復(fù)方法

  • 第一步:使用安裝光盤進(jìn)入救援模式,進(jìn)入時(shí)需要根據(jù)提示手動(dòng)選擇語言、鍵盤等

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

加載救援模式的過程中會(huì)提示硬盤上的系統(tǒng)已經(jīng)被找到并掛載到/mnt/sysp_w_picpath下,因此進(jìn)入救援模式后可以使用 chroot /mnt/sysp_w_picpath 命令切換到硬盤上操作系統(tǒng)的根目錄下,因?yàn)榫仍J较绿峁┑拿畋容^有限,好多命令都不支持。

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

如果進(jìn)入到救援模式后,沒有發(fā)現(xiàn)硬盤上的根文件系統(tǒng),則需要使用相關(guān)命令查找并分析根文件系統(tǒng)所在硬盤分區(qū)位置,如果硬盤使用的是普通分區(qū),則可以通過 blkid 命令和 fdisk -l 命令分析出根文件系統(tǒng)的分區(qū)位置,而如果硬盤使用的是LVM分區(qū),則可以使用 lvscan 命令查看分區(qū),并且需要使用 vgchange -ay 命令激活VG卷組。

分析出根文件系統(tǒng)所在分區(qū)后掛載根文件系統(tǒng),然后檢查并修改fstab文件,如果該文件丟失,則手動(dòng)創(chuàng)建一份,按照相應(yīng)格式在其中添加掛載根文件系統(tǒng)的條目,然后重啟系統(tǒng),直到能夠自動(dòng)檢測出硬盤上的系統(tǒng)并掛載到/mnt/sysp_w_picpath下為止。


  • 第二步:進(jìn)入到硬盤的根文件系統(tǒng)后,使用mount命令掛載光盤,比如將光盤掛載到/mnt/cdrom上:

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第三步:使用rpm命令安裝kernel包,安裝時(shí)會(huì)提示kernel已安裝,需要使用--force--replacepkgs選項(xiàng)強(qiáng)制安裝。安裝完之后會(huì)在/boot目錄下自動(dòng)生成initramfs文件和vmlinuz文件

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

vmlinuz-2.6.32-642.el6.x86_64initramfs-2.6.32-642.el6.x86_64.img 是系統(tǒng)啟動(dòng)時(shí)必要的兩個(gè)文件,缺一不可。

vmlinuz-2.6.32-642.el6.x86_64:內(nèi)核文件,如果只是該文件丟失,可以從光盤或者相同版本的操作系統(tǒng)上拷貝。

initramfs-2.6.32-642.el6.x86_64.img:虛擬文件系統(tǒng),通過Boot Loader程序能夠?qū)⑵浼虞d到內(nèi)存中,然后這個(gè)文件會(huì)被解壓縮并且在內(nèi)存中模擬一個(gè)跟文件系統(tǒng),這個(gè)跟文件系統(tǒng)能夠提供一個(gè)可以運(yùn)行的程序,通過該程序可以加載在啟動(dòng)過程中所需要的核心模塊(RAID、LVM、SCSI等文件系統(tǒng)與磁盤的驅(qū)動(dòng)程序),加載完成之后,會(huì)協(xié)助內(nèi)核重新呼叫/sbin/init來執(zhí)行后續(xù)的正常啟動(dòng)。如果只是該文件丟失,可以使用 mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 重新生成 。

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第四步:使用 grub-install 命令修復(fù)grub,需要注意的是該命令需要指定/boot目錄的父目錄,如果/boot的父目錄是根目錄(/),則可以省略 --root-directory=DIR 選項(xiàng)。該命令也可以修復(fù)/boot/grub下的文件

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第五步:在/boot/grub下創(chuàng)建 grub.conf 配置文件,配置文件內(nèi)容如下圖所示

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第六步:使用exit命令退出硬盤中的文件系統(tǒng),再使用reboot命令重啟系統(tǒng)


5、grub.conf文件損壞的修復(fù)

如果grub.conf文件損壞,則操作系統(tǒng)將不能正常啟動(dòng),此時(shí)手中如果有安裝光盤的話可以通過救援模式重新創(chuàng)建grub.conf文件,但如果沒有安裝光盤的話,可以通過以下方式修復(fù):

  • 第一步:如果grub.conf文件損壞,則系統(tǒng)系統(tǒng)時(shí)會(huì)自動(dòng)進(jìn)入grub的命令行模式,該模式下可以通過 help 命令查看幫助。使用root命令可以顯示當(dāng)前grub所在硬盤的分區(qū)位置;

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第二步:使用 root 命令指定內(nèi)核存放的位置;

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第三步:使用 kernel 命令設(shè)置kernel文件路徑及根文件系統(tǒng)所在設(shè)備,支持Tab命令補(bǔ)全;

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第四步:使用 initrd 命令設(shè)置initramfs路徑,支持Tab命令補(bǔ)全;

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第五步:使用 boot 命令啟動(dòng)系統(tǒng);

  • 第六步:系統(tǒng)啟動(dòng)后手工重新編寫 /boot/grub/grub.conf 配置文件。



四、在U盤上自制 Linux 系統(tǒng)


根據(jù) CentOS 6 的啟動(dòng)過程,可以在U盤上自制一個(gè)定制版的Linux系統(tǒng),首先需要?jiǎng)澐殖鲆粋€(gè)/boot分區(qū)和一個(gè)根(/)分區(qū),其次需要安裝grub,然后將內(nèi)核文件和initramfs文件放入到U盤的/boot目錄下,最后創(chuàng)建必要的配置文件,具體步驟如下:

  • 第一步:使用 fdisk 命令為U盤創(chuàng)建/boot分區(qū)根分區(qū),/boot分區(qū)(/dev/sdb1)大小為100M,根分區(qū)(/dev/sdb2)大小為6G

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第二步:格式化分區(qū),將/boot分區(qū)(/dev/sdb1)和根分區(qū)(/dev/sdb2)都格式化成ext4格式

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第三步:分別將U盤上的boot(/dev/sdb1)分區(qū)和根分區(qū)(/dev/sdb2)掛載到當(dāng)前系統(tǒng)的/mnt/boot/mnt/sysroot

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第四步:使用 grub-install 命令安裝grub,注意需要指定所掛載U盤/boot分區(qū)的父目錄為/mnt

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第五步:在/mnt/boot/grub目錄下創(chuàng)建grub.conf配置文件,該配置文件中需要在kernel參數(shù)配置項(xiàng)中關(guān)閉selinux,并指定init程序?yàn)?span >/bin/bash

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第六步:復(fù)制內(nèi)核文件和initramfs文件到/mnt/boot目錄下

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第七步:在/mnt/sysroot目錄下創(chuàng)建一級(jí)目錄

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第八步:在/mnt/sysroot/bin目錄下創(chuàng)建fstab的自動(dòng)掛載文件

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第九步:復(fù)制bash命令及相關(guān)庫文件,注意bash命令和庫文件的路徑一定要放對(duì),可以使用which命令查看bash路徑,使用ldd命令查看bash的依賴庫

CentOS6啟動(dòng)過程總結(jié)與GRUB問題修復(fù)

  • 第十步:參考第九步,根據(jù)需求復(fù)制相應(yīng)的命令及庫文件,可以使用腳本復(fù)制命令和庫,腳本內(nèi)容如下:

[root@localhost ~]# cat copycmd.sh 
#!/bin/bash
 
ch_root="/mnt/sysroot"
[ ! -d $ch_root ] && mkdir $ch_root
bincopy() {
    if which $1 &>/dev/null; then
        local cmd_path=`which --skip-alias $1`
        local bin_dir=`dirname $cmd_path`
        [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
        [ -f ${ch_root}${cmd_path} ] || cp -n $cmd_path ${ch_root}${bin_dir}
        return 0
    else
        echo "Command not found."
        return 1
    fi
}
 
libcopy() {
    local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
    for loop in $lib_list;do
        local lib_dir=`dirname $loop`
        [ -d ${ch_root}${lib_dir} ] || mkdir -p  ${ch_root}${lib_dir}
        [ -f ${ch_root}${loop} ] || cp -n $loop ${ch_root}${lib_dir}
    done
}
read -p "Please input a command: " command
while [ "$command" != "quit" ];do
    if bincopy $command ;then
        libcopy $command
    fi
    read -p "Please input a command or quit: " command
done


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI