日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CentOS6 启动流程图文解剖 + 引导文件损坏处理方法

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CentOS6 启动流程图文解剖 + 引导文件损坏处理方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CentOS6 啟動流程圖文解剖 + 引導文件損壞處理方法

?1570人閱讀?評論(0)?收藏?舉報

轉載此文章是確實幫助到我,也希望能幫助到其它人;

解決 VFS:Unable to mount root fs on Unknown-block(0,0) 的問題,有可能是內核升級過程中引導文件損壞造成,如有老內核,可進入系統重新重成新內核的引導文件放到/boot/ 下即可。:) 重新生成引導文件方法參見下文“四、GRUB(GRand Unified Bootloader)、加載內核” -> “如何制作 initramfs”


我們在使用Linux操作系統的時候,我們只需按下電源鍵,等待,然后輸入賬戶和密碼就可以使用Linux操作系統了。那么在按下電源到輸入賬號和密碼之前,操作系統都做了些什么?下面就來講述在這段時間發生的動作。

下面以CentOS6系列為例來講解Linux的啟動流程。

一、Linux啟動流程詳解

下圖就是啟動流程的大致過程:

二、POST加電自檢

POST(PowerOnSelfTest)首先對每一個設備進行檢查。完成后會尋找存有引導記錄的設備,找到后讀入操作系統引導記錄,然后將系統控制權交給引導記錄,并由引導記錄來完成系統的順利啟動。

三、MBR引導

MBR(Master Boot Record) MBR記錄一般是在磁盤 0 磁道 1 扇區,共512個字節。前446個字節是BootLoder,后 4*16 的 64 個字節是存放分區信息的,最后 2 個字節是校驗信息,一般是 55AA。

四、GRUB(GRand Unified Bootloader)、加載內核

就是MBR中的前 446 個字節,是BooTLoader的一種,它的作用是要選擇要啟動的內核。

1、GRUB程序的組成:

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5組成。對于這些部分我的理解是這樣:

  • device.map:存放的是內核文件的根分區
  • menu.lis:是grub.conf的鏈接文件,但是這個名字我覺得更與它的功能接近,就是菜單列表。里賣弄設置了可以選擇的內核菜單。存放于stage2中。
  • stage:用于grub引導程序過大,所以分2段引導,第一段存放在MBR中,第二段存放于內核文件系統中,第一段引導完成后可以找到第二段。 但是,第二段是存放于內核文件系統中的,此時還沒有格式化文件系統,如何可以訪問到第二段的 menu.lst 呢??就需要借助于中間層 stage1_5,有它來協助 stage1 段來訪問 stage2 段。stage1_5通常位于 stage1 字段后的 63 個扇區。 由于stage2 在內存中存放可以使用的文件系統不確定,所以這就是有多個 stage1_5 的原因了。

2、grub.conf 文件參數意義

  • default=1????#?默認啟動的內核title,?0?表示是第一個 ?
  • timeout=5????#?默認等待時間 ?
  • splashimage=(hd0,0)/grub/splash.xpm.gz????#?指定菜單的背景圖片的路徑。為xpm格式,采用gzip壓縮,只能為14bits色 ?
  • hiddenmenu????#?隱藏菜單 ?
  • title?CentOS?(2.6.32-358.el6.x86_64)????#?標題名,用戶可自定義 ?
  • ????root?(hd0,0)????#?指定?grub?的根位置 ?
  • ????#?指定?kernel?文件的位置,還要指出?root(系統啟動后)?的位置,掛載方式?ro,這項很關鍵。 ?
  • ????#?加載后會啟動?init?進程。 ?
  • ????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 ?
  • ????#?在內核啟動過程中裝載根文件系統時有用 ?
  • ????initrd?/initramfs-2.6.32-358.el6.x86_64.img?
  • initramfs-2.6.32-358.el6.x86_64.img 的本質是????
  • #?initramfs?是以?gzip?壓縮的?cpio?格式的文件。內核啟動時將他作為一個臨時的根文件系統。 ?
  • #?grub?的?stage2?將initrd加載到內存里,讓后將其中的內容釋放到內容中, ?
  • #?內核便去執行init腳本,這時內核將控制權交給了init文件處理。 ?
  • #?init?它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完后, ?
  • #?會創建一個根設備,然后將根文件系統rootfs以只讀的方式掛載。 ?
  • #?這一步結束后,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序, ?
  • #?執行系統的1號進程。此后系統的控制權就全權交給/sbin/init進程了。?
  • 如何制作 initramfs 呢?

  • #?可以使用?dircut?命令,用法如下: ?
  • #?只有在?initramfs?文件損毀的時候會使用到 ?
  • [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 ?
  • #?詳細介紹,可使用這個鏈接: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: 進入編輯模式

    2)選擇要啟動的內核或系統

    允許傳遞引導參數給內核

    選擇界面可隱藏

  • #?可以自啟動是通過?grub?像內核傳遞參數。 ?
  • #?應用之一是:修改?root?密碼(忘記密碼),使用?e?選項,傳遞單用戶指令。?
  • 3)為編輯功能提供保護機制

    啟用內核文件

    選擇運行指定的內核得先輸入密碼

    傳遞參數

    使用e命令得先輸入密碼

  • [root@server?root]#?grub-md5-crypt? ?
  • Password:? ?
  • Retype?password:? ?
  • $1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0 ?
  • #?上面是生成的加密字符串 ?
  • #?然后將信息加入到?grub.conf?文件中,格式如下: ?
  • password?--md5?$1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0 ?
  • #?當然加入?grub.conf?文件的位置不同,加密效果也不一樣。 ?
  • #?加入到?title?之前的話,會加密整個菜單。 ?
  • #?加入到?title?指內的話,會加密對應的操作系統的入口。?
  • 4、安裝grub的方式

    1)使用grub-install命令

  • #?grub-install?[--root-directory=/path/to/somewhere]?DEVICE?
  • 2)grub交互是命令

    在這里我們自制一個精簡grub,當然啟動的時候只啟動一個bash就可以。示例是在 VMware 虛擬機下完成的。

    第一步:準備好塊新磁盤,分 2 個區出來

    第二步:模擬啟動時的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

    拷貝內核文件和 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?
  • 第四步: 生成根文件系統

    第五步:拷貝使用命令和庫到對應根目錄下

    將剛才的磁盤鏡像作為另一個虛擬機的啟動盤。

    五、啟動 init 進程

    init 進程是系統啟動的第一個進程。其他進程都是有此進程控制fork出來的,也就是說,init是其他進程的“祖先”,PID=1。當然,PID=0進程我們稱為空閑進程是屬于內核的。

    init啟動后所做的事情:

    1、讀取/etc/inittab來讀取默認級別?假設:讀取到的默認級別是 3

    /etc/init/*.conf

  • #?啟動級別:(runlevel) ?
  • #?0:關機 ?
  • #?1:單用戶模式 ?
  • #?2:多用戶模式,不支持?NFS?功能 ?
  • #?3:完全多用戶模式,支持文本接口 ?
  • #?4:預留模式 ?
  • #?5:完全多用戶模式,支持圖形模式 ?
  • #?6:關機 ?
  • #?/etc/inittab文件格式如下,這是遵循了CentOS5的風格。 ?
  • id:3:initdefault:?
  • 2、執行初始化系統腳本 /etc/rc.d/rc.sysinit 來初始化腳本

    這個大家有機會可以讀讀,腳本主要的作用如下:

  • #?獲取網絡環境與主機類型。首先會讀取網絡環境設置文件"/etc/sysconfig/network",獲取主機名稱與默認網關等網絡環境。 ?
  • #?答應文本歡迎信息。 ?
  • #?掛載/etc/fstab文件中定義的其它文件系統。 ?
  • #?激活swap ?
  • #?檢測根文件系統,并以讀寫方式重新掛載 ?
  • #?決定是否啟動SELinux和udev。 ?
  • #?接口設備的檢測與即插即用(pnp)參數的測試。 ?
  • #?用戶自定義模塊的加載。用戶可以再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時會加載到系統中。 ?
  • #?加載核心的相關設置。按"/etc/sysctl.conf"這個文件的設置值配置功能。 ?
  • #?設置系統時間(clock)。 ?
  • #?設置終端的控制臺的字形。 ?
  • #?設置raid及LVM等硬盤功能。 ?
  • #?以方式查看檢驗磁盤文件系統。 ?
  • #?進行磁盤配額quota的轉換。 ?
  • #?重新以讀取模式載入系統磁盤。 ?
  • #?啟動quota功能。 ?
  • #?啟動系統隨機數設備(產生隨機數功能)。 ?
  • #?清楚啟動過程中的臨時文件。 ?
  • #?將啟動信息加載到"/var/log/dmesg"文件中。?
  • 3、然后執行 /etc/rc.d/rc 腳本

    此腳本運行的時候此腳本的時候,會讀取/etc/rc.d/rc3.d/下的所有腳本,來控制系統啟動的時候啟動或者關閉那些服務

  • #?這里面的腳本大致分為?2?類,以?S?開頭的和以?K?開頭的腳本。 ?
  • #?S?代表開機時啟動的,K?表示開機時不啟動。 ?
  • #?每個文件的命名格式,例如:S01sysstat?S?開機啟動?01?啟動次序?sysstat?啟動腳本名 ?
  • #?啟動的定義是在每個腳本中定義的:例如 ?
  • #?#?chkconfig:?-?85?15 ?
  • #?默認級別?啟動次序?不啟動次序?
  • 這些腳本是否開機自啟動,可由 chkconfig 命令來管理。

  • #?常用選項: ?
  • #?chkconfig?--add?SRV_SCRIPT?可以將自己寫的一些腳本,讓此命令統一管理。例如:chkconfig?--add?httpd ?
  • #?chkconfig?--del?SRV_SCRIPT?將服務刪除,意思就是服務不由chkconfig這種機制來管理 ?
  • #?chkconfig?SRV_SCRIPT?{on|off}?設置服務開機是否自啟動,默認管理的級別是2345. ?
  • #?--level?2345?等,指定默認級別,可以與其他選項一起使用?
  • 4、執行/etc/rc.d/rc.local腳本,此腳本是啟動過程中最后啟動的一個腳本。

    最后會執行 /bin/login 登錄用戶。至此系統啟動過程完成。

    0

    總結

    以上是生活随笔為你收集整理的CentOS6 启动流程图文解剖 + 引导文件损坏处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。