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
原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/14512
上頭條只差了MARKDOWN的渲染