20.1 Linux啟動流程分析
Linux啟動過程:
按下開機電源后計算機硬件主動讀取BIOS來加載硬件信息以及硬件系統(tǒng)的自我測試,之后系統(tǒng)會主動讀取第一個可啟動的設(shè)備(由BIOS設(shè)置),此時就可以讀入引導(dǎo)加載程序(boot loader)了,引導(dǎo)加載程序指定使用那個內(nèi)核文件來啟動,并實際加載內(nèi)核到內(nèi)存中解壓縮與執(zhí)行,此時內(nèi)核就能夠在內(nèi)存中活動,并檢測所有硬件信息與加載適當?shù)尿?qū)動程序來使主機運行,等內(nèi)核檢測硬件與加載驅(qū)動程序完畢后,就可以登錄了。
1)加載BIOS的硬件信息與進行自我測試,并依據(jù)設(shè)置取得第一個可啟動的設(shè)備
2)讀取并執(zhí)行第一個啟動設(shè)備內(nèi)MBR的boot Loader(即grub,spfdisk等程序)
3)依據(jù)boot loader的設(shè)置加載內(nèi)核,內(nèi)核開始檢測硬件和加載驅(qū)動程序
4)在硬件驅(qū)動成功后,Kernel會主動調(diào)用init進程,而init會取得run-level信息
5)init執(zhí)行/etc/rc.d/rc.sysinit文件來準備軟件執(zhí)行的操作環(huán)境
6)init執(zhí)行run-level的各個服務(wù)的啟動
7)init執(zhí)行/etc/rc.d/rc.local文件
8)init執(zhí)行終端機模擬程序mingetty來啟動login進程,最后等待用戶登錄
?
Boot Loader的主要功能:
提供菜單:用戶可以選擇不同的啟動選項,也是多重引導(dǎo)的重要功能
加載內(nèi)核文件:直接指向可啟動的程序區(qū)段來開始操作系統(tǒng)
轉(zhuǎn)交其他loader:將引導(dǎo)裝載功能轉(zhuǎn)交給其他loader負責
?
問題1):每種操作系統(tǒng)都有自己的boot loader,對于多操作系統(tǒng),每個操作系統(tǒng)必須使用自己的loader才能加載自己的操作系統(tǒng)內(nèi)核,而系統(tǒng)的MBR只有一個,怎么能同時在一部主機上安裝windows和linux呢
答案:由于boot loader具有菜單功能,因此可以選擇不同的內(nèi)核來啟動。由于具有控制權(quán)轉(zhuǎn)交的功能,因此可以加載其他boot sector內(nèi)的loader,(windows的loader默認布局有控制權(quán)轉(zhuǎn)交功能,因此不能用windows的loader加載linux的loader)
?
問題2):假設(shè)linuux安裝在SATA硬盤上,可以通過BIOS的INT13取得boot loader與kenerl文件來啟動,然后kernel會開始接管系統(tǒng)并且檢測硬件及嘗試掛載根目錄來取得額外的驅(qū)動程序。但是內(nèi)核根本不認識SATA磁盤,所以需要加載SATA磁盤的驅(qū)動程序,否則根本無法掛載根目錄,但是SATA的驅(qū)動程序在/lib/modules內(nèi),根本無法掛載根目錄,又怎么能讀取到/lib/modules內(nèi)的驅(qū)動程序呢?
答案:通過虛擬文件系統(tǒng)解決,一般使用的文件名是/boot/initrd。該文件能夠通過boot loader加載到內(nèi)存中,文件被解壓縮并在內(nèi)存中仿真成一個根目錄,且此仿真在內(nèi)存中的文件系統(tǒng)能夠提供一個可執(zhí)行程序,通過該程序來加載啟動過程中所需要的內(nèi)核模塊,通常是USB,RAID,LVM,SCSI等文件系統(tǒng)與硬盤接口的驅(qū)動程序。等載入完成后,會幫助內(nèi)核重新調(diào)用/sbin/init來開始后續(xù)的正常流程
(如果linux安裝在IDE接口的磁盤上,且默認使用ext2/ext3文件系統(tǒng),那么不需要initrd也能順利啟動linux)
?
內(nèi)核加載完畢進行完硬件檢測與驅(qū)動程序加載后,主機硬件就已經(jīng)準備就緒來,此時內(nèi)核會主動調(diào)用第一個進程,就是/sbin/init (init的PID為1),/sbin/init的主要功能就是準備軟件執(zhí)行的環(huán)境,包括系統(tǒng)主機名、網(wǎng)絡(luò)設(shè)置、語系處理、文件系統(tǒng)格式及其他服務(wù)的啟動。而所有的操作都會通過init的配置文件/etc/inittab來規(guī)劃
inittab一個很重要的設(shè)置選項就是run level
0——halt (系統(tǒng)直接關(guān)機)
1——single user mode(單用戶維護模式,用在系統(tǒng)出問題時維護)
2——Multi-user,without NFS(類似run level3,但無NFS服務(wù))
3——Full multi-user mode(完整含有網(wǎng)絡(luò)功能的純文本模式)
4——unused (系統(tǒng)保留功能)
5——X11(與run level3 類似,但加載使用X Windows)
6——reboot (重新啟動)
?
在/etc/inittab里有一句:"si::sysint:/etc/rc.d/rc.sysinit"表示:開始加載各項系統(tǒng)服務(wù)之前,得先設(shè)置好整個系統(tǒng)環(huán)境,主要利用/etc/rc.d/rc.sysinit這個shell script 來設(shè)置好系統(tǒng)環(huán)境的
?
啟動系統(tǒng)服務(wù)與相關(guān)啟動配置文件(/etc/rc.d/rc N & /etc/sysconfig)
/etc/rc.d/rc5的意義是這樣的:
通過外部第一號參數(shù)($1)來取得想要執(zhí)行的腳本目錄,即由/etc/rc.d/rc 5可以取得/etc/rc5.d/這個目錄來準備處理相關(guān)的腳本程序
找到/etc/rc5.d/K??*開頭的文件,并進行/etc/rc5.d/K??* stop 的操作
找到/etc/rc5.d/S??*開頭的文件,并進行/etc/rc5.d/S??* start的操作
(/etc/rc5.d下的文件全部是鏈接文件,鏈接到stand alone服務(wù)啟動的目錄/etc/init.d中)
如/etc/rc5.d/K91capistop-->/etc/init.d/capistop
/etc/rc5.d/S10networkstart--> /etc/init.d/networdkstart?
S和K后的數(shù)字表示文件執(zhí)行的順序,S99local就是/etc/rc.d/rc.local是最后執(zhí)行
?
用戶自定義開機啟動程序(/etc/rc.d/rc.local)
如果用戶有任何想要在啟動時進行的工作,直接將它寫入/etc/rc.d/local,那個該工作就會在啟動的時候自動加載
?
啟動過程會用到的主要配置文件:
1)模塊:/etc/modprobe.conf (這個文件大多在于指定系統(tǒng)內(nèi)的硬件所使用的模塊,如果系統(tǒng)檢測到錯誤的驅(qū)動程序,或者你想要使用更新的驅(qū)動程序來對應(yīng)相關(guān)的硬件配備時,就得要手動處理該文件)
2)/etc/sysconfig/*下的幾個文件:
authconfig 這個文件主要設(shè)置用戶的身份認證的機制,包括是否使用本地/etc/passwd,/etc/shadow等
clock 該文件用于設(shè)置linux主機的失去,可以使用格林威治時間,也可以使用本地時間
i18n 用于設(shè)置一些語系的使用方面
keyboard&mouse 設(shè)置鍵盤與鼠標的形式
network 可以設(shè)置是否啟動網(wǎng)絡(luò),以及設(shè)置主機名還有網(wǎng)關(guān)信息
network-scripts 主要用于設(shè)置網(wǎng)卡
?
切換run level: init N
顯示當前的run level :runlevel ?。ㄝ敵鼋Y(jié)果左邊代表前一個runlevel,右邊代表目前的runlevel)
init 0 關(guān)機
init 6 重啟
?
?
20.2 內(nèi)核與內(nèi)核模塊
內(nèi)核和內(nèi)核模塊存放位置:
內(nèi)核:/boot/vmlinuz或/boot/vmlinuz-version
內(nèi)核解壓所需RAMDisk:/boot/initrd (/boot/initrd-version)
內(nèi)核模塊:/lib/modules/version/kernel或 /lib/modules/$(uname -r)/kernel
內(nèi)核源碼:/usr/src/linux 或/usr/src/kernels(要安裝才會有,默認不安裝)
內(nèi)核版本:/proc/version
系統(tǒng)內(nèi)核功能:/proc/sys/kernel
?
內(nèi)核模塊與依賴性:
/lib/modules/$(uname -r)/modules.dep文件記錄了在內(nèi)核支持的模塊的各項依賴性
例如,做好的網(wǎng)卡驅(qū)動程序,文件名為a.ko,如何更新內(nèi)核依賴性?
使用depmod命令就可以實現(xiàn)(depmod [-Ane])
cp a.ko /lib/module/$(uname -r)/kernel/driver/net
depmod
?
內(nèi)核模塊的查看:
lsmod
使用lsmod后,系統(tǒng)會顯示出目前已存在與內(nèi)核中的模塊,顯示包括:模塊名稱module、模塊的大小size、此模塊是否被其他模塊所使用Used by
modinfo [-adln] [module_name|filename]
如:modinfo wmi
?
內(nèi)核模塊的加載與刪除:
如果想要自行手動加載模塊,最簡單也建議使用modprobe命令來加載模塊,因為modprobe會主動查找modules.dep的內(nèi)容,先克服了模塊的依賴性后,菜決定需要加載的模塊有哪些。insmod則完全有用戶加載一個完整文件名的模塊,并不會主動分析模塊依賴性
modprobe [-lcfr] module_name
insmod [/full/path/module_name] [parameters]
例如:嘗試載入cifs.ko這個文件系統(tǒng)模塊
insmod /lib/module/$(uname -r)/kernel/fs/cifs/cifs.ko
lsmod | grep cifs
刪除模塊:rmmod [-fw] module_name
?
?
20.3 Boot Loader:Grub
boot loader的程序代碼執(zhí)行與設(shè)置值加載分為兩個階段來執(zhí)行
stage1:執(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)定義與主要配置文件menu.lst),一般來說,配置文件都在/boot下
?
安裝在MBR的grub主程序最終要的任務(wù)之一就是從磁盤中加載內(nèi)核文件,以讓內(nèi)核能夠順利驅(qū)動整個系統(tǒng)的硬件
grub的硬盤代號如hd(0,0)表示第一塊查找到的硬盤代號為(hd0),該硬盤的第一號分區(qū)為(hd0,0)
?
/boot/grub/menu.lst (grub.cfg)
default=0 默認的啟動選項,使用第一個啟動菜單
timeout=5? 若5秒內(nèi)未動鍵盤,使用默認菜單啟動
hiddenmenu 讀秒期間是否顯示完整的菜單界面
?
需要initrd時刻為:
根目錄所在磁盤為SATA、USB或SCSI等連接接口
跟母所在文件系統(tǒng)為LVM、RAID等特殊格式
根目錄所在文件系統(tǒng)為非傳統(tǒng)Linux“認識”的文件系統(tǒng)
其他必須要在內(nèi)核加載時提供的模塊
?
可以使用mkinitrd命令來重制initrd文件
mkinitrd [-v] [--with=模塊名稱] initrd文件名 內(nèi)核版本
例1:以mkinitrd的默認功能創(chuàng)建一個initrd虛擬硬盤文件
mkinitrd -v initrd_$(uanem -r) ?$(uname -r)
例2:增加8139too這個模塊的initrd文件
mkinitrd -v --with=8139too initrd_vbirdtest ?$(uname -r)
?
安裝grub(grub-install是安裝grub相關(guān)的文件到設(shè)備上去等待在啟動時被讀取,但還需要設(shè)置好配置文件menu.lst后,再以grub shell來安裝grub主程序到MBR或者boot sector上面去)
grub-install [--root-directory=DIR] ?INSTALL_DEVICE
例1:將grub安裝到目前系統(tǒng)的MBR下面,我的系統(tǒng)為/dev/had
grub-install /dev/hda
例2:我的/home為獨立的/dev/sda3,如何安裝grub到/dev/sda3
grub-install --root-directory=/home /dev/sda3
?
內(nèi)核功能中的vga設(shè)置
解決tty1~tty6的分辨率問題
首先產(chǎn)看是否支持FRAMEBUFFER_CONSOLE這個內(nèi)核功能參數(shù)
grep 'FRAMEBUFFER_CONSOLE' ?/boot/config-3.2.0-23-generic-pae (如果出現(xiàn)CONFIG FRAMEBUFFER CONSOLE=y表示有支持)
修改分辨率 vi /boot/grub/menu.lst (或者是grub.cfg文件 添加紅色部分)
menuentry 'Ubuntu,Linux 3.2.0-67-generic-pae' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root c6008246-e4ee-490f-bec6-3f72108424dd
linux /boot/vmlinuz-3.2.0-67-generic-pae root=UUID=c6008246-e4ee-490f-bec6-3f72108424dd ro quiet splash $vt_handoff
vga=790
initrd /boot/initrd.img-3.2.0-67-generic-pae
}
790對應(yīng)著1024*768的分辨率,還有其他參數(shù),如784~795,769,771,773,775
?
20.4啟動過程的問題解決
1)忘記密碼
a.重新啟動
b.啟動進入grub菜單后,在要進入的菜單上按“e” 進入菜單設(shè)置
grub edit>kernel /vmlinuz-2.6.18-92.e15 ro root=LABEL=/ rhgb quiet single
(我的ubuntu下應(yīng)該是linux /boot/vmlinuz-3.2.0-67-generic-pae root=UUID=c6008246-e4ee-490f-bec6-3f72108424dd ro quiet splash $vt_handoff single )
按下enter在按b就能夠啟動進入單用戶維護模式
c.進入單用戶模式后,就可以執(zhí)行shell,輸入passwd就能夠重新root密碼,在執(zhí)行init 5可以切換成X窗口界面
?
2)init配置文件錯誤
a.同樣啟動進入grub后
grub edit>kernel /vmlinuz-2.6.18-92.e15 ro root=LABEL=/ rhgb quiet? init=/bin/bash
將內(nèi)核調(diào)用的第一個進程init變成/bin/bash
b.在shell中輸入mount -o remount,rw /(將根目錄重新掛載成可讀寫)
mount -a(參考/etc/fstab的內(nèi)容重新掛載文件系統(tǒng))
c.然后進行救援工作,完畢后,重啟一次就可以了
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
