本文主要講述CenOS系統啟動的整個流程。
對于CentOS系統來說,整個啟動過程可分為4個階段,分別是:加點自檢,加載MBR,加載內核并執行初始化信息,初始化用戶空間。下面就具體來描述每個過程都做了什么。
一.加點自檢(power on system test,POST)
任何一種操作系統的啟動,第一步必定是加點自檢,主要功能是裝載在硬件芯片CMOS之上的BIOS(Basic Input Output System)來實現,這個程序CMOS會根據CMOS上的配置信息去檢測當前計算機是否具有啟動系統的基本硬件能力,比如CPU,內存是否正常等等。
二.選擇啟動順序,加載MBR
完成BIOS初始化之后,BIOS會列出一些可以啟動的裝置順序,然后根據這個順序去找對應的內核文件。但是由于不同系統的文件系統系統可能會不同,所以就有了一個叫做啟動管理程序,來處理文件系統不同這些問題,而這個程序就叫做Booot Loader,它位于可以啟動的第一塊硬盤的MBR(Master Boot Record)中。MBR則是位于可以啟動的硬盤的第一個扇區之內,Boot Loader還要完成操作系統的識別,加載核心文件的功能,當用戶安裝多個系統以后,還會提供一個讓用戶選擇要啟動的操作系統的菜單。因此當MBR被破壞以后,Boot Loader也會收到影響,進而就會導致無法啟動系統。
三.加載內核Kernel,并執行系統初始化信息
當Boot Loader讀取操作系統內核文件后,接下來就會將內核文件解壓后裝載到內存之中,并依據內核所提供的功能去測試設備。此時,內核程序還沒加載到磁盤,也就是說此時系統還沒有磁盤的驅動能力,那又如何加載位于磁盤上的內核文件呢?
Linux采用了一種叫做虛擬文件系統(Initial RAM DISK)來解決這個問題,它的主要功能是:通過Boot Loader程序加載到內存中,然后這個文件就會被解壓展開到模擬的根文件系統中,這個根文件系統能提供一個可運行的程序,通過這個程序加載核心的模塊,完成之后,釋放虛擬的文件系統,并掛載真實的根文件系統,完成根切換,之后就能執行正常的啟動過程。
四.啟動用戶空間的第一個程序,初始化用戶空間
1.完成以上三步之后,內核會呼叫用戶空間的第一個程序:/sbin/init,這個程序會完成一系列的初始化操作,包括主機名設定,網絡配置等操作,所有的這些操作都是在init的配置文件中定義的。因此init配置文件就至關重要。
對于CentOS5:其采用的是SysV init方式,通過腳本啟動服務,有依賴關系的服務就會被串行啟動,配置文件為/etc/inittab
對于CentOS6:采用Upstart方式進行,進程間的通信通過D-Bus進行,可以基本實現類似并行啟動,配置文件為/etc/inittab,/etc/init/*.conf
對于CentOS7:采用了全新的Systemd方式,其特點是只有在服務第一次被啟動才會真正啟動,其配置文件為/usr/lib/systemd/*
2.init配置文件
在init配置文件中,尤為重要的一項是設置系統的默認運行級別,而在Linux之上,運行級別0-6七種級別,分別是:
0:關閉所有服務,然后關機 |
1:維護模式,也叫單用戶模式,允許root用戶可以不用密碼直接登錄系統 |
2:維護模式,也叫多用戶模式,需要認證,會啟動網絡 |
3:正常級別,完全多用戶模式,提供文本界面 |
4:預留級別,暫未使用 |
5:正常級別:完全多用戶級別,提供圖形節界面 |
6:關閉所有服務,重新啟動 |
??催\行級別的方法:
runlevel 或者 who -r |
切換運行級別的方法:
init run_level |
在CentOS6中,/etc/inittab文件內容是:
# inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, # with configuration in /etc/sysconfig/init. # # For information on how to write upstart event handlers, or how # upstart works, see init(5), init(8), and initctl(8). # # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) id:3:initdefault:
定義的格式為:
id:runlevel:action:process,例如上述文件中的最后一行:id:3:initdefault: |
因此init的整個處理流程為:
1.通過讀取/etc/inittab文件來設定運行級別 |
2.使用/etc/rc.d/rc.sysinit來初始化系統 |
3.執行3級別下所設定的操作,并忽略其他級別設定的配置 |
從上面可以看到,初始化系統是根據/etc/rc.d/rc.sysinit進行的,這個腳本的主要的任務是:
1.根據/etc/sysconfig/network文件來設定主機名 |
2.打印文本歡迎信息 |
3.激活SELinux和udev |
4.掛載/etc/fatab中定義的文件系統 |
5.激活swap設備 |
6.檢測根文件系統 |
7.設置系統時鐘 |
8.根據/etc/sysctl.conf文件來設定內核參數 |
9.激活LVM和RAID |
10.加載驅動程序 |
11.清理操作 |
當內核設定運行級別以后,就要去完成對應級別下的操作,而這些級別對應下的任務是/etc/rc.$runlevle.d
/下的操作,不同級別下這些腳本被成為服務腳本,這些腳本決定如何開啟或關閉服務,而具體的方式則是系統通過傳遞S參數來啟動服務,傳遞K來關閉服務;這些服務腳本的定義規范為:
(1)至少接受四個參數:
start:啟動服務 |
restart:重啟服務 |
stop:停止服務 |
status:查看服務運行狀態 |
(2)腳本的開頭
#chkconfig :start_level start_prio stop_prio #description:description information |
這些腳本可以通過/etc/init.d/script_name {start|stop|status|restart}調用,也可以通過service script_name {start|stop|status|restart}調用
五.grub
1.在系統啟動過程中,Boot Loader至關重要,然而Boot Loader處于MBR當中,MBR的大小是512bytes,只有其中的446bytes是用來存放Boot Loader的,為了解決存放Boot Loader的位置空間的大小問題,Linux將Boot Loader的程序分成三個階段來運行,在Linux上,grub是使用最廣泛的啟動加載器:
stage1:
執行Boot Loader主程序,這必須安裝在MBR中,而且沒有安放Boot Loader相關的配置文件
stage1_5:
在MBR隨后的分區存放,主要用于與stage2所在的文件系統進行交互
stage2:
通過Boot Loader加載所有配置文件及其相關的參數信息,而這些信息全都存放于/boot目錄之下,這些配置文件主要包括:
device.map:定義grub的安裝位置 |
e2fs_stage1_5:ext2文件系統定義 |
fat_stage1_5:fat文件系統定義 |
ffs_stage1_5:文件系統定義 |
grub.conf:grub的配置文件 |
iso9660_stage1_5:光驅的定義 |
jfs_stage1_5:jfs文件系統發的定義 |
menu.lst:鏈接文件 |
minix_stage1_5:文件系統的定義 |
reiserfs_stage1_5:reiser文件系統的定義 |
splash.xpm.gz:背景圖片 |
stage1:stage1相關的信息 |
stage2:stage2相關的信息 |
ufs2_stage1_5:ufs文件系統的定義 |
vstafs_stage1_5:vfs文件系統的定義 |
xfs_stage1_5:xfs文件系統的定義 |
2.Linux一切皆文件,對grub的配置也不例外,其配置文件為/etc/grub.conf
(1)設置grub的方法一,直接修改其配置文件
# 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/sda3 # 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-431.el6.x86_64) #設定操作系統的名稱 root (hd0,0) #設定要啟動的內核所在的位置 kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=908a3c89-4592-4dc4-8dc2-b5261f7c0e83 rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img #設定輔助內核引導的ramdisk文件的位置 |
(2)通過命令行接口
進入grub命令行,可以在啟動時根據提示的信息進入,在對應的title輸入c就能進入,
常用的grub命令有:
help:獲取幫助信息 |
find:查找文件 |
root:設定要啟動的內核所在的位置 |
kernel:設置內核文件路徑 |
initrd:設定ramdisk的位置 |
六.為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1) 為硬盤新建兩個主分區;并為其安裝grub;
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機;
具體過程為:
(1)創建分區,結果為
(2)格式化分區:
(3)創建目錄
(4)掛載
(5使用grub-install安裝grub
(6)提供內核文件和ramdisk文件
(7)為rootfs提供bash,ls,cat程序
復制庫文件:
(8)為grub提供配置文件
至此,制作完成
七.制作一個kickstart文件以及一個引導鏡像。描述其過程。
可以手動編輯或者通過system-config-kickstart來創建ks.cfg文件 #命令段 firewall --disabled #禁用防火墻 install #執行新的安裝操作 cdrom #使用光盤安裝 lang en_US.UTF-8 #默認安裝語言 keyboard us #選擇鍵盤 rootpw --iscrypted $6$LqIQ9sxk$JLd1tXFz/QavUP7lY4.HeR/HoVGHpgy2V8KzbxCZHxQw7tSH7y4rAqzFYB9yK6r76dxybToPduLH0UEn7Kcm81 #管理員加密密碼 authconfig --enableshadow --passalgo=sha512 selinux --enforcing #激活selinux logging --level=info #信息等級 timezone --utc Asia/Shanghai #定義系統時區 bootloader --location=mbr --driveorder=sdb --append="crashkernel=auto rhgb quiet" clearpart --all #刪除所有現在分區 part /boot --fstype=ext4 --size=200 #掛載分區 part / --fstype=ext4 --size=40960 part swap --size=4096 #腳本段 %pre #執行安裝前腳本 echo "start install" %end %post #執行安裝后腳本 echo "install end" #程序包段 %packages @chinese-support #使用中文 @development #安裝開發工具 @graphical-desktop-clients #安裝圖形化工具 @remote-desktop-clients #安裝遠程桌面客戶端 %end
(1)制作引導光盤
將系統光盤中除了Packages和repodata外的所有文件復制到同一個目錄下,并創建引導光盤
mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6 boot test" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso /root/centos6/ |
(2)制作自動安裝系統光盤
在/root/centos6/isolinux/isolinux.cfg文件中 append initrd=initrd.img 條目后,添加ks文件讀取路徑 ks=cdrom:/ks.cfg,然后把centos6目錄創建為光盤鏡像boot.iso
mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS6 boot test" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso /root/centos6/ |
原創文章,作者:zhangbao,如若轉載,請注明出處:http://www.www58058.com/60947
內容寫翔實扎實,但是整個介紹下來內容量還是比較大的,做為博客來講,考慮到讀者的感受,建議使用Markdonw來進行格式編寫,非常簡單實用。