CentOS6 啟動(dòng)流程圖文解剖 + 引導(dǎo)文件損壞處理方法
2014-08-12 04:58?
1570人閱讀??
收藏?
舉報(bào)
轉(zhuǎn)載此文章是確實(shí)幫助到我,也希望能幫助到其它人;
解決 VFS:Unable to mount root fs on Unknown-block(0,0) 的問(wèn)題,有可能是內(nèi)核升級(jí)過(guò)程中引導(dǎo)文件損壞造成,如有老內(nèi)核,可進(jìn)入系統(tǒng)重新重成新內(nèi)核的引導(dǎo)文件放到/boot/ 下即可。:) 重新生成引導(dǎo)文件方法參見(jiàn)下文“四、GRUB(GRand Unified Bootloader)、加載內(nèi)核” -> “如何制作 initramfs”
我們?cè)谑褂肔inux操作系統(tǒng)的時(shí)候,我們只需按下電源鍵,等待,然后輸入賬戶和密碼就可以使用Linux操作系統(tǒng)了。那么在按下電源到輸入賬號(hào)和密碼之前,操作系統(tǒng)都做了些什么?下面就來(lái)講述在這段時(shí)間發(fā)生的動(dòng)作。
下面以CentOS6系列為例來(lái)講解Linux的啟動(dòng)流程。
一、Linux啟動(dòng)流程詳解
下圖就是啟動(dòng)流程的大致過(guò)程:
二、POST加電自檢
POST(PowerOnSelfTest)首先對(duì)每一個(gè)設(shè)備進(jìn)行檢查。完成后會(huì)尋找存有引導(dǎo)記錄的設(shè)備,找到后讀入操作系統(tǒng)引導(dǎo)記錄,然后將系統(tǒng)控制權(quán)交給引導(dǎo)記錄,并由引導(dǎo)記錄來(lái)完成系統(tǒng)的順利啟動(dòng)。
三、MBR引導(dǎo)
MBR(Master Boot Record) MBR記錄一般是在磁盤(pán) 0 磁道 1 扇區(qū),共512個(gè)字節(jié)。前446個(gè)字節(jié)是BootLoder,后 4*16 的 64 個(gè)字節(jié)是存放分區(qū)信息的,最后 2 個(gè)字節(jié)是校驗(yàn)信息,一般是 55AA。
四、GRUB(GRand Unified Bootloader)、加載內(nèi)核
就是MBR中的前 446 個(gè)字節(jié),是BooTLoader的一種,它的作用是要選擇要啟動(dòng)的內(nèi)核。
1、GRUB程序的組成:
主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5組成。對(duì)于這些部分我的理解是這樣:
- device.map:存放的是內(nèi)核文件的根分區(qū)
- menu.lis:是grub.conf的鏈接文件,但是這個(gè)名字我覺(jué)得更與它的功能接近,就是菜單列表。里賣(mài)弄設(shè)置了可以選擇的內(nèi)核菜單。存放于stage2中。
- stage:用于grub引導(dǎo)程序過(guò)大,所以分2段引導(dǎo),第一段存放在MBR中,第二段存放于內(nèi)核文件系統(tǒng)中,第一段引導(dǎo)完成后可以找到第二段。 但是,第二段是存放于內(nèi)核文件系統(tǒng)中的,此時(shí)還沒(méi)有格式化文件系統(tǒng),如何可以訪問(wèn)到第二段的 menu.lst 呢??就需要借助于中間層 stage1_5,有它來(lái)協(xié)助 stage1 段來(lái)訪問(wèn) stage2 段。stage1_5通常位于 stage1 字段后的 63 個(gè)扇區(qū)。 由于stage2 在內(nèi)存中存放可以使用的文件系統(tǒng)不確定,所以這就是有多個(gè) stage1_5 的原因了。
2、grub.conf 文件參數(shù)意義
default=1????#?默認(rèn)啟動(dòng)的內(nèi)核title,?0?表示是第一個(gè) ?timeout=5????#?默認(rèn)等待時(shí)間 ?splashimage=(hd0,0)/grub/splash.xpm.gz????#?指定菜單的背景圖片的路徑。為xpm格式,采用gzip壓縮,只能為14bits色 ?hiddenmenu????#?隱藏菜單 ?title?CentOS?(2.6.32-358.el6.x86_64)????#?標(biāo)題名,用戶可自定義 ?????root?(hd0,0)????#?指定?grub?的根位置 ?????#?指定?kernel?文件的位置,還要指出?root(系統(tǒng)啟動(dòng)后)?的位置,掛載方式?ro,這項(xiàng)很關(guān)鍵。 ?????#?加載后會(huì)啟動(dòng)?init?進(jìn)程。 ?????kernel?/vmlinuz-2.6.32-358.el6.x86_64?ro?root=/dev/mapper/vg0-root?rd_NO_LUKS?rd_NO_DM?LANG=en_US.UTF-8?rd_LVM_LV=vg0/swap?rd_NO_MD?SYSFONT=latarcyrheb-sun16?crashkernel=auto?rd_LVM_LV=vg0/root??KEYBOARDTYPE=pc?KEYTABLE=us?rhgb?crashkernel=auto?quiet?rhgb?quiet ?????#?在內(nèi)核啟動(dòng)過(guò)程中裝載根文件系統(tǒng)時(shí)有用 ?????initrd?/initramfs-2.6.32-358.el6.x86_64.img? initramfs-2.6.32-358.el6.x86_64.img 的本質(zhì)是????
#?initramfs?是以?gzip?壓縮的?cpio?格式的文件。內(nèi)核啟動(dòng)時(shí)將他作為一個(gè)臨時(shí)的根文件系統(tǒng)。 ?#?grub?的?stage2?將initrd加載到內(nèi)存里,讓后將其中的內(nèi)容釋放到內(nèi)容中, ?#?內(nèi)核便去執(zhí)行init腳本,這時(shí)內(nèi)核將控制權(quán)交給了init文件處理。 ?#?init?它也主要是加載各種存儲(chǔ)介質(zhì)相關(guān)的設(shè)備驅(qū)動(dòng)程序。當(dāng)所需的驅(qū)動(dòng)程序加載完后, ?#?會(huì)創(chuàng)建一個(gè)根設(shè)備,然后將根文件系統(tǒng)rootfs以只讀的方式掛載。 ?#?這一步結(jié)束后,釋放未使用的內(nèi)存,轉(zhuǎn)換到真正的根文件系統(tǒng)上面去,同時(shí)運(yùn)行/sbin/init程序, ?#?執(zhí)行系統(tǒng)的1號(hào)進(jìn)程。此后系統(tǒng)的控制權(quán)就全權(quán)交給/sbin/init進(jìn)程了。?
如何制作 initramfs 呢?
#?可以使用?dircut?命令,用法如下: ?#?只有在?initramfs?文件損毀的時(shí)候會(huì)使用到 ?[root@server?~]#?dracut?/mnt/initramfs-`uname?-r`.img?`uname?-r` ?[root@server?~]#?du?-sh?/mnt/initramfs-2.6.32-358.el6.x86_64.img? ?16M?/mnt/initramfs-2.6.32-358.el6.x86_64.img ?[root@server?~]#?du?-sh?/boot/initramfs-2.6.32-358.el6.x86_64.img? ?16M?/boot/initramfs-2.6.32-358.el6.x86_64.img ?#?詳細(xì)介紹,可使用這個(gè)鏈接:https://zh.opensuse.org/index.php?title=SDB:Dracut&variant=zh-cn#.E5.90.AF.E7.94.A8_dracut_.E7.94.9F.E6.88.90.E7.9A.84_initramfs? 3、grub的功能
1)提供菜單,并提供交互式接口
e: 進(jìn)入編輯模式
2)選擇要啟動(dòng)的內(nèi)核或系統(tǒng)
允許傳遞引導(dǎo)參數(shù)給內(nèi)核
選擇界面可隱藏
#?可以自啟動(dòng)是通過(guò)?grub?像內(nèi)核傳遞參數(shù)。 ?#?應(yīng)用之一是:修改?root?密碼(忘記密碼),使用?e?選項(xiàng),傳遞單用戶指令。? 3)為編輯功能提供保護(hù)機(jī)制
啟用內(nèi)核文件
選擇運(yùn)行指定的內(nèi)核得先輸入密碼
傳遞參數(shù)
使用e命令得先輸入密碼
[root@server?root]#?grub-md5-crypt? ?Password:? ?Retype?password:? ?$1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0 ?#?上面是生成的加密字符串 ?#?然后將信息加入到?grub.conf?文件中,格式如下: ?password?--md5?$1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0 ?#?當(dāng)然加入?grub.conf?文件的位置不同,加密效果也不一樣。 ?#?加入到?title?之前的話,會(huì)加密整個(gè)菜單。 ?#?加入到?title?指內(nèi)的話,會(huì)加密對(duì)應(yīng)的操作系統(tǒng)的入口。? 4、安裝grub的方式
1)使用grub-install命令
#?grub-install?[--root-directory=/path/to/somewhere]?DEVICE? 2)grub交互是命令
在這里我們自制一個(gè)精簡(jiǎn)grub,當(dāng)然啟動(dòng)的時(shí)候只啟動(dòng)一個(gè)bash就可以。示例是在 VMware 虛擬機(jī)下完成的。
第一步:準(zhǔn)備好塊新磁盤(pán),分 2 個(gè)區(qū)出來(lái)
第二步:模擬啟動(dòng)時(shí)的boot目錄,和根目錄,并掛載。如下
[root@server?~]#?df?-H?|?tail?-n?2 ?/dev/sdd1??????????????518M????11M???481M???3%?/mnt/boot ?/dev/sdd2??????????????2.2G????71M???2.0G???4%?/mnt/sysroot? 第三步:制作 grub,并生成 grub 的配置文件
制作grub
拷貝內(nèi)核文件和 initramfs 文件到 /mnt/boot 目錄下,并生成 grub.conf 文件
[root@server?~]#?cp?/boot/vmlinuz-2.6.32-358.el6.x86_64?/mnt/boot/vmlinuz ?[root@server?~]#?cp?/boot/initramfs-2.6.32-358.el6.x86_64.img?/mnt/boot/initramfs.img ?[root@server?~]#?ll?/mnt/boot/ ?total?20106 ?drwxr-xr-x?2?root?root?????1024?Jul?24?20:58?grub ?-rw-r--r--?1?root?root?16542269?Jul?24?21:06?initramfs.img ?-rwxr-xr-x?1?root?root??4043888?Jul?24?21:05?vmlinuz ?#?生成的?grub.conf?文件 ?[root@server?~]#?cat?/mnt/boot/grub/grub.conf ?default=0?timeout=10?title?Mini?Linux ?????root?(hd0,0)? ?????kernel?/vmlinuz?ro?root=/dev/sda2?selinux=0?init=/bin/bash ?????initrd?/initramfs.img? 第四步: 生成根文件系統(tǒng)
第五步:拷貝使用命令和庫(kù)到對(duì)應(yīng)根目錄下
將剛才的磁盤(pán)鏡像作為另一個(gè)虛擬機(jī)的啟動(dòng)盤(pán)。
五、啟動(dòng) init 進(jìn)程
init 進(jìn)程是系統(tǒng)啟動(dòng)的第一個(gè)進(jìn)程。其他進(jìn)程都是有此進(jìn)程控制fork出來(lái)的,也就是說(shuō),init是其他進(jìn)程的“祖先”,PID=1。當(dāng)然,PID=0進(jìn)程我們稱(chēng)為空閑進(jìn)程是屬于內(nèi)核的。
init啟動(dòng)后所做的事情:
1、讀取/etc/inittab來(lái)讀取默認(rèn)級(jí)別?假設(shè):讀取到的默認(rèn)級(jí)別是 3
/etc/init/*.conf
#?啟動(dòng)級(jí)別:(runlevel) ?#?0:關(guān)機(jī) ?#?1:單用戶模式 ?#?2:多用戶模式,不支持?NFS?功能 ?#?3:完全多用戶模式,支持文本接口 ?#?4:預(yù)留模式 ?#?5:完全多用戶模式,支持圖形模式 ?#?6:關(guān)機(jī) ?#?/etc/inittab文件格式如下,這是遵循了CentOS5的風(fēng)格。 ?id:3:initdefault:? 2、執(zhí)行初始化系統(tǒng)腳本 /etc/rc.d/rc.sysinit 來(lái)初始化腳本
這個(gè)大家有機(jī)會(huì)可以讀讀,腳本主要的作用如下:
#?獲取網(wǎng)絡(luò)環(huán)境與主機(jī)類(lèi)型。首先會(huì)讀取網(wǎng)絡(luò)環(huán)境設(shè)置文件"/etc/sysconfig/network",獲取主機(jī)名稱(chēng)與默認(rèn)網(wǎng)關(guān)等網(wǎng)絡(luò)環(huán)境。 ?#?答應(yīng)文本歡迎信息。 ?#?掛載/etc/fstab文件中定義的其它文件系統(tǒng)。 ?#?激活swap ?#?檢測(cè)根文件系統(tǒng),并以讀寫(xiě)方式重新掛載 ?#?決定是否啟動(dòng)SELinux和udev。 ?#?接口設(shè)備的檢測(cè)與即插即用(pnp)參數(shù)的測(cè)試。 ?#?用戶自定義模塊的加載。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時(shí)會(huì)加載到系統(tǒng)中。 ?#?加載核心的相關(guān)設(shè)置。按"/etc/sysctl.conf"這個(gè)文件的設(shè)置值配置功能。 ?#?設(shè)置系統(tǒng)時(shí)間(clock)。 ?#?設(shè)置終端的控制臺(tái)的字形。 ?#?設(shè)置raid及LVM等硬盤(pán)功能。 ?#?以方式查看檢驗(yàn)磁盤(pán)文件系統(tǒng)。 ?#?進(jìn)行磁盤(pán)配額quota的轉(zhuǎn)換。 ?#?重新以讀取模式載入系統(tǒng)磁盤(pán)。 ?#?啟動(dòng)quota功能。 ?#?啟動(dòng)系統(tǒng)隨機(jī)數(shù)設(shè)備(產(chǎn)生隨機(jī)數(shù)功能)。 ?#?清楚啟動(dòng)過(guò)程中的臨時(shí)文件。 ?#?將啟動(dòng)信息加載到"/var/log/dmesg"文件中。? 3、然后執(zhí)行 /etc/rc.d/rc 腳本
此腳本運(yùn)行的時(shí)候此腳本的時(shí)候,會(huì)讀取/etc/rc.d/rc3.d/下的所有腳本,來(lái)控制系統(tǒng)啟動(dòng)的時(shí)候啟動(dòng)或者關(guān)閉那些服務(wù)
#?這里面的腳本大致分為?2?類(lèi),以?S?開(kāi)頭的和以?K?開(kāi)頭的腳本。 ?#?S?代表開(kāi)機(jī)時(shí)啟動(dòng)的,K?表示開(kāi)機(jī)時(shí)不啟動(dòng)。 ?#?每個(gè)文件的命名格式,例如:S01sysstat?S?開(kāi)機(jī)啟動(dòng)?01?啟動(dòng)次序?sysstat?啟動(dòng)腳本名 ?#?啟動(dòng)的定義是在每個(gè)腳本中定義的:例如 ?#?#?chkconfig:?-?85?15 ?#?默認(rèn)級(jí)別?啟動(dòng)次序?不啟動(dòng)次序? 這些腳本是否開(kāi)機(jī)自啟動(dòng),可由 chkconfig 命令來(lái)管理。
#?常用選項(xiàng): ?#?chkconfig?--add?SRV_SCRIPT?可以將自己寫(xiě)的一些腳本,讓此命令統(tǒng)一管理。例如:chkconfig?--add?httpd ?#?chkconfig?--del?SRV_SCRIPT?將服務(wù)刪除,意思就是服務(wù)不由chkconfig這種機(jī)制來(lái)管理 ?#?chkconfig?SRV_SCRIPT?{on|off}?設(shè)置服務(wù)開(kāi)機(jī)是否自啟動(dòng),默認(rèn)管理的級(jí)別是2345. ?#?--level?2345?等,指定默認(rèn)級(jí)別,可以與其他選項(xiàng)一起使用? 4、執(zhí)行/etc/rc.d/rc.local腳本,此腳本是啟動(dòng)過(guò)程中最后啟動(dòng)的一個(gè)腳本。
最后會(huì)執(zhí)行 /bin/login 登錄用戶。至此系統(tǒng)啟動(dòng)過(guò)程完成。
- 上一篇linux sort 命令詳解
- 下一篇linux 開(kāi)機(jī)啟動(dòng)服務(wù)和 chkconfig 使用方法
頂
0 踩
總結(jié)
以上是生活随笔為你收集整理的CentOS6 启动流程图文解剖 + 引导文件损坏处理方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。