一、CentOS 6 的啟動流程
公司主營業(yè)務:成都網(wǎng)站制作、成都網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出旺蒼免費做網(wǎng)站回饋大家。
第一步:加電自檢(POST)
主要檢查硬件設備是否存在并能正常運行,如:CPU、內(nèi)存、硬盤、風扇、輸入輸出設備等。自檢功能主要是通過BIOS來實現(xiàn)的,BIOS程序是裝載在一個硬件芯片CMOS上的,加電過程就是給CMOS通電,然后啟動BIOS程序,BIOS程序會根據(jù)CMOS上面的一些配置信息區(qū)讀取其他的硬件設備信息并檢測其是否存在并能正常運行,之后進行硬件設備的初始化。
第二步:選擇啟動順序,加載MBR
按照BIOS中設置的Boot Sequence查找Boot Loader程序所在的設備。Boot Loader是一個程序,它依賴于一個硬件之上,這個硬件就是硬盤,準確的說為第一個可以啟動的硬盤的第一個扇區(qū)內(nèi),即MBR(Master Boot Record,主引導記錄)。
Boot Loader的主要功能就是去識別、加載操作系統(tǒng)中的核心文件,并提交到內(nèi)存中運行,進而來啟動對應的操作系統(tǒng)。另一個主要功能是提供菜單信息(可以提供不同的啟動項來加載不同的操作系統(tǒng)),并將啟動管理功能轉交給其他的加載程序。
第三步:加載系統(tǒng)內(nèi)核(Kernel)文件,執(zhí)行系統(tǒng)初始化信息
Boot Loader程序讀取操作系統(tǒng)的內(nèi)核文件后,會將其解壓后裝載到內(nèi)存當中,然后接管BIOS的工作開始測試并加載各個設備(CPU、硬盤、網(wǎng)卡等)。
因為內(nèi)核文件(Kernel)通常是存放在系統(tǒng)上的/boot目錄中,并且是以vmlinuz開頭的文件,此時內(nèi)存程序還沒有加載到硬盤,因此無法讀取系統(tǒng)上的內(nèi)核文件,而如果先去加載硬盤則必須有硬盤的驅動程序,因此這將會產(chǎn)生一個先后順序的問題,為了解決這個問題,Linux采用GRUB啟動管理程序來識別硬盤信息,RTUB程序的執(zhí)行過程需要三個階段,具體的執(zhí)行過程將在下面的第二章節(jié)介紹。
第四步:啟動第一個執(zhí)行程序/sbin/init
在內(nèi)核、硬件及驅動信息加載完畢后,內(nèi)核會呼叫用戶控件的第一個執(zhí)行程序/sbin/init,init程序主要功能是準備軟件運行環(huán)境,包括系統(tǒng)的主機名稱、網(wǎng)絡配置、文件系統(tǒng)格式等其他服務的啟動管理。而這些所有的操作都是通過init的配置文件來定義的。
在CentOS 5中 init 的配置文件為:/etc/inittab
在CentOS 6中 init 的配置文件為:/etc/inittab,/etc/init/*.conf
在init的配置文件中有個一非常重要的配置項目,那就是默認的系統(tǒng)啟動級別。啟動級別是為系統(tǒng)維護的目的而設定的,其實現(xiàn)方式是關閉或啟動對應級別下的服務。以下為init的7個運行級別:
0:halt,關機
1:Single user,單用戶模式,此級別允許以root用戶身份登錄,而無需認證,相當于windows的安全模式
2:Multiuser,多用戶模式,需要用戶認證,會啟動網(wǎng)絡功能,但不會啟動NFS
3:Full multiuser,完全多用戶模式,文本界面
4:unused,預留級別,目前無特別的使用目的
5:X11,正常級別,也是完全多用戶模式,圖形界面
6:reboot,重啟
通常使用較多的默認級別為3或5,服務器上一般默認使用3級別,不同級別之間是可以進行切換的,切換方式為:init [0-6],可以使用 who -r 或 run_leave命令查看運行級別。
第五步:運行系統(tǒng)初始化腳本
根據(jù) init 的配置文件,先獲取默認的 runlevel,然后再執(zhí)行 /etc/rc.d/rc.sysinit腳本完成系統(tǒng)初始化。
系統(tǒng)初始化腳本所做的事情主要有:
1、設定主機名(讀取/etc/sysconfig/network文件)
2、激活 SELinux 和 udev
3、打印文本歡迎信息
4、掛載所有定義在/etc/fstab文件中的文件系統(tǒng)
5、激活 swap 設備
6、檢測跟文件系統(tǒng),并實現(xiàn)以讀寫方式重新掛載
7、設置系統(tǒng)時鐘
8、根據(jù) /etc/sysctl.conf 文件設定內(nèi)核參數(shù)的值
9、激活LVM和RAID設備
10、加載額外的設備驅動程序
11、清理操作
第六步:啟動系統(tǒng)服務
按照默認級別的參數(shù)N,執(zhí)行 /etc/rcN.d/目錄下設定的關閉和啟動相應的服務。
第七步:打印登錄提示符
二、GRUB程序的三個階段
stage1:運行Boot Loader主程序,這個程序必須要被安裝在啟動區(qū)(MBR)。因為MBR空間有限,因此在MBR當中僅安裝Boot Loader的最小主程序,并沒有安裝Boot Loader的相關配置文件。
stage1_5:存放在MBR隨后的扇區(qū)中,主要用于與stage2所在分區(qū)的文件系統(tǒng)進行交互。
stage2:通過Boot Loader加載所有配置文件及相關的環(huán)境參數(shù)信息,這些配置文件及相關的環(huán)境參數(shù)都存放于磁盤分區(qū)上的/boot目錄下。
grup的配置文件路徑為:/boot/grub/grub.conf,內(nèi)容如下:
default:設定默認啟動的內(nèi)核和操作系統(tǒng),如果同時安裝了多個操作系統(tǒng)或內(nèi)核,0表示定義的第一個title系統(tǒng),1表示定義的第二個title系統(tǒng),依次類推;
timeout:設定系統(tǒng)啟動時選擇操作系統(tǒng)菜單的等待時間,單位是秒(s);
splashp_w_picpath:設定系統(tǒng)啟動時grub菜單的背景圖片。圖片格式為xpm,14bits顏色,大小為640*480,需要gzip壓縮;
hiddenmenu:隱藏選擇菜單,默認情況下是不顯示菜單信息,如果想要顯示菜單,將該配置注釋即可;
title:定義一個操作系統(tǒng)或系統(tǒng)內(nèi)核,且包括下面內(nèi)容:
root:指明引導當前操作系統(tǒng)或內(nèi)核文件所在的分區(qū);
kernel:指定文件路徑、根文件系統(tǒng)所在設備,以及傳遞給內(nèi)核的參數(shù)。由于啟動過程中需要掛載跟目錄,因此需要指定根目錄所在的分區(qū)。內(nèi)核參數(shù) rhgb表示色彩顯示,quiet表示靜默模式加載內(nèi)核;
initrd:指定用于輔助內(nèi)核完成系統(tǒng)啟動的ramdisk文件路徑;
三、關于GRUB的調試
1、破解root用戶密碼
第一步:系統(tǒng)啟動時按任意鍵進入GRUB菜單,動作一定要快,默認是5s的倒計時
如上圖所示,可以使用上下鍵選擇要啟動的操作系統(tǒng)(這里只用一個);
按“e”可以對選擇的項進行編輯;
按“a”可以對選擇的項進行內(nèi)核參數(shù)修改;
按“c”可以進入命令行模式;
第二步:根據(jù)提示,選擇相應的菜單,然后按“a”,在原有內(nèi)核參數(shù)的最后加上“1或s或S或single”的任意一個參數(shù),表示進入單用戶模式,然后按回車鍵啟動系統(tǒng)
第三步:以單用戶模式進入系統(tǒng)后,使用passwd命令修改root用戶密碼,修改完之后重啟系統(tǒng)即可使用新的root用戶密碼登錄系統(tǒng)。
2、為GRUB菜單設置保護密碼
默認情況下進入GRUB菜單后不需要任何密碼就可以進行編輯,相對來說是比較危險的,因此可以修改 grub.conf 配置文件為GRUB菜單設置密碼保護,在 grub.conf 文件中的title字段上面新增一行pwssword PASSWD,password支持命令口令和加密口令,具體設置如下圖所示:
md5加密口令的生成命令為:grub-md5-crypt
在grub.conf文件中新增password后,再次進入GRUB菜單時如果想要編輯則必須按“p”鍵,然后通過密碼驗證后才能編輯,如下圖所示:
同理,在grub.conf配置文件中的title內(nèi)添加password,可以保護內(nèi)核,即進入系統(tǒng)時需要輸入密碼驗證后才能啟動。
3、取消圖形界面的啟動,使用文本界面啟動
系統(tǒng)默認的啟動方式是圖形界面啟動,因此看不到系統(tǒng)的啟動過程,可以通過修改 grub.conf配置文件設置成文本界面啟動,生產(chǎn)環(huán)境下也建議使用文本界面啟動,因為這種啟動方式可以看到整個過程,如果哪個服務在啟動過程中出錯可以及時發(fā)現(xiàn)。修改方法是把kernel參數(shù)中的rhgb和quiet刪除。
4、如果/boot下的文件損壞或丟失的恢復方法
第一步:使用安裝光盤進入救援模式,進入時需要根據(jù)提示手動選擇語言、鍵盤等
加載救援模式的過程中會提示硬盤上的系統(tǒng)已經(jīng)被找到并掛載到/mnt/sysp_w_picpath下,因此進入救援模式后可以使用 chroot /mnt/sysp_w_picpath 命令切換到硬盤上操作系統(tǒng)的根目錄下,因為救援模式下提供的命令比較有限,好多命令都不支持。
如果進入到救援模式后,沒有發(fā)現(xiàn)硬盤上的根文件系統(tǒng),則需要使用相關命令查找并分析根文件系統(tǒng)所在硬盤分區(qū)位置,如果硬盤使用的是普通分區(qū),則可以通過 blkid 命令和 fdisk -l命令分析出根文件系統(tǒng)的分區(qū)位置,而如果硬盤使用的是LVM分區(qū),則可以使用 lvscan 命令查看分區(qū),并且需要使用 vgchange -ay 命令激活VG卷組。
分析出根文件系統(tǒng)所在分區(qū)后掛載根文件系統(tǒng),然后檢查并修改fstab文件,如果該文件丟失,則手動創(chuàng)建一份,按照相應格式在其中添加掛載根文件系統(tǒng)的條目,然后重啟系統(tǒng),直到能夠自動檢測出硬盤上的系統(tǒng)并掛載到/mnt/sysp_w_picpath下為止。
第二步:進入到硬盤的根文件系統(tǒng)后,使用mount命令掛載光盤,比如將光盤掛載到/mnt/cdrom上:
第三步:使用rpm命令安裝kernel包,安裝時會提示kernel已安裝,需要使用--force或--replacepkgs選項強制安裝。安裝完之后會在/boot目錄下自動生成initramfs文件和vmlinuz文件
vmlinuz-2.6.32-642.el6.x86_64 和 initramfs-2.6.32-642.el6.x86_64.img 是系統(tǒng)啟動時必要的兩個文件,缺一不可。
vmlinuz-2.6.32-642.el6.x86_64:內(nèi)核文件,如果只是該文件丟失,可以從光盤或者相同版本的操作系統(tǒng)上拷貝。
initramfs-2.6.32-642.el6.x86_64.img:虛擬文件系統(tǒng),通過Boot Loader程序能夠將其加載到內(nèi)存中,然后這個文件會被解壓縮并且在內(nèi)存中模擬一個跟文件系統(tǒng),這個跟文件系統(tǒng)能夠提供一個可以運行的程序,通過該程序可以加載在啟動過程中所需要的核心模塊(RAID、LVM、SCSI等文件系統(tǒng)與磁盤的驅動程序),加載完成之后,會協(xié)助內(nèi)核重新呼叫/sbin/init來執(zhí)行后續(xù)的正常啟動。如果只是該文件丟失,可以使用 mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 重新生成 。
第四步:使用 grub-install命令修復grub,需要注意的是該命令需要指定/boot目錄的父目錄,如果/boot的父目錄是根目錄(/),則可以省略 --root-directory=DIR 選項。該命令也可以修復/boot/grub下的文件
第五步:在/boot/grub下創(chuàng)建 grub.conf配置文件,配置文件內(nèi)容如下圖所示
第六步:使用exit命令退出硬盤中的文件系統(tǒng),再使用reboot命令重啟系統(tǒng)
5、grub.conf文件損壞的修復
如果grub.conf文件損壞,則操作系統(tǒng)將不能正常啟動,此時手中如果有安裝光盤的話可以通過救援模式重新創(chuàng)建grub.conf文件,但如果沒有安裝光盤的話,可以通過以下方式修復:
第一步:如果grub.conf文件損壞,則系統(tǒng)系統(tǒng)時會自動進入grub的命令行模式,該模式下可以通過 help 命令查看幫助。使用root命令可以顯示當前grub所在硬盤的分區(qū)位置;
第二步:使用 root命令指定內(nèi)核存放的位置;
第三步:使用 kernel 命令設置kernel文件路徑及根文件系統(tǒng)所在設備,支持Tab命令補全;
第四步:使用 initrd 命令設置initramfs路徑,支持Tab命令補全;
第五步:使用 boot 命令啟動系統(tǒng);
第六步:系統(tǒng)啟動后手工重新編寫 /boot/grub/grub.conf 配置文件。
四、在U盤上自制 Linux 系統(tǒng)
根據(jù) CentOS 6 的啟動過程,可以在U盤上自制一個定制版的Linux系統(tǒng),首先需要劃分出一個/boot分區(qū)和一個根(/)分區(qū),其次需要安裝grub,然后將內(nèi)核文件和initramfs文件放入到U盤的/boot目錄下,最后創(chuàng)建必要的配置文件,具體步驟如下:
第一步:使用 fdisk 命令為U盤創(chuàng)建/boot分區(qū)和根分區(qū),/boot分區(qū)(/dev/sdb1)大小為100M,根分區(qū)(/dev/sdb2)大小為6G
第二步:格式化分區(qū),將/boot分區(qū)(/dev/sdb1)和根分區(qū)(/dev/sdb2)都格式化成ext4格式
第三步:分別將U盤上的boot(/dev/sdb1)分區(qū)和根分區(qū)(/dev/sdb2)掛載到當前系統(tǒng)的/mnt/boot和/mnt/sysroot上
第四步:使用 grub-install命令安裝grub,注意需要指定所掛載U盤/boot分區(qū)的父目錄為/mnt
第五步:在/mnt/boot/grub目錄下創(chuàng)建grub.conf配置文件,該配置文件中需要在kernel參數(shù)配置項中關閉selinux,并指定init程序為/bin/bash
第六步:復制內(nèi)核文件和initramfs文件到/mnt/boot目錄下
第七步:在/mnt/sysroot目錄下創(chuàng)建一級目錄
第八步:在/mnt/sysroot/bin目錄下創(chuàng)建fstab的自動掛載文件
第九步:復制bash命令及相關庫文件,注意bash命令和庫文件的路徑一定要放對,可以使用which命令查看bash路徑,使用ldd命令查看bash的依賴庫。
第十步:參考第九步,根據(jù)需求復制相應的命令及庫文件,可以使用腳本復制命令和庫,腳本內(nèi)容如下:
[root@localhost ~]# cat copycmd.sh #!/bin/bash ch_root="/mnt/sysroot" [ ! -d $ch_root ] && mkdir $ch_root bincopy() { if which $1 &>/dev/null; then local cmd_path=`which --skip-alias $1` local bin_dir=`dirname $cmd_path` [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir} [ -f ${ch_root}${cmd_path} ] || cp -n $cmd_path ${ch_root}${bin_dir} return 0 else echo "Command not found." return 1 fi } libcopy() { local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+') for loop in $lib_list;do local lib_dir=`dirname $loop` [ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir} [ -f ${ch_root}${loop} ] || cp -n $loop ${ch_root}${lib_dir} done } read -p "Please input a command: " command while [ "$command" != "quit" ];do if bincopy $command ;then libcopy $command fi read -p "Please input a command or quit: " command done