linux操作系統啟動流程 & grub簡述
CentOS 5 啟動流程
1.POST:通電自檢
2.BIOS:BOIS自檢,加載硬盤
3.讀取MBR,進行MBR引導
4.bootloader:grub引導菜單
5.加載內核 Kernel(ramdisk)
6.啟動init進程,依據inittab文件設定運行級別
7.init進程,執行rc.sysinit文件
8.啟動內核模塊,執行不同級別的腳本程序
9.執行/etc/rc.d/rc.local
10.啟動mingetty,進入系統登陸界面。
1.BIOS
打開計算機電源,計算機會首先加載BIOS信息。BIOS中包含了CPU的相關信息、設備啟動順序信息、硬盤信息、內存信息、時鐘信息、PnP特性等等。開機時將ROM中的指令映射到RAM的低地址空間,CPU讀取到這些指令,硬件的健康狀況進行檢查,按照BIOS中設置的啟動設備來啟動。
2.MBR
硬盤上第0磁道第一個扇區被稱為MBR,也就是Master Boot Record,即主引導記錄,它的大小是512字節,可里面卻存放了預啟動信息、分區表信息。
系統找到BIOS所指定的硬盤的MBR后,就會將其復制到0×7c00地址所在的物理內存中。被復制到物理內存的內容就是Boot Loader,那就是lilo或者grub了。
3.bootloader
Boot Loader 就是在操作系統內核運行之前運行的一段小程序。bootloader供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本; 把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后把系統控制權移交給內核。
Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的。
grub簡介
grub啟動三階段:
- stage1: 引導安裝在MBR中的引導程序(bootloader)
- stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;
- stage2:讀取存放在磁盤上的grub(存放位置:/boot/grub),grub的配置文件:/boot/grub/grub.conf,在etc目錄下有此文件的連接文件:/etc/grub.conf
注意:stage2及內核通常放置于同一個磁盤分區。
grub stage2功用:
- 提供菜單、并提供交互式接口
e: 編輯模式,用于編輯菜單;
c: 命令模式,交互式接口; - 加載用戶選擇的內核或操作系統
允許傳遞參數給內核
可隱藏此菜單 - 為菜單提供了保護機制
為編輯菜單進行認證
為啟用內核或操作系統進行認證
grub的命令行接口
help: 獲取幫助列表
help KEYWORD: 詳細幫助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數;
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;
boot: 引導啟動選定的內核;
手動在grub命令行接口啟動系統:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
如何識別設備
(hd#,#)
hd#: 磁盤編號,用數字表示;從0開始編號
#: 分區編號,用數字表示; 從0開始編號
grub配置文件
[root@localhost ~]# cat /boot/grub/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=d420f98e-b665-44d9-a4fd-e0e1503ea87c 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
參數:
default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始;
timeout=#:指定菜單項等待選項選擇的時長;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
hiddenmenu:隱藏菜單;
password [--md5] STRING: 菜單編輯認證;
title TITLE:定義菜單項“標題”, 可出現多次;
root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
password [--md5] STRING: 啟動選定的內核或操作系統時進行認證;
實例:手動恢復grub
1>.屏幕上出現grub的啟動項選擇菜單時按c鍵也是可以進入grub>狀態的
2>.輸入“ root (hd ” ,然后按兩次 TAB 鍵; /* 這會列出你電腦上可能的磁盤設備,硬盤為 hd0/hd1 或 sd0/sd1 等 */
然后,選擇你的安裝 Linux 系統的硬盤,比如 hd0 ,輸入 “ root (hd0, ” 再按兩次 TAB 鍵; /* 這會列出你的第一塊硬盤上的分區情況,你會知道哪個是 swap 交換分區, 0x82 ,哪個是 Linux 分區 0x83 */
3>.cat指令是用來查看文件內容的,有時我們不知道Linux的/boot分區,以及/根分區所在的位置,要查看/etc/fstab的內容來得知
這時,我們就要用到cat (hd[0-n],y)/etc/fstab 來獲得這些內容;注意要學會用tab鍵命令補齊的功能;
4>.root (hd[0-n,y) 指令來指定/boot所在的分區
選擇你認為可能的 /boot 目錄所在的分區:第一塊硬盤第一個分區
5>.kernel 指令,用來指定Linux的內核,及/所在的分區
如果/boot有自己獨立的分區,kernel格式如下;
kernel /vmlinuz在這里按tab鍵來補齊,就看到內核全稱了 ro root=/dev/hd[a-z]X
6>.initrd 命令行來指定initrd文件
如果/boot是獨立的一個分區,格式如下:
grub> initrd /init在這里tab 來補齊;
7>.boot 引導系統
前面的幾個步驟都弄好 。就進入引導
4.加載內核
Kernel,內核,Kernel是Linux系統最主要的程序,實際上,Kernel的文件很小,只保留了最基本的模塊,并以壓縮的文件形式存儲在硬盤中,當GRUB將Kernel讀進內存,內存開始解壓縮內核文件。
initrd(Initial RAM Disk),它在stage2這個步驟就被拷貝到了內存中,這個文件是在安裝系統時產生的,是一個臨時的根文件系統(rootfs)。因為Kernel為了精簡,只保留了最基本的模塊,因此,Kernel上并沒有各種硬件的驅動程序,也就無法識rootfs所在的設備,故產生了initrd這個文件,該文件裝載了必要的驅動模塊,當Kernel啟動時,可以從initrd文件中裝載驅動模塊,直到掛載真正的rootfs,然后將initrd從內存中移除。
Kernel會以只讀方式掛載根文件系統,當根文件系統被掛載后,開始裝載第一個進程(用戶空間的進程),執行/sbin/init,之后就將控制權交接給了init程序。
總結
- 探測可識別到的所有硬件設備;
- 加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)
- 以只讀方式掛載根文件系統:rootfs;
- 運行用戶空間的第一個應用程序:/sbin/init
5. init:依據inittab文件設定運行級別
內核被加載后,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,并依據此文件來進行初始化工作。其實/etc/inittab文件最主要的作用就是設定Linux的運行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要運行在等級5上。Linux的運行等級設定如下:
[root@localhost ~]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
7個級別:
0:關機, shutdown
1:單用戶模式(single user),root用戶,無須認證;維護模式;
2、多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS;維護模式;
3、多用戶模式(mutli user),完全功能模式;文本界面;
4、預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
5、多用戶模式(multi user), 完全功能模式,圖形界面;
6、重啟,reboot
默認級別:3, 5
級別切換:init #
級別查看:
who -r
runlevel
配置文件/etc/inittab
每行定義一種action以及與之對應的process
id:runlevels:action:process
id:一個任務的標識符,用于唯一標識每個登記項,不能重復
runlevels:系統的運行級別,表示process的action要在哪個級別下運行,該段中可以定義多個運行級別,各級別之間直接寫不用分隔符;如果為空,表示在所有的運行級別運行
action:表示對應登記項的process在一定條件下所要執行的動作。
process:任務;
action:
wait:等待切換至此任務所在的級別時執行一次;
respawn:一旦此任務終止,就自動重新啟動之;
initdefault:設定默認運行級別;此時,process省略;
sysinit:設定系統初始化方式,只有系統開機或重新啟動的時候,這個process才會被執行一次,此處一般為指定/etc/rc.d/rc.sysinit腳本;
例子:
id:3:initdefault:
表示我們默認的運行級別是3,也就是說我們默認開機啟動會進入命令行模式。
si::sysinit:/etc/rc.d/rc.sysinit
所所有的運行級別下,init依賴/etc/rc.d/rc.sysinit這個腳本對系統進行初始化
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
.....
l6:6:wait:/etc/rc.d/rc 6
l0:標識
0:動作在0級別下運行
wait:是指在切換至0級別時執行后面的process(/etc/rc.d/rc 0),并且init進程會等待直到這些進程終止。/etc/rc.d/rc 0 這是一個腳本,后面的0是傳遞進去的參數 ,傳遞進去0就代表著要去啟動或關閉/etc/rc.d/rc0.d/目錄下的服務腳本所控制服務;
K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的;
S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動
[root@localhost rc1.d]# cd /etc/rc.d/rc0.d
[root@localhost rc0.d]# ls
K01smartd K16abrt-ccpp K60crond K75ntpdate K87irqbalance K92ip6tables K99sysstat
K05atd K16abrtd K61nfs-rdma K75quota_nld K87restorecond K92iptables K99vmware-tools
K05wdaemon K25sshd K73winbind K75udev-post K88auditd K92pppoe-server S00killall
K10cups K30postfix K74acpid K83bluetooth K88rsyslog K95firstboot S01halt
K10psacct K30spice-vdagentd K74haldaemon K84NetworkManager K89netconsole K95rdma
K10saslauthd K43vmware-tools-thinprint K74ntpd K84wpa_supplicant K89portreserve K99cpuspeed
K15htcacheclean K50dnsmasq K75blk-availability K85mdmonitor K89rdisc K99lvm2-monitor
K15httpd K50kdump K75netfs K85messagebus K90network K99rngd
6.系統初始化腳本rc.sysinit
系統初始化腳本:/etc/rc.d/rc.sysinit
- 設置主機名;
- 設置歡迎信息;
- 激活udev和selinux;
- 掛載/etc/fstab文件中定義的所有文件系統;
- 檢測根文件系統,并以讀寫方式重新掛載根文件系統;
- 設置系統時鐘;
- 根據/etc/sysctl.conf文件來設置內核參數;
- 激活lvm及軟raid設備;
- 激活swap設備;
- 加載額外設備的驅動程序;
- 清理操作;
7.啟動內核模塊,執行不同級別的腳本程序
執行/etc/inittab中腳本:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
.....
l6:6:wait:/etc/rc.d/rc 6
8.執行/etc/rc.d/rc.local
/etc/rc.d/rc.local是給用戶自定義啟動時需要執行的文件。
9.啟動mingetty,進入系統登陸界面
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
(1)mingetty會調用login程序;
(2)打開虛擬終端的程序除了mingetty之外,還有諸如getty等;
CentOS6啟動流程
1.POST:通電自檢
2.BIOS:BOIS自檢,加載硬盤
3.讀取MBR,進行MBR引導
4.bootloader:grub引導菜單
5.加載內核 Kernel(ramdisk)
6.啟動init進程,依據inittab文件設定運行級別 (inittab用于定義默認運行級別)
7.init進程,執行rc.sysinit文件
8.分別執行/etc/init/rcS.conf、/etc/init/rc.conf、/etc/init/start-ttys.confl來調用命令執行/etc/rc#.d/文件
里面定義的是各種服務的啟動腳本,可以ls查看,S開頭代表開機啟動的服務,K開頭的是關機要執行的任務。#代表數字,一個數字代表一個運行級別,共7個運行級別,這里就不多說了
9.執行/etc/rc.d/rc.local
10.執行/bin/login程序,等待用戶登錄
CentOS7啟動流程
1.POST:通電自檢
2.BIOS:BOIS自檢,加載硬盤
3.讀取MBR,進行MBR引導
4.bootloader:grub引導菜單
5.加載內核和inintamfs模塊
6.內核開始初始化,使用systemd來代替centos6以前的init程序
7.執行initrd.target
包括掛載/etc/fstab文件中的系統,此時掛載后,就可以切換到根目錄了
8.從initramfs根文件系統切換到磁盤根目錄
entos7表面是有“運行級別”這個概念,實際上是為了兼容以前的系統,每個所謂的“運行級別”都有對應的軟連接指向,默認的啟動級別時/etc/systemd/system/default.target,根據它的指向可以找到系統要進入哪個模式
模式:
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
9.systemd執行sysinit.target
10.systemd啟動multi-user.target下的本機與服務器服務
11.systemd執行multi-user.target下的/etc/rc.d/rc.local
12.Systemd執行multi-user.target下的getty.target及登錄服務
getty.target是啟動終端的systemd對象。如果到此步驟,系統沒有被指定啟動圖形桌面,到此就可以結束了,如果要啟動圖形界面,需要在此基礎上啟動桌面程序
13.systemd執行graphical需要的服務
區別
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100142