您好,登錄后才能下訂單哦!
一、CentOS 6 的啟動流程
第一步:加電自檢(POST)
主要檢查硬件設備是否存在并能正常運行,如:CPU、內存、硬盤、風扇、輸入輸出設備等。自檢功能主要是通過BIOS來實現的,BIOS程序是裝載在一個硬件芯片CMOS上的,加電過程就是給CMOS通電,然后啟動BIOS程序,BIOS程序會根據CMOS上面的一些配置信息區讀取其他的硬件設備信息并檢測其是否存在并能正常運行,之后進行硬件設備的初始化。
第二步:選擇啟動順序,加載MBR
按照BIOS中設置的Boot Sequence查找Boot Loader程序所在的設備。Boot Loader是一個程序,它依賴于一個硬件之上,這個硬件就是硬盤,準確的說為第一個可以啟動的硬盤的第一個扇區內,即MBR(Master Boot Record,主引導記錄)。
Boot Loader的主要功能就是去識別、加載操作系統中的核心文件,并提交到內存中運行,進而來啟動對應的操作系統。另一個主要功能是提供菜單信息(可以提供不同的啟動項來加載不同的操作系統),并將啟動管理功能轉交給其他的加載程序。
第三步:加載系統內核(Kernel)文件,執行系統初始化信息
Boot Loader程序讀取操作系統的內核文件后,會將其解壓后裝載到內存當中,然后接管BIOS的工作開始測試并加載各個設備(CPU、硬盤、網卡等)。
因為內核文件(Kernel)通常是存放在系統上的/boot目錄中,并且是以vmlinuz開頭的文件,此時內存程序還沒有加載到硬盤,因此無法讀取系統上的內核文件,而如果先去加載硬盤則必須有硬盤的驅動程序,因此這將會產生一個先后順序的問題,為了解決這個問題,Linux采用GRUB啟動管理程序來識別硬盤信息,RTUB程序的執行過程需要三個階段,具體的執行過程將在下面的第二章節介紹。
第四步:啟動第一個執行程序/sbin/init
在內核、硬件及驅動信息加載完畢后,內核會呼叫用戶控件的第一個執行程序/sbin/init,init程序主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統格式等其他服務的啟動管理。而這些所有的操作都是通過init的配置文件來定義的。
在CentOS 5 中 init 的配置文件為:/etc/inittab
在CentOS 6 中 init 的配置文件為:/etc/inittab,/etc/init/*.conf
在init的配置文件中有個一非常重要的配置項目,那就是默認的系統啟動級別。啟動級別是為系統維護的目的而設定的,其實現方式是關閉或啟動對應級別下的服務。以下為init的7個運行級別:
0:halt,關機
1:Single user,單用戶模式,此級別允許以root用戶身份登錄,而無需認證,相當于windows的安全模式
2:Multiuser,多用戶模式,需要用戶認證,會啟動網絡功能,但不會啟動NFS
3:Full multiuser,完全多用戶模式,文本界面
4:unused,預留級別,目前無特別的使用目的
5:X11,正常級別,也是完全多用戶模式,圖形界面
6:reboot,重啟
通常使用較多的默認級別為3或5,服務器上一般默認使用3級別,不同級別之間是可以進行切換的,切換方式為:init [0-6],可以使用 who -r 或 run_leave命令查看運行級別。
第五步:運行系統初始化腳本
根據 init 的配置文件,先獲取默認的 runlevel,然后再執行 /etc/rc.d/rc.sysinit 腳本完成系統初始化。
系統初始化腳本所做的事情主要有:
1、設定主機名(讀取/etc/sysconfig/network文件)
2、激活 SELinux 和 udev
3、打印文本歡迎信息
4、掛載所有定義在/etc/fstab文件中的文件系統
5、激活 swap 設備
6、檢測跟文件系統,并實現以讀寫方式重新掛載
7、設置系統時鐘
8、根據 /etc/sysctl.conf 文件設定內核參數的值
9、激活LVM和RAID設備
10、加載額外的設備驅動程序
11、清理操作
第六步:啟動系統服務
按照默認級別的參數N,執行 /etc/rcN.d/ 目錄下設定的關閉和啟動相應的服務。
第七步:打印登錄提示符
二、GRUB程序的三個階段
stage1:運行Boot Loader主程序,這個程序必須要被安裝在啟動區(MBR)。因為MBR空間有限,因此在MBR當中僅安裝Boot Loader的最小主程序,并沒有安裝Boot Loader的相關配置文件。
stage1_5:存放在MBR隨后的扇區中,主要用于與stage2所在分區的文件系統進行交互。
stage2:通過Boot Loader加載所有配置文件及相關的環境參數信息,這些配置文件及相關的環境參數都存放于磁盤分區上的/boot目錄下。
grup的配置文件路徑為:/boot/grub/grub.conf,內容如下:
default:設定默認啟動的內核和操作系統,如果同時安裝了多個操作系統或內核,0表示定義的第一個title系統,1表示定義的第二個title系統,依次類推;
timeout:設定系統啟動時選擇操作系統菜單的等待時間,單位是秒(s);
splashp_w_picpath:設定系統啟動時grub菜單的背景圖片。圖片格式為xpm,14bits顏色,大小為640*480,需要gzip壓縮;
hiddenmenu:隱藏選擇菜單,默認情況下是不顯示菜單信息,如果想要顯示菜單,將該配置注釋即可;
title:定義一個操作系統或系統內核,且包括下面內容:
root:指明引導當前操作系統或內核文件所在的分區;
kernel:指定文件路徑、根文件系統所在設備,以及傳遞給內核的參數。由于啟動過程中需要掛載跟目錄,因此需要指定根目錄所在的分區。內核參數 rhgb表示色彩顯示,quiet表示靜默模式加載內核;
initrd:指定用于輔助內核完成系統啟動的ramdisk文件路徑;
三、關于GRUB的調試
1、破解root用戶密碼
第一步:系統啟動時按任意鍵進入GRUB菜單,動作一定要快,默認是5s的倒計時
如上圖所示,可以使用上下鍵選擇要啟動的操作系統(這里只用一個);
按“e”可以對選擇的項進行編輯;
按“a”可以對選擇的項進行內核參數修改;
按“c”可以進入命令行模式;
第二步:根據提示,選擇相應的菜單,然后按“a”,在原有內核參數的最后加上“1或s或S或single”的任意一個參數,表示進入單用戶模式,然后按回車鍵啟動系統
第三步:以單用戶模式進入系統后,使用passwd命令修改root用戶密碼,修改完之后重啟系統即可使用新的root用戶密碼登錄系統。
2、為GRUB菜單設置保護密碼
默認情況下進入GRUB菜單后不需要任何密碼就可以進行編輯,相對來說是比較危險的,因此可以修改 grub.conf 配置文件為GRUB菜單設置密碼保護,在 grub.conf 文件中的title字段上面新增一行pwssword PASSWD,password支持命令口令和加密口令,具體設置如下圖所示:
md5加密口令的生成命令為:grub-md5-crypt
在grub.conf文件中新增password后,再次進入GRUB菜單時如果想要編輯則必須按“p”鍵,然后通過密碼驗證后才能編輯,如下圖所示:
同理,在grub.conf 配置文件中的title內添加password,可以保護內核,即進入系統時需要輸入密碼驗證后才能啟動。
3、取消圖形界面的啟動,使用文本界面啟動
系統默認的啟動方式是圖形界面啟動,因此看不到系統的啟動過程,可以通過修改 grub.conf 配置文件設置成文本界面啟動,生產環境下也建議使用文本界面啟動,因為這種啟動方式可以看到整個過程,如果哪個服務在啟動過程中出錯可以及時發現。修改方法是把kernel參數中的rhgb和quiet刪除。
4、如果/boot下的文件損壞或丟失的恢復方法
第一步:使用安裝光盤進入救援模式,進入時需要根據提示手動選擇語言、鍵盤等
加載救援模式的過程中會提示硬盤上的系統已經被找到并掛載到/mnt/sysp_w_picpath下,因此進入救援模式后可以使用 chroot /mnt/sysp_w_picpath 命令切換到硬盤上操作系統的根目錄下,因為救援模式下提供的命令比較有限,好多命令都不支持。
如果進入到救援模式后,沒有發現硬盤上的根文件系統,則需要使用相關命令查找并分析根文件系統所在硬盤分區位置,如果硬盤使用的是普通分區,則可以通過 blkid 命令和 fdisk -l 命令分析出根文件系統的分區位置,而如果硬盤使用的是LVM分區,則可以使用 lvscan 命令查看分區,并且需要使用 vgchange -ay 命令激活VG卷組。
分析出根文件系統所在分區后掛載根文件系統,然后檢查并修改fstab文件,如果該文件丟失,則手動創建一份,按照相應格式在其中添加掛載根文件系統的條目,然后重啟系統,直到能夠自動檢測出硬盤上的系統并掛載到/mnt/sysp_w_picpath下為止。
第二步:進入到硬盤的根文件系統后,使用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 是系統啟動時必要的兩個文件,缺一不可。
vmlinuz-2.6.32-642.el6.x86_64:內核文件,如果只是該文件丟失,可以從光盤或者相同版本的操作系統上拷貝。
initramfs-2.6.32-642.el6.x86_64.img:虛擬文件系統,通過Boot Loader程序能夠將其加載到內存中,然后這個文件會被解壓縮并且在內存中模擬一個跟文件系統,這個跟文件系統能夠提供一個可以運行的程序,通過該程序可以加載在啟動過程中所需要的核心模塊(RAID、LVM、SCSI等文件系統與磁盤的驅動程序),加載完成之后,會協助內核重新呼叫/sbin/init來執行后續的正常啟動。如果只是該文件丟失,可以使用 mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 重新生成 。
第四步:使用 grub-install 命令修復grub,需要注意的是該命令需要指定/boot目錄的父目錄,如果/boot的父目錄是根目錄(/),則可以省略 --root-directory=DIR 選項。該命令也可以修復/boot/grub下的文件
第五步:在/boot/grub下創建 grub.conf 配置文件,配置文件內容如下圖所示
第六步:使用exit命令退出硬盤中的文件系統,再使用reboot命令重啟系統
5、grub.conf文件損壞的修復
如果grub.conf文件損壞,則操作系統將不能正常啟動,此時手中如果有安裝光盤的話可以通過救援模式重新創建grub.conf文件,但如果沒有安裝光盤的話,可以通過以下方式修復:
第一步:如果grub.conf文件損壞,則系統系統時會自動進入grub的命令行模式,該模式下可以通過 help 命令查看幫助。使用root命令可以顯示當前grub所在硬盤的分區位置;
第二步:使用 root 命令指定內核存放的位置;
第三步:使用 kernel 命令設置kernel文件路徑及根文件系統所在設備,支持Tab命令補全;
第四步:使用 initrd 命令設置initramfs路徑,支持Tab命令補全;
第五步:使用 boot 命令啟動系統;
第六步:系統啟動后手工重新編寫 /boot/grub/grub.conf 配置文件。
四、在U盤上自制 Linux 系統
根據 CentOS 6 的啟動過程,可以在U盤上自制一個定制版的Linux系統,首先需要劃分出一個/boot分區和一個根(/)分區,其次需要安裝grub,然后將內核文件和initramfs文件放入到U盤的/boot目錄下,最后創建必要的配置文件,具體步驟如下:
第一步:使用 fdisk 命令為U盤創建/boot分區和根分區,/boot分區(/dev/sdb1)大小為100M,根分區(/dev/sdb2)大小為6G
第二步:格式化分區,將/boot分區(/dev/sdb1)和根分區(/dev/sdb2)都格式化成ext4格式
第三步:分別將U盤上的boot(/dev/sdb1)分區和根分區(/dev/sdb2)掛載到當前系統的/mnt/boot和/mnt/sysroot上
第四步:使用 grub-install 命令安裝grub,注意需要指定所掛載U盤/boot分區的父目錄為/mnt
第五步:在/mnt/boot/grub目錄下創建grub.conf配置文件,該配置文件中需要在kernel參數配置項中關閉selinux,并指定init程序為/bin/bash
第六步:復制內核文件和initramfs文件到/mnt/boot目錄下
第七步:在/mnt/sysroot目錄下創建一級目錄
第八步:在/mnt/sysroot/bin目錄下創建fstab的自動掛載文件
第九步:復制bash命令及相關庫文件,注意bash命令和庫文件的路徑一定要放對,可以使用which命令查看bash路徑,使用ldd命令查看bash的依賴庫。
第十步:參考第九步,根據需求復制相應的命令及庫文件,可以使用腳本復制命令和庫,腳本內容如下:
[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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。