linux启动流程及自定义gurb
linux 啟動流程
POST BIOS(boot sequence) 所選擇的啟動設備次序的MBR中是否有引導程序, ----> MBR(bootloader) 提供內核列表 ------->加載選定的Kernel,initrd(內存模擬的磁盤設備需要緩存),initramfs(緩存) ?---->獲取到根文件系統并掛載,運行init
?
bootloadler開始以后的掛載流程
1、當系統讀取bootloader,掛載內核分區的時候,不識別更高級的磁盤分區上,只能放在基本磁盤分區,而且只支持read1,所以內核和根不在同一個磁盤分區上,我們通常把內核所在的基本磁盤分區掛載到boot分區上。
2、最終bootloader在啟動的時候是在臨時掛載的 / 下找 vminuz?
?
3、為了節約磁盤空間vmlinuz是被壓縮的,節約空間和保證IO速度。在使用的時候內核需要解壓,此時vmlinuz被分為2段,一段是沒有壓縮(解壓算法),另一端是壓縮的。
解壓后 bootloader讀取initramfs,的控制權完全交給kernel,內核完成自身初始化,加載磁盤完成后啟動init
?
問題1:/lib/modules在跟文件系統中,kernel如何掛載?不掛載又怎么能找到這個硬盤的驅動程序?
/lib/modules/中是linux所需要的所有模塊存放位置,但是kernel現在不知道我們的設備硬件是什么,kernel不可能將所有的模塊都放在內核中,因為硬件設備以及功能模塊太多了。所以就放到了/lib/modules。但是/lib/modules又是在跟文件系統中。那此時kernel如何能找到硬盤的驅動模塊完成并加載呢?因為此時的模塊就是在根文件系統上,我們需要先掛載他才能找到所有的模塊。這個情況就是為什么要在boot分區中還要放置一個initrd文件的原因了。這個就是啟動時加載Kernel后掛載的臨時根文件系統。
?
問題2:又是誰探測到了你的硬盤的型號,并把對應的驅動模塊放置在initramfs文件中提供給bootloader呢?
是安裝操作系統時,安裝程序在安裝操作系統時可以探測到你的硬盤是什么設備,需要什么啟動程序,做成initramfs文件放到了 bootloader可以讀取到的根文件系統中,這樣kernel就可以通過這個文件加載根文件系統,而后就可以讀取/lib/modules/ 加載所有的其他需要的模塊了
就是這個文件,所以有可能都安裝了同樣的操作系統,但是硬盤的驅動不同。導致了硬盤互換也不能啟動的原因。
initrd是個文件系統,幫助kernel完成初始化。內核要將其掛載,以這個為根,掛載后在這里加載真正根文件系統的驅動模塊,加載后initrd中有個程序運行后可以替換跟文件系統,將真正的根文件系統替換initrd,替換完以后這個應用程序由誰終止,自身終止就是系統啟動的第0個進程。之后就是要訪問/sbin/init
/sbin/init: 功能
/etc/inittab
/etc/rc.d/rc.sysinit腳本
操作:
設置主機名
打印文本歡迎信息
激活selinux 與 udev探測額外的硬件設備并為其裝在模塊
激活swap
? 掛載etc/fstab中定義的本地文件系統
實現檢測根文件系統,并對其以讀寫方式重新掛在
設置系統時鐘,從硬件讀取時鐘,維護系統軟時鐘
裝在鍵盤映射
根據 etc/sysctl.conf 設置內核參數
激活軟raid與lvm設備
清理var等等目錄的操作
設定默認運行級別
啟動各種服務
init特性:
id 操作的id
runlevels 在那些級別下運行次操作
action ? 動作
initdefault 默認執行
process 操作
?
Centos 5 init: SystemV格式:啟動順序是串行化,初始化程序一個一個執行
Centos 6 init: Upstart:程序依然有依賴,但是不用等待所依賴的程序完成初始化完成(啟動初始化程序通過dbus相互通信),和System V兼容性不太好。
Centos 7 : ? SystemD,和SysV兼容。并且參考OS X 中并行初始化的過程
啟動應用程序:將應用程序定義到啟動級別中
? 0:關機
? ? ?1:單用戶模式
2:多用戶模式,不支持NFS文進系統
3:完全多用戶模式
4:預留級別
5:完全多用戶模式:圖形模式
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
#啟動前腳本
for t in $(cat /proc/cmdline); docase $t inemergency)start rcS-emergencybreak;;esacdone end script exec /etc/rc.d/rc.sysinit #中間會執行這個腳本 post-stop script #upstat特有的格式,會定義什么時候執行
#停止后腳本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 ?啟動內核時傳遞給內核的參數 ?or /proc/process/cmdline 啟動程序時的啟動命令。
?
MBR:
bootloader:引導加載器,裝操作系統時又不同的操作系統設定安裝的。
引導程序:
win:ntloder
linux:LILO:
LInux LOader,不能引導位于1024柱面(Cylinder以后的分區)的操作系統
GRUB: GRand Unified Bootloader
把系統引導過程劃分了3端:
1st stage:位于 MBR bootloader--為了引導snd stage
1.5 stage:位于boot分區上,為識別內核文件所在的文件系統,系統文件系統擴展(為什么linux可以識別更多的文件系統)
2ndstage:位于boot分區上,GRUB引導程序
[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 這個就是grob主配置文件,stage2 讀取這個配置文件
# 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,選擇啟動的內核或系統
內核:linux
系統,win or linux
隱藏
2.提供交互式接口
e:可以編輯修改grob.conf 中的內容
? ? ?1:單用戶模式,給予密碼的保護(1,啟用內核,2,傳遞參數及進入編輯模式)
?
grub.conf 中title 就是現實在啟動界面的字符
root(hd0,0) 設定內核所在分區為grub的根
kernel 制定內核文件的路徑。后面可以傳遞給內核的啟動參數
initrd : 指定為內核提供額外驅動功能的ramdisk(因為kernel認為這是磁盤,所以需要做一個磁盤轉換為內存的緩存,所以速度慢) ?,單 ramfs(因為是文件系統,不需要再次緩存,所以快)
?
> c
進入修改模式
help root 獲取root命令的幫助
?
查找vmlinuz內核在哪個磁盤上,如果有可以tab補全
然后就可以輸入 grub> root (hd0,0) ? ? 回車
? ? ? ? ? ? ? ? ? ? ?grub> kernel /vmlinz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root?這個root值必須要寫最好備份一份root的位置。因為這個是找不到的
? ? ? ? ? ? ? ? ? ? ?grub> initrd ?/initramfs-2.6.32-642.el6.x86_64.img?#這個文件版本必須和kernel版本對應 ? ?
? ? ? ? ? ? ? ? ? ? ?boot ?啟動
>e
進入編輯模式
>e 針對某一行進行修改
修改grub 的根分區
?
?
修改添加kernel參數
添加 : 1 單用戶模式:幾乎不會啟動任何服務,且不要登錄,但是會執行/etc/rc.d/rc.sysinit
? ? 如果不上執行rc.sysinit ?傳遞 emergency
? ? 如果想讓用戶不能隨意進入單用戶模式,兩種方式
位置不同輸入密碼的時間就不同
設置加密密碼:
? ? ? ? ??
重啟
?需要敲e建輸入密碼 ,這是需要p進入密碼輸入
?啟動輸入密碼:
?
grub.conf 位置文件其他的含義
?
default=0 . #定義默認啟動那個title timeout=5 #啟動倒計時 splashimage=(hd0,0)/grub/splash.xpm.gz #顯示啟動時背景圖片 hiddenmenu #隱藏菜單 默認隱藏,只顯示倒計時。去掉就直接顯示選擇的那個os password --md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0 #password centos title CentOS 6 (2.6.32-642.el6.x86_64)root (hd0,0) #hd0 磁盤, 0分區#磁盤表示方式:在grub中,都已hd開頭,并緊跟一個數字做各磁盤設備的標記,第幾塊硬盤
#分區:0-3 主分區,邏輯分區從5開始,一般boot在磁盤的最外道的分區上
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# 制定內核文件,及傳遞給內核的參數
#ro root=/path/to/DEVICE 以只讀方式掛載真正的根分區位置,而后在sysinit中還要重新rw掛在一邊
#quiet 內核初始化信息模式:靜默,不輸初始化信息
initrd /initramfs-2.6.32-642.el6.x86_64.img
#通常為cpio歸檔,并使用gzip壓縮,通常以img作為后綴,因為這個是個磁盤映像文件。
password --md5 $1$PFbU5/$/h/7uhL5LISHvrPyVTBiz0 ~
?
轉載于:https://www.cnblogs.com/python-way/p/6189260.html
總結
以上是生活随笔為你收集整理的linux启动流程及自定义gurb的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件绿色版和安装版的区别
- 下一篇: meterpreter_paranoid