Linux操作系統(tǒng)啟動(dòng)流程
POST -->
BootSequence(BIOS) -->
Bootloader(mbr) -->
kernel(ramdisk) -->
rootfs(switch_root) --> /sbin/init(/etc/inittab;/etc/init/*.conf;/usr/lib/systemd/system/) -->
設(shè)置默認(rèn)運(yùn)行級(jí)別;運(yùn)行系統(tǒng)初始化腳本,完成系統(tǒng)初始化;關(guān)閉對(duì)應(yīng)級(jí)別下需要停止的服務(wù),啟動(dòng)對(duì)應(yīng)級(jí)別下需要開(kāi)啟的服務(wù) -->
設(shè)置登錄終端 -->
啟動(dòng)[圖形]終端
以上流程分兩部分:
- 內(nèi)核空間的啟動(dòng)流程:
POST(power on system test):加電自檢;給CMOS加電,通過(guò)啟動(dòng)其上的BIOS(Basic Input Output System即基本輸入輸出系統(tǒng))程序去讀取硬件信息并檢測(cè)其是否存在。
Boot Sequence:按次序查找個(gè)引導(dǎo)設(shè)備,第一個(gè)有引導(dǎo)程序的設(shè)備即為本次啟動(dòng)要用到的設(shè)備。
Bootloader(mbr): 引導(dǎo)加載器,程序。提供一個(gè)菜單,允許用戶選擇要啟動(dòng)的系統(tǒng)或不同的內(nèi)核版本,把用戶選定的內(nèi)核裝載到RAM中的特定空間中,解壓、展開(kāi),而后把系統(tǒng)控制權(quán)移交給內(nèi)核。(注意:BootLoader只能放在基本磁盤分區(qū)上,而不能存放于邏輯磁盤)
-
kernel(ramdisk):自身初始化
<1>探測(cè)可識(shí)別到的所有硬件設(shè)備
<2>加載硬件驅(qū)動(dòng)程序(有可能會(huì)借助于ramdisk加載驅(qū)動(dòng))- ramdisk (虛擬文件系統(tǒng)): Linux內(nèi)核特性之一;使用緩沖和緩存來(lái)加速對(duì)磁盤上的文件訪問(wèn);即把內(nèi)存當(dāng)磁盤來(lái)用。
- 配置文件:
* CentOS 5:/boot/initrd-VERSION-release.img ;程序工具:mkinitrd
為當(dāng)前正在使用的內(nèi)核重新制作ramdisk文件:mkinitrd /boot/initramfs-(uname -r)
* CentOS 6,7:/boot/initramfs-VERSION-release.img;程序工具:dracut
為當(dāng)前正在使用的內(nèi)核重新制作dracut /boot/initramfs-(uname -r)
rootfs:掛載根文件系統(tǒng)(readonly以只讀方式掛載根文件系統(tǒng));
switch_root:切換根文件
- 用戶空間的啟動(dòng)流程:
/sbin/init: 運(yùn)行用戶空間的第一個(gè)應(yīng)用程序/sbin/init
* CentOS 5:SysV init ;配置文件:/etc/inittab
* CentOS 6:Upstart;配置文件:/etc/inittab;/etc/init/*.conf
* CentOS 7:Systemd;配置文件:/usr/lib/systemd/system;/etc/systemd/system-
設(shè)置默認(rèn)運(yùn)行級(jí)別:
* 運(yùn)行級(jí)別:為了系統(tǒng)的運(yùn)行或維護(hù)等目的而設(shè)定的機(jī)制
* 共分7個(gè)級(jí)別:0-6
* 0:關(guān)機(jī),shutdown
* 1:?jiǎn)斡脩裟J剑╯ingle user),root用戶無(wú)需認(rèn)證,維護(hù)模式
* 2:多用戶模式(multi user),會(huì)啟動(dòng)網(wǎng)絡(luò)功能,但不會(huì)啟動(dòng)NFS,維護(hù)模式
* 3:多用戶模式,完全功能模式,文本界面
* 4:預(yù)留級(jí)別,目前無(wú)特別使用目的,但習(xí)慣以同3級(jí)別功能使用
* 5:多用戶模式,完全功能模式,圖形界面
* 6:重啟,reboot- 默認(rèn)級(jí)別為:3或5;服務(wù)器基本上默認(rèn)使用3級(jí)別
- 級(jí)別切換:init #
- 級(jí)別查看:who -r或者runlevel
- 默認(rèn)級(jí)別為:3或5;服務(wù)器基本上默認(rèn)使用3級(jí)別
-
運(yùn)行初始化腳本,完成系統(tǒng)初始化:/etc/inittab(只針對(duì)CentOS5系統(tǒng))
* 每行定義一種action,以及與之對(duì)應(yīng)的process
init配置文件/etc/inittab中的格式:
id:runlevels:action:process
* id:一個(gè)任務(wù)的標(biāo)識(shí)符
* runlevels:在哪些級(jí)別啟動(dòng)此任務(wù):#,###, 也可以為空,表示所有級(jí)別
* ation:在什么條件下啟動(dòng)任務(wù)
* wait:等待切換至此任務(wù)所在的級(jí)別時(shí)執(zhí)行一次
* respawn:此任務(wù)終止時(shí)就自動(dòng)重新啟動(dòng)之
* initdefault:設(shè)定默認(rèn)運(yùn)行級(jí)別,此時(shí)process省略
* sysinit:設(shè)定系統(tǒng)初始化方式,此處一般指定/etc/rc.d/rc.sysinit腳本
* process:?jiǎn)?dòng)的任務(wù)- init的處理流程:init是通過(guò)自上而下的讀取inittab文件依次執(zhí)行的
* CentOS6在此設(shè)置默認(rèn)的runlevel:id:5:initdefault:- init是根據(jù)/etc/rc.d/rc.sysinit中的內(nèi)容進(jìn)行系統(tǒng)初始化,/etc/rc.d/rc.sysinit所做的事情:
(1) 設(shè)置主機(jī)名;
(2) 設(shè)置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的所有文件系統(tǒng);
(5) 檢測(cè)根文件系統(tǒng),并以讀寫方式重新掛載根文件系統(tǒng);
(6) 設(shè)置系統(tǒng)時(shí)鐘;
(7) 根據(jù)/etc/sysctl.conf文件來(lái)設(shè)置內(nèi)核參數(shù);
(8) 激活lvm及軟raid設(shè)備;
(9) 激活swap設(shè)備;
(10) 加載額外設(shè)備的驅(qū)動(dòng)程序;
(11) 清理操作;
- init是根據(jù)/etc/rc.d/rc.sysinit中的內(nèi)容進(jìn)行系統(tǒng)初始化,/etc/rc.d/rc.sysinit所做的事情:
- init的處理流程:init是通過(guò)自上而下的讀取inittab文件依次執(zhí)行的
- 關(guān)閉對(duì)應(yīng)級(jí)別下需要停止的服務(wù),啟動(dòng)對(duì)應(yīng)級(jí)別下需要開(kāi)啟的服務(wù):
* 例如 /etc/rc.d/rc3/ 目錄下的服務(wù)腳本所控制的服務(wù):
* K:要停止的服務(wù);K##,優(yōu)先級(jí)數(shù)字越小,越是優(yōu)先關(guān)閉;依賴的服務(wù)先關(guān)閉,而后關(guān)閉被依賴的服務(wù)
* S* :要啟動(dòng)的服務(wù);S##*,優(yōu)先級(jí)數(shù)字越小,越是優(yōu)先啟動(dòng),被依賴的服務(wù)先啟用,而后啟動(dòng)依賴的服務(wù)
* rc腳本:接受一個(gè)運(yùn)行級(jí)別數(shù)字為參數(shù)
腳本框架: for srv in /etc/rc.d/rc#.d/k*.d;do $srv stop done for srv in /etc/rc.d/rc#.d/s*.d;do $src start done- 注意:正常級(jí)別下,最后啟動(dòng)的一個(gè)服務(wù)SS99local 沒(méi)有連接至/etc/init.d下的某腳本,而是連接至/etc/rc.d/rc.local腳本;因此,不便或不需要寫為服務(wù)腳本的程序期望能開(kāi)機(jī)自動(dòng)運(yùn)行時(shí),直接放置于此腳本文件中即可。
- 設(shè)置啟動(dòng)終端,啟動(dòng)[ 圖形 ] 終端;
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
(1)mingetty會(huì)調(diào)用login程序;
(2)打開(kāi)虛擬終端的程序除了mingetty之外,還有諸如getty等;
tty7:5:respawn:/etc/X11 #啟動(dòng)圖形終端
-
chkconfig 命令:管控/etc/init.d/目錄下每個(gè)服務(wù)腳本在各級(jí)別下的啟動(dòng)或關(guān)閉狀態(tài)
查看:chkconfig --list [name] 添加:chkconfig --add name 能被添加的服務(wù)的腳本定義格式之一: #!/bin/bash # # chkconfig: LLL NN NN # description: 刪除:chkconfig --del name 修改指定的鏈接類型: chkconfig [--level LEVELS] name <on|off|reset> --level LEVELS:指定要控制的級(jí)別;默認(rèn)為2345;
GRUB啟動(dòng)引導(dǎo)程序配置(Boot Loader)
grub:GRand Unified Bootloader
在系統(tǒng)啟動(dòng)流程中,BIOS讀取相關(guān)信息之后,接下來(lái)就是去第一個(gè)可以啟動(dòng)的設(shè)備當(dāng)中的MBR中讀取Boot loader信息。
- grub 0.X:grub legacy
- grub 2.X:grub2
- grub legacy:
- stage1:mbr
- stage1_5:mbr之后的扇區(qū),讓stage1中的bootloader能識(shí)別stage2所在的分區(qū)上的文件系統(tǒng)
- stage2:磁盤分區(qū)(/boot/grub/)
配置文件:/boot/grub/grub.conf
stage2及內(nèi)核等通常放置于一個(gè)基本磁盤分區(qū) - 功用:
(1):提供菜單,并提供交互式接口
e:編輯模式;用于編輯菜單
c:命令模式;交互式接口
(2): 加載用戶選擇的內(nèi)核或者操作系統(tǒng);允許傳遞參數(shù)給內(nèi)核;可隱藏此菜單。
(3):為菜單提供了保護(hù)機(jī)制;為編輯菜單進(jìn)行認(rèn)證;為啟用內(nèi)核或操作系統(tǒng)進(jìn)行認(rèn)證。
- 如何識(shí)別設(shè)備:(hd#,#)
- hd# : 磁盤編號(hào),用數(shù)字表示,從0開(kāi)始編號(hào)
-
:分區(qū)編號(hào),用數(shù)字表示,從0開(kāi)始編號(hào)
grub的命令接口
help:獲取幫助列表
help KEYWORD:獲取詳細(xì)幫助信息
find (hd0,0)/PATH/TO/SOMEFILE
root (hd0,0) 設(shè)置誰(shuí)為根
kernel /PATH/TO/RERNEL_FILE:內(nèi)核路徑;設(shè)置本次啟動(dòng)時(shí)用到的內(nèi)核文件,額外還可以添加許多內(nèi)核支持使用的cmdline參數(shù);
例如: init=/path/to/init,selinux=0
initrd /PATH/TO/LNITRAMS_FILE:設(shè)定為選定的內(nèi)核提供額外文件的ramdisk
boot:引導(dǎo)啟動(dòng)選定的內(nèi)核
...
配置文件:/etc/grub/grub.conf
配置項(xiàng):
default=#:設(shè)定默認(rèn)啟動(dòng)的菜單項(xiàng);菜單項(xiàng)(title)編號(hào)從0開(kāi)始
timeout=#:指定菜單項(xiàng)等待選項(xiàng)選擇的時(shí)長(zhǎng)
spashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑
passwd [--md5] STRING: 菜單編輯認(rèn)證
hiddenmenu: 隱藏菜單
title TITLE :定義菜單項(xiàng)“標(biāo)題”,可以出現(xiàn)多次;
root (hd0,0):grub查找stage2及kernel文件所在設(shè)備分區(qū);為grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] :啟動(dòng)內(nèi)核
initrd /PATH/TO/IMTRAMFS_FILE :內(nèi)核匹配的ramfs文件
passwd [--md5] STRING:啟動(dòng)選定內(nèi)核或操作系統(tǒng)時(shí)進(jìn)行認(rèn)證
grub-md5-crypt #密碼串生成工具
[root@localhost ~]# grub-md5-crypt
Password:
Retype password:
\$1$XJZYv/$NB0d91w7u2UIhXa0434I8.
grup出現(xiàn)問(wèn)題無(wú)法啟動(dòng)系統(tǒng)后如何修復(fù)
- 本機(jī)grub安裝(grub破壞后未重啟)
<1> grub-install --root-directory=/ /dev/sda
<2>grub
grub>root (hd#,#)
grub>setup (hd#)
示例:
[root@localhost ~]# dd if=/dev/sda of=/boot/mbr.bak count=1 bs=512 #備份MBR
[root@localhost ~]# dd if=/dev/zero of=/dev/sda count=1 bs=200 #破壞MBR前200個(gè)bs,即把grub.conf破壞了
恢復(fù)方法1: [root@localhost ~]# grub
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit
方法2: [root@localhost ~]# grub-install --root-directory=/ /dev/sda
Installation finished. No error reported.
This is the contents of the device map //boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
#this device map was generated by anaconda
(hd0) /dev/sda
- grub破壞后重啟,需要緊急救援模式來(lái)修復(fù),步驟如下:
<1> 用安裝光盤啟動(dòng),在安裝界面選擇Rescue installed system 進(jìn)入緊急救援模式(或者,在此界面按ESC鍵,在boot: 之后輸入linux rescue 進(jìn)入)
<2>然后根據(jù)提示選擇語(yǔ)言和鍵盤格式
<3>選擇是否配置網(wǎng)卡
<4>提示硬盤上的系統(tǒng)已經(jīng)被找到并掛載在/mnt/sysimage 下,continue用讀寫模式加載
<5>輸入chroot /mnt/sysimage切換磁盤根目錄
<6>運(yùn)行grub-install --root-directory=/ /dev/sda修復(fù)grub
注意:此處演示為centos6系統(tǒng),如果centos7系統(tǒng)需要使用grub2-install --root-directory=/ /dev/sda
實(shí)現(xiàn)kickstart文件制作與光盤鏡像制作
在我們CentOS系統(tǒng)安裝完成后 會(huì)在/root 目錄下生成一個(gè)anaconda-ks.cfg文件,此文件就是kickstart,我們可以以此文件為模板來(lái)定制自己的kickstart文件。
可以使用 ks指明kickstart文件的位置
如:ks=cdrom:/PATH/TO/KICKSTART_FILE
kickstart文件的格式
-
命令段:指定各種安裝前配置選項(xiàng),如鍵盤類型等;分為:
- 必備命令
- 可選命令
-
程序包段:指明要安裝的程序包,以及包組,也包括不安裝的程序包;
%package #指明程序包段開(kāi)始 @group_name #安裝一個(gè)包組 package # 安裝單個(gè)程序包 -package #明確指明不安裝的 %end #程序包段結(jié)束 -
腳本段:
- %pre:安裝前腳本
運(yùn)行環(huán)境:運(yùn)行安裝介質(zhì)上的衛(wèi)星Linux系統(tǒng)環(huán)境; - %post:安裝后腳本
運(yùn)行環(huán)境:安裝完成的系統(tǒng);
- %pre:安裝前腳本
命令段中的必備命令:
- authconfig:認(rèn)證方式的配置;
authconfig --enableshadow --passalgo=sha512 - bootLoader:定義bootloader的安裝位置及相關(guān)配置;
bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet" - keyboard:設(shè)置鍵盤類型;
keyboard us - lang:設(shè)置語(yǔ)言類型;
lang en_US.UTF-8 - part: 分區(qū)布局;
part /boot --fstype=ext4 --size=500 part pv.008002 --grow --size=1 - rootpw:管理員密碼;
rootpw --iscrypted $6$UQONRau1iY1OvJbk$NB0k1D1LpHCbV6ioFOyq3LAH/L6tSF79upN.zg48ZV8y5NzBzOoXNlqaRZEIkPn.tDdPFnuxrAnS/e3UX - timezone:指定時(shí)區(qū);
timezone --utc Etc/UTC - 補(bǔ)充:分區(qū)相關(guān)的其他指令
- clearpart:清楚分區(qū);
clearpart --linux --drives=sda - volgroup:創(chuàng)建卷組;
volgroup VolGroup --pesize=4096 pv.008002 - logvol:創(chuàng)建邏輯卷;
logvol /home --fstype=ext4 --name=lv_home --vgname=VolGroup --grow --size=100
- clearpart:清楚分區(qū);
命令段中的可選命令:
- install OR upgrade:安裝或升級(jí)
- text:安裝界面類型,text為tui,默認(rèn)為gui
- network:配置網(wǎng)絡(luò)接口;
network --onboot yes --device eth0 --bootproto dhcp --noipv6 - firewall:防火墻;
firewall --disabled - selinux:SELinux;
selinux --disabled - halt、poweroff或reboot:安裝完成之后的行為;
- repo:指明安裝時(shí)使用的repository;
repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100 - url:指明安裝時(shí)使用的repository;為url格式。
定制kickstart文件
yum install system-config-kickstart
system-config-kickstart
檢查語(yǔ)法錯(cuò)誤:
# ksvalidator
......
示例:
[root@localhost ~]# yum install system-config-kickstart #安裝system-config-kickstart
[root@localhost ~]# system-config-kickstart #運(yùn)行kickstart之后打開(kāi)一個(gè)kickstart configurator的配置界面

創(chuàng)建光盤鏡像
[root@localhost ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myboot/