来自ChinaUnix的对Linux rc.sysinit, rc, functions脚本的分析和Linux启动分析
生活随笔
收集整理的這篇文章主要介紹了
来自ChinaUnix的对Linux rc.sysinit, rc, functions脚本的分析和Linux启动分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
很不錯(cuò)的參考資料,摘自chinaunix?
首先貼上Linux的啟動(dòng)過程:?
系統(tǒng)啟動(dòng)?
1、系統(tǒng)加電?
2、BIOS 自檢 → 本地設(shè)備枚舉和初始化?
3、POST 代碼從內(nèi)存中清除,但運(yùn)行時(shí)服務(wù)(runtime service)仍然留在內(nèi)存。?
4、BIOS 從 CMOS 的設(shè)置中找出第1/2/3 啟動(dòng)設(shè)備(可能有第4個(gè)),然后逐個(gè)嘗試,?
并在第一個(gè) ”active“狀態(tài)的硬盤上讀入其 MBR?
第一階段引導(dǎo)加載程序?
1、MBR 實(shí)際上是由3個(gè)部分組成 :主引導(dǎo)加載程序(master bootloader code,446 字節(jié))、主分區(qū)表 (ppt)、magic nubmer (0xAA55)組成?
主分區(qū)表有4個(gè)記錄,對(duì)應(yīng)主分區(qū)1-主分區(qū)4,共64 字節(jié)。最后的 magic number 是 2 字節(jié)?
2、主引導(dǎo)加載程序搜索主分區(qū)表,掃描全部4個(gè)分區(qū)記錄,確保只有1個(gè)是被標(biāo)為”active“ 的(用 fdisk 可以設(shè)置某個(gè)分區(qū)為 active 分區(qū))。?
然后讀入該分區(qū)的引導(dǎo)扇區(qū)(前512 字節(jié))。active 分區(qū)一般是 C 盤或者 linux 的第一個(gè)分區(qū)?
3、主引導(dǎo)加載程序的作用就是讀入第2階段的引導(dǎo)加載程序?
第二階段引導(dǎo)加載程序?
1、第2階段引導(dǎo)加載程序的目的是加載內(nèi)核和 initrd 。GRUB 和 LILO 都是把 boot loader 程序分成兩部分,一部分在 MBR ,一部分在”active" 分區(qū)的引導(dǎo)扇區(qū)?
2、第2階段引導(dǎo)加載程序被讀入內(nèi)存后,它讀取 root() 命令給出的分區(qū)下的 grub/grub.conf ,顯示一個(gè)菜單,供用戶選擇?
3、GRUB 可以細(xì)分為3個(gè)階段,中間的一個(gè)是 stage1.5 ,它跟在 stage1 的后面,目的是讓 grub 能夠識(shí)別文件系統(tǒng)的類型?
內(nèi)核?
1、內(nèi)核自解壓?
2、按照 bootloader 向它提供的 initrd 在內(nèi)存中的地址,把 /dev/initrd 的內(nèi)容拷貝到 /dev/ram ,并釋放 /dev/initrd 所占用的內(nèi)存?
3、把 /dev/ram 按 rw 的模式掛載為初始根文件系統(tǒng)?
4、執(zhí)行其上面的 /linuxrc 或者 /init 腳本,目的是加載驅(qū)動(dòng)模塊?
5、在 /linuxrc 和 /init 腳本中,會(huì)有 pivot_root ()或者 switchroot 把 /sysroot 下的真正根文件系統(tǒng)設(shè)備掛載到 / ,把初始根文件系統(tǒng)掛載到 /initrd 下?
6、/linuxrc 和 /init 腳本的后面會(huì) umount /initrd 下的初始根文件系統(tǒng)(即使沒有完全卸載,也會(huì)在 /etc/rc.d/rc.sysinit 中把它們?nèi)啃遁d)?
7、接下來是啟動(dòng) init 進(jìn)程。在 2.4 內(nèi)核中,這個(gè)步驟是由內(nèi)核完成的。但在 2.6 內(nèi)核中,這個(gè)步驟是由 /init 腳本完成的。?
Init?
1、init 首先執(zhí)行 /etc/rc.d/rc.sysinit 進(jìn)行系統(tǒng)的初始化?
2、而 rc.sysint 會(huì)先執(zhí)行 /etc/rc.d/init.d/functions ,獲得一些有用的函數(shù),例如 daemon()、action ()、success()、failure()等?
3、按照默認(rèn)運(yùn)行級(jí)別或者 grub 啟動(dòng)時(shí)的 kernel 行給出的運(yùn)行級(jí)別運(yùn)行 /etc/rcN.d/ 下的腳本,先執(zhí)行 K 開頭的(按從低到高),再執(zhí)行S開頭的(從低到高)?
這個(gè)過程“有可能”是通過執(zhí)行 /etc/rc.d/rc 腳本實(shí)現(xiàn)的。因?yàn)?rc 腳本是為改變 runlevel 而做的,那么從關(guān)機(jī)(level 0)到 正常(level3/5)應(yīng)該也算是?
一種特殊的改變 runlevel 的情況吧?
4、按照 /etc/inittab 的要求在指定的虛擬控制臺(tái)上創(chuàng)建 mingetty 進(jìn)程,提示輸入用戶名和密碼?
5、執(zhí)行 login 命令,login 命令會(huì)做如下工作 :?
a)如果存在 ~/.hashlogin ,則以 "quiet" 的方式登錄,不顯示郵件、不打印 motd?
如果存在 /var/log/lastlog ,則打印最后登錄時(shí)時(shí)間?
b)設(shè)置環(huán)境變量,包括 HOME、MAIL、PATH 、SHELL、TERM 等?
PATH 值默認(rèn)是 /usr/local/bin:/bin:/usr/bin (對(duì)于普通用戶而言),?
對(duì)于 root 而言,則是 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 。?
c)如果不是 quiet login ,則打印用戶的郵件數(shù)量和 /etc/motd 文件)?
d)啟動(dòng) login shell (默認(rèn)是 /bin/sh),并執(zhí)行 ~/.bashprofile?
e)~/.bashprofile 會(huì)自動(dòng)執(zhí)行 ~/.bashrc ,而 ~/.bashrc 又調(diào)用 /etc/bashrc
首先貼上Linux的啟動(dòng)過程:?
系統(tǒng)啟動(dòng)?
1、系統(tǒng)加電?
2、BIOS 自檢 → 本地設(shè)備枚舉和初始化?
3、POST 代碼從內(nèi)存中清除,但運(yùn)行時(shí)服務(wù)(runtime service)仍然留在內(nèi)存。?
4、BIOS 從 CMOS 的設(shè)置中找出第1/2/3 啟動(dòng)設(shè)備(可能有第4個(gè)),然后逐個(gè)嘗試,?
并在第一個(gè) ”active“狀態(tài)的硬盤上讀入其 MBR?
第一階段引導(dǎo)加載程序?
1、MBR 實(shí)際上是由3個(gè)部分組成 :主引導(dǎo)加載程序(master bootloader code,446 字節(jié))、主分區(qū)表 (ppt)、magic nubmer (0xAA55)組成?
主分區(qū)表有4個(gè)記錄,對(duì)應(yīng)主分區(qū)1-主分區(qū)4,共64 字節(jié)。最后的 magic number 是 2 字節(jié)?
2、主引導(dǎo)加載程序搜索主分區(qū)表,掃描全部4個(gè)分區(qū)記錄,確保只有1個(gè)是被標(biāo)為”active“ 的(用 fdisk 可以設(shè)置某個(gè)分區(qū)為 active 分區(qū))。?
然后讀入該分區(qū)的引導(dǎo)扇區(qū)(前512 字節(jié))。active 分區(qū)一般是 C 盤或者 linux 的第一個(gè)分區(qū)?
3、主引導(dǎo)加載程序的作用就是讀入第2階段的引導(dǎo)加載程序?
第二階段引導(dǎo)加載程序?
1、第2階段引導(dǎo)加載程序的目的是加載內(nèi)核和 initrd 。GRUB 和 LILO 都是把 boot loader 程序分成兩部分,一部分在 MBR ,一部分在”active" 分區(qū)的引導(dǎo)扇區(qū)?
2、第2階段引導(dǎo)加載程序被讀入內(nèi)存后,它讀取 root() 命令給出的分區(qū)下的 grub/grub.conf ,顯示一個(gè)菜單,供用戶選擇?
3、GRUB 可以細(xì)分為3個(gè)階段,中間的一個(gè)是 stage1.5 ,它跟在 stage1 的后面,目的是讓 grub 能夠識(shí)別文件系統(tǒng)的類型?
內(nèi)核?
1、內(nèi)核自解壓?
2、按照 bootloader 向它提供的 initrd 在內(nèi)存中的地址,把 /dev/initrd 的內(nèi)容拷貝到 /dev/ram ,并釋放 /dev/initrd 所占用的內(nèi)存?
3、把 /dev/ram 按 rw 的模式掛載為初始根文件系統(tǒng)?
4、執(zhí)行其上面的 /linuxrc 或者 /init 腳本,目的是加載驅(qū)動(dòng)模塊?
5、在 /linuxrc 和 /init 腳本中,會(huì)有 pivot_root ()或者 switchroot 把 /sysroot 下的真正根文件系統(tǒng)設(shè)備掛載到 / ,把初始根文件系統(tǒng)掛載到 /initrd 下?
6、/linuxrc 和 /init 腳本的后面會(huì) umount /initrd 下的初始根文件系統(tǒng)(即使沒有完全卸載,也會(huì)在 /etc/rc.d/rc.sysinit 中把它們?nèi)啃遁d)?
7、接下來是啟動(dòng) init 進(jìn)程。在 2.4 內(nèi)核中,這個(gè)步驟是由內(nèi)核完成的。但在 2.6 內(nèi)核中,這個(gè)步驟是由 /init 腳本完成的。?
Init?
1、init 首先執(zhí)行 /etc/rc.d/rc.sysinit 進(jìn)行系統(tǒng)的初始化?
2、而 rc.sysint 會(huì)先執(zhí)行 /etc/rc.d/init.d/functions ,獲得一些有用的函數(shù),例如 daemon()、action ()、success()、failure()等?
3、按照默認(rèn)運(yùn)行級(jí)別或者 grub 啟動(dòng)時(shí)的 kernel 行給出的運(yùn)行級(jí)別運(yùn)行 /etc/rcN.d/ 下的腳本,先執(zhí)行 K 開頭的(按從低到高),再執(zhí)行S開頭的(從低到高)?
這個(gè)過程“有可能”是通過執(zhí)行 /etc/rc.d/rc 腳本實(shí)現(xiàn)的。因?yàn)?rc 腳本是為改變 runlevel 而做的,那么從關(guān)機(jī)(level 0)到 正常(level3/5)應(yīng)該也算是?
一種特殊的改變 runlevel 的情況吧?
4、按照 /etc/inittab 的要求在指定的虛擬控制臺(tái)上創(chuàng)建 mingetty 進(jìn)程,提示輸入用戶名和密碼?
5、執(zhí)行 login 命令,login 命令會(huì)做如下工作 :?
a)如果存在 ~/.hashlogin ,則以 "quiet" 的方式登錄,不顯示郵件、不打印 motd?
如果存在 /var/log/lastlog ,則打印最后登錄時(shí)時(shí)間?
b)設(shè)置環(huán)境變量,包括 HOME、MAIL、PATH 、SHELL、TERM 等?
PATH 值默認(rèn)是 /usr/local/bin:/bin:/usr/bin (對(duì)于普通用戶而言),?
對(duì)于 root 而言,則是 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 。?
c)如果不是 quiet login ,則打印用戶的郵件數(shù)量和 /etc/motd 文件)?
d)啟動(dòng) login shell (默認(rèn)是 /bin/sh),并執(zhí)行 ~/.bashprofile?
e)~/.bashprofile 會(huì)自動(dòng)執(zhí)行 ~/.bashrc ,而 ~/.bashrc 又調(diào)用 /etc/bashrc
?
然后就是強(qiáng)人的對(duì)Linux /etc/rc.sysinit, /etc/rc.d/rc, /etc/rc.d/functions這些腳本的分析,很到位。文章中標(biāo)注為紅色的是未分析的部分。??
/Files/super119/Linux_startup_scripts_hack.rar?
?
轉(zhuǎn)載于:https://www.cnblogs.com/super119/archive/2010/12/18/1909951.html
總結(jié)
以上是生活随笔為你收集整理的来自ChinaUnix的对Linux rc.sysinit, rc, functions脚本的分析和Linux启动分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#接口注意事项
- 下一篇: UDP:用戶数据报协议(读书笔记之二)