2018-04-20 啟動(dòng)流程和內(nèi)核管理1

1、內(nèi)核

  • Linux內(nèi)核特點(diǎn):
    支持模塊化:.ko(內(nèi)核對(duì)象)
    如:文件系統(tǒng),硬件驅(qū)動(dòng),網(wǎng)絡(luò)協(xié)議等
    支持內(nèi)核模塊的動(dòng)態(tài)裝載和卸載
  • 組成部分
    核心文件:/boot/vmlinuz-VERSION-release
[root@redhat7 boot]#file vmlinuz-3.10.0-693.el7.x86_64 ---可以看到
這個(gè)文件是個(gè)bz的壓縮文件,要把它引導(dǎo)到內(nèi)存中需要解壓縮。
vmlinuz-3.10.0-693.el7.x86_64: Linux kernel x86 boot executable bzImage, version 3.10.0-693.el7.x86_64 (mockbuild@x86-038.build.eng.bos.redhat.c, RO-rootFS, swap_dev 0x5, Normal VGA

ramdisk:輔助的偽根系統(tǒng)
CentOS 5: /boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img
模塊文件:/lib/modules/VERSION-release

2 centos6啟動(dòng)流程

  1. 加載BIOS的硬件信息,獲取第一個(gè)啟動(dòng)設(shè)備
  2. 讀取第一個(gè)啟動(dòng)設(shè)備MBR的引導(dǎo)加載程序(grub)的啟動(dòng)信息
  3. 加載核心操作系統(tǒng)的核心信息,核心開始解壓縮,并嘗試驅(qū)動(dòng)所有的硬件設(shè)備
  4. 核心執(zhí)行init程序,并獲取默認(rèn)的運(yùn)行信息
  5. init程序執(zhí)行/etc/rc.d/rc.sysinit文件
  6. 啟動(dòng)核心的外掛模塊
  7. init執(zhí)行運(yùn)行的各個(gè)批處理文件(scripts)
  8. init執(zhí)行/etc/rc.d/rc.local
  9. 執(zhí)行/bin/login程序,等待用戶登錄
  10. 登錄之后開始以Shell控制主機(jī)

3、啟動(dòng)的詳細(xì)過(guò)程

  • POST
    加電自檢,是BIOS功能的一個(gè)主要部分。BIOS也是一個(gè)小的系統(tǒng),在主板上,是一個(gè)芯片,負(fù)責(zé)完成對(duì)CPU、主板、內(nèi)存、硬盤子系統(tǒng)、顯示子系統(tǒng)、串并行接口、鍵盤、CD-ROM光驅(qū)等硬件情況的檢測(cè)等。
  • BootSequence
    BIOS按次序查找引導(dǎo)設(shè)備,第一個(gè)有引導(dǎo)程序的設(shè)備為本次啟動(dòng)設(shè)備。
  • bootloader: 引導(dǎo)加載器,引導(dǎo)程序,linux中的引導(dǎo)加載器是GRUB,centos6中是grub,centos7中是grub2。
    GRUB的引導(dǎo)加載分為三個(gè)階段:primary boot loader (MBR中的前446個(gè)字節(jié),不在分區(qū)上,在磁盤的0磁道0扇區(qū)): 1st stage,1.5 stage(幫助gurb去識(shí)別硬盤分區(qū)上的文件系統(tǒng),在512個(gè)字節(jié)之后的扇區(qū)上可以找到,不在分區(qū)上),secondary bootloader :2nd stage,硬盤分區(qū)上的文件。
    bootloader的功用:允許用戶選擇要啟動(dòng)系統(tǒng)或不同的內(nèi)核版本;把用戶選定的內(nèi)核裝載到內(nèi)存中的特定空間中,解壓、展開,并把系統(tǒng)控制權(quán)移交給內(nèi)核,此時(shí)BIOS將退出歷史舞臺(tái),使命已經(jīng)完成,BIOS程序就終止,內(nèi)核就控制了系統(tǒng)。
  • 加載內(nèi)核kernel
    ①自身初始化:一部分是grub去解壓,也有一部分是內(nèi)核自解壓。
    ②探測(cè)可識(shí)別到的所有硬件設(shè)備
    ③加載硬件驅(qū)動(dòng)程序,一部分借助于內(nèi)核的核心文件去加載,也有一部分借助于ramdisk加載驅(qū)動(dòng),也就是/boot/initramfs-2.6.32-696.el6.x86_64.img這個(gè)文件,這個(gè)文件是個(gè)本地回環(huán)文件,內(nèi)核加載時(shí)把它也加載到內(nèi)存中,把文件當(dāng)成一個(gè)磁盤來(lái)使用,稱為輔助的偽根文件系統(tǒng)ramdisk,啟動(dòng)時(shí)先在內(nèi)存中掛載這個(gè)文件系統(tǒng),這個(gè)文件系統(tǒng)中有很多驅(qū)動(dòng)模塊,其中就包括加載根文件系統(tǒng)的驅(qū)動(dòng)模塊,這個(gè)文件很重要,如果刪除或者損壞,根文件系統(tǒng)就無(wú)法加載,因?yàn)橹挥屑虞d了根的文件系統(tǒng)后才能切根、掛載根,進(jìn)而才能訪問(wèn)根下的數(shù)據(jù),去加載根下的程序,比如第一個(gè)程序init程序。
    ④以只讀方式掛載根文件系統(tǒng),為了防止內(nèi)核文件中有bug,掛載后把根刪除了,所以先以只讀方式掛載。
    ⑤運(yùn)行用戶空間的第一個(gè)應(yīng)用程序:/sbin/init
    加載內(nèi)核完畢后內(nèi)核的使命就完畢了,系統(tǒng)就交給了init,用它去加載用戶空間的程序。

總結(jié):系統(tǒng)初始化:
POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只讀) --> init(systemd)

4、ramdisk文件的制作

(1) mkinitrd命令 --centos5使用
為當(dāng)前正在使用的內(nèi)核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname-r).img$(uname-r) ---$()可以用代替
(2) dracut命令 ---centos6和7使用
為當(dāng)前正在使用的內(nèi)核重新制作ramdisk文件
dracut /boot/initramfs-$(uname-r).img $(uname-r)

[root@centos6 boot]#rm -f initramfs-2.6.32-696.el6.x86_64.img ---刪除文件
[root@centos6 boot]#ls  ---文件已經(jīng)刪除
config-2.6.32-696.el6.x86_64           lost+found
efi                                    symvers-2.6.32-696.el6.x86_64.gz
grub                                   System.map-2.6.32-696.el6.x86_64
initrd-2.6.32-696.el6.x86_64kdump.img  vmlinuz-2.6.32-696.el6.x86_64
[root@centos6 boot]# dracut /boot/initramfs-`uname -r`.img `uname -r`   ---制作這個(gè)文件
[root@centos6 boot]#ls
config-2.6.32-696.el6.x86_64         initrd-2.6.32-696.el6.x86_64kdump.img
dracut                               lost+found
efi                                  symvers-2.6.32-696.el6.x86_64.gz
grub                                 System.map-2.6.32-696.el6.x86_64
initramfs-2.6.32-696.el6.x86_64.img       ---已經(jīng)生成
vmlinuz-2.6.32-696.el6.x86_64
[root@centos6 boot]#cat /boot/grub/grub.conf  ---查看grub.conf下的文件
# 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/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=6350f737-89cd-4f10-b687-13672099dae5 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-696.el6.x86_64.img    ---這個(gè)名字和/boot下的文件是一個(gè)名字,所以生成的時(shí)候要跟這個(gè)文件中的名字要一樣
title windows 2017 
    rootnoverify (hd0,2)
    chainloader +1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容