1. 程式人生 > >CentOS系列啟動流程詳解

CentOS系列啟動流程詳解

chkconfig esp 任務 ios 參數 rootfs 歡迎信息 組件 ade

一、Linux啟動內核文件
1.Linux系統組成
動態視角:內核+根文件系統
靜態視角:磁盤分區+相關文件
2.Kernel特點
(1)支持某塊化:.ko (kernel object)文件
(2)支持模塊運行時動態裝載或卸載;
總結:Linux kernel在單內核設計模型上,吸取了多內核設計的優點,使用了模塊化設計
單內核設計:把所有功能集成於同一個程序;如Linux
微內核設計:每種功能使用一個單獨的子系統實現;如Windows, Solaris
3.kernel組成
(1)核心文件
1)/boot/vmlinuz-VERSION-release
註: “ vmlinuz ”最後一個z表示壓縮格式的kernel文件
2)ramdisk(中間臨時文件根系統,動態創建出來的,使用緩沖和緩存來加速對磁盤上的文件訪問)
安裝操作系統後臨時生成的文件,能夠掃描當前操作系統的硬盤驅動,裝載對應的模塊
用於實現系統初始化的基於內存的磁盤設備,把內存中的一段空間當內存使用
CentOS 5:/boot/initrd-VERSION-release.img
工具程序:mkinitrd
CentOS 6,7:/boot/initramfs-VERSION-release.img
工具程序:dracut, mkinitrd
註意:
a)不是必須的,當自編譯內核時候知道硬盤接口時候將硬盤驅動編譯進kernel,ramdisk就不用了
b)initrd,基於ramdisk的磁盤映像文件;initramfs,基於ramdisk的文件系統
initrd啟動後用free查看memory時候,有一段空間被buffers和cached占用,二次緩存
把內存當磁盤使用就必須要在內存中緩存和緩沖,而當做文件系統則避免雙緩沖雙緩存
[root@centos7 ~]# cd /boot
[root@centos7 /boot]# ll
total 128764
-rw-r--r--. 1 root root 151918 Nov 9 07:43 config-3.10.0-957.el7.x86_64
drwx------. 3 root root 17 Nov 9 08:46 efi
drwxr-xr-x. 2 root root 27 Jan 3 22:02 grub
drwx------. 5 root root 97 Jan 3 22:22 grub2
-rw-------. 1 root root 74000291 Jan 3 22:18 initramfs-0-rescue-7d3c429a01ad4cf6be18b47612865dfd.img
-rw-------. 1 root root 29296849 Jan 3 22:22 initramfs-3.10.0-957.el7.x86_64.img
-rw------- 1 root root 11245847 Feb 11 17:03 initramfs-3.10.0-957.el7.x86_64kdump.img
-rw-r--r--. 1 root root 314036 Nov 9 07:43 symvers-3.10.0-957.el7.x86_64.gz
-rw-------. 1 root root 3543471 Nov 9 07:43 System.map-3.10.0-957.el7.x86_64
-rwxr-xr-x. 1 root root 6639904 Jan 3 22:18 vmlinuz-0-rescue-7d3c429a01ad4cf6be18b47612865dfd
-rwxr-xr-x. 1 root root 6639904 Nov 9 07:43 vmlinuz-3.10.0-957.el7.x86_64
[root@centos7 /boot]# file initramfs-3.10.0-957.el7.x86_64.img
initramfs-3.10.0-957.el7.x86_64.img: ASCII cpio archive (SVR4 with no CRC)
(2)模塊文件:/lib/modules/VERSION-release(與內核版本發行號相同的目錄)/*
[root@centos7 ~]# ls /boot
config-3.10.0-957.el7.x86_64
efi
grub
grub2
initramfs-0-rescue-7d3c429a01ad4cf6be18b47612865dfd.img
initramfs-3.10.0-957.el7.x86_64.img
initramfs-3.10.0-957.el7.x86_64kdump.img
symvers-3.10.0-957.el7.x86_64.gz
System.map-3.10.0-957.el7.x86_64
vmlinuz-0-rescue-7d3c429a01ad4cf6be18b47612865dfd
vmlinuz-3.10.0-957.el7.x86_64
[root@centos7 ~]# ls /lib/modules/3.10.0-957.el7.x86_64/
build modules.builtin modules.modesetting source
extra modules.builtin.bin modules.networking updates
kernel modules.dep modules.order vdso
modules.alias modules.dep.bin modules.softdep weak-updates
modules.alias.bin modules.devname modules.symbols
modules.block modules.drm modules.symbols.bin
[root@centos7 ~]# ls /lib/modules/3.10.0-957.el7.x86_64/kernel/
arch crypto drivers fs kernel lib mm net sound virt

[root@centos7 ~]# ls /lib/modules/3.10.0-957.el7.x86_64/kernel/

arch :與平臺相關的特有代碼,專有的匯編級的代碼
crypto:加密解密組件
drivers:驅動程序
fs :文件系統
kernel :內核自己追蹤用到的文件
lib:庫文件
mm:內存管理功能,memory manage
net:網絡功能
sound:和聲音相關的驅動程序,單獨放出來,因為有很多與聲音相關的×××
virt:訪問虛擬機
二、CentOS系列PC架構MBR主機啟動流程
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/.conf) --> 設定運行級別 --> 系統初始化腳本 --> 關閉或啟動對應級別下的服務 --> 啟動終端
1.POST:加電自檢,檢查硬件設備是否存在
用於實現POST的代碼在主板上ROM(CMOS)芯片上
BIOS:Basic Input and Output System 基本上輸入輸出系統,固化在ROM芯片上
2.Boot Sequence:
按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備;
技術分享圖片
bootloader:引導加載器,程序;
提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本; 把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而後把系統控制權移交給內核;
(1)Windows上引導加載器:ntloader
(2)Linux上引導加載器:
1)LILO:短小精悍的linux加載器,1024柱面之後無法加載,現在多用於安卓手機啟動
2)GRUB:Grand Uniform Bootloader統一引導加載器
GRUB 0.X(CentOS 5/6):Grub Legacy
GRUB 1.X(CentOS 7):Grub2,完全重寫,設計理念上很大改變3.Kernel實現功能
kernel自身初始化,實現功能
---> 探測可識別到的所有硬件設備;
---> 加載硬件驅動程序;(有可能會借助於ramdisk加載驅動)
---> 以只讀方式掛載根文件系統;
---> 運行用戶空間的第一個應用程序:/sbin/init
4./sbin/init管理用戶空間服務進程
init程序的在不同CentOS版本上類型:
CentOS 5及以前:SysV init 配置文件:/etc/inittab
CentOS 6:Ubantu研發的Upstart 配置文件:/etc/inittab /etc/init/
.conf
CentOS 7:Systemd 配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
(1)CentOS 5:
SysV init,配置文件:/etc/inittab
技術分享圖片
[root@localhost ~]# cat /etc/inittab
id:3:initdefault: 此處 表示默認啟動級別為3文本界面,不能為0級別
/etc/inittab文件:每行定義一種action 以及與之對應的process
格式:id:runlevels:action:process
id:一個任務的標識符;
runlevels:在哪些級別啟動此任務;#,###,若此處為空則表示所有級別;
action:在什麽條件下啟動此任務;
wait:等待切換至此任務所在的級別時執行一次;
respawn:再次發起;此任務終止,就自動重新啟動;
initdefault:設定默認運行級別;此時process會省略,不是設定任務,而是默認啟動級別;
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本(CentOS5和6用到,7無);
process:任務;
(2)CentOS 6:
init程序:upstart,但依然為/sbin/init,
其配置文件: /etc/init/.conf, /etc/inittab(僅用於定義默認運行級別)
註意:
.conf為upstart風格的配置文件;各功能切割成片段
技術分享圖片
init-system-dbus.conf:主要在哪兒啟動服務的配置文件
rcS.conf: 系統初始化腳本
start-ttys.conf:啟動時的終端數量
rc.conf:啟動服務的配置文件
更改默認tty數量文件: [root@localhost init]# cat start-ttys.conf
技術分享圖片
(3)CentOS 7:不需要任何啟動腳本
init程序:systemd,配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
完全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl命令來控制服務;

systemctl {start|stop|restart|status} name[.service]

5.啟動運行級別初始化控制:/etc/rc.d/rc#.d
(1)系統運行級別:為了系統的運行或維護等目的而設定的機制;
0-6:共7個級別;
0:關機, shutdown
1:單用戶模式(single user),root用戶,無須認證;維護模式;
2:多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS;維護模式;
3:多用戶模式(mutli user),完全功能模式;文本界面;
4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
5:多用戶模式(multi user), 完全功能模式,圖形界面;
6:重啟,reboot
1) 默認級別:3, 5
2) 級別切換:init #
3) 級別查看命令:who -r ; runlevel
(2)/etc/rc.d目錄
1)rc #腳本:接受一個運行級別數字為參數;當級別切換時啟動或關閉服務
K:要停止的服務;
K##
,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而後關閉被依賴的;
S:要啟動的服務;
S##
,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務後啟動;
註意:按照glob通配,數字越小排在前面
技術分享圖片
2)/etc/rc.d/rc腳本框架(vim /etc/rc.d/rc)
for srv in /etc/rc.d/rc#.d/K; do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S
; do
$srv start
done
技術分享圖片
(3)/etc/init.d/ (/etc/rc.d/init.d/)腳本執行方式:

/etc/init.d/SRV_SCRIPT {start|stop|restart|status}

service SRV_SCRIPT {start|stop|restart|status}

       chkconfig命令:
              管理控制/etc/init.d/每個服務腳本在各級別下的啟動或關閉狀態;
      1) 查看:chkconfig  --list   [name]

技術分享圖片
2) 添加:chkconfig --add name
3) 刪除:chkconfig --del name
4) 修改指定的鏈接類型:
chkconfig [--level LEVELS] name <on|off|reset>
--level LEVELS:指定要控制的級別;默認為2345;
5) 能被添加的服務的腳本定義格式:
#!/bin/bash
#

chkconfig: ### ## ## ======註釋:運行級別、啟動優先級、關閉優先級======

description:

(4)/etc/rc.d/rc.local腳本:開機自動讀取此文件中命令
正常級別下,最後啟動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本
而是鏈接至了/etc/rc.d/rc.local (/etc/rc.local)腳本;
因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置於此腳本文件中即可。
技術分享圖片
6.系統初始化腳本:/etc/rc.d/rc.sysinit
(1) 設置主機名;
(2) 設置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的所有文件系統;
(5) 檢測根文件系統,並以讀寫方式重新掛載根文件系統;
(6) 設置系統時鐘;
(7) 根據/etc/sysctl.conf文件來設置內核參數;
(8) 激活lvm及軟raid設備;
(9) 激活swap設備;
(10) 加載額外設備的驅動程序;
(11) 清理操作;
7.啟動終端
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
(1)mingetty會調用login程序;
(2)打開虛擬終端的程序除了mingetty之外,還有諸如getty等;

啟動開機流程總結:
內核級別:

  1. POST做開機啟動時候的硬件檢測功能
    2.BootSequence(BIOS)啟動加載主引導分區MBR中的引導加載器程序BootLoader
    在LInux現行的BootLoader是三段劃分(打破446字節限制)的GRUB程序,
    第一段寫在BootLoader中
    1.5段在其後扇區用於文件系統的引導
    2段在boot/grub中提供國土部接口和調用系統內核kernel
    3.Kernel識別硬件、加載驅動、只讀掛載根文件系統、同時交付給用戶空間第一個程序/sbin/init
    此處特別要註意,系統發行商為了適應多種硬件接口驅動調用,會在第一次安裝系統時候,自動識別硬件接口,並調用唯一驅動程序來生成ramdisk文件,以內存當磁盤做虛根,驅動接口後會切換到真實的根文件系統上
    CentOS 5系列是initrd,當磁盤映像文件會造成二次緩存緩沖
    CentOS 6/7系列改進為initramfs,以文件系統形式可以不二次占用緩存和緩沖
    用戶空間級別
    4./sbin/init接管後更具其配置文件來初始化
    5.更具/sbin/init中的配置會設置默認運行級別,以及一些在/etc/init.d/設置的開機服務
    6./etc/rc.d/rc.sysinit運行系統初始化腳本,完成系統初始化
    7.關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務
    8.設置登錄終端 [--> 啟動圖形終端]

CentOS系列啟動流程詳解