CentOS啟動詳解及kickstart檔案製作
簡述linux作業系統啟動流程
CentOS的啟動流程總體順序如下CentOS 6:
POST --> Boot Sequence --> bootloader(MBR) --> Kernel --> 載入臨時的rootfs --> switchroot --> /sbin/init --> (配置檔案:/etc/inittab, /etc/init/*.conf) --> 根據init配置檔案設定預設執行級別 --> 執行系統初始化指令碼/etc/rc.d/rc.sysinit,完成系統初始化 --> 開啟或關閉使用者選定的對應執行級別下所對應的服務 --> 啟動終端,列印登入提示符。
接下來逐一詳解:
第一步:POST加電自檢
主要實現的功能是檢測各個外圍硬體裝置是否存在而且能夠正常執行起來,實現這一自檢功能的是固化在主機板上的ROM(主要代表為CMOS)晶片上的BIOS(Basic Input/Output System)程式;例如BIOS會檢測CPU、Memory以及I/O裝置是否能夠正常執行,如果是個人計算機的話可能還會檢測一下顯示器。只要一通電,CPU就會自動去載入ROM晶片上的BIOS程式,是這樣來實現的。而檢測完成之後就進行硬體裝置的初始化。
第二步:Boot Sequence(選擇啟動裝置以載入MBR)
主要實現的功能是選擇要啟動的硬體裝置,選擇可以讀取這個裝置上位於MBR裡頭的bootloader了。這一步的實現是這樣的:根據BIOS中對啟動順序的設定,BIOS自己會依次掃描各個引導裝置,然後第一個被掃描到具有載入程式(bootloader)的裝置就被作為要啟動的引導裝置。
第三步:載入bootloader(MBR) 載入器 程式
而bootloader要實現的功能就是提供一個選單給使用者,讓使用者去選擇要啟動的系統或不同的核心版本,然後把使用者選擇的核心版本載入至RAM中的特定空間,接著在RAM中解壓、展開,而後把系統控制權移交給核心。
grub是bootloader中的一種,就grub來說,為了打破在MBR中只有446Bytes用於存放bootloader這一限制,所以這一步的實現是這樣的:grub是通過分成三個階段來實現載入核心這一功能的,這三個階段分別是:stage1, stage1.5以及stage2。其中:
stage1:存放於MBR的前446Bytes,用於載入stage1.5階段,目的是為了識別並驅動stage2(或者/boot)所在分割槽的檔案系統;
stage1.5:存放於MBR之後的扇區,載入stage2所在分割槽的檔案系統驅動,讓stage1中的bootloader能識別stage2所在分割槽的檔案系統;
stage2:存放於磁碟分割槽之上,具體存放於/boot/grub目錄之下,主要用於載入核心檔案(vmlinuz-VERSION-RELEASE)以及ramdisk這個臨時根檔案系統(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。作用是作業系統啟動以後,把它當做一個磁碟使用,從而把它識別成(臨時)根檔案系統,藉助於ramdisk把真正的根檔案系統掛載,臨時根檔案系統自動退出,真正的根將接替工作,臨時根不是必須的,
概述:假如要啟動的是硬碟裝置,首先我們的硬體平臺主機板BIOS必須能夠識別硬碟,然後BIOS才能載入硬碟中的bootloader,而bootloader自身載入後就能夠直接識別當前主機上的硬碟裝置了;不過,能夠識別硬碟裝置不代表能夠識別硬碟裝置中的檔案系統,因為檔案系統是額外附加的一層軟體組織的檔案結構,所以要對接一種檔案系統,就必須要有對應的能夠識別和理解這種檔案系統的驅動,這種驅動就稱為檔案系統驅動。而stage1.5就是向grub提供檔案系統驅動的,這樣stage1就能訪問stage2及核心所在的分割槽(/boot)了。
演示:
[ [email protected] ~]# ls -1F /boot/
config-2.6.32-642.el6.x86_64 //此版本核心被編譯時選擇的功能與模組配置檔案;
efi/
grub/ //就是引導裝載程式grub相關配置檔案的目錄;
initramfs-2.6.32-642.el6.x86_64.img //臨時根檔案系統,提供根檔案系統所在分割槽的驅動;
initrd-2.6.32-642.el6.x86_64kdump.img
lost+found/
symvers-2.6.32-642.el6.x86_64.gz
System.map-2.6.32-642.el6.x86_64 //核心功能放置到記憶體地址的對映表;
vmlinuz-2.6.32-642.el6.x86_64* //就是核心檔案;
[ [email protected] ~]#
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]# ls -1F /boot/grub/
device.map
e2fs_stage1_5
fat_stage1_5
ffs_stage1_5
grub.conf
iso9660_stage1_5
jfs_stage1_5
[email protected]
minix_stage1_5
reiserfs_stage1_5
splash.xpm.gz
stage1
stage2
ufs2_stage1_5
vstafs_stage1_5
xfs_stage1_5
//可以看到stage1, 各種檔案系統對應的stage1.5及stage2這幾個階段的檔案都存放於此目錄下;
檢視grub的配置:
[ [email protected] ~]# vim /boot/grub/grub.conf
default=0 //設定預設啟動第一個選單項(title);
timeout=5 //等待使用者選擇選單項的時長;
splashimage=(hd0,0)/grub/splash.xpm.gz //指明選單項的背景圖片的檔案路徑;
hiddenmenu //是否隱藏選單的具體內容;
title CentOS (2.6.18-398.el5) //此處為選單項的標題;
root (hd0,0) //指定grub查詢stage2及Kernel檔案所在裝置的分割槽;可理解為grub的"根",對grub而言,所有型別硬碟都是hd,格式為(hd#,N);hd#, #表示第幾個磁碟;N表示對應磁碟的分割槽;修復硬碟使用;
kernel /vmlinuz-2.6.18-398.el5 ro root=/dev/VolGroup00/LogVol00 //啟動的核心;
initrd /initrd-2.6.18-398.el5.img //與核心匹配的ramdisk檔案;
//注意:kernel和initrd的檔案路徑均以grub的"根"作為起始目錄,且存放於stage2所在分割槽上;需要注意的是,stage2、核心以及ramdisk檔案通常放置於一個基本磁碟分割槽之上,因為grub無法驅動lvm、高階軟raid等複雜邏輯裝置,除非提供一個複雜的驅動介面,否則如果stage2及核心等檔案都存放在lvm等複雜邏輯裝置上將無法被stage1所識別。
第四步:Kernel自身初始化
Kerenl在得到系統控制權之後,首先要進行自身初始化,而初始化的主要作用是:
(1)探測可識別到的所有硬體裝置;
bootloader將系統控制權移交給核心。
(2)載入硬體驅動程式,即載入真正的根檔案系統所在裝置的驅動程式(有可能會藉助於ramdisk載入驅動);
這就像統治者(核心)在得知底下存在的人力、財力之後,開始將可以“為我所用”的人力納入麾下,聽自己使喚,而不聽使喚的殺掉;
(3)以只讀方式掛載根檔案系統;
如果有藉助於ramdisk這個臨時檔案系統(虛根),則在這一步之後會執行根切換;否則不執行根切換。
(4)執行使用者空間的第一個應用程式:/sbin/init.
到這裡核心空間的啟動流程就結束了,而接下來是使用者空間完成後續的系統啟動流程。
注意:
ramdisk和核心是由bootloader一同載入到記憶體當中的,ramdisk是用於實現系統初始化的、基於記憶體的磁碟裝置,即載入至記憶體(的某一段空間)後把記憶體當磁碟使用,並在記憶體中作為臨時根檔案系統提供給核心使用,幫助核心掛載真正的根檔案系統。而之所以能夠幫助核心掛載根檔案系統是因為在ramdisk這個臨時檔案系統的/lib/modules目錄下有真正的根檔案系統所在裝置的驅動程式;除此之外,這個臨時檔案系統也遵循FHS,例如有這些固定目錄結構:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, ...
因為Linux核心有一個特性就是通過使用緩衝/快取來達到加 速對磁碟上檔案的訪問的目的,而ramdisk是載入到記憶體並模擬成磁碟來使用的,所以Linux就會為記憶體中的“磁碟”再使用一層緩衝/快取,但是我們的ramdisk本來就是記憶體,它只不過被當成硬碟來使用罷了,這就造成雙緩衝/快取了,而且不會起到提速效果,甚至影響了訪問效能;CentOS 5系列以及之前版本的ramdisk檔案為initrd-VERSION-RELEASE.img,就會出現上述所說到的問題;而為了解決一問題,CentOS 6/7系列版本就將其改為initramfs-VERSION-RELEASE.img,使用檔案系統的方式就可以避免雙緩衝/快取了,我們可以說這是一種提速機制。
需要注意的是,系統發行商為了適應於各個不同的硬體介面,因此將各個不同的硬體介面的驅動組裝打包起來,例如在使用者第一次使用光碟安裝完系統之後,會動態探測當前主機上的硬體裝置並呼叫與之對應的裝置驅動再做成ramdisk檔案的。所以,ramdisk檔案並非必須的,如果只是為了將Linux安裝於特定硬體平臺上,就可以直接把對應的驅動編譯進核心即可,而不需要去使用ramdisk檔案了。
第五步:init管理使用者空間服務程序
init可以理解成是核心派來管理使用者空間的使者,就好像天使代表上帝來訪問人間一樣。init這個初始化程式會根據其配置檔案執行一系列操作。雖然CentOS 5、CentOS 6以及CentOS 7的init配置 檔案各不相同,但總體的啟動流程是不變的。
這一步的流程是:/sbin/init --> 根據init配置檔案設定預設執行級別 --> 執行系統初始化指令碼/etc/rc.d/rc.sysinit,完成系統初始化 --> 關閉或啟動使用者選定的預設執行級別所對應的服務 --> 啟動終端,列印登入提示符
(1)根據init配置檔案設定預設執行級別
對於CentOS 5來說,初始化程式init是SysV init,其配置檔案為:/etc/inittab;
對於CentOS 6來說,初始化程式init是upstart,其配置檔案為:/etc/inittab, /etc/init/*.conf,也就是upstart將配置檔案拆分成多個,在/etc/init/目錄下以conf結尾的都是upstart風格的配置檔案,而/etc/inittab僅用於設定預設執行級別;
對於CentOS 7來說,初始化程式init是systemd,其配置檔案為:/usr/lib/system/systemd/*, /etc/systemd/system/*;
注意:
執行級別是為了系統的執行和維護等目的而設定的一種機制,對於CentOS 5/6來講,一共有7種執行級別,即0-6,它們的意義如下:
0:關機模式,shutdown;
1:單使用者模式(single user):不需要通過認證,登入進去之後為root使用者身份,是維護模式;
2:多使用者模式(multi user):會啟動網路功能,但不會啟動NFS,是維護模式;
3:多使用者模式(multi user):為完全功能模式,提供文字介面;
4:預留級別,目前無特別使用目的,但習慣上以同3級別功能來使用;
5:多使用者模式(multi user):為完全功能模式,提供圖形介面;
6:重啟模式,reboot;
預設級別:3, 5
級別切換:init #
級別檢視:
who -r
runlevel
CentOS 5配置檔案詳解:
每行定義一種action以及與之對應的process:
格式:id:runlevel:action:process
各欄位解釋:
id:一個任務的識別符號;
runlevel:在哪些級別下啟動該任務;格式可以是#,###,也可以為空(表示所有級別);
action:在什麼條件下啟動該任務;
process:任務;
action種類:
wait:等待切換至該任務所在的級別時執行一次;
respawn:一旦該任務終止,就會重新啟動這個任務;
initdefault:設定預設執行級別;此時process是省略掉的;
sysinit:設定系統初始化方式,這裡一般指定為/etc/rc.d/rc.sysinit指令碼檔案;
CentOS 6配置檔案/etc/inittab:
[[email protected] ~]# 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:3:initdefault:
[[email protected] ~]#
CentOS 7配置檔案/etc/inittab:
[[email protected] ~]# cat /etc/inittab
cat /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#
[[email protected] ~]#
注意:CentOS 7使用target代替了runlevel,也就是在CentOS 7系列已經沒有了執行等級這一概念了。而如果需要設定target則可參考該檔案的後兩行註釋;
程式碼分析:
以下為CentOS 5的/etc/inittab檔案
id:3:initdefault: //設定預設執行級別,此處設定為3;
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit //指定系統初始化指令碼;
//根據前面獲取到的執行級別資訊,執行/etc/rc.d/rc指令碼;
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
//因為預設執行級別為3,因此只會開啟或關閉/etc/rc.d/rc3.d/目錄下的指令碼所控制的服務;而其它
的/etc/rc.d/rc#.d/目錄則別略過;
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
(2)執行系統初始化指令碼/etc/rc.d/rc.sysinit,完成系統初始化
執行初始化指令碼是為了初始化系統環境,這一步初始化包括:
①設定主機名;
②設定歡迎資訊;
③啟用udev和selinux;
④掛載/etc/fstab檔案中定義的所有檔案系統;
⑤檢測根檔案系統,以讀寫方式重新掛載根檔案系統;
⑥設定系統時鐘;
⑦根據/etc/sysctl.conf檔案來設定核心引數;
⑧啟用lvm及軟raid裝置;
⑨啟用swap裝置;
⑩載入額外裝置的驅動程式(因為核心只加載根檔案系統所在分割槽的驅動程式);
清理操作;
注意:CentOS 7的systemd沒有這一步,而是通過其他機制來實現。
(3)關閉或啟動使用者選定的預設執行級別下所對應的服務
要實現的功能是:根據前面使用者通過init配置檔案對預設執行級別的設定,關閉或啟動這個執行級別下的服務。(注意:關閉在前,啟動在後)
具體實現方式:執行/etc/rc.d/rc這個指令碼檔案,而初始化程式init根據前面獲取的預設執行級別資訊,將這個執行級別數字以引數方式傳遞給/etc/rc.d/rc指令碼中的變數$runlevel;然後,這個指令碼會以glob方式去把/etc/rc.d/rc$runlevel.d/S*匹配到的指令碼所控制的服務開啟,而把/etc/rc.d/rc$runlevel.d/K*匹配到的指令碼所控制的服務開啟。
/etc/rc.d/rc#.d/目錄下的指令碼檔案命名格式:
(1)K##*:表示要停止的服務;'##'表示關閉優先順序,數字越小,越是優先關閉;依賴到其他服務的服務會優先關閉,而被依賴的服務則後關閉;
(2)S##*:表示要啟動的服務;'##'表示啟動優先順序,數字越小,越是優先啟動;被依賴的服務會優先
啟動,而依賴到其他服務的服務則後啟動;
例如,runlevel為3時,則匹配到的是/etc/rc.d/rc3.d/目錄下的指令碼檔案;runlevel為5時,則匹配到的是/etc/rc.d/rc5.d/目錄下的指令碼檔案等;而這些目錄下的指令碼有些是以S打頭的,有些是以K打頭的,這樣的控制機制很容易想明白:其中以S打頭的代表要開啟的服務,以K打頭的代表要關閉的服務。這就是我們的主機啟動之後為什麼有些服務會自動啟動,而有些服務不會自動啟動的原因了。
需要注意的是,在這些/etc/rc.d/rc#.d/目錄下,除了S99local這個服務指令碼之外,其他服務都連結到/etc/init.d/目錄下對應的服務指令碼,而S99local則連結到/etc/rc.d/rc.local(或/etc/rc.local)。所以,如果我們有不方便或者沒必要寫成服務指令碼的程式,但又希望這樣的程式能夠在開機自動開啟時,可以直接寫進/etc/rc.d/rc.local這個指令碼檔案中就行了!
以下為/etc/rc.d/rc指令碼檔案程式碼節選:
# First, run the KILL scripts.
for i in /etc/rc$runlevel.d/K* ; do
//這是一個for迴圈,根據前面獲取的執行級別來匹配並關閉/etc/rc#.d/目錄下所有以K打頭的指令碼
所控制的服務;
check_runlevel "$i" || continue
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/K??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
|| continue
# Bring the subsystem down.
if LC_ALL=C egrep -q "^..*init.d/functions" $i ; then
$i stop //stop,關閉服務!
else
action $"Stopping $subsys: " $i stop
fi
done
# Now run the START scripts.
for i in /etc/rc$runlevel.d/S* ; do
//這是一個for迴圈,根據前面獲取的執行級別資訊,匹配並開啟/etc/rc#.d/目錄下所有以S打頭的
指令碼所控制的服務;
check_runlevel "$i" || continue
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/S??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
&& continue
# If we're in confirmation mode, get user confirmation
if [ -f /var/run/confirm ]; then
confirm $subsys
test $? = 1 && continue
fi
update_boot_stage "$subsys"
# Bring the subsystem up.
if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
export LC_ALL=C
exec $i start
fi
if LC_ALL=C egrep -q "^..*init.d/functions" $i \
|| [ "$subsys" = "single" -o "$subsys" = "local" ]; then
$i start //start,開啟服務!
else
action $"Starting $subsys: " $i start
fi
done
演示:
檢視/etc/rc.d/目錄下的所有S99local指令碼:
[[email protected] ~]# find /etc/rc.d/ -name S99local -exec ls -l {} \;
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc2.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc5.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc3.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc4.d/S99local -> ../rc.local
//所有S99local服務指令碼都連結至/etc/rc.d/rc.local;
[[email protected] ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Feb 20 06:11 /etc/rc.local -> rc.d/rc.local
//服務指令碼/etc/rc.local連結至/etc/rc.d/rc.local;
檢視/etc/rc.d/目錄下的檔案及目錄:
[[email protected] ~]# ls -1F /etc/rc.d/
init.d/
rc*
rc0.d/
rc1.d/
rc2.d/
rc3.d/
rc4.d/
rc5.d/
rc6.d/
rc.local*
rc.sysinit*
//可以看到多個執行級別多對應的/etc/rc.d/rc#目錄;
檢視/etc/rc.d/rc0.d/目錄下的服務指令碼:
[[email protected] ~]# ll /etc/rc.d/rc0.d/
total 320
lrwxrwxrwx 1 root root 17 Feb 20 06:08 K01dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root 16 Feb 20 06:09 K01smartd -> ../init.d/smartd
lrwxrwxrwx 1 root root 22 Feb 20 06:20 K02avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root root 24 Feb 20 06:20 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd
.....(中間省略).....
lrwxrwxrwx 1 root root 25 Feb 20 06:09 K99readahead_early -> ../init.d/readahead_early
lrwxrwxrwx 1 root root 25 Feb 20 06:09 K99readahead_later -> ../init.d/readahead_later
lrwxrwxrwx 1 root root 17 Feb 20 06:08 S00killall -> ../init.d/killall
lrwxrwxrwx 1 root root 14 Feb 20 06:08 S01halt -> ../init.d/halt
//因為執行級別0代表關機模式,因此統統都為以K打頭的連結檔案;
注意:CentOS 7採用的是systemd這個初始化程式,在系統啟動過程中不會啟動服務,而是在使用者需要用到時則立即啟動對應的服務。這是為了提高系統啟動速度的一種非常精巧的設計。
(4)啟動終端,列印登入提示符
根據前面獲取的執行級別來啟動終端,mingetty程式是用於啟動終端的,它會呼叫登入程式login,這樣就能顯示出登入提示符了,類似mingetty這種用於開啟終端的程式還有getty等。
而如果預設執行級別為5,則會開啟圖形介面。
以下為CentOS 5的/etc/inittab檔案中部分程式碼:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
//在配置檔案這裡指明開啟留個文字終端,分別對應於[Ctrl]+[Alt]+F1至F6;
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
第六步:使用者登入
系統啟動結束!
2、簡述grub啟動載入程式配置及命令列介面詳解
GRUB(Boot Loader):
grub: GRand Unified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2
grub legacy:
stage1: mbr
stage1_5: mbr之後的扇區,讓stage1中的bootloader能識別stage2所在的分割槽上的檔案系統;
stage2:磁碟分割槽(/boot/grub/)
配置檔案:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及核心等通常放置於一個基本磁碟分割槽;
功用:
(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
配置檔案:/boot/grub/grub.conf
配置項:
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-md5-crypt命令
進入單使用者模式:
(1) 編輯grub選單(選定要編輯的title,而後使用e命令);
(2) 在選定的kernel後附加
1, s, S或single都可以;
(3) 在kernel所在行,鍵入“b”命令;
安裝grub:
(1) grub-install
grub-install --root-directory=ROOT /dev/DISK
(2) grub
grub> root (hd#,#)
grub> setup (hd#)
3、實現kickstart檔案製作與光碟映象製作
安裝引導選項:
ks:指明kickstart檔案的位置;
ks=
DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE
Hard Drive: ks=hd:/DEVICE/PATH/TO/KICKSTART_FILE
HTTP Server: ks=http://HOST[:PORT]/PATH/TO/KICKSTART_FILE
FTP Server: ks=ftp://HOST[:PORT]/PATH/TO/KICKSTART_FILE
HTTPS Server: ks=https://HOST[:PORT]/PATH/TO/KICKSTART_FILE
kickstart檔案的格式
命令段:
指定各種安裝前配置選項,如鍵盤型別等;
必備命令
可選命令
程式包段:
指明要安裝程式包,以及包組,也包括不安裝的程式包;
%packages
@group_name
package
-package
%end
用%package指名開始,%end指名結束,包組以@開始標明,軟體名可以直接寫,但每個之間需要換行
指令碼段:
%pre:安裝前指令碼
執行環境:執行安裝介質上的微型Linux系統環境;
%post:安裝後腳本
執行環境:安裝完成的系統;
命令段中的必備命令:
authconfig:認證方式配置
authconfig --enableshadow --passalgo=sha512
bootloader:定義bootloader的安裝位置及相關配置
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
--append= 可以指定核心引數
--driveorder= 設定裝置BIOS中的開機裝置啟動順序
--location=設定引導記錄的位置; mbr:預設值;partition:將boot loader安裝於包含kernel的分割槽超級塊
keyboard:設定鍵盤型別
keyboard us
lang:語言型別
lang zh_CN.UTF-8
part:分割槽佈局;
part /boot --fstype=ext4 --size=500
part pv.008 --size=10240
volgroup vg0 --pesize=8192
pv.008logvol / --fstype=ext4 --name=root --vgname=vg0 --size=1024
logvol swap --name=swap --vgname=vg0 --size=1024
logvol /usr --fstype=ext4 --name=usr --vgname=vg0 --size=1024
logvol /var --fstype=ext4 --name=var --vgname=vg0 --size=2048
rootpw:管理員密碼
rootpw --iscrypted $6$4Yh15kMGDWOPtbbW$SGax4DsZwDAz4201.O97WNnoBmO/rmmA7H8s.
timezone:時區
timezone Asia/Shanghai
補充:分割槽相關的其它指令
clearpart:清除分割槽
clearpart --none --drives=sda:清空磁碟分割槽;
在建立新分割槽前清空系統上原有的分割槽表,預設不刪除分割槽
clearpart --all
clearpart --drives=hda,hdb --all --initlabel
-all 擦除系統上原有所有分割槽;
--drives 刪除指定驅動器上的分割槽
--initlabel 初始化磁碟卷標為系統架構的預設卷標
--linux 擦除所有的linux分割槽
--none(default)不移除任何分割槽
volgroup:建立卷組
volgroup myvg --pesize=4096 pv.008002
logvol:建立邏輯卷
logvol /home --fstype=ext4 --name=lv_home --vgname=myvg --size=5120
生成加密密碼的方式:
~]# openssl passwd -1 -salt `openssl rand -hex 4 //生成的密碼可以直接貼上複製到上面rootpw 後即可生效
可選命令:
install OR upgrade:安裝或升級;
text:安裝介面型別,text為tui,預設為GUI
network:配置網路介面
network --onboot yes --device eth0 --bootproto dhcp --noipv6
firewall:防火牆
firewall --disabled
selinux:SELinux
selinux --disabled
halt、poweroff或reboot:安裝完成之後的行為;
repo:指明安裝時使用的repository;
repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100
url: 指明安裝時使用的repository,但為url格式;可選,指明安裝源為遠端的ftp、http方式安裝
url --url=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-x86_64/
url --url ftp://<username>:<password>@install.example.com/iso
url --url http://install.example.com/iso
參考官方文件:《Installation Guide》
系統安裝完成之後禁用防火牆:
CentOS 6:
# service iptables stop
# chkconfig iptables off
CentOS 7:
# systemctl stop firewalld.service
# systemctl disable firewalld.service
系統安裝完成後禁用SELinux:
編輯/etc/sysconfig/selinux或/etc/selinux/config檔案,修改SELINUX引數的值為下面其中之一:
permissive
disabled
立即生效:
# getenforce
# setenforce 0
定製kickstart檔案
[[email protected] ~]# ls /mnt/
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
[[email protected] ~]# mkdir myboot
[[email protected] ~]# cd myboot
[[email protected] myboot]# cp -r /mnt/isolinux/ ./
[[email protected] myboot]# ls
isolinux
[[email protected] myboot]#
[[email protected] myboot]# ls isolinux/
boot.cat grub.conf isolinux.bin memtest TRANS.TBL vmlinuz
boot.msg initrd.img isolinux.cfg splash.png vesamenu.c32
[[email protected] myboot]# cd isolinux/
[[email protected] isolinux]# ll
total 58124
-r--r--r--. 1 root root 2048 Oct 10 08:45 boot.cat
-rw-r--r--. 1 root root 84 Oct 10 08:45 boot.msg
-rw-r--r--. 1 root root 281 Oct 10 08:45 grub.conf
-rw-r--r--. 1 root root 52893200 Oct 10 08:45 initrd.img
-rw-r--r--. 1 root root 24576 Oct 10 08:45 isolinux.bin
-rw-r--r--. 1 root root 3032 Oct 10 08:45 isolinux.cfg
-rw-r--r--. 1 root root 190896 Oct 10 08:45 memtest
-rw-r--r--. 1 root root 186 Oct 10 08:45 splash.png
-r--r--r--. 1 root root 2215 Oct 10 08:45 TRANS.TBL
-rw-r--r--. 1 root root 152976 Oct 10 08:45 vesamenu.c32
-rwxr-xr-x. 1 root root 6224704 Oct 10 08:45 vmlinuz
[[email protected] isolinux]# chmod +w *
[[email protected] ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 7 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myboot/
安裝時要選擇安裝.boot.ios映象檔案,按TAB 輸入一下內容
也可以通過修改ks.cfg檔案,系統重新載入配置檔案即可
相關推薦
CentOS啟動詳解及kickstart檔案製作
簡述linux作業系統啟動流程 CentOS的啟動流程總體順序如下CentOS 6: POST --> Boot Sequence --> bootloader(MBR) --> Kernel --> 載入臨時的rootfs --> sw
CentOS啟動詳解
color 完成 for 運行級別 虛擬 不支持 centos7 無需 mage CentOS6啟動過程 2、POST加電自檢 POST: Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、
FastDFS Tracker端配置檔案詳解及啟動注意事項
今天進行了FastDFS的tracker端的配置,程式碼傳送如下: Java程式碼 # is this config file disabled # falsefor enabled # truefor disabled disabled=false#當前配置
CentOS 6安裝詳解及PXE 安裝
ges ide 運行 name partition top 遠程 nec cal Linux系統安裝詳解 註: Tab鍵 編輯選項 esc鍵可以返回去 vmlinuz initrd=initrd.img 後面加 rescue相當於進入
btrfs檔案系統詳解及使用
btrfs檔案系統的核心特性: 多物理卷支援:btrfs可由多個底層物理卷組成;支援RAID,以聯機“新增”、移除,修改; 寫時複製更新機制(CoW):複製、更新及替換指標,而非就地更新; &
滾動條詳解及製作(一)
檢視滾動條的滾動距離 js中有兩套方法可以檢視當前滾動條的滾動距離。 第一套是這樣的: window.pageXOffset/window.pageYOffset 這個方法可以檢視滾動條的橫軸和縱軸的滾動距離,但是很遺憾的是IE8以及以下的版本不相容。 因此針對於IE,我們就需要有第二套方法: d
sudo配置檔案詳解及實戰
安裝NGINX之後每次都需要切換ROOT使用者做配置檔案修改和啟動,為了加強安全,ROOT使用者一般是不允許直接提供給應用開發人員或者運維人員的,所以需要提供一種方法可以一般使用者執行ROOT使用者下的程式,並且該可執行程式依賴的其他ROOT使用者資源也是可以訪問的。使用chmod命令只能解決指定檔案的非RO
Spring IOC容器啟動流程原始碼解析(一)——容器概念詳解及原始碼初探
目錄 1. 前言 1.1 IOC容器到底是什麼 IOC和AOP是Spring框架的核心功能,而IOC又是AOP實現的基礎,因而可以說IOC是整個Spring框架的基石。那麼什麼是IOC?IOC即控制反轉,通俗的說就是讓Spring框架來幫助我們完成物件的依賴管理和生命週期控制等等工作。從面向物件的角度來說,
Hibernate5(2016)——配置檔案詳解及核心API
1.Hibernate配置檔案詳解: 1.1 Hibernate對映配置檔案: 1 對映配置檔名稱和位置沒有固定要求 2 對映配置檔案中,標籤name屬性值寫實體類相關內容 class標籤name屬性值寫實體類的全路徑 id標籤和property的name屬性值寫實體類的屬性名稱
Servlet檔案下載例子詳解及response的contentType型別大全
一、Servlet檔案下載例子。 以下例子為實現檔案下載的工具方法, package com.avcon.utils; import java.io.File; import java.io.FileInputStream; impor
Rational Rose 2007安裝步驟詳解及解決安裝過程中的一些問題(解決虛擬光碟機載入不了bin檔案問題)
首先下載兩個檔案: ①:Rational.Rose.Enterprise.v7.0-TFTISO.bin ②:license.upd 網上下載不到(我是網上下載的)的可以找我要(給我留下你的百度雲,我分享給你o(^▽^)o)! 下面來講一講安裝過程: 1、解壓後兩個檔
Struts2實現單檔案的上傳功能例項詳解及原始碼
Struts2完成檔案的上傳功能例項 10級學員 郞志課堂筆記 在這裡通過一個例項簡單寫一下struts2實現檔案上傳的流程。 首先通過手寫的方式寫一個上傳的流程 第一步:建立相應的jsp頁面 <%@ page language="java" import="ja
WebService核心檔案【server-config.wsdd】詳解及呼叫示例
作者:Vashon 時間:2015-04-21 一、準備工作 匯入需要的jar包: 二、
docker-compose.yml 配置檔案詳解及專案釋出
一. 前言關於 docker compose 技術可以檢視官方文件 Docker Compose 以下的內容是確立在已經下載好 Docker 以及 Docker Compose,可參看 Docker Compose 的官方安裝教程 Install Docker Compose 二. Docker Comp
Python按行輸出檔案內容詳解及延伸
#! /usr/bin/python2.7 try: //try....except----
sudo配置檔案/etc/sudoers詳解及實戰用法
一、sudo執行命令的流程 將當前使用者切換到超級使用者下,或切換到指定的使用者下, 然後以超級使用者或其指定切換到的使用者身份執行命令,執行完成後,直接退回到當前使用者。 具體工作過程如下: 當用戶執行sudo時,系統會主動尋找/etc/sudoers檔案,判斷該使用者是否
bash配置檔案/etc/profile,/etc/bashrc,~/.bash_profile,~/.bashrc詳解及修改PATH環境變數
1.bash的配置檔案 1)、全域性配置與個人配置 全域性配置 /etc/profile, /rtc/profile.d/*.sh,/etc/bashrc 個人配置 ~/.bash_pr
IOS 檔案讀寫操作詳解及簡單例項
iPhone 檔案讀寫操作1,寫檔案操作- (IBAction)btnWrite:(id)sender { //建立檔案管理器 NSFileManager *fileManager = [NSFileManager defaultManager]; //獲取路徑
Android檔案儲存的問題:ClassLoader和實現Parcelable介面後 詳解及用途
可能小夥伴們讀了我上一篇部落格關於Android檔案儲存的的,在檔案操作的時候大家有沒有疑問呀,有就對了,可能在儲存自定義物件的時候,如何序列化呀?ClassLoader到底是啥鬼呀?序列化後怎麼讀取出來呀?好吧,針對於上面的問題,我一個一個的說明吧! 今天主
Oracle LISTENER監聽檔案引數詳解及Lsnrctl命令綜述
# listener.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LI