啟動流程游桩、模塊管理、BootLoader(Grub2)

系統(tǒng)啟動是一項非常復(fù)雜的程序耐朴,因為內(nèi)核得先檢測硬件并加載適當?shù)尿?qū)動程序后借卧,接下來則必須要調(diào)用程序來準備好系統(tǒng)運行的環(huán)境,讓用戶能夠順利操作主機系統(tǒng)筛峭。

如果你能夠理解開機的原理铐刘,那么將有助于你在系統(tǒng)出問題時能夠快速修復(fù)系統(tǒng)。而且還能夠順利的配置多重操作系統(tǒng)的多重引導(dǎo)問題影晓。

為了多重引導(dǎo)镰吵,就不能不學(xué)grub2這個Linux下優(yōu)秀的引導(dǎo)裝載程序(boot loader)。而且在系統(tǒng)運作期間挂签,你也要學(xué)會管理內(nèi)核模塊疤祭。


1、Linux的啟動流程分析

如果想要多重開機饵婆,如果root密碼忘記勺馆,如果/etc/fstab設(shè)置錯誤等,如何解決?

1.1草穆、啟動流程一覽

目前各大Linux distributions使用的主流 boot loader為grub2灌灾,早期是grub1或LILO。

以個人Linux主機為例悲柱,當按下電源后锋喜,電腦硬件會主動讀取BIOS或UEFI BIOS來載入硬件信息及進行硬件系統(tǒng)的自我測試。之后系統(tǒng)會主動去讀取第一個可開機的設(shè)備(由BIOS設(shè)置)豌鸡,此時就可以讀入引導(dǎo)裝載程序嘿般。

引導(dǎo)裝載程序可以指定使用哪個內(nèi)核文件來啟動,并實際加載內(nèi)核到內(nèi)存當中解壓縮與執(zhí)行直颅,此時內(nèi)核就可以在內(nèi)存中運行,并檢測所有硬件信息與加載適當?shù)尿?qū)動程序來使這部主機運行怀樟。等到內(nèi)核檢測硬件與加載驅(qū)動程序完畢后功偿,操作系統(tǒng)已在你的PC上面跑起來了。

主機系統(tǒng)運行后往堡,Linux才會調(diào)用外部程序開始準備軟件執(zhí)行的環(huán)境械荷,并實際加載系統(tǒng)運行所需的軟件程序。最后系統(tǒng)就會開始等待你的登錄與操作虑灰。

系統(tǒng)啟動過程如下:

1吨瞎,加載BIOS的硬件信息與進行自檢,并依據(jù)設(shè)置取得第一個可啟動的設(shè)備(硬盤穆咐,光盤颤诀,U盤);

2对湃,讀取并執(zhí)行第一個啟動設(shè)備內(nèi)MBR(主引導(dǎo)分區(qū))的 boot loader(如grub2)崖叫;

3,依據(jù) boot loader的設(shè)置加載Kernel拍柒,Kernel會開始檢測硬件與加載驅(qū)動程序心傀;

4,在硬件驅(qū)動成功后拆讯,Kernel會主動調(diào)用systemd進程(原來的init進程)脂男,并以default.targert流程開機;

systemd執(zhí)行sysinit.target初始化系統(tǒng)及basic.target準備作業(yè)系統(tǒng)种呐;

systemd啟動multi-user.target下的本機與服務(wù)器服務(wù)宰翅;

systemd執(zhí)行multi-user.target下的/etc/rc.d/rc.local文件;

systemd執(zhí)行multi-user.target下的getty.target及登錄服務(wù)爽室;

systemd執(zhí)行g(shù)raphical需要的服務(wù)

1.2堕油、BIOS,boot loader與Kernel加載

BIOS:不論傳統(tǒng)的BIOS還是UEFI BIOS都會被稱為BIOS;

MBR:雖然分割表有傳統(tǒng)MBR以及新式的GPT掉缺,不過GPT也保留一塊相容的MBR的區(qū)塊卜录,因此,底下的說明在安裝boot loader的部分眶明,都簡稱MBR艰毒。總之搜囱,MBR就代表該磁盤最前面可安裝boot loader的那個區(qū)塊丑瞧。

BIOS,開機自檢與MBR/GPT

由于不同的操作系統(tǒng)的文件格式各不相同蜀肘,因此我們必須要以一個開機管理程序來處理核心文件載入(load)的問題绊汹,因此這個開機管理程序就被稱為 boot loader。boot loader安裝在開機裝置的第一個扇區(qū)(sector)內(nèi)扮宠,也就是我們一直談?wù)摰腗BR西乖。

只要BIOS能夠檢測到你的磁盤(無論SATA還是IDE接口),那它就有辦法通過INT 13 這條信道來讀取該磁盤的第一個扇區(qū)內(nèi)的MBR坛增,這樣boot loader也就能夠被執(zhí)行获雕。

Tips:

我們知道每科硬盤的最前面區(qū)塊含有MBR或GPT分割表的提供loader的區(qū)塊,那么如果我的主機上面有兩個硬盤收捣,系統(tǒng)會去哪個硬盤的最前面區(qū)塊讀取boot loader呢届案?這個就要看BIOS的設(shè)定了。

基本上罢艾,我們常常講的 "系統(tǒng)的MBR" 其實指的是第一個開機裝置的MBR才對楣颠。需要注意。

Boot Loader的功能

loader最主要的功能是要認識操作系統(tǒng)的文件格式并載入內(nèi)核到內(nèi)存中去執(zhí)行咐蚯,由于不同的操作系統(tǒng)的文件格式不一致球碉,因此每種作業(yè)系統(tǒng)都有自己的boot loader。

多重操作系統(tǒng)仓蛆?必須要使用自己的loader才能夠載入屬于自己的操作系統(tǒng)內(nèi)核睁冬;但系統(tǒng)的MBR只有一個,那么怎么樣同時在一臺主機上面安裝Linux和Windows呢看疙?

其實每個文件系統(tǒng)(filesystem)分區(qū)(partition)都會保留一塊開機磁區(qū)(boot sector)提供作業(yè)系統(tǒng)安裝boot loader豆拨,而通常操作系統(tǒng)默認會安裝一份loader到他根目錄所在的文件系統(tǒng)的boot sector上。

boot sector與操作系統(tǒng)的關(guān)系

如圖所示能庆,每個操作系統(tǒng)都會安裝一套boot loader到它自己的文件系統(tǒng)中施禾。Linux安裝時,可以選擇將boot loader安裝到MBR去搁胆,也可以選擇不安裝弥搞。Windows默認將MBR和boot sector都安裝boot loader邮绿。所以,你會發(fā)現(xiàn)安裝多重操作系統(tǒng)時攀例,你的MBR常常會被不同的操作系統(tǒng)的boot loader所覆蓋船逮。

雖然各個操作系統(tǒng)都可以安裝一份boot loader到他們的boot sector中,這樣操作系統(tǒng)可以通過自己的boot loader來載入核心粤铭⊥谖福可問題是MBR只有一個,要如何執(zhí)行boot sector內(nèi)的loader呢梆惯?

boot loader的主要功能是:

提供選單酱鸭,使用者可以選擇不同的開機項目,這也是多重開機的功能垛吗;

載入核心文檔凹髓,直接指向可開機的程序區(qū)段來開始作業(yè)系統(tǒng);

轉(zhuǎn)交其他loader怯屉,將開機管理功能轉(zhuǎn)交給其他loader負責蔚舀;

由于具有控制權(quán)轉(zhuǎn)交的功能,因此可以載入其他boot sector內(nèi)的loader蚀之。不過Windows的loader默認不具有控制權(quán)轉(zhuǎn)交功能蝗敢,因此不能使用Windows的loader來載入Linux的loader捷泞,所以為什么需要先裝Windows再裝Linux足删。


引導(dǎo)裝載程序菜單功能與控制權(quán)轉(zhuǎn)交示意圖

選單一:MBR(grub2) --> kernel file --> booting;

選單二:MBR(grub2) --> boot sector(Windows loader) --> Windows kernel --> booting锁右;

選單三:MBR(grub2) --> boot sector(grub2) --> kernel file --> booting失受;

加載內(nèi)核檢測硬件與initramfs的功能

當由boot loader的管理而開始讀取內(nèi)核文件后,Linux就會將內(nèi)核解壓縮到內(nèi)存中咏瑟,并利用內(nèi)核的功能開始測試與驅(qū)動各周邊設(shè)備拂到。此時,Linux內(nèi)核會以自己的功能重新偵測一次硬件码泞,而不一定會使用BIOS檢測的硬件兄旬。

一般來說,內(nèi)核文件放置在/boot里余寥,并取名為/boot/vmlinuz领铐。

Linux內(nèi)核模塊放置在/lib/modules/ 目錄內(nèi)(/lib不可與/放置于不同的分區(qū)),因為在開機過程中內(nèi)核必須要先掛載根目錄宋舷,這樣才能夠讀取內(nèi)核模塊來載入驅(qū)動程序绪撵。


一般來說,非必要的功能且可以編譯成模塊的內(nèi)核功能祝蝠,目前的Linux distributions都會將它編譯成模塊音诈。如USB幻碱,SATA等設(shè)備的驅(qū)動程序通常都是以模塊的方式存在的。

但是细溅,內(nèi)核根本不認識SATA磁盤褥傍,所以需要載入SATA磁盤的驅(qū)動,否則根本就無法掛載根目錄谒兄。但是SATA的驅(qū)動在/lib/modules內(nèi)摔桦,你根本無法掛載 /目錄 又怎么讀取到/lib/modules內(nèi)的驅(qū)動呢?


這時候就需要通過虛擬文件系統(tǒng)來解決了承疲。虛擬文件系統(tǒng)(Initial RAM Disk(Filesystem))邻耕,一般的文件名為/boot/initrd或/boot/initramfs。它能夠通過boot loader來載入到內(nèi)存中燕鸽,然后這個文檔會被解壓縮并且在內(nèi)存中模擬成一個根目錄兄世,且此模擬在內(nèi)存中的文件系統(tǒng)能夠提供一支可執(zhí)行的程序,通過該程序來載入開機過程中所需要的核心模塊啊研,通常這些模塊就是USB御滩,RAID,LVM党远,SCSI等文件系統(tǒng)與磁盤的驅(qū)動程序削解。

BIOS與boot loader及內(nèi)核載入流程

在核心完整載入后,你的主機應(yīng)該就開始正常的運作了沟娱,接下來就要開始執(zhí)行系統(tǒng)的第一支進程:systemd氛驮!

1.3、第一個進程systemd及使用default.target進入開機程序分析

在內(nèi)核載入完畢济似,硬件檢測驅(qū)動載入后矫废,此時內(nèi)核就會主動呼叫第一個進程--systemd(PID為1)。systemd最主要的功能就是準備軟件執(zhí)行的環(huán)境(包括系統(tǒng)主機名砰蠢、網(wǎng)絡(luò)蓖扑、語系拨匆、文件系統(tǒng)格式及其他服務(wù)的啟動)颁股。所有的動作都會通過systemd的預(yù)設(shè)啟動服務(wù)集合舱呻,亦即/etc/systemd/system/default.target來規(guī)劃物邑。另外察署,systemd已經(jīng)舍棄沿用多年的system V的runlevel了哦茁裙!

常見的操作環(huán)境target與相同的runlevel等級

過去的system V使用的是runlevel(執(zhí)行等級)的概念來啟動系統(tǒng)娘赴,systemd也與runlevel相結(jié)合扔傅。

對應(yīng)關(guān)系
對應(yīng)關(guān)系

systemd的處理流程

當我們?nèi)〉昧?etc/systemd/system/default.target這個預(yù)設(shè)操作界面的設(shè)置之后碰声,系統(tǒng)會到/usr/lib/systemd/system/這個目錄下去取得multi-user.target或graphical.target之一诡蜓。

假設(shè)我們使用的是graphical.target,接下來systemd回去找兩個地方的設(shè)置:

/etc/systemd/system/graphical.target.wants/ :使用者設(shè)置載入的unit胰挑;

/usr/lib/systemd/system/graphical.target.wants/:系統(tǒng)預(yù)設(shè)載入的unit蔓罚;

/usr/lig/systemd/system/graphical.target

上圖表示graphical.target必須要完成multi-user.target之后才能進行椿肩,進行完graphical.target之后,還得要display-manager.service才行豺谈。那通過同樣的方式郑象,我們來看看multi-user.target的啟動需要載入那些項目。

/usr/lib/systemd/system/multi-user.target

如上茬末,multi-user.target需要在basic運行完畢后才能載入上訴許多unit哩厂榛。

Tips:

要知道系統(tǒng)的服務(wù)啟用流程,最簡單可使用“ systemctl list-dependencies graphcial.target”丽惭,如果想要知道背后的設(shè)定意義击奶,那就分別找出/etc與/usr/lib下面的wants文件,當然還有Requires這個設(shè)定值责掏。

基本上Centos7.x開機流程是這樣:

1柜砾,local-fs.target+swap.target:這兩個主要掛載本機/etc/fstab里面與相關(guān)內(nèi)存交換空間;

2换衬,sysinit.target:主要檢測硬件痰驱,載入所需的內(nèi)核模塊等;

3瞳浦,basic.target:載入主要的硬件驅(qū)動與防火墻相關(guān)任務(wù)担映;

4,multi-user.target:載入其他一般系統(tǒng)或網(wǎng)絡(luò)服務(wù)載入叫潦;

5蝇完,graphical.target:載入圖形界面相關(guān)服務(wù)。


1.4诅挑、systemd執(zhí)行sysinit.target初始化系統(tǒng)四敞,basic.target準備系統(tǒng)

基本上泛源,可以把sysinit.target這些服務(wù)分成幾大類:

特殊文件系統(tǒng)設(shè)備的掛載拔妥;

特殊文件系統(tǒng)的啟用;

開機過程的信息傳輸與動畫執(zhí)行达箍;

日志文件的使用没龙;

載入額外內(nèi)核模塊;

設(shè)定終端機(console)字形缎玫;

啟動動態(tài)設(shè)備管理員硬纤;


不論使用哪種操作環(huán)境來使用系統(tǒng),這個sysinit.target都是必要的工作赃磨。


basic.target這個項目筝家,它主要啟動的服務(wù)有:

載入alsa音效驅(qū)動;

載入firewalld防火墻邻辉;

載入CPU的微指令功能溪王;

啟動與設(shè)置SELinux的安全文本腮鞍;

將目前的開機所產(chǎn)生的信息寫入/var/log/dmesg中;

由/etc/sysconfig/modules/*.modules及/etc/rc.modules載入管理員指定的模塊莹菱;

載入systemd支援的timer功能移国;

在這個階段完成后,系統(tǒng)已經(jīng)可以順利運作道伟。就差一堆你需要的登錄服務(wù)迹缀、網(wǎng)絡(luò)服務(wù)、認證服務(wù)等蜜徽。


1.5祝懂、systemd啟動multi-user.target下的服務(wù)

一般來說,服務(wù)的啟動腳本設(shè)置都放置于一下目錄:

/usr/lib/systemd/system??(系統(tǒng)默認服務(wù)啟動腳本)??

/etc/systemd/system??(管理員自己開發(fā)與設(shè)置的腳本)??


使用者針對主機的服務(wù)的各項unit若要enable的話拘鞋,就是將它放到/etc/systemd/system/multi-user.target.wants/目錄下面去做個連接嫂易,這樣就可以在開機時會自動啟動它。

mongod開機自啟詳細


相容的system V的rc-local.service

老版的Linux里掐禁,系統(tǒng)完成開機后還想要讓系統(tǒng)額外執(zhí)行某些程序怜械,可以將該程序或腳本放入到/etc/rc.d/rc.local下去。

新版Linux的systemctl機制中傅事,建議直接寫一個systemd的啟動腳本文件到/etc/systemd/system下缕允,然后用systemctl enable啟動它。

但是放置到/etc/rc.d/rc.local下的腳本systemd也支持蹭越,那就是rc-local.service這個服務(wù)障本。這個服務(wù)不需要啟動,它會判斷/etc/rc.d/rc.local是否具有可執(zhí)行的權(quán)限來判斷要不要啟動這個服務(wù)响鹃。

/etc/rc.d/rc.local


提供tty界面與登入的服務(wù)

能不能提供登錄服務(wù)也是multi-user.target底下的內(nèi)容驾霜,包括systemd-logind.service,systemd-user-sessions.service等服務(wù)买置。

如果getty服務(wù)先啟動完畢粪糙,你會發(fā)現(xiàn)有可用的終端嘗試讓你登錄系統(tǒng)。問題是忿项,如果systemd-logind.service或systemd-user-sessions.service服務(wù)未啟動完畢的話蓉冈,那么你還是無法登錄系統(tǒng)的。這就能解釋為什么我們在剛開機時可能輸入了正確的賬號密碼卻無法登錄系統(tǒng)轩触。


1.6寞酿、systemd啟動graphical.target底下的服務(wù)

graphical.target,systemd就會開始載入用戶管理服務(wù)與圖形界面管理員(window display manager脱柱,DM)等伐弹,啟動圖形界面來讓用戶以圖形的界面登錄系統(tǒng)。

graphical.target啟動依賴


multi-user.target啟動依賴

graphical.target相較于multi-user.target多的那幾項大多數(shù)是圖形界面賬號管理的功能榨为,gdm.service是讓使用者利用圖形界面登錄的服務(wù)惨好。


1.7椅邓、開機過程中會用到的主要配置文件

基本上,systemd有自己的配置文件處理方式昧狮,不過為了相容于system V景馁,很多的服務(wù)腳本文件還是會讀取位于/etc/sysconfig/ 下的配置文件。


關(guān)于模塊:/etc/modprobe.d/*.conf以及/etc/modules-load.d/*.conf

有兩個地方可以處理模塊載入問題:

/etc/modules-load.d/*.conf ? ?#單純要內(nèi)核載入模塊的位置逗鸣;

/etc/modprobe.d/*.conf ? ?#可以加上模塊參數(shù)的位置合住;

如果你有某些特定的參數(shù)要處理時,就得要在這兩者進行撒璧。

/etc/sysconfig/*

/etc/sysconfig/

authconfig:

規(guī)范使用者的身份認證機制透葛,包括是否使用本機的/etc/passwd,/etc/shadow等卿樱,以及/etc/shadow密碼記錄使用何種加密算法等僚害。使用“authconfig-tui指令來修改較佳!”

cpupower:

如果有啟動cpupower.service這個服務(wù)繁调,他就會讀取這個配置文件萨蚕。主要是Linux核心如何操作CPU的原則。

firewalld蹄胰,iptables-config岳遥,ip6tables-config,ebtables-config:

與防火墻服務(wù)啟動的參數(shù)有關(guān)裕寨。

network-scripts/:

主要用于網(wǎng)卡配置浩蓉。



2、內(nèi)核與內(nèi)核模塊

在開機過程中宾袜,是否能夠成功的驅(qū)動我們主機的硬件設(shè)備捻艳,是內(nèi)核(Kernel)的工作!而內(nèi)核一般都是壓縮檔庆猫,因此在使用內(nèi)核之前认轨,得先將它解壓縮后,才能加載到內(nèi)存中阅悍。

目前的內(nèi)核都是具有可讀取模塊化驅(qū)動程序的功能好渠,即所謂的“modules”(模塊化)功能昨稼,所謂的模塊化可以將它想象出一個插件节视,該插件可能由硬件開發(fā)廠商提供或我們的內(nèi)核本來就支持。

內(nèi)核與內(nèi)核模塊放在哪假栓?

內(nèi)核:/boot/vmlinuz寻行;

內(nèi)核解壓縮所需RAMDisk:/boot/initramfs(/boot/initramsfs-$Version);

核心模塊:/lib/modules/$version/kernel或/lib/modules/$(uname -r)/kernel匾荆;

核心原始碼:/usr/src/linux或/usr/src/kernels/(要安裝了才會有拌蜘,默認不安裝)


如果內(nèi)核被順利加載到系統(tǒng)中杆烁,會有以下幾個信息被記錄下來

內(nèi)核版本:/proc/version;

系統(tǒng)內(nèi)核功能:/proc/sys/kernel/


問題來了简卧,如果我有一個新硬件兔魂,偏偏我的操作系統(tǒng)不支持,怎么辦举娩?

重新編譯內(nèi)核析校,并加入最新的硬件驅(qū)動程序源碼;

將該硬件的驅(qū)動程序編譯成為模塊铜涉,在啟動時加載該模塊智玻。


2.1、內(nèi)核模塊與依賴性

核心模塊放在/lib/modules/$(uname -r)/kernel中芙代,里面分成這幾個目錄

arch:與硬件平臺有關(guān)的項目吊奢,如CPU的等級;

crypto:核心所支持的加密技術(shù)纹烹,如md5或des等页滚;

drivers:一些硬件驅(qū)動程序,如顯卡網(wǎng)卡等铺呵;

fs:內(nèi)核所支持的filesystem逻谦,如vfat,nfs等陪蜻;

lib:一些函數(shù)庫邦马;

net:與網(wǎng)絡(luò)有關(guān)的各項協(xié)定資料,防火墻模塊等宴卖;

sound:與音效有關(guān)模塊組


Linux提供了一些模塊組依賴性解決方案滋将,那就是檢查/lib/modules/$(uanme -r)/modules.dep這個文件,它記錄了在核心支援的模塊的各項依賴性症昏。利用depmod命令即可随闽。

depmod命令

Kernel內(nèi)核模塊擴展名一定是以.ko結(jié)尾的。


2.2肝谭、內(nèi)核模塊的查看

lsmod ? ?#查看目前內(nèi)核加載了多少模塊

lsmod

顯示內(nèi)容有:

模塊名稱(Module)掘宪;

模塊的大小(Size)攘烛;

模塊是否被其他模塊所使用的(Used by)魏滚; ? ?#如上,nf_nat_masquerade_ipv4先被載入后坟漱,ipt_MASQUERADE才能進一步載入系統(tǒng)鼠次。

使用modinfo命令查詢模塊信息

modinfo命令


2.3、內(nèi)核模塊的加載如刪除

如何手動加載模塊?

使用 modprobe 這個命令來載入模塊腥寇,因為modprobe會主動去搜尋modules.dep的內(nèi)容成翩,先克服模塊的依賴性才決定需要載入的模塊有哪些。

insmod命令則完全有用戶自行加載一個完整文件名的模塊赦役,并不會主動分析模塊依賴性麻敌。使用rmmod刪除這個模塊。

insmod
rmmod


使用insmod或rmmod命令的問題是掂摔,你必須自行找到模塊的完整文件名才行庸论,萬一模塊有依賴性的問題時,你將無法直接加載或刪除該模塊棒呛。所以聂示,建議使用modprobe命令。

modprobe



3簇秒、Boot Loader:Grub2

BootLoader是加載內(nèi)核的重要工具鱼喉,沒有BootLoader,Kernel根本無法被載入系統(tǒng)趋观。

Centos7已將沿用多年的BootLoader從grub換成了grub2扛禽。


3.1、BootLoader的兩個stage

我們知道皱坛,MBR是整個磁盤的第一個sector內(nèi)的一個區(qū)塊编曼,充其量整個大小也才446Byte。即使是GPT也沒有很大的磁區(qū)來儲存loader的資料剩辟。所以Linux將boot loader的程序代碼執(zhí)行與設(shè)置值加載分成兩個階段(stage)來執(zhí)行掐场。

Stage1:執(zhí)行boot loader主程序

第一階段執(zhí)行boot loader的主程序,這個主程序必須要被安裝在開機區(qū)贩猎,亦即是MBR或boot sector熊户。但因為MBR實在太小了,所以MBR或boot sector通常僅安裝boot loader的最小主程序吭服,并沒有安裝loader的相關(guān)配置文件嚷堡。

Stage2:主程序加載配置文件

第二階段為通過boot loader加載所有配置文件與相關(guān)的環(huán)境參數(shù)配置文件包括文件系統(tǒng)定義與主要配置文件grub.cfg),一般來說艇棕,配置文件都在/boot下蝌戒。


與grub2有關(guān)的文件都放在/boot/grub2:

/boot/grub2


3.2、grub2的配置文件/boot/grub2/grub.cfg

grub2功能挺多的:

認識與支援較多的文件系統(tǒng)沼琉,并且可以使用grub2的主程序直接在文件系統(tǒng)中查找內(nèi)核文件名北苟;

啟動的時候,可以自行編輯與修改啟動設(shè)置選項刺桃,類似bash的命令模式粹淋;

可以動態(tài)查找配置文件吸祟,而不需要在修改配置文件后重新安裝grub瑟慈。即只需修改/boot/grub2/grub.cfg里面的設(shè)置就行桃移,下次開機就生效。

#其實這三點就是Stage1葛碧,2分別安裝在MBR與文件系統(tǒng)中的原因。


硬盤與分割槽在grub2中的代號

grub2是如何識別磁盤的呢?

跟/dev/sda1不相同纯衍。其實只要注意這幾個東西就行:

硬盤代號以小括號()包起來竖共;

硬盤以hd表示,后面會接一組數(shù)字乳绕;

以“查找順序”為硬盤的編號绞惦,而不是依照電纜的排序;

第一個查找的硬盤為0號洋措,第二個為1號济蝉,以此類推;

每塊硬盤的第一個分區(qū)代號為1菠发,依序類推王滤;

所以說,第一個查找到的磁盤為“hd0”滓鸠,而該磁盤的第一個分區(qū)為(hd0雁乡,1)。

硬盤代號


/boot/grub2/grub.cfg配置文件

不要隨便改動grub.cfg配置文件糜俗。

在grub.cfg開始部分踱稍,大多是環(huán)境設(shè)置與預(yù)設(shè)值等,比較重要的默認由哪個選項開機(set default)以及默認的秒數(shù)(set timeout)悠抹,再則就是每個選單的設(shè)定寞射,在menuentry這個設(shè)置值后的項目。包括了--class锌钮,--unrestricted等制定項目桥温,之后通過{ }將選單會用到的資料框起來。grub2會載入模塊梁丘。

比較重要的三個項目:

set root='hd0侵浸,gpt2' ? #這root是指grub2配置文件所在的那個設(shè)備;

linux16/vmlinuz-xxxxx/centos-root = xxx ? ?#這是Linux內(nèi)核文件以及內(nèi)核執(zhí)行時所下達的參數(shù)氛谜;

initrd16/initramfs-3.10... ? ?#這是initramfs所在的文件名


3.3掏觉、grub2配置文件維護/etc/default/grub與/etc/grub.d

通過/etc/default/grub這個主要環(huán)境配置文件與/etc/grub.d/目錄內(nèi)相關(guān)配置文件來處理grub.cfg比較妥當。


/etc/default/grub主要環(huán)境配置文件

/etc/default/grub

幾個重要的設(shè)定選項:

倒數(shù)時間參數(shù):GRUB_TIMEOUT值漫;

是否隱藏菜單選項:GRUB_TIMEOUT_STYLE澳腹;

信息輸出的終端機模式:GRUB_TERMINAL_OUTPUT; ? ?#主要有console,serial酱塔,gfxterm沥邻,vga_text等;

默認開機選項:GRUB_DEFAULT ? ?#能使用的值包括有saved羊娃,數(shù)字唐全,title名,ID名等蕊玷;

內(nèi)核的額外參數(shù)功能:GRUB_CMDLINE_LINUX ? ?#如果你的核心在啟動的時候還需要加入額外的參數(shù)邮利,那就在這里加入吧。

#GRUB_CMDLINE_LINUX="..... crashkernel=auto rhgb quiet elevator=deadline"

這些主要環(huán)境設(shè)置完畢后垃帅,必須要使用?grub2-mkconfig?來重建grub.cfg才行延届。但不必重啟系統(tǒng),是不是很方便了贸诚!

grub2-mkconfig? -o? /boot/grub2/grub.cfg


自己額外設(shè)定的項目方庭,就是寫入/etc/default/grub就行了。

假設(shè)你需要(1)開機選單等待40 秒鐘赦颇、 (2)預(yù)設(shè)用第一個選單開機二鳄、 (3)選單請顯示出來不要隱藏、 (4)核心外帶『elevator=deadline』的參數(shù)值媒怯, 那應(yīng)該要如何處理grub.cfg 呢订讼?

自定義


選單建置的腳本/etc/grub.d/*

其實grub2-mkconfig會去分析/etc/grub.d/*里面的文件,然后執(zhí)行該文件的來構(gòu)建grub.cfg的啦扇苞。一般來說欺殿,/etc/grub.d/*下會有這些文件存在:

/etc/grub.d/

00_header:主要在建立初始的顯示項目,包括需要載入的模塊分析鳖敷、屏幕終端格式脖苏,倒數(shù)秒數(shù)、菜單隱藏等定踱,大部分在/etc/default/grub里所設(shè)置的便是棍潘,都會在這個腳本中被利用來重建grub.cfg;

10_linux:根據(jù)分析/boot下的文件崖媚,嘗試找到正確的linux內(nèi)核與讀取這個內(nèi)核需要的文件系統(tǒng)模塊與參數(shù)等亦歉,都在這個腳本運行后找到并設(shè)置到grub.cfg中;

30_os-prober:這個腳本默認會到系統(tǒng)上找其他的partition里面可能包含的操作系統(tǒng)畅哑,然后將該操作系統(tǒng)做成選項來處理就是了肴楷;

40_custom:如果你還有其他想要自己手動加上去的選單項目,或者是其他需求荠呐,那么建議在這里補充赛蔫。


所以砂客,一般來說,我們會修改的僅有40_custom這個文件呵恢。我們知道鞠值,menuentry就是一個選項,那后續(xù)的項目有哪些呢瑰剃?常見有這幾項:

直接指定內(nèi)核開機齿诉;

通過chainloader的方式移交loader的控制權(quán)筝野;


3.4晌姚、initramfs的重要性 與 建立initramfs文件

initramfs內(nèi)所包含的模塊大多是與開機過程有關(guān),而主要以文件系統(tǒng)及硬盤模塊(USB歇竟、SCSI等)為主挥唠。

一般來說,需要initramfs的時刻為:

根目錄所在磁盤為SATA焕议、USB或SCSI等連接宝磨;

根目錄所在磁盤文件系統(tǒng)為LVM、RAID等特殊格式盅安;

根目錄所在文件系統(tǒng)為非傳統(tǒng)Linux認識的文件系統(tǒng)時唤锉;

其他必須要在內(nèi)核加載時提供的模塊;

#早期的IDE硬盤沒有initramfs也可開機(Linux內(nèi)核能直接識別)别瞭,但自從SATA硬盤后窿祥,沒有initramfs就無法開機,因為內(nèi)核無法識別需要先載入SCSI模塊來驅(qū)動蝙寨。


一般來說晒衩,各distribution提供的內(nèi)核都會附上initramfs文件,但如果有需要想重制initramfs文件的話墙歪,可以使用 dracut(Centos7)/mkinitrd(老版) 來處理听系。

dracut

dracut


dracut


3.5、測試與安裝grub2

如果Linux主機使用的本來就是grub2就不用安裝了虹菲。

首先靠胜,必須要使用grub-install將一些文件復(fù)制到/boot/grub2里面去。

grub2-install

基本上毕源,grub2-install大概僅能安裝grub2主程序到boot sector中去浪漠,如果后面的設(shè)備是整個系統(tǒng)(/dev/sda...),那loader程序才會寫入到MBR里去脑豹。

如果是從其他boot loader轉(zhuǎn)成grub2時郑藏,得先使用grub2-install安裝grub2配置文件;

如果安裝到分區(qū)時瘩欺,可能需要加上額外的許多參數(shù)才能順利安裝必盖;

開始編輯/etc/default/grub及/etc/grub.d/*這幾個重要文件拌牲;

使用grub2-mkconfig -o /boot/grub2/grub.cfg來建立開機的配置文件


依據(jù)3.3 小節(jié)的第一個練習(xí),我們的測試機目前為40 秒倒數(shù)歌粥,且有一個強制進入圖形界面的『 My graphical CentOS7 』選單塌忽!現(xiàn)在我們想要多加兩個選單,一個是回到MBR 的chainloader失驶,一個是使用/dev/vda4 的chainloader土居,該如何處理?

修改40_custom 成為這樣:


3.6嬉探、開機前的額外功能修改

開機的默認選項擦耀,還可以進行g(shù)rub2的修改功能。

grub2開機畫面


由于默認選項沒有隱藏涩堤,因此直接看到了五個選項眷蜓。同時會讀秒。選項部分的畫面其實就是menuentry后面的文字√ノВ現(xiàn)在知道如何修改menuentry后面的文字了吧吁系。點擊“Goto MBR”與“Goto /dev/vda4”又會重新回到選項,因為這兩個都是我們自定義的重新讀取選項文件白魂。

有一個?'e'(edit)汽纤,這是grub2支援修改指令。這是很有用的功能福荸,如你剛剛將grub.cfg的內(nèi)容寫錯了蕴坪,導(dǎo)致無法開機。我們就可以查閱menuentry選項并加以修改哦逞姿。

按'e'進入以下畫面:

grub2額外的命令編輯模式



3.7辞嗡、關(guān)于開機畫面與終端機畫面的圖形顯示方式

如果想讓開機畫面使用圖形顯示方式,例如使用中文來顯示你的畫面滞造。

效果圖


3.8续室、為個別選項加上密碼

使用者可以在開機過程中與grub2內(nèi)選擇進入某個選項,以及進入grub命令模式去修改選項的參數(shù)資料等谒养。如何讓某些密碼控制grub2的所有功能挺狰,某些密碼則只能進入個別選項開機呢?這就牽涉到grub2的賬號機制了买窟。


grub2的賬號丰泊、密碼與選項的設(shè)置

grub2有點在模擬Linux的賬號管理方案。在grub2中始绍,有針對兩種身份進行密碼設(shè)置:

superusers:設(shè)置系統(tǒng)管理員與相關(guān)參數(shù)還有密碼等瞳购,使用這個密碼的用戶,可在grub2內(nèi)具有所有修改的權(quán)限亏推。但一旦設(shè)置了這個superusers參數(shù)学赛,則所有的指令修改竟會被變成受限制的年堆!

users:設(shè)置一般賬號的相關(guān)參數(shù)與密碼,可以設(shè)置多個用戶盏浇。使用這個密碼的用戶可以選擇要進入某些選項 变丧。不過,選項也得要搭配相對的賬號才行绢掰。

假設(shè)你的系統(tǒng)有三個各別的操作系統(tǒng)痒蓬,分別安裝在(hd0,1), (hd0,2), (hd0,3) 當中。假設(shè)(hd0,1) 是所有人都可以選擇進入的系統(tǒng)滴劲, (hd0,2) 是只有系統(tǒng)管理員可以進入的系統(tǒng)攻晒,(hd0,3)則是另一個一般用戶與系統(tǒng)管理員可以進入的系統(tǒng)。

另外哑芹,假設(shè)系統(tǒng)管理員的帳號/密碼設(shè)定為?zhang/abcd1234炎辨, 而一般帳號為 user/dcba4321 捕透,那該如何設(shè)定聪姿?

如果依據(jù)上述的說明,其實沒有用到Linux 的linux16 與initrd16 的項目乙嘀,只需要chainloader 的項目而已末购!

因此,整個grub.cfg 會有點像底下這樣喔:

如上所示虎谢,你得要使用superusers來指定那個賬號是管理員盟榴。另外,這個賬號與Linux實體賬號無關(guān)婴噩。這僅是用啦判斷密碼所代表的意思擎场。而密碼的給予有兩種語法:

password_pbkdf2,帳號使用grub2-mkpasswd-pbkdf2所產(chǎn)生的密碼几莽;

password帳號沒加密的明文迅办;


有了帳號密碼之后,再來就是個別選項上?是否要取消限制(--unrestricted)?或者是給予 哪個用戶(--users)的設(shè)定項目章蚣。所有的系統(tǒng)管理員所屬的密碼應(yīng)該是能夠修改所有的選項站欺。

grub2密碼設(shè)置的文件位置與加密的密碼

還記得/etc/grub.d/*里面的文件嗎,那些數(shù)字順序就是grub.cfg的來源順序纤垂。因此最早被讀的應(yīng)該是00_header(不建議修改)矾策,自己可以建一個名為01_users的文件,然后將賬號密碼參數(shù)寫進去峭沦。

向01_users中添加賬戶和密碼


接下來看看每個menuentry要如何修改贾虽?

為個別的選項設(shè)置賬號密碼的使用模式

根據(jù)之前的設(shè)置,目前我們的Linux系統(tǒng)選項有五個:

來自/etc/grub.d/10_linux這個文件主動檢測的兩個menuentry吼鱼;

來自/etc/grub.d/40_custom這個自己設(shè)定的三個menuentry蓬豁;

假設(shè)我們在40_custom里面增加一個可以進入救援模式(rescue)的環(huán)境履磨,并放置到最后一個選項中,同時僅有知道dmtsai的密碼才能使用庆尘。

修改完了不要忘了重建一下grub.cfg啰剃诅。重新開機測試一下結(jié)果。

默認的選項環(huán)境

選項4,5會需要輸入賬號密碼

需要輸入賬號密碼的環(huán)境
Problem



4驶忌、開機過程的問題解決

很多時候矛辕,我們可能做了某些操作導(dǎo)致系統(tǒng)無法正常開機,這時可以進入rescue模式去處理付魔。


4.1聊品、忘記root密碼的解決之道

其實在Linux環(huán)境中root密碼忘記時還可以挽救。只要能夠進入并掛載 " / "几苍,然后重設(shè)root密碼就可以了翻屈。

只是在新版的systemd管理機制中,默認的rescue模式無法直接取得root權(quán)限妻坝,還是得要使用root密碼才能登錄rescue環(huán)境伸眶。不過還是可以通過一個名為?"rd.break"?的內(nèi)核參數(shù)來處理。

需要注意刽宪,rd.break是在Ram Disk里面的操作系統(tǒng)狀態(tài)厘贼,因此不能直接取得原本的Linux系統(tǒng)操作環(huán)境。所以還需要chroot的支援圣拄∽旖眨可能由于SELinux的問題,你還得加上某些特殊流程才能順利搞定root密碼的救援庇谆。

現(xiàn)在來操作一下吧岳掐!進入開機grub時按e進入編輯模式,在 linux16那一行末尾使用這個參數(shù)饭耳。

加上rd.break參數(shù)

改完之后不要返回串述,直接按 [ ctrl + x ]開始開機。

開機完成后會出現(xiàn)如下畫面哥攘,此時你應(yīng)該是在RAM Disk的環(huán)境剖煌,并不是原本的環(huán)境。因此根目錄下面的東西和你原本的系統(tǒng)無關(guān)哦逝淹!而且耕姊,你的系統(tǒng)應(yīng)該會被掛載到/sysroot目錄下。

接下來這樣做:

echo的內(nèi)容是你重置后的密碼

需要了解的:

chroot 目錄:代表將你的根目錄 “暫時” 切換到chroot之后的目錄栅葡。如上就是/sysroot將會被作為暫時的根目錄茉兰。

/.autorelabel:在rd.break的RAM Disk環(huán)境下,系統(tǒng)是沒有SELinux的欣簇,而你剛剛更改了/etc/shadow(密碼修改)所以這個文件的SELinux安全文本的特性會被取消规脸。如果你沒有讓系統(tǒng)于開機時自動回復(fù)SELinux的安全文本坯约,你的系統(tǒng)將無法登錄(在SELinux為Enforcing模式下)。加上./autorelabel就是要讓系統(tǒng)在開機的時候自動使用默認的SELinux type重新寫入SELinux安全文本到每個文件去莫鸭。


4.2闹丐、直接開機就以root執(zhí)行bash的方法

還可以在開機后直接取得系統(tǒng)根目錄后,讓系統(tǒng)給一個bash給我們用被因。方法就是將rd.break參數(shù)改為 init=/bin/bash 即可卿拴。不需要root密碼而有root權(quán)限。


重點:

Linux不可隨意關(guān)鍵梨与,否則容易造成文件系統(tǒng)錯誤或是其他無法開機的問題堕花;

開機流程主要是:BIOS、MBR粥鞋、Loader缘挽、Kernel+initramfs、systemd呻粹;

Loader具有提供選項壕曼,加載內(nèi)核文件,轉(zhuǎn)交控制權(quán)給其他loader等功能尚猿;

boot loader可以安裝在MBR或者是每個分割槽的boot sector區(qū)域中窝稿;

initramfs可以提供內(nèi)核在開機過程中所需要的最重要的模塊,通常與磁盤和文件系統(tǒng)有關(guān)的模塊凿掂;

systemd的配置文件主要來自/etc/systemd/system/default.target項目;

額外的設(shè)備與模塊對應(yīng)纹蝴,可寫入/etc/modprobe.d/*.conf中庄萎;

內(nèi)核模塊的管理可使用lsmod,modinfo塘安,rmmod糠涛,insmod,modprobe等命令兼犯;

modprobe主要參考/lib/modules/$(uname -r)/modules.dep的設(shè)置來載入與卸載內(nèi)核模塊忍捡;

grub2的配置文件與相關(guān)文件系統(tǒng)大多放在/boot/grub2目錄下,配置文件為grub.cfg切黔;

grub2對磁盤的代號設(shè)置與Linux不同砸脊,主要通過檢查的順序來給予設(shè)置。如(hd0)及(hd0纬霞,1)等凌埂;

grub.cfg內(nèi)每個選項與menuentry有關(guān),而直接指定內(nèi)核開機時诗芜,至少需要Linux16及initrd16兩個項目瞳抓;

grub.cfg內(nèi)設(shè)置loader控制權(quán)移交時埃疫,最重要者為chainloader+1這項;

若想要重建initramfs孩哑,可使用dracut或mkinitrd處理栓霜;

重新安裝grub2到MBR貨boot sector時,可利用grub2-install來處理横蜒;

若想進入救援模式(rescue)叙淌,可與開機選項過程中,在linux16的選項后面加入“rd.break”或"init=/bin/bash”等方式來就如救援模式愁铺;

我們可以對grub2的個別選項給予不同的密碼鹰霍;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茵乱,隨后出現(xiàn)的幾起案子茂洒,更是在濱河造成了極大的恐慌,老刑警劉巖瓶竭,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件督勺,死亡現(xiàn)場離奇詭異,居然都是意外死亡斤贰,警方通過查閱死者的電腦和手機智哀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門谎痢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗽桩,“玉大人介时,你說我怎么就攤上這事赁项∫髁瘢” “怎么了山上?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵景图,是天一觀的道長固蛾。 經(jīng)常有香客問我骗爆,道長次氨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任摘投,我火速辦了婚禮煮寡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犀呼。我一直安慰自己幸撕,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布圆凰。 她就那樣靜靜地躺著杈帐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挑童,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天累铅,我揣著相機與錄音,去河邊找鬼站叼。 笑死娃兽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的尽楔。 我是一名探鬼主播投储,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阔馋!你這毒婦竟也來了玛荞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤呕寝,失蹤者是張志新(化名)和其女友劉穎勋眯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體下梢,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡客蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孽江。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讶坯。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岗屏,靈堂內(nèi)的尸體忽然破棺而出辆琅,到底是詐尸還是另有隱情,我是刑警寧澤担汤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布涎跨,位于F島的核電站,受9級特大地震影響崭歧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撞牢,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一率碾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屋彪,春花似錦所宰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春躯泰,著一層夾襖步出監(jiān)牢的瞬間谭羔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工麦向, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瘟裸,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓诵竭,卻偏偏與公主長得像话告,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卵慰,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容