第10周作業
1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)。
CentOS系統啟動詳細的過程如下(以CentOS7為例):
-
加電自檢(POST)
按下電源開關,BIOS系統隨即開始加電自檢,檢查CPU、內存、主板及各接口、硬盤、鍵盤、光驅等,檢測它們的好壞。 -
讀取啟動順序
檢查完成后,BIOS會根據預先設定好的啟動順序去挨個尋找可引導設備,它找到的第一個有引導程序的設備成為本次啟動的引導設備。 -
主引導記錄(MBR)
BIOS程序會自動去讀取可引導設備中具有引導作用的代碼部分,即通常所說的主引導記錄(MBR),共512字節大小,由446字節的bootloader,64字節的分區表,2字節的結束標志組成。 -
GRUB
現主流的GRUB版本為grub 1.x,即grub2。它的代碼不能完全裝于MBR扇區中,所以將它分為兩段,一起來完成系統的引導工作。工作過程分以以下幾個階段: -
stage1
這一階段的代碼位于MBR中,BIOS讀取MBR中的boogloader代碼,這段代碼不包含文件系統的驅動,但它可以識別到stage2位于哪個分區中,但因為不包含文件系統的驅動所以stage1無法直接訪問stage2所在的分區,因此就有了stage1_5,以構建stage1和stage2通信的橋梁。 -
stage1_5
這個階段的代碼位于MBR后的63個扇區之中,它的作用是提供各種文件系統的驅動文件,以便stage1中的程度可以和stage2所在的分區通信進而找到stage2所存儲的內核文件和rootfs的文件系統驅動。 -
stage2
因為此時GRUB已可識別stage2所在的文件系統,所以這個階段它會找到grub的配置文件(/boot/grub2/grub.cfg),并根據其中的設定給用戶提供一個可選擇的菜單,用于選擇想要啟動的系統或內核版本。同時stage2即/boot/目錄下還提供了Linux系統內核文件(vmlinuz文件)和虛擬文件系統文件(initramfs)等其它核心文件。
待用戶選擇了相應的系統或等待超時后,系統啟動進入下一個階段。 -
Bootloader
提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核裝載到RAM(內存)中的特定空間中,解壓,展開,而后把系統控制權移交給內核?,F在Linux中流行的bootloader程序是grub,它的工作過程是這樣的: -
系統內核加載
在用戶選擇了要啟動的系統后,這時bootloader程序會將/boot下的內核文件、虛擬文件系統文件加載至內存中解壓并運行,至此bootloader的工作已圓滿完成。接下來的工作將由Linux內核來完成。
內核首先探測所有可識別的硬件設備,然后加載驅動,有的設備驅動可能需要借助虛擬根文件系統來裝載。
由于現在很多硬件驅動都是以模塊的形式存在的,如usb,raid,lvm,scsi,sata。此時的內核還不具備驅動這些設備的能力。(正如我們經??吹礁鱈inux發行版它們的/boot分區文件系統不會是lvm或raid,大多為單獨的一個分區)這時就需要用到initramfs這個虛擬的根文件系統,這樣就可以借助這個虛擬的根文件系統來加載各模塊驅動,進而可以掛載各設備,包括磁盤上真實的根文件系統。此階段使用的是只讀掛載。 -
啟動systemd
在系統核心將硬件識別及驅動加載完成后主機硬件已經準備就緒。此時內核會主動啟動系統第一個程序:systemd。systemd的主要功能是完成以下任務: -
掛載/etc/fstab里所有的文件系統(local-fs.target+swap.target)
-
偵測硬件,加載所需要的核心模塊(sysinit.target)
-
加載主要的外圍硬件設備驅動程序和防火墻相關任務(basic.target)
-
加載multi-user.target相關的服務,如tty登錄界面等
-
加載圖形界面相關的服務
當登錄終端tty或者圖形界面加載完成以后,至此,整個系統的啟動工作即已完成。
2、為運行于虛擬機上的CentOS 6添加一塊新硬盤,提供兩個主分區。
(1) 為硬盤新建兩個主分區;并為其安裝grub。
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs。
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件。
(4) 為grub提供配置文件。
(5) 將新的硬盤設置為第一啟動項并能夠正常啟動目標主機。
這題糾結了很久,浪費了大量的時間,做了幾十遍,但總是會碰到提示according mtab /dev/sda2 已經掛載的錯誤提示,導致系統不能正常啟動,找了很多同學做的作業,以及搜索錯誤提示信息,但都沒個準確的說法和解決辦法。但唯一做成的一次其步驟如下,和馬哥視頻中的也只是個別步驟的順序不同。(總結一點:當理論還不足以撐起隨便折騰的欲望時,請使用前人的方法,完全照抄然后加以熟練。)
新增硬盤為系統中識別為sdb,相關步驟如下:
fdisk /dev/sdb #然后創建兩個主分區(sdb1,sdb2,sdb3),并且創建一個swap分區,因為宿主機有swap分區,強烈建議和宿主環境保持一致 mke2fs -t ext4 /dev/sdb1 #給新分區創建ext4文件系統 mke2fs -t ext4 /dev/sdb3 #給新分區創建ext4文件系統 mkswap /dev/sdb2 #啟用swap分區 mkdir /mnt/boot #給新分區創建掛載點 mkdir /mnt/sysroot #給新分區創建掛載點 mount /dev/sdb1 /mnt/boot #將新分區掛載至/mnt/boot,作用類似于/boot分區 mount /dev/sdb2 /mnt/sysroot # 將新分區掛載至/mnt/sysroot,用于后面構建新系統的rootfs grub-install --root-directory=/mnt /dev/sdb #root-directory指定根所在的位置,不要指定/mnt/boot,gurb會自動去找指定路徑下的boot目錄的,/dev/sdb 用于指定想將grub安裝到哪個設備上。 cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/ #為新硬盤第一分區提供內核文件 cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/ #為新硬盤第一分區提供ramdisk文件 mkdir -pv /mnt/sysroot/{bin,sbin,lib,lib64,etc,home,root,media,mnt,dev,tmp} #為第二分區提供rootfs cp /bin/{bash,ls,cat} /mnt/sysroot/bin #將/bin目錄下的bash,ls,cat程序復制到/mnt/sysroot/bin目錄中 cp `ldd /bin/{bash,ls,cat} | grep -o "/lib64/.*[[:space:]]" | sort -u` /mnt/sysroot/lib64 #將bash,ls,cat所依賴的庫文件一同復制到新rootfs中的lib64目錄中 cp /boot/grub/splash.xpm.gz /mnt/boot/grub/ #提供開機畫面背景圖片(此處使用原系統中的圖片) cp /etc/grub.conf /mnt/boot/grub/ #給新的grub提供配置文件 vim /mnt/boot/grub/grub.conf #編輯新硬盤中的grub配置文件 ,修改kernel處的root=/dev/sda2,硬盤編號為BIOS識別的順序,第一個識別到的編號為a,這里這塊硬盤在此系統中實際為sdb,但把它拿到一臺沒有硬盤的機器上去,它就成了sda。數字2表示為硬盤上的第2個分區,然后保存退出,關機,將硬盤卸載,然后以此硬盤新建虛擬機,以驗證配置結果。以下為grub.conf文件需要發動的配置的說明: title CentOS 6 (2.6.32-642.el6.x86_64) Test_OS #在此處添加了"Test_OS" root (hd0,0) #只有一塊硬盤的情況下,其編號即為0,這里的root實際是指grub的根,是指grub stage2和kernel文件所在的分區,我們將grub stage2和kernel文件放置在了新增硬盤的第一分區,在grub中編號從0開始。 kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda3 selinux=0 init =/bin/bash #此處指定文件系統的根所在的位置,在Linux系統中分區編號是從開始的,我們把根文件系統建立在這塊硬盤上的第3個分區上了,并同時關閉了selinux,將指定init程序為/bin/bash initrd /initramfs-2.6.32-642.el6.x86_64.img #此處指定虛擬文件系統文件的位置。 最后新建虛擬機并指定使用這塊新增的虛擬磁盤,然后啟動虛擬機,即可進入系統,并以bash程序初始化系統,只有ls和cat指令以及bash內置指令可以使用
3、制作一個kickstart文件以及一個引導鏡像。描述其過程。
可以使用系統安裝過程中生成的文件(/root/anaconda-ks.cfg)加以修改或者使用圖形化的kickstart工具來完成kickstart文件的制作。圖形化kickstart工具需要先安裝system-config-kickstart軟件包。以下是使用圖形化工具生成的一份文件,全部選項配置完成以后,將文件保存為ks.cfg了,詳細內容如下:
[root@localhost ~]# more ks.cfg #platform=x86, AMD64, or Intel EM64T #version=DEVEL # Firewall configuration firewall --disabled #關閉防火墻 # Install OS instead of upgrade install #指定安裝類型為全新安裝 # Use CDROM installation media cdrom #安裝方式配置為從光驅安裝 # Root password rootpw --iscrypted $1$2xS8GSnM$IHzs2YYbCRGvcJmNxQ51W0 #加密后的root賬號密碼,配置時輸入明文密碼,并啟用加密選項 # System authorization information auth --useshadow --passalgo=sha512 #指定root密碼加密方式 # Use graphical install graphical #使用圖形化方式進行安裝 firstboot --disable #第一次啟動的時候禁用代理 # System keyboard keyboard us #設定鍵盤為美式鍵盤 # System language lang en_US #設定系統語言為美式英語 # SELinux configuration selinux --disabled #關閉selinux # Installation logging level logging --level=info #設定anaconda日志級別 # Reboot after installation reboot #設定安裝完成后系統自動重啟 # System timezone timezone Asia/Shanghai #設定系統時區為上海 # Network information network --bootproto=dhcp --device=eth0 --onboot=on #設定網卡開機自啟,并使用dhcp獲取ip # System bootloader configuration bootloader --location=mbr #設定bootloader的安裝位置,安裝到mbr中 # Partition clearing information clearpart --all #設定清理磁盤上所有分區信息 # Disk partitioning information part / --fstype="ext4" --size=20000 #按需要自定義分區 part /boot --fstype="ext4" --size=500 part swap --fstype="swap" --size=2000 %packages #選擇要安裝的軟件包 @chinese-support @desktop-platform-devel @development @eclipse @emacs @hardware-monitoring @internet-browser @kde-desktop @network-tools @perl-runtime @ruby-runtime @x11 %end
bash 56
制作引導鏡像:
先將光盤鏡像文件掛載至光驅,然后將除Packages和repodata之外的目錄全部copy至某目錄下,如/tmp/myiso;
然后使用如下指令生成名為boot.iso的引導鏡像,放置于/boot目錄下。
mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.6 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.catlog -o /root/boot.iso /tmp/myiso/
原創文章,作者:N24_lantian,如若轉載,請注明出處:http://www.www58058.com/65727
對于開機啟動流程其實是一個非常重要的知識,尤其是在面試過程中經常會被問到,所以這部分希望能通過自己的理解圖解出來。