一 Linux 系統啟動流程
POST –> BIOS(Boot Sequence) –> MBR(bootloader) –> kernel + initramfs(或initrd) –> rootfs (ro) –> /sbin/init –> (/etc/inittab, /etc/init/*.conf) –>設定默認運行級別–>使用/etc/rc.d/rc.sysinit初始化系統 –> 分別啟動并關閉指定服務 –> 啟動終端
1. post:當我們按下開機的電源后,主板上的芯片組會首先向CPU發出一個reset指令,之后待芯片組檢測到電源供電穩定后便撤去reset指令,CPU就會跳轉到BIOS中的啟動代碼位置; BIOS首先要檢測關鍵設備是否正常,這個過程就稱為POST(加電后自檢)。
2.MBR:CPU讀取可引導設備的第一個扇區即MBR(Master boot record),也稱“主引導記錄”,大小為512字節,其中存放著:
引導加載程序(boot loader):446bytes,常用的boot loader有LILO和GRUB,現以GRUB為主;
分區表:64bytes
有效性標記:2bytes
CPU執行boot loader,boot loader選擇要啟動的內核(在當前磁盤的某或某些分區上)并加載到內存中
3.kernel + initramfs:內核被加載后,它要做的工作主要有:探測硬件、裝載驅動程序、以只讀方式裝載根文件系統(rootfs)、啟動第一個進程/sbin/init。
備注:內核要裝載根文件系統就需要先能驅動磁盤,即需要先裝載驅動程序,而驅動程序又在磁盤上。為解決此問題,boot loader在加載內核的同時也把initramfs(或initrd)加載到內存中,它是一個臨時的根文件系統,里面包含了啟動所必須的驅動模塊。內核掛載這個臨時根,裝載驅動程序,然后釋放臨時根,掛載實際的根文件系統,并啟動第一個進程/sbin/init。
4.init:內核初始化的最后一步就是啟動pid為1的/sbin/init進程。這個進程是系統的第一個進程,它負責產生其他所有進程。init進程上來首先做的事是去讀取/etc/inittab和/etc/init/*.conf
init程序類型:
SysV: init, CentOS 5
配置文件:/etc/inittab
Upstart: init, CentOS 6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system, /etc/systemd/system
在/etc/inittab和/etc/init/*.conf中,大致規定了以下動作:
取得runlevel即運行級別
使用/etc/rc.d/rc.sysinit進行系統初始化
根據runlevel啟動相應的服務并關閉需要停止的服務
確定Ctrl+Alt+Delete組合鍵功能
啟動字符終端
啟動圖形終端
系統運行級別:
0:關機
1:single user mode,單用戶模式;直接以root身份登錄,無需身份認證,且不會開啟網絡服務
2:multi user mode,不支持NFS功能
3:完全多用戶模式,文本接口
4:未使用,預留級別
5:完全多用戶模式,圖形接口
6:重啟
可在命令行切換級別:init #
配置文件:/etc/inittab
id:runlevels:action:process
各字段的含義:
id:登記項的標識符,必須是唯一的
runlevels:系統的運行級別,表示process的action要在哪個級別下運行,可定義多個級別,各級別間不用
分隔符;如果為空,表示在所有的運行級別下運行
具體的action有:
respawn:當process終止后馬上啟動一個新的
wait:當進入指定的runlevels后process才會啟動一次,并且到離開runlevels為止
initfault:設定默認的運行級別
sysinit:系統初始化,只有系統開機或重啟時process才會被執行一次
5.sysinit: 在設定了運行等級后,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本
(1) 設置主機名;
(2) 設置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的文件系統;
(5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統;
(6) 設置系統時鐘;
(7) 激活swap設備;
(8) 根據/etc/sysctl.conf文件設置內核參數;
(9) 激活lvm及software raid設備;
(10) 加載額外設備的驅動程序;
(11) 清理操作;
6.啟動指定的默認級別的默認為啟動的服務,停止指定的級別下默認為關閉的服務
/etc/rc.d/rc#.d (#表示運行級別),該目錄下都是符號鏈接文件,其指向的實際服務腳本位于/etc/rc.d/init.d目錄中(該目錄有個軟鏈接/etc/init.d)。這些鏈接文件均以S或K開頭:
S##:啟動的服務
K##:停止的服務
##:01-99,數字越小,越優先啟動或關閉
注意:正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本;因此,不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中;
chkconfig:查看或修改服務隨系統啟動的啟動選項,它并不是直接激活或停止一個服務,而只是修改了其符號鏈接。用法如下:
a) 讓指定的服務接受chkconfig命令管理:
第一步:在位于/etc/rc.d/init.d目錄下的服務腳本中添加如下一行或多行注釋:
# chkconfig: LEVEL SPRI KPRI ,例如# chkconfig: – 85 15
chkconfig后面有三個字段,它們的含義分別為:
LEVEL:當此服務由chkconfig控制時,默認在哪些運行級是啟動的。若默認不在任何運行級啟動,以“–”號表示
SPRI:啟動優先級
KPRI:關閉優先級
第二步:chkconfig –add SERVICE,該命令會自動在/etc/rc.d/rc#.d目錄中創建鏈接文件
b) chkconfig del SERVICE:讓指定服務不再接受chkconfig管理,會刪除鏈接文件
c) chkconfig –list [SERVICE]:顯示所有服務或指定服務的開機啟動設置
d) chkconfig [–level ###] SERVICE on/off/reset:若不指定–level選項,on和off操作默認只對運行級2、3、4、5有效,而reset默認對所有運行級有效,reset意為重置,即恢復成服務腳本中的初始設置
二 grub應用
GRUB:grand uniform bootloader:統一引導加載器,找到操作系統所在的磁盤,并把內核加載到內存,將控制器轉交給內核的程序。
GRUB(Grand Unified Bootloader)是由GNU下的FSF組織所推行的;
CentOS 5和CentOS 6上使用的版本為Grub 0.97,
CentOS 7上使用的版本為Grub2 1.96。
功能:MBR中的前 446 個字節,是BooTLoader的一種,提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓展開,把系統控制權移交給內核,主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5組成。
grub legacy:
stage1: mbr (0柱面 0磁道 1扇區)
stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;
stage2:磁盤分區(/boot/grub/),讀取grub.conf配置文件,并實現引導功能的擴展
配置文件:/boot/grub/grub.conf <– /etc/grub.conf
配置項:
1.default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始;
2.timeout=#:指定菜單項等待選項選擇的時長;
3.splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
4.hiddenmenu:隱藏菜單;
5.password [–md5] STRING: 設置密碼,菜單編輯認證;
6.title TITLE:定義菜單項“標題”, 可出現多次;
a) root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub的“根”;
b) kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核,指定 kernel 文件的位置,還要 指出root(系統啟動后)的位置,掛載方式 ro,這項很關鍵
c) initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
d) password [–md5] STRING: 啟動選定的內核或操作系統時進行認證;
initramfs文件說明:initramfs-2.6.32-573.el6.x86_64.img
nitramfs 是以 gzip 壓縮的 cpio 格式的文件。內核啟動時將他作為一個臨時的根文件系統。
grub 的 stage2 將initrd加載到內存里,然后將其中的內容釋放到內存中,
內核便去執行init腳本,這時內核將控制權交給了init文件處理。
init 它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完后,
會創建一個根設備,然后將根文件系統rootfs以只讀的方式掛載。
這一步結束后,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,
執行系統的1號進程。此后系統的控制權就全權交給/sbin/init進程了。
grub的功能:
(1) 提供菜單、并提供交互式接口
e: 編輯模式,用于編輯菜單;
c: 命令模式,交互式接口;
(2) 加載用戶選擇的內核或操作系統
允許傳遞參數給內核
可隱藏此菜單
(3) 為菜單提供了保護機制
為編輯菜單進行認證
為啟用內核或操作系統進行認證
如何識別設備:
(hd#,#)
hd#: 磁盤編號,用數字表示;從0開始編號
#: 分區編號,用數字表示; 從0開始編號
(hd0,0)
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
示例1 grub保護機制,為grub設置密碼,開機進入也需要輸入密碼
a) grub-md5-crypt生成密碼
b) 保護編輯功能,則需要title之外的添加
vi /boot/grub/grub.conf
password –md5 $1$.Co8f$ytb48fDRNEzwZBzE36GUv.
現在添加好密碼到文件后 重啟系統在開選擇grub 就需要密碼才能進入
示例2 如果忘記根密碼就進入單用戶模式修改密碼
a) 啟動計算機,在顯示GRUB菜單時—按e鍵, 進入編輯—選kernel項—按e鍵
b) 輸入空格+single 回車—按b鍵,重啟系統進入單用戶模式,輸入以下命令更改口令:
安裝grub:
(1) grub-install
grub-install –root-directory=ROOT /dev/DISK
(2) grub
grub> root (hd#,#)
grub> setup (hd#)
示例3 重新安裝grub, 用grub-install安裝
dd if=/dev/zero of=/dev/sda bs=200 count=1 模擬破壞掉原來的grub
grub-install –root-directory=/ /dev/sda 重新安裝grub
示例4 在grub命令提示符下修復grub
dd if=/dev/zero of=/dev/sda bs=200 count=1 模擬破壞掉原來的grub
grub
root (hd0,0)
setup (hd0)
示例5 在緊急救援模式下修復
d if=/dev/zero of=/dev/sda bs=200 count=1
放入光碟重啟,進入救援模式,或者按住ESC 進入命令行提示符輸入linux rescus
打開一好shell 命令提示符輸入
chroot /mnt/sysimage
grub-install –root-directory=/ /dev/sda
reboot
示例6 Vmware 虛擬機下制作grub
第一步:準備好塊新磁盤,分3個區
第二步:模擬啟動時的boot目錄,和根目錄,并掛載。
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot/
第三步:制作 grub,并生成 grub 的配置文件
grub-install –root-directory=/mnt /dev/sdb
拷貝內核文件和initramfs 文件到 /mnt/boot 目錄下,并生成 grub.conf 文件
cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/initramfs.img
vi /mnt/boot/grub/grub.conf
第四步: 生成根文件系統
mkdir /mnt/sysroot
mount /dev/sdb3 /mnt/sysroot/
cd /mnt/sysroot/
mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
第五步:拷貝使用命令和庫到對應根目錄下
cp /bin/bash /mnt/sysroot/bin/
ldd /bin/bash
cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
cp /lib64/libc.so.6 /mnt/sysroot/lib64/
cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
sync
vi /mnt/boot/grub/grub.conf
將剛才的磁盤鏡像作為另一個虛擬機的啟動盤。
原創文章,作者:liangkai,如若轉載,請注明出處:http://www.www58058.com/11641