grub and boot
Centos5,6的開機啟動流程
grub
Centos7的開機啟動流程
Centos5,6的開機啟動流程
initrd / initramfs
一般存儲在/boot目錄下,以.img為結尾的文件,是一個小型的根目錄系統的映像文件,裡面存放了各類系統必須的模組,為了解決内核在加載完成之後沒有模組無法訪問磁盤加載rootfs的問題。
rc
在inittab的文件中,有這麼一行命令 si::sysinit:/etc/rc.d/rc.sysinit ,這句話表示将設置的run level的值作為參數賦予給rc這個腳本。
我們先來看一下rc,打開/etc/rc.d/rc:
最主要的兩段:
for i in /etc/rc$runlevel.d/K* ; do #循環列出/etc/rc#.d目錄下以K開頭的文件并賦值給i。
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/K??} #做字符串切片,删去第一個/etc/rc$.d/K##的部分。
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] || continue #如果不存在相同的文件名或者文件名.init的服務腳本,則跳出當前這一輪循環。
check_runlevel "$i" || continue #檢查符号鍊接是否有效。
# Bring the subsystem down.
[ -n "$UPSTART" ] && initctl emit --quiet stopping JOB=$subsys
$i stop #傳遞當前服務程序stop參數。
[ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys
done
for i in /etc/rc$runlevel.d/S* ; do #循環列出/etc/rc#.d目錄下以S開頭的文件并賦值給i。
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/S??} subsys #做字符串切片,删去第一個/etc/rc$.d/S##的部分。
[ -f /var/lock/subsys/$subsys ] && continue 如果存在與服務腳本相同的文件名的文件就跳出當前這輪循環。
[ -f /var/lock/subsys/$subsys.init ] && continue 如果存在服務腳本.init的文件名的文件就條和醋當前這輪循環。
check_runlevel "$i" || continue 檢查符号連接是否有效。
# If we're in confirmation mode, get user confirmation
if [ "$do_confirm" = "yes" ]; then
confirm $subsys
rc=$?
if [ "$rc" = "1" ]; then
continue
elif [ "$rc" = "2" ]; then
do_confirm="no"
fi
fi
update_boot_stage "$subsys"
# Bring the subsystem up.
[ -n "$UPSTART" ] && initctl emit --quiet starting JOB=$subsys
if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then 如果執行到halt或者reboot腳本,就
export LC_ALL=C 去除所有本地化的設置
exec $i start 傳遞start參數給rc#
fi
$i start 傳遞start參數給服務腳本。
[ -n "$UPSTART" ] && initctl emit --quiet started JOB=$subsys
done
功能就是根據選擇的run level去傳遞對應的/etc/rc.d/rc一個數字,然後rc腳本就回去檢查相對應的/etc/rc.d/rc#.d目錄下的文件,将K[##關閉優先級]開頭的文件傳遞stop參數,将S[##啟動優先級]開頭的文件傳遞start參數,來打開關閉服務。
chkconfig:更新runlevel的啟動服務。
chkconfig [--add | --del] name :将一個服務添加/删除進系統服務。
chkconfig --list name:查詢一個服務在每一個run level下是否為開機啟動。
chkconfig [--level levels] [--type type] [--no-redirect] name <on|off|reset|resetpriorities>:設置指定的某一個run level下特定服務的狀态。
grub
大家都知道在計算機從bios中讀取到開機啟動順序之後按序去讀取MBR的過程我們稱為boot lorder,計算機在這個階段會去讀取MBR中占了446Byte的boot loader中的程序,而在Centos的發行版中基本上都是GRUB這個程序。
446Byte有多少大呢?446個英文字符,要在這麼小的空間中存放一個功能如此強大的程序,是怎麼做到的呢?
grub分為三部分,為stage1,stage1.5和stage2,stage1存放在boot lorder中,stage1指向磁盤中的存放1.5和2的目錄(一般為boot),然後通過stage1.5文件的簡單驅動來獲得/boot的内容得到stage2。
grub的設定文件
/boot/grub/grub.conf
有些boot目錄中會有menu.lst文件,仔細看哦這個文件是通過軟鍊接的形式連到grub.conf文件去的。
主要屬性:
default=0 默認啟動的系統,0代表第一個。
timeout=5 超時時間。
splashimage=(hd0,6)/boot/grub/splash.xpm.gz grub的背景畫面,這裡為指明了splash.xpm這張圖片~
hiddenmenu 是否隐藏grub的啟動菜單。
title Fedora Core (2.6.11-1.1369_FC4) 這個就是我們在grub界面看到的第一個頁面的選項内容啦~
root (hd0,6) 指定這個系統的根目錄
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ 指定核心以及rootfs
initrd /boot/initrd-2.6.11-1.1369_FC4.img 指定initramfs
title WinXp 這個就是第二個啦,XP哦~
rootnoverify (hd0,0) 類似root,但是不測試安裝該分區。
chainloader 1 GRUB讀入分區的第一個扇區的引導記錄。
grub手動指定引導
grub命令行下:
grub> find /PATH:可以查詢是否有路徑。
grub> root (hd0,1):指定根設備。
grub> kernel /vmlinux-version-relias.arch ro grub> root=ROOTFS_PATH:指定内核。
grub> initrd /initrd-version-relias.arch.img:指定ramfs文件。
grub> boot:開始引導。
grub安裝與修複
命令行中:
grub-install --root-directory=/boot /dev/sda :指定boot目錄與stage要寫入的磁盤。
grub命令行中:
grub> chroot /mnt/sysimage :挂載真正的rootfs。
grub> root (hd0,1):指定boot所在的根目錄。
grub> setup (hd0):将stage1寫入到MBR中。
Centos7的開機啟動流程
與Centos5,6相比,Centos7将系統啟動的第一支程序從init變成systemd,systemd并不是一個純粹的init系統,而且還能管理系統的各種daemon,并有用的多個新特性與功能。
支持平行啟動服務,并按照相依性啟動程序
按需啟動
支持快照與狀态恢複
c group預設限制硬件資源 …
支持平行啟動服務,并按照相依性啟動程序
對比init的腳本啟動,systemd大膽的将所有需要啟動的都分為一個一個的unit,并以對應的後綴來區分,大緻分為:
系統服務(.service)
挂載點(.mount)
sockets(.sockets)
系統設備(.device)
交換分區(.swap)
文件路徑(.path)
啟動目标(.target)
systemd計時器(.timer)
systemd會為每一個需要啟動的服務啟動一個套接字,來使不同的daemon之間可以通信,并為每一個daemon分配一個控制組,達到一組一組的按照相依性來啟動。
按需啟動
init在系統啟動時,會啟動所有預設為啟動的服務進程,并且系統必須等待所有的服務都啟動就緒之後才會允許用戶登錄操作,這樣會讓系統啟動速度非常慢,并且浪費系統資源。
systemd就采用了按需啟動,在開機時,做到不需要的服務就不啟動,在用到之後才回去啟用,然後使用完畢後一段時間後就又會關閉。
支持快照與狀态恢複
systemd能夠将系統當前的狀态保存為快照存貯下來,并且在需要時恢複當前系統狀态。
target
在systemd中,将原來sysV,upstart一直保留的run level改為了target這種形式,但是target并沒有run level劃分為0-6,而是更加細緻的分了非常多的target。
SysV啟動級别 Systemd目标 注釋
0 runlevel0.target, poweroff.target 中斷系統(halt)
1, s, single runlevel1.target, rescue.target 單用戶模式
2, 4 runlevel2.target, runlevel4.target, multi-user.target 用戶自定義啟動級别,通常識别為級别3。
3 runlevel3.target, multi-user.target 多用戶,無圖形界面。用戶可以通過終端或網絡登錄。
5 runlevel5.target, graphical.target 多用戶,圖形界面。繼承級别3的服務,并啟動圖形界面服務。
6 runlevel6.target, reboot.target 重啟
emergency emergency.target 急救模式(Emergency shell)
systemd啟動流程圖
systemctl命令
systemctl [options]
show [NAME.unittype]:顯示指定服務狀态或當前允許的服務列表。
status [NAME.unittype]:查看指定unit狀态。
list-units [--type TYPE] [--all]:查看指定unit類型的load,活動狀态,運行狀态,簡述。
list-unit-files --type TYPE [--all]:查看指定unit類型的啟動狀态,是否為開機自啟等。
start [NAME.unittype]:啟動指定unit。
stop [NAME.unittype]:停止指定unit。
restart [NAME.unittype]:重新啟動unit。
reload [NAME.unittype]:重新加載unit。
reset [NAME.unittype]:還原設置unit。
try-restart [NAME.unittype]:如果服務運行中才會重啟
enable [NAME.unittype]:設置為開機啟動。
disable [NAME.unittype]:設置為開機不啟動。
isolate [NAME.target]:切換到指定target。
get-default [NAME.target]:查詢開機默認target。
set-default [NAME.target]:設置開機默認target。
snapshot:創建一個快照,創建完成後在下次重啟後,系統會自動回複快照狀态。
hibernate:休眠模式,把信息寫入到文件中,也就是硬盤中,不會有斷電丢失數據的問題,但恢複時最慢,和重新開機一樣。
sleepp:睡眠模式,把信息到存到内存中,但不能斷電,斷電後數據丢失,恢複最快。
hybrid-sleep:混合睡眠模式。
reboot:重啟
halt:關機
systemd文件
/etc/systemd/system.conf:systemd設定檔。
/lib/systemd/system/NAME.UNIT:unit腳本文件位置。
/etc/systemd/system/NAME.UNIT.wants:存放了指定target要啟動的所有服務。
我們來看一下/etc/systemd/system/目錄下面到底存放了什麼文件。
[root@xiao ~]# ll /etc/systemd/system/
total 32
drwxr-xr-x. 2 root root 4096 Nov 21 2014 basic.target.wants
lrwxrwxrwx. 1 root root 37 Nov 21 2014 default.target -> /lib/systemd/system/multi-user.target 注意這個
drwxr-xr-x. 2 root root 4096 Nov 21 2014 default.target.wants
drwxr-xr-x. 2 root root 4096 Nov 21 2014 getty.target.wants
drwxr-xr-x. 2 root root 4096 Apr 8 14:29 multi-user.target.wants
drwxr-xr-x. 2 root root 4096 Nov 21 2014 printer.target.wants
drwxr-xr-x. 2 root root 4096 Nov 21 2014 sockets.target.wants
drwxr-xr-x. 2 root root 4096 Mar 22 17:48 sysinit.target.wants
drwxr-xr-x. 2 root root 4096 Nov 21 2014 system-update.target.wants
從這個目錄我們可以看到,其實系統當前所運行的target是通過軟鍊接的形式鍊接到/lib/systemd/system/目錄下的target文件,基于這種方式,
我們就可以通過手動來切換target。
[root@xiao system]#rm -f default.target
[root@xiao system]#ln -s /lib/systemd/system/graphical.target default.target
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!