linux系統啓動流程及常見問題的解決

一、前言

    計算機開機是一個神祕的過程。我們只是按了開機鍵,就看到屏幕上的進度條或者一行行的輸出,直到我們到達登錄界面。然而,計算機開機又是個異常脆弱的過程,我們滿心期望的登錄界面可能並不會出現,而是一個命令行或者錯誤信息。瞭解計算機開機過程有助於我們修復開機可能出現的問題。

二、Linux啓動流程

    linux啓動時我們會看到許多啓動信息,大致可分爲:BIOS > MBR > 引導加載程序 > 內核 > init process > login

    init程序的類型:

  • SysV: init, CentOS 5之前, 配置文件: /etc/inittab。

  • Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf。

  • Systemd:systemd, CentOS 7,配置文件: /usr/lib/systemd/system、 /etc/systemd/system。

  1、加電自檢

    當我們打開計算機電源,計算機會自動從主板的BIOS讀取其中所存儲的程序。這一程序通常知道一些直接連接在主板上的硬件(硬盤,網絡接口,鍵盤,串口,並口)。現在大部分的BIOS允許從軟盤、光盤或者硬盤中選擇一個來啓動計算機。

  2、計算機從所選擇的存儲設備中讀取起始的512 bytes

    前512 bytes叫做主引導記錄MBR (master boot record)。MBR會告訴電腦從該設備的某一個分區(partition)來裝載引導加載程序(boot loader)。加載程序儲存有操作系統(OS)的相關信息,比如操作系統名稱,操作系統內核所在位置等。常用的boot loader有GRUB和LILO。

    GRUB有幾個重要的文件,引導順序: stage 1 > stage 1.5 > stage 2 
        stage 1:它只有512字節,通常放在MBR中,它的作用很簡單,就是在系統啓動時用於裝載STAGE2並將控制權交給它。
        stage 2:GRUB的核心,所有的功能都是由它實現。

       stage 1.5:介於 stage 1和 stage 2之間,是它們的橋樑,因爲 stage 2較大,通常都是放在一個文件系統當中的,但是 stage 1並不能識別文件系統格式,所以才需要 stage 1.5來引導位於某個文件系統當中的 stage 2。

     根據文件系統格式的不同, stage 1.5也需要相應的文件,如:e2fs_stage1_5,fat_stage1_5,分別用於識別ext和fat的文件系統格式。它存放於1-63的柱面之間。

   主要的配置文件爲 grub.conf
   裏面選項含義:
   
   title : 一個操作系統引動的標頭,可以使多個
       root : 指明所需文件存在於哪個磁盤哪個分區上 (hd0,0)表示第一個硬盤,第一個分區,可參考/boot/grub/device.map
       kernel : 內核文件的名字,並且會有一些加載內核時的參數 or代表以只讀方式加載
       initrd : 包含一些附加的驅動程序


  3、boot loader加載內核(kernel)

     內核實際上是一個用來操作計算機的程序,它是計算機操作系統的內核,主要的任務是管理計算機的硬件資源,充當軟件和硬件的接口。操作系統上的任何操作都要通過內核傳達給硬件。Windows和Linux各自有自己內核。狹義的操作系統就是指內核,廣義的操作系統包括內核以及內核之上的各種應用。我們可以在多個分區安裝boot loader,每個引導加載程序對應不同的操作系統,在讀取MBR的時候選擇我們想要啓動的引導加載程序。這就是多操作系統的原理。

  4、若加載的是Linux內核,Linux內核開始工作

     內核會首先預留自己運行所需的內存空間,然後通過驅動程序(driver)檢測計算機硬件。這樣,操作系統就可以知道自己有哪些硬件可用。隨後,內核會啓動一個init進程。它是Linux系統中的1號進程(Linux系統沒有0號進程)。到此,內核就完成了在計算機啓動階段的工作,交接給init來管理。

     Linux系統有7個運行級別(runlevel):

  •  運行級別0:系統關機狀態,系統默認運行級別不能設爲0,否則不能正常啓動

  •  運行級別1:單用戶工作狀態,root權限,用於系統維護,禁止遠程登陸,可以破譯密碼

  •  運行級別2:多用戶狀態(沒有NFS)

  •  運行級別3:完全的多用戶狀態(有NFS),登陸後進入控制檯命令行模式

  •  運行級別4:系統未使用,保留

  •  運行級別5:有圖形化的完全多用戶模式,X11控制檯,登陸後進入圖形GUI模式

  •  運行級別6:系統正常關閉並重啓,默認運行級別不能設爲6,否則不能正常啓動

    通常使用較多的默認級別爲 3 或 5 ,服務器基本上默認使用 3 級別,即文本界面。不同級別之間可以進行切換。

    查看init運行級別:runlevel

    切換級別:init 5

  5、根據boot loader的選項,Linux此時可以進入單用戶模式(single user mode)

      在此模式下,初始腳本還沒有開始執行,我們可以檢測並修復計算機可能存在的錯誤隨後,init會運行一系列的初始腳本(startup scripts),這些腳本是Linux中常見的shell scripts。這些腳本執行如下功能:

     設置計算機名稱,時區,檢測文件系統,掛載硬盤,清空臨時文件,設置網絡等;

     當執行完這些初始腳本,操作系統已經完全準備好了。

  6、在此後的過程中,你將以用戶(user)的身份操作電腦。此外,根據創建用戶時的設定,Linux還會將其用戶歸到某個組(group)中。

三、常見問題及其解決方法

  實驗一 刪除/boot/grub/下除了grub.conf外的其他文件

cd /boot    進入boot,除了grub,刪除所有文件
ls          
cd /grub    進入grub,除了grub.conf ,刪除所有文件
ls

image.png

image.png

    刪除/boot下所有,除了grub.conf

image.png

    重啓;

    結果 : 正常啓動

  實驗二dd if=/dev/zero of=/dev/sda bs=1 count=446      清空stage1

    if=/dev/zero    從文件/dev/zero讀取 (全部寫零的意思)
    of=/dev/sda    輸出到文件/dev/sda
    bs=1           同時設置讀寫塊的大小爲1bytes
    count=446    僅讀取446個數據塊數

image.png

image.png

   結果 : 無法啓動,直接進入了光盤引導

   處理方法 : 進入Rescue救援模式

image.png

    根據下圖的指示,幾乎全部默認選項來進行操作;

image.png

image.png

    在此處可以救援模式中的shell進行操作;

image.png

df  顯示目前在系統上的文件系統的磁盤使用情況統計

image.png

chroot /mnt/sysimage     用來在指定的根目錄下運行指令,把根目錄換成指定的根目錄
grub-install /dev/sda      把grub安裝到/dev/sda

image.png

image.png

image.png

image.png

  實驗三dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512   破壞stage1.5

    if=/dev/zero    從文件/dev/zero讀取 (全部寫零的意思)
    of=/dev/sda    輸出到文件/dev/sda
    bs=1           同時設置讀寫塊的大小爲1bytes
    count=10240    僅讀取10240個數據塊數
    seek=512 從輸出文件/dev/sda   開頭跳過512個塊後再開始複製

image.png

image.png

     處理方法 : 進入Rescue救援模式

image.png

     重啓 reboot

 實驗四刪除  /etc/fstab    /boot     /etc/inittab(centos6 /etc/init/rcS.conf)    /etc/rc.d/rc.sysinit   

image.png

    結果 : 無法啓動,直接進入了光盤引導

    處理方法 : 進入Rescue救援模式

     因爲fstab文件已刪除,fstab文件:存放檔案系統與目錄結構對應資料的檔案

 mount /dev/sda2  /mnt/sysimage

image.png

    進入/boot目錄中,首先恢復丟失的/etc/fstab文件,從假根環境中通過blkid命令將結果輸出重定向到真根環境中/etc/fstab中

    blkid >> /mnt/sysimage/etc/fstab      blkid命令將結果輸出重定向到真根環境中/etc/fstab    

    chroot /mnt/sysimage       把根目錄換成指定的根目錄   

    vim /etc/fstab      編譯 /etc/fstab  文件

blkid >> /mnt/sysimage/etc/fstab    blkid命令將結果輸出重定向到真根環境中/etc/fstab    
chroot /mnt/sysimage       把根目錄換成指定的根目錄

image.png image.png

    重啓 init 0

    再次進入Rescue救援模式

chroot /mnt/sysimage    把根目錄換成指定的根目錄
grub-install /dev/sda      把grub安裝到/dev/sda

image.png

mount /dev/cdrom /media      將光盤掛載到/media
rpm -ivh /media/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force      強力安裝內核

image.png

image.png

vim /boot/grub/grub.conf

   default=0
   timeout=5
   hiddenmenu
   title CentOS 6       一個操作系統引動的標頭,可以使多個
      root (hd0,0)         指明所需文件存在於哪個磁盤哪個分區上 (hd0,0)表示第一個硬盤,第一個分區
      kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=b2b27503-0a08-4a84-95fc-97c9eb769b1a rhgb quiet     內核文件的名字,並且會有一些加載內核時的參數 ro 代表以只讀方式加載
      initrd /initramfs-2.6.32-696.el6.x86_64.img     包含一些附加的驅動程序

image.png

image.png

 rpm -qf /etc/init/rcS.conf          查詢指定文件rcS.conf來自於哪一個已安裝的rpm包
 rpm -qf /etc/rc.d/rc.sysinit          查詢指定文件rc.sysinit 來自於哪一個已安裝的rpm包

image.png

 cd /app      進入/app目錄  (該目錄可任意選擇)  
 cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app/    將依賴包下載,複製到/app/   
 rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id   將rpm格式的文件轉換爲cpio格式的文件
 cp etc/init/rcS.conf /etc/init
 cp etc/rc.d/rc.sysinit /etc/rc.d

image.pngimage.png   

    重啓  reboot

四、小總結

     最後總結一下,不管是重啓系統還是關閉系統,首先要運行sync命令,把內存中的數據寫到磁盤中。

     sync 將數據由內存同步到硬盤中。            關機指令:                                        shutdown –h 10 計算機將在10分鐘後關機,並且會顯示在登陸用戶的當前屏幕中。              shutdown –h now 立馬關機
             shutdown –h 20:25 系統會在今天20:25關機    
             shutdown –h +10 十分鐘後關機              halt 關閉系統              poweroff  關機
             init 0 關機      重啓指令:
            shutdown –r now 系統立馬重啓
            shutdown –r +10 系統十分鐘後重啓             reboot 就是重啓,等同於 shutdown –r now
            init 6 重啓


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章