簡述linux操作系統(tǒng)啟動流程
以CentOS 5歹茶、6為例
系統(tǒng)啟動流程大體可以表示為POST加電自檢-->BIOS根據(jù)其中的啟動順序-->MBR設(shè)備的bootloader(GRUB)-->啟動Kernel(中間可能需要借助ramdisk加載根文件系統(tǒng)并進行rootfs轉(zhuǎn)換)-->Init-->Runlevel關(guān)閉和啟動對應的服務進程。
上述過程從Init開始就是用戶空間的啟動操作了,CentOS 5、6、7的Init啟動機制有所不同侠讯,所以Init的啟動過程會有所區(qū)別:
CentOS 5:systemV
CentOS 6:Upstart
CentOS 7:systemd
下面的過程以systemV的Init機制為基礎(chǔ):
BIOS
BIOS(Basic Input/Output System)淫痰,基本輸入輸出系統(tǒng)沸柔,該系統(tǒng)存儲于主板的ROM芯片上循衰,計算機在開機時,會最先讀取該系統(tǒng)勉失,然后會有一個加電自檢過程羹蚣,這個過程其實就是檢查CPU和內(nèi)存,計算機最基本的組成單元(控制器乱凿、運算器和存儲器)顽素,還會檢查其他硬件,若沒有異常就開始加載BIOS程序到內(nèi)存當中。BIOS主要的一個功能就是存儲了磁盤的啟動順序全蝶,BIOS會按照啟動順序去查找第一個磁盤頭的MBR信息,并加載和執(zhí)行MBR中的Bootloader程序抑淫,若第一個磁盤不存在MBR,則會繼續(xù)查找第二個磁盤(PS:啟動順序可以在BIOS的界面中進行設(shè)置)姥闪,一旦BootLoader程序被檢測并加載內(nèi)存中,BIOS就將控制權(quán)交接給了BootLoader程序。MBR
MBR(Master Boot Record),主引導記錄梳毙,MBR存儲于磁盤的頭部哺窄,大小為512bytes牌废,其中,446bytes用于存儲BootLoader程序,64bytes用于存儲分區(qū)表信息番甩,最后2bytes(魔術(shù)字)用于MBR的有效性檢查窍育。GRUB
Grand Unified Bootloader,多系統(tǒng)啟動程序宴胧,其執(zhí)行過程可分為三個步驟:
- Stage1:這個其實就是MBR中的啟動引導程序漱抓,由于只有446字節(jié)不能實現(xiàn)復雜的功能,它的主要工作就是查找并加載第二段Bootloader程序(stage2)恕齐,但系統(tǒng)在沒啟動時乞娄,MBR根本找不到文件系統(tǒng),也就找不到stage2所存放的位置显歧,因此仪或,就有了stage1_5
- Stage1_5:安裝在MBR之后的磁盤扇區(qū),該步驟就是為了識別文件系統(tǒng)士骤,進而可以進入stage2
- Stage2:GRUB程序會根據(jù)/boot/grub/grub.conf文件查找Kernel的信息范删,然后開始加載Kernel程序,當Kernel程序被檢測并在加載到內(nèi)存中敦间,GRUB就將控制權(quán)交接給了Kernel程序瓶逃。
PS:實際上這個步驟/boot還沒被掛載,GRUB直接識別grub所在磁盤的文件系統(tǒng)廓块。
- Kernel
內(nèi)核厢绝,Kernel是Linux系統(tǒng)最主要的程序,實際上带猴,Kernel的文件很小昔汉,只保留了最基本的模塊,并以壓縮的文件形式存儲在硬盤中拴清,當GRUB將Kernel讀進內(nèi)存靶病,內(nèi)存開始解壓縮內(nèi)核文件。
- 講內(nèi)核啟動口予,應該先講下initrd這個文件:
initrd(Initial RAM Disk)娄周,它在stage2這個步驟就被拷貝到了內(nèi)存中,這個文件是在安裝系統(tǒng)時產(chǎn)生的沪停,是一個臨時的根文件系統(tǒng)(rootfs)煤辨。因為Kernel為了精簡裳涛,只保留了最基本的模塊,因此众辨,Kernel上并沒有各種硬件的驅(qū)動程序端三,也就無法識rootfs所在的設(shè)備,故產(chǎn)生了initrd這個文件鹃彻,該文件裝載了必要的驅(qū)動模塊郊闯,當Kernel啟動時,可以從initrd文件中裝載驅(qū)動模塊蛛株,直到掛載真正的rootfs团赁,然后將initrd從內(nèi)存中移除。 - Kernel會以只讀方式掛載根文件系統(tǒng)泳挥,當根文件系統(tǒng)被掛載后然痊,開始裝載第一個進程(用戶空間的進程),執(zhí)行/sbin/init屉符,之后就將控制權(quán)交接給了init程序剧浸。
- Init
該程序就是進行OS初始化操作,實際上是根據(jù)/etc/inittab(定義了系統(tǒng)默認運行級別)設(shè)定的動作進行腳本的執(zhí)行矗钟,第一個被執(zhí)行的腳本為/etc/rc.d/rc.sysinit唆香,這個是真正的OS初始化腳本,這個腳本的任務有:
- 激活udev和selinux吨艇;
- 根據(jù)/etc/sysctl.conf文件躬它,來設(shè)定內(nèi)核參數(shù);
- 設(shè)定系統(tǒng)時鐘东涡;
- 裝載硬盤映射冯吓;
- 啟用交換分區(qū);
- 設(shè)置主機名疮跑;
- 根文件系統(tǒng)檢測组贺,并以讀寫方式重新掛載根文件系統(tǒng);
- 激活RAID和LVM設(shè)備祖娘;
- 啟用磁盤配額失尖;
- 根據(jù)/etc/fstab,檢查并掛載其他文件系統(tǒng)渐苏;
- 清理過期的鎖和PID文件
上述都執(zhí)行完后掀潮,根據(jù)配置的啟動級別,執(zhí)行對應目錄底下的腳本琼富,最后執(zhí)行/etc/rc.d/rc.local這個腳本(所以很多自定義的啟動腳本可以寫入這個文件中)仪吧,至此,系統(tǒng)啟動完成鞠眉。
關(guān)于init程序的配置文件路徑邑商,除了/etc/inittab外摄咆,還有/etc/init/*.conf,及/usr/lib/systemd/system/(CentOS7)人断。
- Runlevel
運行級別,不同的級別會啟動的服務不一樣朝蜘,init會根據(jù)定義的級別去執(zhí)行相應目錄下的腳本恶迈,Linux的啟動級別分為以下幾種
0:關(guān)機模式
1:單一用戶模式(直接以管理員身份進入)
2:多用戶模式(無網(wǎng)絡)
3:多用戶模式(命令行)
4:保留
5:多用戶模式(圖形界面)
6:重啟
在不同的運行級別下,/etc/rc.d/rc這個腳本會分別執(zhí)行不同目錄下的腳本
Run level 0 – /etc/rc.d/rc0.d/
Run level 1 – /etc/rc.d/rc1.d/
Run level 2 – /etc/rc.d/rc2.d/
Run level 3 – /etc/rc.d/rc3.d/
Run level 4 – /etc/rc.d/rc4.d/
Run level 5 – /etc/rc.d/rc5.d/
Run level 6 – /etc/rc.d/rc6.d/
這些目錄下的腳本只有K*和S*開頭的文件谱醇,K開頭的文件為開機需要執(zhí)行關(guān)閉的服務暇仲,S開頭的文件為開機需要執(zhí)行開啟的服務。
簡述grub啟動引導程序配置及命令行接口詳解
grub啟動引導程序配置
grub的配置文件/boot/grub/grub.conf副渴,該配置文件的信息如下:
grub.conf:
#boot=/dev/sda
default=0 #設(shè)定默認啟動的title的編號奈附,從0開始
timeout=5 #等待用戶選擇的超時時間
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景圖片
hiddenmenu #隱藏菜單
title CentOS (2.6.18-194.el5PAE) #內(nèi)核標題
root (hd0,0) #內(nèi)核所在的設(shè)備hd表示硬盤,第一個0是硬盤號煮剧,第二個0是分區(qū)號
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #內(nèi)核文件路徑以及傳遞給內(nèi)核的參數(shù)
initrd /initrd-2.6.18-194.el5PAE.img #ramdisk文件路徑
grub 命令行用法
- 進入GRUB的命令行模式
開機后grub引導菜單
grub1.png
- 輸入c即可進入grub命令行模式
grub>
- 輸入e可對進入選定的菜單項的編輯
grub2.png
- 獲取GRUB命令行幫助
在grub>提示符的后面輸入help
grub> help
如果需要得到某個指令的幫助斥滤,就在 help 后加空格跟指令,比如:
grub>help kernel
- cat查看文件內(nèi)容
有時我們不知道Linux的/boot分區(qū)勉盅,以及/ 根分區(qū)所在的位置佑颇,要查看/etc/fstab的內(nèi)容來得知,這時草娜,我們就要用到cat (hd[0-n],y)/etc/fstab 來獲得這些內(nèi)容挑胸,注意要靈活使用tab鍵命令補齊的功能
grub> cat (hd0, #輸入hd0,然后再按tab鍵會跳出hd0有的分區(qū)
grub> cat (hd0,2)/etc/fstab #顯示所在分區(qū)的/etc/fstab文件信息
- root (hd[0-n,y) 指令來指定/boot所在的分區(qū)
比如我們確認/boot在(hd0,0)
grub> root (hd0,0)
- kernel 指令,用來指定Linux的內(nèi)核宰闰,及/所在的分區(qū)
- 如果我們已經(jīng)通過root (hd[0-n],y) 指定了/boot所在的分區(qū)茬贵,語法有兩個:
- 如果/boot和Linux的/位于同一個分區(qū),應該是下面的一種格式移袍;
grub> kernel /boot/vmlinuz在這里按tab鍵來補齊解藻,就看到內(nèi)核全稱了 ro root=根所在的路徑
- 如果/boot有自己獨立的分區(qū),應該是咐容;
grub> kernel /vmlinuz在這里按tab鍵來補齊舆逃,就看到內(nèi)核全稱了 ro root=根所在的路徑
例如
grub> kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=[fstab文件中查詢到的root所在的掛載UUID]
- initrd 命令行來指定initrd文件
grub> initrd /boot/initr #在這里tab來補齊有可能是initrd,也可能是initramfs
grub> initrd /boot/initrmfs-2.6.32-696.el6.x86_64.img
如果/boot是獨立的一個分區(qū)
grub> initrd /initr #在這里tab來補齊
grub> initrd /initrmfs-2.6.32-696.el6.x86_64.img
- boot命令來引導系統(tǒng)
grub>boot
- grub的保護機制
grub可以通過設(shè)置密碼來保護配置文件不被輕易的修改戳粒,方法為:
- 在配置文件的title之上添加 password --md5 md5生成的密碼 (用于啟動時保護配置文件編輯)
- 在配置文件的某個title之內(nèi)添加password --md5 md5生成的密碼 (用于保護此項內(nèi)核不被輕易啟動 或編輯)
- 生成md5密碼的命令:grub-md5-crypt
- grub-install重建grub
重建grub到第一硬盤mbr
grub-install /dev/sda
- grub救援模式
如果系統(tǒng)無法啟動路狮,利用CentOS安裝光盤進入Rescue installed system救援模式
進入命令行后,使用命令
#chroot /mnt/sysimage #掛載原系統(tǒng)的根蔚约,此路徑在進入救援模式后有提示
掛載根后即可進行各種命令行操作了奄妨,例如重裝grub
#grub-install /dev/sda
實現(xiàn)kickstart文件制作與光盤鏡像制作
關(guān)于kickstart
kickstart是一個定義了Linux安裝過程的配置文件,比如系統(tǒng)語言苹祟、鍵盤選項砸抛、要在系統(tǒng)中使用的時區(qū)评雌、如何對磁盤進行分區(qū)、應該安裝哪些軟件包等直焙。有了這個文件可以解放雙手景东,讓Linux安裝過程按照我們預先定義的要求進行自動化安裝,同時部署大量主機時十分有用奔誓。一般centos系統(tǒng)安裝后斤吐,會在root目錄下生成一個名為anaconda-ks.cfg的kickstart配置文件
ks文件主要由三個部分組成:
- 命令段:用于配置系統(tǒng)
install #出現(xiàn)install可代表下面為安裝配置命令段
cdrom #安裝介質(zhì)
lang zh_CN.UTF-8 #安裝語言
keyboard us #鍵盤類型
selinux --enforcing #是否開啟selinux
timezone --utc Asia/Shanghai #時區(qū)、系統(tǒng)時鐘是否使用UTC時間
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
- 軟件包段:選擇要安裝的軟件包組及軟件包
@core #安裝
@base #安裝
lftp #安裝
-zsh #這里說明不安裝厨喂,但如果有其他安裝的文件需要依賴其時和措,也會安裝
- 腳本段:安裝前后執(zhí)行的腳本
%pre #安裝過程開始之前執(zhí)行的腳本;所能夠執(zhí)行的操作較少蜕煌,因為是anaconda加載的簡潔版的shell環(huán)境
%post #所有軟件包安裝完成之后執(zhí)行的腳本派阱;由于是此時系統(tǒng)已安裝完成,所以是完整的shell環(huán)境
利用ks文件安裝系統(tǒng)
在boot提示符指定本機的網(wǎng)絡參數(shù)和kickstart配置文件斜纪,配置文件中又設(shè)定了安裝源(一般自建http贫母、ftp服務器和yum源),執(zhí)行下面的命令后傀广,系統(tǒng)會自動結(jié)合kickstart文件颁独,實現(xiàn)快速安裝系統(tǒng)
- 利用光盤引導后,在CentOS安裝界面按ESC鍵進入boot提示符
kickstart1.png
在boot提示符后鍵入安裝命令
例如指定了網(wǎng)絡配置伪冰、ks文件路徑
boot:linux ip=192.168.1.106 netmask=255.255.255.0 gateway=192.168.1.1 dns=192.168.1.1 ks=http://10.1.1.100/centos6-x86_64.cfg
- 指定kickstart配置文件的路徑
支持以下格式:
CD ks=cdrom:/directory/ks.cfg
硬盤驅(qū)動器 ks=hd:device/directory/ks.cfg
FTP服務器 ks=ftp://server.mydomain.com/directory/ks.cfg
HTTP服務器 ks=http://server.mydomain.com/directory/ks.cfg
HTTPS服務器 ks=https://server.mydomain.com/directory/ks.cfg
NFS服務器 ks=nfs:server.mydomain.com:/directory/ks.cfg
其它設(shè)備 ks=file:/device/directory/ks.cfg
kickstart文件制作
- 利用圖形化工具system-config-kickstart制作ks文件
運行system-config-kickstart
~]# system-config-kickstart
- 制作包含ks文件的光盤映像
將制作好的ks文件和安裝光盤中的isolinux文件夾都復制到一個文件夾下例如/tmp/mykickstart下
]# ls
isolinux ks.cfg
編輯/isolinux/isolinux.cfg文件
]# vim /isolinux/isonux.cfg
在文件中添加新的label并設(shè)置成默認選項誓酒,將原來的默認default行刪除
label linux
menu label ^Install CentOS based mykickstart
menu default
kernel vmlinuz
append initrd=initrd.img ks=cdrom:/ks.cfg
#此處指定了ks文件所在的路徑
在ks.cfg和isolinux文件夾共同的父目錄的父目錄即/tmp下執(zhí)行
]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.9 by mykickstart" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /tmp/centos6.9_by_ks.iso mykickstart
]# ls
mykickstart centos6.9_by_ks.iso
光盤映像制作完成