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

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