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