linux启动流程及自定义gurb
linux 啟動(dòng)流程
POST BIOS(boot sequence) 所選擇的啟動(dòng)設(shè)備次序的MBR中是否有引導(dǎo)程序, ----> MBR(bootloader) 提供內(nèi)核列表 ------->加載選定的Kernel,initrd(內(nèi)存模擬的磁盤(pán)設(shè)備需要緩存),initramfs(緩存) ?---->獲取到根文件系統(tǒng)并掛載,運(yùn)行init
?
bootloadler開(kāi)始以后的掛載流程
1、當(dāng)系統(tǒng)讀取bootloader,掛載內(nèi)核分區(qū)的時(shí)候,不識(shí)別更高級(jí)的磁盤(pán)分區(qū)上,只能放在基本磁盤(pán)分區(qū),而且只支持read1,所以?xún)?nèi)核和根不在同一個(gè)磁盤(pán)分區(qū)上,我們通常把內(nèi)核所在的基本磁盤(pán)分區(qū)掛載到boot分區(qū)上。
2、最終bootloader在啟動(dòng)的時(shí)候是在臨時(shí)掛載的 / 下找 vminuz?
?
3、為了節(jié)約磁盤(pán)空間vmlinuz是被壓縮的,節(jié)約空間和保證IO速度。在使用的時(shí)候內(nèi)核需要解壓,此時(shí)vmlinuz被分為2段,一段是沒(méi)有壓縮(解壓算法),另一端是壓縮的。
解壓后 bootloader讀取initramfs,的控制權(quán)完全交給kernel,內(nèi)核完成自身初始化,加載磁盤(pán)完成后啟動(dòng)init
?
問(wèn)題1:/lib/modules在跟文件系統(tǒng)中,kernel如何掛載?不掛載又怎么能找到這個(gè)硬盤(pán)的驅(qū)動(dòng)程序?
/lib/modules/中是linux所需要的所有模塊存放位置,但是kernel現(xiàn)在不知道我們的設(shè)備硬件是什么,kernel不可能將所有的模塊都放在內(nèi)核中,因?yàn)橛布O(shè)備以及功能模塊太多了。所以就放到了/lib/modules。但是/lib/modules又是在跟文件系統(tǒng)中。那此時(shí)kernel如何能找到硬盤(pán)的驅(qū)動(dòng)模塊完成并加載呢?因?yàn)榇藭r(shí)的模塊就是在根文件系統(tǒng)上,我們需要先掛載他才能找到所有的模塊。這個(gè)情況就是為什么要在boot分區(qū)中還要放置一個(gè)initrd文件的原因了。這個(gè)就是啟動(dòng)時(shí)加載Kernel后掛載的臨時(shí)根文件系統(tǒng)。
?
問(wèn)題2:又是誰(shuí)探測(cè)到了你的硬盤(pán)的型號(hào),并把對(duì)應(yīng)的驅(qū)動(dòng)模塊放置在initramfs文件中提供給bootloader呢?
是安裝操作系統(tǒng)時(shí),安裝程序在安裝操作系統(tǒng)時(shí)可以探測(cè)到你的硬盤(pán)是什么設(shè)備,需要什么啟動(dòng)程序,做成initramfs文件放到了 bootloader可以讀取到的根文件系統(tǒng)中,這樣kernel就可以通過(guò)這個(gè)文件加載根文件系統(tǒng),而后就可以讀取/lib/modules/ 加載所有的其他需要的模塊了
就是這個(gè)文件,所以有可能都安裝了同樣的操作系統(tǒng),但是硬盤(pán)的驅(qū)動(dòng)不同。導(dǎo)致了硬盤(pán)互換也不能啟動(dòng)的原因。
initrd是個(gè)文件系統(tǒng),幫助kernel完成初始化。內(nèi)核要將其掛載,以這個(gè)為根,掛載后在這里加載真正根文件系統(tǒng)的驅(qū)動(dòng)模塊,加載后initrd中有個(gè)程序運(yùn)行后可以替換跟文件系統(tǒng),將真正的根文件系統(tǒng)替換initrd,替換完以后這個(gè)應(yīng)用程序由誰(shuí)終止,自身終止就是系統(tǒng)啟動(dòng)的第0個(gè)進(jìn)程。之后就是要訪問(wèn)/sbin/init
/sbin/init: 功能
/etc/inittab
/etc/rc.d/rc.sysinit腳本
操作:
設(shè)置主機(jī)名
打印文本歡迎信息
激活selinux 與 udev探測(cè)額外的硬件設(shè)備并為其裝在模塊
激活swap
? 掛載etc/fstab中定義的本地文件系統(tǒng)
實(shí)現(xiàn)檢測(cè)根文件系統(tǒng),并對(duì)其以讀寫(xiě)方式重新掛在
設(shè)置系統(tǒng)時(shí)鐘,從硬件讀取時(shí)鐘,維護(hù)系統(tǒng)軟時(shí)鐘
裝在鍵盤(pán)映射
根據(jù) etc/sysctl.conf 設(shè)置內(nèi)核參數(shù)
激活軟raid與lvm設(shè)備
清理var等等目錄的操作
設(shè)定默認(rèn)運(yùn)行級(jí)別
啟動(dòng)各種服務(wù)
init特性:
id 操作的id
runlevels 在那些級(jí)別下運(yùn)行次操作
action ? 動(dòng)作
initdefault 默認(rèn)執(zhí)行
process 操作
?
Centos 5 init: SystemV格式:啟動(dòng)順序是串行化,初始化程序一個(gè)一個(gè)執(zhí)行
Centos 6 init: Upstart:程序依然有依賴(lài),但是不用等待所依賴(lài)的程序完成初始化完成(啟動(dòng)初始化程序通過(guò)dbus相互通信),和System V兼容性不太好。
Centos 7 : ? SystemD,和SysV兼容。并且參考OS X 中并行初始化的過(guò)程
啟動(dòng)應(yīng)用程序:將應(yīng)用程序定義到啟動(dòng)級(jí)別中
? 0:關(guān)機(jī)
? ? ?1:單用戶(hù)模式
2:多用戶(hù)模式,不支持NFS文進(jìn)系統(tǒng)
3:完全多用戶(hù)模式
4:預(yù)留級(jí)別
5:完全多用戶(hù)模式:圖形模式
6:重啟
/etc/init/rcS.conf ? upstart 支持的腳本
start on startupstop on runleveltask# Note: there can be no previous runlevel here, if we have one it's bad # information (we enter rc1 not rcS for maintenance). Run /etc/rc.d/rc # without information so that it defaults to previous=N runlevel=S. console output pre-start script
#啟動(dòng)前腳本
for t in $(cat /proc/cmdline); docase $t inemergency)start rcS-emergencybreak;;esacdone end script exec /etc/rc.d/rc.sysinit #中間會(huì)執(zhí)行這個(gè)腳本 post-stop script #upstat特有的格式,會(huì)定義什么時(shí)候執(zhí)行
#停止后腳本if [ "$UPSTART_EVENTS" = "startup" ]; thenif [ "$UPSTART_EVENTS" = "startup" ]; then[ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)[ -z "$runlevel" ] && runlevel="3"for t in $(cat /proc/cmdline); docase $t in-s|single|S|s) runlevel="S" ;;[1-9]) runlevel="$t" ;;esacdoneexec telinit $runlevelfi end script
直到最后打印登錄界面
?
/proc/cmdline ?啟動(dòng)內(nèi)核時(shí)傳遞給內(nèi)核的參數(shù) ?or /proc/process/cmdline 啟動(dòng)程序時(shí)的啟動(dòng)命令。
?
MBR:
bootloader:引導(dǎo)加載器,裝操作系統(tǒng)時(shí)又不同的操作系統(tǒng)設(shè)定安裝的。
引導(dǎo)程序:
win:ntloder
linux:LILO:
LInux LOader,不能引導(dǎo)位于1024柱面(Cylinder以后的分區(qū))的操作系統(tǒng)
GRUB: GRand Unified Bootloader
把系統(tǒng)引導(dǎo)過(guò)程劃分了3端:
1st stage:位于 MBR bootloader--為了引導(dǎo)snd stage
1.5 stage:位于boot分區(qū)上,為識(shí)別內(nèi)核文件所在的文件系統(tǒng),系統(tǒng)文件系統(tǒng)擴(kuò)展(為什么linux可以識(shí)別更多的文件系統(tǒng))
2ndstage:位于boot分區(qū)上,GRUB引導(dǎo)程序
[root@vm2 keepalived]# ls /boot/grub/ device.map ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 stage2 xfs_stage1_5 e2fs_stage1_5 grub.conf menu.lst splash.xpm.gz ufs2_stage1_5 fat_stage1_5 iso9660_stage1_5(docker) minix_stage1_5 stage1 vstafs_stage1_5
menu.lst -> ./grub.conf 這個(gè)就是grob主配置文件,stage2 讀取這個(gè)配置文件
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-358.el6.x86_64)root (hd0,0)kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quietinitrd /initramfs-2.6.32-358.el6.x86_64.img?
?grob 功能;
1,選擇啟動(dòng)的內(nèi)核或系統(tǒng)
內(nèi)核:linux
系統(tǒng),win or linux
隱藏
2.提供交互式接口
e:可以編輯修改grob.conf 中的內(nèi)容
? ? ?1:單用戶(hù)模式,給予密碼的保護(hù)(1,啟用內(nèi)核,2,傳遞參數(shù)及進(jìn)入編輯模式)
?
grub.conf 中title 就是現(xiàn)實(shí)在啟動(dòng)界面的字符
root(hd0,0) 設(shè)定內(nèi)核所在分區(qū)為grub的根
kernel 制定內(nèi)核文件的路徑。后面可以傳遞給內(nèi)核的啟動(dòng)參數(shù)
initrd : 指定為內(nèi)核提供額外驅(qū)動(dòng)功能的ramdisk(因?yàn)閗ernel認(rèn)為這是磁盤(pán),所以需要做一個(gè)磁盤(pán)轉(zhuǎn)換為內(nèi)存的緩存,所以速度慢) ?,單 ramfs(因?yàn)槭俏募到y(tǒng),不需要再次緩存,所以快)
?
> c
進(jìn)入修改模式
help root 獲取root命令的幫助
?
查找vmlinuz內(nèi)核在哪個(gè)磁盤(pán)上,如果有可以tab補(bǔ)全
然后就可以輸入 grub> root (hd0,0) ? ? 回車(chē)
? ? ? ? ? ? ? ? ? ? ?grub> kernel /vmlinz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root?這個(gè)root值必須要寫(xiě)最好備份一份root的位置。因?yàn)檫@個(gè)是找不到的
? ? ? ? ? ? ? ? ? ? ?grub> initrd ?/initramfs-2.6.32-642.el6.x86_64.img?#這個(gè)文件版本必須和kernel版本對(duì)應(yīng) ? ?
? ? ? ? ? ? ? ? ? ? ?boot ?啟動(dòng)
>e
進(jìn)入編輯模式
>e 針對(duì)某一行進(jìn)行修改
修改grub 的根分區(qū)
?
?
修改添加kernel參數(shù)
添加 : 1 單用戶(hù)模式:幾乎不會(huì)啟動(dòng)任何服務(wù),且不要登錄,但是會(huì)執(zhí)行/etc/rc.d/rc.sysinit
? ? 如果不上執(zhí)行rc.sysinit ?傳遞 emergency
? ? 如果想讓用戶(hù)不能隨意進(jìn)入單用戶(hù)模式,兩種方式
位置不同輸入密碼的時(shí)間就不同
設(shè)置加密密碼:
? ? ? ? ??
重啟
?需要敲e建輸入密碼 ,這是需要p進(jìn)入密碼輸入
?啟動(dòng)輸入密碼:
?
grub.conf 位置文件其他的含義
?
default=0 . #定義默認(rèn)啟動(dòng)那個(gè)title timeout=5 #啟動(dòng)倒計(jì)時(shí) splashimage=(hd0,0)/grub/splash.xpm.gz #顯示啟動(dòng)時(shí)背景圖片 hiddenmenu #隱藏菜單 默認(rèn)隱藏,只顯示倒計(jì)時(shí)。去掉就直接顯示選擇的那個(gè)os password --md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0 #password centos title CentOS 6 (2.6.32-642.el6.x86_64)root (hd0,0) #hd0 磁盤(pán), 0分區(qū)#磁盤(pán)表示方式:在grub中,都已hd開(kāi)頭,并緊跟一個(gè)數(shù)字做各磁盤(pán)設(shè)備的標(biāo)記,第幾塊硬盤(pán)
#分區(qū):0-3 主分區(qū),邏輯分區(qū)從5開(kāi)始,一般boot在磁盤(pán)的最外道的分區(qū)上
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8
rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet# 制定內(nèi)核文件,及傳遞給內(nèi)核的參數(shù)
#ro root=/path/to/DEVICE 以只讀方式掛載真正的根分區(qū)位置,而后在sysinit中還要重新rw掛在一邊
#quiet 內(nèi)核初始化信息模式:靜默,不輸初始化信息
initrd /initramfs-2.6.32-642.el6.x86_64.img
#通常為cpio歸檔,并使用gzip壓縮,通常以img作為后綴,因?yàn)檫@個(gè)是個(gè)磁盤(pán)映像文件。
password --md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0 ~
?
轉(zhuǎn)載于:https://www.cnblogs.com/python-way/p/6189260.html
總結(jié)
以上是生活随笔為你收集整理的linux启动流程及自定义gurb的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 软件绿色版和安装版的区别
- 下一篇: Linux学习整理-网络防火墙firew