系統(tǒng)加電,Power ---up /Reset
創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,專業(yè)領(lǐng)域包括網(wǎng)站建設(shè)、網(wǎng)站制作、電商網(wǎng)站制作開發(fā)、微信小程序開發(fā)、微信營銷、系統(tǒng)平臺(tái)開發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評(píng)估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!system startup --- BIOS/bootmonitor
stage 1 bootloader --- Master Boot Record
stage 2 bootloader --- Grub,LILO,etc.(其中Grub將stage2分為1.5和2)
kernel --- linux 內(nèi)核空間
init --- user-sapce 用戶空間
Operation
系統(tǒng)首次引導(dǎo)或重啟時(shí)加電的瞬間處理器(cpu)執(zhí)行存在于BIOS中的一段已知代碼,而后選擇一個(gè)可引導(dǎo)設(shè)備,pc可用來做引導(dǎo)的設(shè)備多樣(靈活),BIOS需確定使用哪個(gè)設(shè)備來引導(dǎo)
將stage 1 的引導(dǎo)加載程序(bootloader)加載至RAM執(zhí)行.bootloader大小小于512Bytes(一個(gè)扇區(qū)sector),主要工作是加載stage 2 的引導(dǎo)加載程序
stage2第二階bootloader加載至RAM執(zhí)行,通常屏幕有顯示動(dòng)畫,將linux內(nèi)核壓縮形態(tài)映像和一個(gè)可選的初始RAM磁盤(initramfs臨時(shí)根文件系統(tǒng))加載至內(nèi)存.stage2 bootloader控制權(quán)交給內(nèi)核映像,解壓和初始化,此階段stage2 bootloader會(huì)檢測系統(tǒng)硬件,枚舉 系統(tǒng)鏈接的硬件設(shè)備,掛載根設(shè)備,加載內(nèi)核必要的modules內(nèi)核模塊.
啟動(dòng)第一個(gè)用戶空間程序(init).執(zhí)行高級(jí)系統(tǒng)初始化工作.
cpu加電瞬間自動(dòng)尋找BISO存放位置,在此之前不依靠任何軟件純硬件執(zhí)行,開始執(zhí)行BISO的第一步加電自檢(POST):POST對(duì)硬件檢測,BIOS第二步本地設(shè)備枚舉和初始化.
BIOS有兩部分組成:POST代碼和運(yùn)行時(shí)服務(wù). POST完成后從內(nèi)存清理出來;運(yùn)行時(shí)服務(wù)依然存在于內(nèi)存,目標(biāo)操作系統(tǒng)能夠繼續(xù)使用BIOS運(yùn)行時(shí)服務(wù)所提供的服務(wù).
要引導(dǎo)一個(gè)操作系統(tǒng),BIOS運(yùn)行時(shí)會(huì)依據(jù)CMOS的設(shè)置定義的順序來搜索處于激活狀態(tài)并可以引導(dǎo)的設(shè)備.可引導(dǎo)設(shè)備可以是軟盤、硬盤、CD-ROM、硬盤上的分區(qū)、網(wǎng)絡(luò)上的設(shè)備.
搜索到可引導(dǎo)的硬盤(通常是硬盤)后,主引導(dǎo)記錄(MBR)中包含主引導(dǎo)加載程序.(MBR是512Btyes的一個(gè)扇區(qū)(sector),位于磁盤的第一個(gè)扇區(qū)(0磁道0柱面1扇區(qū)))將MBR加載至RAM(Random Access Memory,隨機(jī)存儲(chǔ)器,與cpu直接交互數(shù)據(jù),速度快),BIOS將控制權(quán)交給MBR.
MBR中的主引導(dǎo)加載程序(bootloader)是512Bytes的映像,其中包含bootloader程序代碼和一個(gè)分區(qū)表.前446Bytes是主引導(dǎo)加載程序--其中包含可執(zhí)行bootloader代碼和錯(cuò)誤消息文本.接下來64Bytes是分區(qū)表,共包含4個(gè)分區(qū)記錄(每個(gè)分區(qū)64/4=16Bytes).MBR以2Bytes特殊字節(jié)(0xAA55)(magic number,魔數(shù),多用來檢測完整性)結(jié)束.用來檢測MBR的有效性.
centos6 備份MBR的信息的方法: dd if=/dev/sda of=MBR.bak bs=1 conut=512 od -xa MBR.bak 查看以十六進(jìn)制和ASCII碼打印二進(jìn)制文件
MBR中的主引導(dǎo)加載程序主要的工作是查找并加載次引導(dǎo)加載程序(即stage 2 bootloader),通過在分區(qū)表中查找一個(gè)激活分區(qū)后,掃描分區(qū)中的其他分區(qū)確保其他都是非活動(dòng)的,此后將激活分區(qū)中的引導(dǎo)記錄從設(shè)備中加載至RAM并執(zhí)行.
次引導(dǎo)加載程序可形象的稱為內(nèi)核加載程序.主要任務(wù)是加載linux kernel和可選的初始RAM磁盤.
一般的pc機(jī)中,stage 1 bootloader和stage 2 bootloader統(tǒng)稱為GRand Unified Bootloader(GRUB)或Linux Loader(LILO).
GRUB階段的引導(dǎo)加載程序:
/boot/grub中包含了stage1,stage1.5,stage2引導(dǎo)加載程序,和其他引導(dǎo)加載程序及kernel,initramfs.
GRUB通過將兩個(gè)階段轉(zhuǎn)化為三個(gè)階段的引導(dǎo)加載程序?qū)崿F(xiàn)的.
stage 1:MBR引導(dǎo)了一個(gè)1.5階段的引導(dǎo)加載程序加載并運(yùn)行(而不是直接將stage2中的次引導(dǎo)加載程序引導(dǎo)過來)
stage 1.5:引導(dǎo)加載程序,可以理解包含Linux內(nèi)核映像的特殊文件系統(tǒng).(比如/boot/grub/e2fs_stage1_5要從ext2或ext3中加載)
stage 2:等待stage1.5引導(dǎo)加載完成后stage2次引導(dǎo)加載器開始加載,完成之后,GRUB可以在接受請求的顯示內(nèi)核列表(在/etc/grub.conf中定義,軟符號(hào)鏈接/etc/grub/menu.lst和/etc/grub.conf),可以選擇內(nèi)核和修改內(nèi)核參數(shù).甚至可是使用Grub命令行提供的命令對(duì)引導(dǎo)過程進(jìn)行手工定義啟動(dòng).
grub手工自定義:可以用initrd的映像引導(dǎo)一個(gè)kernel
grub>root (hd0,0) #定義可啟動(dòng)的設(shè)備 grub>kernel /vmlinuz #定義啟動(dòng)時(shí)的內(nèi)核 grub>initrd /initramfs.img #定義initramfs鏡像 grub>boot #按照手工定義的方式啟動(dòng)
將stage2的bootloader加載至內(nèi)存后,就可以對(duì)文件系統(tǒng)進(jìn)行查詢,將默認(rèn)的內(nèi)核映像和initrd映像加載至內(nèi)存中.當(dāng)映像文件準(zhǔn)備好之后,stage 2 bootloader調(diào)用內(nèi)核映像.
內(nèi)核映像被加載至內(nèi)存中,stage2 bootloader控制權(quán)釋放后,kernel 階段開始.內(nèi)核映像不是可執(zhí)行的內(nèi)核,是被壓縮的kernel映像,通常是vmlinuz.在這個(gè)內(nèi)核映像的前面是一個(gè)例程,實(shí)現(xiàn)少量的硬件設(shè)置,并從包含內(nèi)核的映像中將kernel解壓縮出來,而后將內(nèi)核加載至高端內(nèi)存中,如果有初始RAM磁盤映像,則將其一起加載至內(nèi)存,并標(biāo)明供以后使用.此后,該例程會(huì)調(diào)用內(nèi)核,并開始啟動(dòng)內(nèi)核引導(dǎo)的過程.
啟動(dòng)init.即第一個(gè)用戶空間進(jìn)程(user-sapce process).通過啟用中斷,搶占式的調(diào)度器就可以周期性的接管控制權(quán),從而提供多任務(wù)能力.
在內(nèi)核引導(dǎo)的過程中,初始RAM磁盤(initrd)是由stage 2 bootloader加載至內(nèi)存中,被復(fù)制到RAM中并掛載到系統(tǒng)上.initrd會(huì)作為RAM中的臨時(shí)根文件系統(tǒng)使用,允許內(nèi)核在沒有掛載任何物理磁盤的情況下完整的實(shí)現(xiàn)引導(dǎo),由于與外圍設(shè)備交互的模塊可能是initrd的一部分,所以內(nèi)核可以很小,但仍需要支持大量的可能的硬件配置,內(nèi)核引導(dǎo)完成之后就可以將initrd根文件系統(tǒng)卸載掉,并掛載真正的文件系統(tǒng).
當(dāng)內(nèi)核引導(dǎo)并初始化之后,內(nèi)核就可以啟動(dòng)自己的第一個(gè)用戶空間應(yīng)用程序了,這是第一個(gè)調(diào)用標(biāo)準(zhǔn)函數(shù)庫編譯的程序.桌面系統(tǒng)中第一個(gè)啟動(dòng)的程序通常是/sbin/init進(jìn)程.到這里系統(tǒng)準(zhǔn)備就緒了.
centos5:SysV init 配置文件:/etc/inittab centos6:upstart 配置文件:/etc/inittab /etc/init/*.conf centos7:systemd 配置文件:/usr/lib/systemd/system,/etc/systemd/system
init相關(guān)的配置文件:/etc/inittab
每行定義一種action以及對(duì)應(yīng)的process id:runlevel:action:process id: 一個(gè)任務(wù)的標(biāo)志符 runlevel: 運(yùn)行級(jí)別,空則標(biāo)識(shí)所有的進(jìn)程 action:定義任務(wù)的啟動(dòng)條件 process:任務(wù) action: wait:等待切換至此級(jí)別是執(zhí)行一次 respawn:一旦此任務(wù)終止,就自動(dòng)重新啟動(dòng) initdefualt:設(shè)定默認(rèn)啟動(dòng)級(jí)別 sysinit:設(shè)定系統(tǒng)初始化的方式,此處一般指定/etc/rc.d/rc.sysinit
/etc/rc.d/rc 接受數(shù)字為參數(shù)
K##string:開機(jī)停止 (先KILL后start)數(shù)字越小越優(yōu)先,依賴的服務(wù)先關(guān)閉,被依賴的后關(guān)閉 S##string:開機(jī)啟動(dòng)
/etc/init.d/
讓程序接受chkconfig的管理 chkconfig --add services_name 不再接受chkconfig管理 chkconfig --del services_name 能被cokconfig所識(shí)別 #chkconfig: 運(yùn)行級(jí)別 啟動(dòng)級(jí)別 關(guān)閉級(jí)別 chkconfig: --list name 顯示單個(gè)的服務(wù)情況 修改控制的級(jí)別: --level LEVELS 默認(rèn)2345 注:正常情況下,最后一個(gè)服務(wù)S99local沒有連接至/etc/init.d下,而是直接指向了/etc/rc.local下,因此自定義的開機(jī)啟動(dòng)腳本直接放到/etc/rc.local中即可 /sbin/mingetty 會(huì)調(diào)用login程序; 打開基于vga的虛擬終端的還有g(shù)etty等也可以.
以上次shell程序自動(dòng)化編譯的apache service為例(腳本實(shí)現(xiàn)apache批量自動(dòng)化編譯移步http://cityx.blog.51cto.com/9857477/1918435):
按照系統(tǒng)啟動(dòng)的流程及chkconfig的特性實(shí)現(xiàn):
開機(jī)系統(tǒng)會(huì)運(yùn)行/etc/init.d/下的腳本或程序,那么將自定義的腳本或程序放入該目錄下就可以開機(jī)時(shí)被執(zhí)行,當(dāng)然將腳本的路徑加入到rc.local下開機(jī)時(shí)也會(huì)被執(zhí)行一般情況下值執(zhí)行一次,我們的需求是作為可控的服務(wù).
符合被chkconfig管理的服務(wù)腳本要求
# chkconfig: 2345 11 88 #腳本中需存在的格式 # description: This starts the Apache Daemon #centos6 可省
下面是我httpd服務(wù)(程序名為httpd)的腳本:將此腳本放入/etc/init.d下即可,留作下步用.
#!/bin/bash # # chkconfig: 345 98 01 # httpdir=/app/apache/httpd pidfile() { pgrep httpd > /app/apache/httpd/httpd.pid } VarVerification() { if [ -z $httpdir ] ;then httpdir=/app/apache/httpd fi } case $1 in start) VarVerification $httpdir/bin/apachectl start 1>/dev/null 2>$httpdir/start.log if [ $? -eq 0 ] ;then if [ -d /app/apache/httpd ] ;then pidfile else echo "The file 'httpd.pid' is not exist!" exit 10 fi else exit 11 fi ;; stop) VarVerification if [ -f $httpdir/httpd.pid ];then $httpdir/bin/apachectl stop if [ $? -eq 0 ] ;then mv $httpdir/httpd.pid /tmp &>/dev/null fi else pgrep httpd &>/dev/null if [ $? -eq 0 ];then $httpdir/bin/apachectl stop fi fi ;; restart) VarVerification $httpdir/bin/apachectl restart if [ $? -eq 0 ] ;then pidfile else mv $httpdir/httpd.pid /tmp fi ;; status) VarVerification if [ -f $httpdir/httpd.pid ];then echo "Apache service is running..." else echo "Apache service is DOWN!" fi esac
[root init.d]# chkconfig --add httpd #接受chkconfig的支配 chkconfig --del httpd #不再接受chkconfig的支配 chkconifg --level 2345 httpd on #指定2345模式下開機(jī)自啟動(dòng) [root init.d]# service httpd start #啟動(dòng)apache服務(wù)
[root init.d]# netstat -ntl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 :::80 :::* LISTEN [root init.d]# service httpd {stop|start|restart|status} 停止,啟動(dòng),重啟,狀態(tài)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。