假設以個人架設的linux主機為例:當你按下電源鍵之后,計算機硬件會主動讀取BIOS來加載硬件信息及進行硬件系統的自我測試,之后系統會主動讀取系統第一個可啟動的設備,此時就可以讀入引導裝載程序了。
引導程序可以指定使用哪個內核文件來啟動,并實際加載內核到內存中解壓縮與執行,此時內核就能夠開始在內存內活動,并檢測所有硬件信息,與加載適當的驅動程序來使這部主機開始運行,等到內核檢測硬件與加載驅動程序之后就可以啟動系統了。
linux系統的啟動流程如下:
1、 加載BIOS的硬件信息與進行自我測試,并依據設置取得第一個可啟動的設備。
boot Sequence:按次序查找各引導設備,第一個有引導程序的設備即為本地啟用要用到的設備 (BIOS)
2、 讀取執行第一個啟動設備內MBR的Bootloader(grub)
Boot Loader的功能:要認識操作系統的文件格式,并根據這個加載內核到內存中去執行。
MBR是整個硬盤的第一個扇區內的一個塊,充其量整個大小也有446,要加載boot的分區的驅動程序,ll -h `locate *ext4.ko`可以看到驅動程序有631k,因此446個字節根本裝不下,不能加載驅動程序,因此linux將boot loader的程序代碼執行與設置分為兩個階段:
階段1、446個字節,不屬于任何一個分區,他是硬盤上面第一個扇區,也沒有文件系統,不需要驅動,
階段1.5、位于第一個扇區后面的扇區,用于存放/boot分區的文件系統的驅動程序,因為/boot是被ext4格式化的,因此需要驅動程序,才能該分區,/boot/grub/*,可以看到1.5階段的一些文件(備份使用)(fdisk -l 可以看到分區是從第一個柱面開始分的,所以還有0柱面8M的空間,用于存放這些數據,所以空間非常充裕 hexdump -C -n 15000 /dev/sda)。
階段2、掛載/boot目錄,加載內核文件,加載虛擬文件系統,掛載根文件系統,就是第三步所實現的功能,2st及內核等通常放置于一個基本磁盤分區(非raid,非lvs等/boot目錄可以單獨分區,如果想把根做成raid等非基本磁盤分區)。
grub功能:提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核版本裝載到RAM中的特定空間中,解壓,展開,而后把系統控制權移交給內核
3、 依據Bootloader的設置加載Kernel文件到內存中,Kernel會開始檢測硬件與加載驅動程序(此時接管bios工作)。
內核文件:/boot/vmlinuz-2.6.32-642.el6.x86_64
驅動程序:/lib/modules/
該文件存在磁盤上,內核需要加載磁盤驅動,才能掛載根目錄,訪問驅動程序,所以此時根根本無法掛載,因此就需要一個虛擬文件系統文件
虛擬文件系統文件:/boot/initramfs-2.6.32-642.el6.x86_64.img
在內存中解壓成一個偽根文件系統,內核借此加載適當的驅動程序,最總釋放虛擬文件系統,并掛載實際根目錄文件系統。
通過/bootloader加載到內存中,然后在內存中仿真成一個根目錄,且此仿真在內存中的文件系統能夠提供一個可執行程序,通過該程序來加載啟動過程中所最需要的驅動程序 (USB,raid,lv,scsi等),等載入完成之后,內核就能識別真正的根了,然后進程根切換,切換完成后,調用/sbin/init來開始后續的正常啟動流程。
該文件的查看方法:有file initramfs-2.6.32-642.el6.x86_64.img可以看到該文件是壓縮文件因此:
1、mv initramfs-2.6.32-642.el6.x86_64.img initramfs-2.6.32-642.el6.x86_64.img.gz
gzip -d initramfs-2.6.32-642.el6.x86_64.img.gz
cat initramfs-2.6.32-642.el6.x86_64.img | cpio -id
2、zcat initramfs-2.6.32-642.el6.x86_64.img | cpio -id
該文件刪除后的恢復方法:
1、救援模式
2、chroot /mnt/sysimage 切換根 救援模式的工具比較少 因此切換到根
3、mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 此操作要在/boot目錄下運行
4、exit;exit;reboot
4、 在硬件驅動成功后,Kernel會主動調用init進程,而init進程會取得run-level信息
Init:準備軟件執行環境,包括系統主機名,網絡設置,文件系統格式及其他服務的啟動等。
配置文件:/etc/inittab,在配置文件有一個重要的設置,就是默認run-level
5、 Init 執行/etc/rc.d/rc.sysinit文件來準備軟件執行的操作環境,配合好整個系統(如網絡,時區)
功能:
1、設置主機名:
2、設置歡迎信息
3、激活udey和selinux
4、掛載/etc/fstab文件中的定義的所有文件系統
5、檢測根文件系統,并以讀寫方式重新掛載根文件系統
6、設置系統時鐘;
7、根據/etc/sysctl.conf文件的設定,來設定內核參數;
8、激活lvm及軟raid
9、激活swap設備
10、加載額外設備的驅動程序;
11、清理操作;
6、 啟動核心的外掛模塊(/etc/modprobe.conf)
用戶加載自定義模塊的驅動程序,通常該文件可以自行產生。
7、 Init運行runl-level的各個服務的啟動(script方式)
運行級別:為了系統運行或維護的目的而設定的機制
0-6:7個級別
0:關機shutdown
1:單用戶模式(single user),root用戶,無需認證,維護模式
2、多用戶模式(multi user),會啟用網絡功能,但不會啟動NFS;維護模式
3、多用戶模式(mutli suer),完全功能模式;文本界面;
4、預留級別:目前無特別適用目的,但習慣以同3界別使用;
5、多用戶級別(multi user),完全功能模哦;
6、重啟模式,reboot
centos 6中/etc/inittab設置的默認級別為:
id:5:initdefault:
其中:
id:runlevels:action:process
id:一個任務的標識符
runlevels:在哪些級別下啟用此任務;
action:在什么條件下啟動此任務;
process:任務
action:
wait:等待切換至此任務所在的級別時執行一次;
respawn:一旦此任務終止時,就會重新啟動
initdefault:設定默認運行級別;此時process會省略
sysinit:設定系統初始化方式,此處一般指定/etc/rc.d/rc.sysinit腳本;
啟動對應級別下的服務(看默認級別,如果默認級別是5 就運行5下面的程序):
0:0:wait:/etc/rc.d/rc 0
。。。。
11:0:wait:/etc/rc.d/rc 5
12:0:wait:/etc/rc.d/rc 6
init要讀取/etc/inittab配置文件完成初始化,該配置文件中有一堆的/etc/rc.d/rc 0,每個級別都有分別做了定義,他會等到你切換到該級別上來,切換過來后,init會到該級別下,將所有k開頭的文件stop掉,所有s啟動起來,這就是有些服務開機自動能啟動的原因。Fl,rc5.d 目錄下面的文件都是軟連接,對應的都是/etc/init.d/下面對應的服務腳本,且配置文件在/etc/sysconfig/目錄下,rc5.d目錄下都是以k或者s打頭的,后面跟的數字代表執行的順序,且是以字符進行排序,表示執行的優先級。
當然我們也可以自定義/etc/inittab中的服務:
例如:
1、進入/etc/init.d下建立腳本
#!/bin/bash
#chkconfig:35 88 22
#description:test service
echo "How are you?"
2、chmod +x testrv
3、chkconfig –add testsrv
4、chkconfig –list testsrv
testrv 0:關閉 1:關閉 2:關閉 3:啟用 4:啟用 5:啟用 6:關閉
5、service testsrv
6、chkconfig –del testsrv
注意:chkconfig [–level <levels>] [–type <type>] <name> <on|off|reset|resetpriorities>
8、 Init執行/etc/rc.d/rc.local文件
目錄下中的/rc.local腳本,我們有任何啟動時就要運行的腳本可以寫到該文件中,在開機啟動的時候就會自動被加載。
9、 Init執行終端機模擬程序mingetty來啟動login進程,最后等待用戶登錄。
10、登錄后開始以shell控制合主機。
POST –> Boot Sequence (BIOS) –> Boot Loader (MBR) –> kernel(ramdisk) –rootfs –> switchroot –> /sbin/init –>(/etc/init/*.conf,/etc/inittab) –> 設定默認運行級別 –> 運行系統初始化腳本 –> 關閉或啟動對應級別下的服務 –> 啟動終端
內核模塊的增刪查
目前內核都是具有可讀取模塊化驅動程序的功能,我們也可以理解為驅動程序,那么到底目前內核中加載了多少模塊呢?
lsmod:查詢內核中加載的模塊 常配合grep使用
Module Size Used by nls_utf8 1455 1 fuse 79892 2 rfcomm 71079 4 sco 17493 2 bridge 85674 0 模塊名稱 模塊大小 此模塊是否被其他模塊所使用
modinfo:查詢模塊信息
格式:modinfo [-adln] [module_name][filename]
選項:
-a:僅列出作者名稱
-d:僅列出該modules的說明
-l:僅列出授權
-n:僅列出該模塊的詳細路徑
insmod:加載內核模塊(需要用戶自行加載一個完整文件名的模塊)
格式:insmod [/full/path/module_name][parameters]
insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko(必須要完整的文件名)
modprobe:加載內核模塊
格式:modprobe [-lcfr] module_name
選項:
-c:列出目前系統所有模塊
-l:列出目前在/lib/modules/`uname -r`/kernel 當中的所有模塊完整文件名
-f:起那個會加載模塊
-r:類似rmmod,就是刪除某個模塊
rmmod:刪除模塊
格式:rmmod [-fw] module_name
選項:
-f:強制將模塊刪除掉,不管是否使用
-w:若該模塊正被使用,則rmmod會等待該模塊被使用完畢后才刪除他
原創文章,作者:Naruto,如若轉載,請注明出處:http://www.www58058.com/45390