開機流程簡介

  1. 開機流程與 Boot Loader
  2. Linux Boot Loaders Compared
  3. 何謂 Boot Loader ?
    1. Boot Loader 是開機載入程式,其主要功用是用來載入作業系統的核心。
    2. 在 Linux 中經常使用的 Loader 有兩種,分別是 LILO (LInux LOader) 及 GRUB (GRand Unified Bootloader) ,它們都具有 Boot Manager (開機管理程式)。

  4. MBR 是整個硬碟的第一個 sector,整個大小不可能超過 512 bytes, loader 不可能只佔不到 512 bytes 的容量。
  5. boot loader 的功能:
    1. boot loader 直接指定並取用 kernel 檔案,來載入到主記憶體當中;
    2. 將 loader 的控制權移交給下一個 loader。
  6. 若條件如下:
    1. MBR 安裝了同時認識 Windows 與 Linux 的檔案系統的 boot loader grub;
    2. /dev/hda1 的 super block 安裝 Windows 的 boot loader;
    3. /dev/hda2 中的 super block 也安裝了 Linux 的 grub ;
    4. Linux 的核心檔案放置在 /dev/hda2 裡面的 /boot/vmlinuz。
    則 MBR 的 grub 可以做到:
    1. 直接指定核心 (在 /dev/hda2 的 /boot/vmlinuz ) 來進行開機;
    2. 將控制權交給 /dev/hda2 super block 當中的 grub 進行管理;
    3. 將控制權交給 /dev/hda1 super block 當中的 Windows 的 loader 來管理。
  7. 為什麼要安裝多重作業系統時,最好先安裝 Windows 再安裝 Linux?
    1. Linux 可以選擇將 boot loader 安裝在 MBR 或者是 super block 當中;
    2. Windows 系統則幾乎預設強制會同時安裝在 MBR 與 Super block 當中,
    3. 若先安裝 Linux ,則後續安裝 Windows 時,會強制將 MBR 的 boot loader 覆蓋掉,故無法以 windows 的 boot loader 進入 Linux 了。

  8. 開機程序:

    \begin{picture}(380,70)
\multiput(0,40)(90,0){4}{\dashbox{}(70,25){}}
......
    1. 載入 BIOS 的硬體資訊,並根據 CMOS 中的紀錄取得第一個開機裝置的代號;
    2. 讀取第一個開機裝置的 MBR 的 boot Loader 的開機資訊,並將 Linux Loader 載入記憶體,接著主控權就交由 Linux Loader 來執行;
    3. 接著您就會看到一個開機選單畫面,來讓您選擇要開啟哪套作業系統。
    4. 選擇 Linux OS 並按下 Enter 鍵以後,Linux Loader 就將 Linux kernel 載入記憶體,準備來進行其他初始化的工作。
    5. 載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置;
    6. kernel 被成功載入後所執行的第一支程式為 init,因此 init 的 PID 為 1。
    7. init 會去讀取 /etc/inittab (initial table) 的內容,取得 run-level 資訊;
    8. init 執行 /etc/rc.d/rc.sysinit 檔案;
    9. 啟動核心的外掛模組 (/etc/modprobe.conf);
    10. init 執行 run-level 的各個批次檔( Scripts );
    11. init 執行 /etc/rc.d/rc.local 檔案;
    12. 執行 /bin/login 程式,並等待使用者登入;
    13. 登入之後開始以 Shell 控管主機。

  9. 第一支程式 init 及設定檔 /etc/inittab 與 runlevel
    [root@dywOffice ~]# vi /etc/inittab
    # Default runlevel. The runlevels used by Mandrakelinux 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:
    
    # System initialization.
    si::sysinit:/etc/rc.d/rc.sysinit
    
    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
    l4:4:wait:/etc/rc.d/rc 4
    l5:5:wait:/etc/rc.d/rc 5
    l6:6:wait:/etc/rc.d/rc 6
    
    # Trap CTRL-ALT-DELETE
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    
    # When our UPS tells us power has failed, assume we have a few minutes
    # of power left.  Schedule a shutdown for 2 minutes from now.
    # This does, of course, assume you have powerd installed and your
    # UPS connected and working correctly.
    pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
    
    # If power was restored before the shutdown kicked in, cancel it.
    pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
    
    
    # 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
    
    [root@dywOffice ~]# man inittab
    [設定項目]:[run level]:[init 的動作行為]:[指令項目]
    1. 設定項目:
       最多四個字元,代表 init 的主要工作項目,只是一個簡單的代表說明。
    2. run level:
       該項目在哪些 run level 底下進行的意思。如果是 35 則代表 runlevel 3 與 
       5 都會執行。
    3. init 的動作項目:
       主要可以進行的動作項目意義有:
       initdefault  :代表預設的 run level 設定值;
       sysinit      :代表系統初始化的動作項目;
       ctrlaltdel   :代表 [ctrl]+[alt]+[del] 三個按鍵是否可以重新開機的設定;
       wait         :代表後面接的指令項目必須要執行完畢才能繼續後面的動作;
       respawn      :代表後面欄位的指令可以無限制的再生。
       更多的設定項目請參考 man inittab 的說明。
    4. 指令項目:
       亦即應該可以進行的指令,通常是一些 script 囉。
    
  10. init 處理系統初始化流程 (/etc/rc.d/rc.sysinit):工作的預設設定檔在 /etc/sysconfig 中。
    1. 取得網路環境與主機類型: 讀取網路設定檔 /etc/sysconfig/network 網路環境。
    2. 測試與掛載記憶體裝置 /proc 及 USB 裝置 /sys。
    3. 決定是否啟動美國國家安全局發展的 Security Enhance Linux (SELinux)套件。
    4. 周邊設備的偵測與 Plug and Play (PnP) 參數的測試。
    5. 使用者自訂模組的載入 (/etc/sysconfig/modules/*.modules)。
    6. 載入核心的相關設定:讀取 /etc/sysctl.conf 的設定值。
    7. 設定系統時間 (clock):
    8. 設定終端機 (console) 字形:
    9. 設定 RAID 與 LVM 等硬碟功能:
    10. 以 fsck 檢驗磁碟檔案系統:
    11. 進行磁碟配額 quota 的轉換 (非必要):
    12. 重新以可讀取模式掛載系統磁碟:
    13. 啟動 quota 功能:
    14. 啟動系統亂數裝置 (產生亂數功能):
    15. 清除開機過程當中的暫存檔案:
    16. 將開機相關資訊載入 /var/log/dmesg 檔案中。
  11. 啟動系統服務與相關啟動設定檔 (/etc/rc.d/rc.n 及 /etc/sysconfig)
    1. run level 3 的啟動目錄放在 /etc/rc.d/rc3.d 目錄當中:
      [root@dywOffice ~]# ll /etc/rc.d/rc3.d
      total 0
      lrwxrwxrwx  1 root root 12 Oct 17 13:11 K09dm -> ../init.d/dm*
      lrwxrwxrwx  1 root root 18 Oct 17 13:11 S03iptables -> ../init.d/iptables*
      lrwxrwxrwx  1 root root 14 Oct 17 13:11 S04acpi -> ../init.d/acpi*
      lrwxrwxrwx  1 root root 19 Oct 17 13:11 S05harddrake -> ../init.d/harddrake*
      lrwxrwxrwx  1 root root 17 Oct 17 13:11 S10network -> ../init.d/network*
      lrwxrwxrwx  1 root root 19 Dec 20 08:25 S11shorewall -> ../init.d/shorewall*
      lrwxrwxrwx  1 root root 16 Oct 17 13:11 S12syslog -> ../init.d/syslog*
      lrwxrwxrwx  1 root root 17 Oct 17 13:11 S13partmon -> ../init.d/partmon*
      ......................中間省略..................................
      lrwxrwxrwx  1 root root 17 Oct 17 13:11 S95kheader -> ../init.d/kheader*
      lrwxrwxrwx  1 root root 16 Oct 17 13:11 S99devfsd -> ../init.d/devfsd*
      lrwxrwxrwx  1 root root 11 Oct 17 13:11 S99local -> ../rc.local*
      
    2. /etc/init.d 目錄內的 scripts 可以接受相關的參數來啟動、停止、重新啟動相關的服務,常見引數如下:
         start     stop    restart     reload     status
        啟動服務   停止服務  重新啟動服務  重新載入服務  顯示服務狀態
      
      1. 以 S 為開頭的檔案,為開機時需要『啟動, start』的服務;
      2. 以 K 為開頭的檔案,為『關機時需要關閉的服務, stop』的檔案連結;
      3. 在 S 與 K 後面接的數字,代表該檔案被執行的順序。
      4. 例如 S10network 指向 ../init.d/network ,代表:開機時,執行『 /etc/rc.d/init.d/network start 』
      5. S10network 要比 S12syslog 還要早執行。最後一項 S99local ,指向 /etc/rc.d/rc.local 這個檔案。
  12. 使用者自訂開機啟動程序 (/etc/rc.d/rc.local):想要在開機時就進行的工作時,直接寫入 /etc/rc.d/rc.local , 系統會在開機的時候自動被載入,而不必等我們登入系統去啟動。
  13. 根據 /etc/inittab 之設定,載入終端機或 X-Window 界面。
    # 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
    
    1. 在 run level 2, 3, 4, 5 時,都會執行 /sbin/mingetty 。
    2. mingetty 為啟動終端機的指令。
    3. respawn 的 init 動作項目,代表『當後面的指令被終止 (terminal) 時, init 會主動的重新啟動該項目。』因此,登入 tty1 終端機界面又以 exit 離開後,系統會重新顯示等待使用者輸入的畫面。
    4. 若不要 tty5 與 tty6,可將其註解,則下次重新開機,就只『F1 ~ F4』有效。
  14. 服務的相關設定檔 /etc/sysconfig:
    [root@dywOffice ~]# ls /etc/sysconfig
    alsa               i18n.bak          printing*
    autofsck           i18n.orig.gcin*   rawdevices
    bootsplash         init              readonly-root
    clock*             installkernel     suspend
    console/           keyboard*         suspend-scripts/
    cpufreq            modules/          syslog
    desktop*           mouse*            system
    dhcpd.rpmsave      msec              tmpwatch
    firstboot.rpmsave  net_monitorrc*    udev_net
    harddisks          network*          usb
    harddrake2/        networking/       userdrake
    i18n               network-scripts/  xinetd
    
    1. authconfig:規範使用者的身份認證,包括加密與否、加密的機制等;
    2. clock:設定 Linux 主機的時區。
    3. desktop:預設的 X Window 的視窗管理員 (Window Manager) 。
    4. i18n:設定語系。
    5. keyboard 與 mouse:設定鍵盤與滑鼠的形式;
    6. network:設定主機名稱,以及 GATEWAY 。
    7. network-scripts/: 裡面的檔案,主要用在設定網路卡。

練習題

  1. 何謂 Boot Loader ?
    Sol. Boot Loader 是開機載入程式,其主要功用是用來載入作業系統的核心。
  2. Linux 常用的 Loader 有那兩種?
    Sol. LILO (LInux LOader) 及 GRUB (GRand Unified Bootloader)。
  3. 為什麼要安裝多重作業系統時,最好先安裝 Windows 再安裝 Linux?
    Sol. Linux 可以選擇將 boot loader 安裝在 MBR 或者是 super block 當中;Windows 系統則幾乎預設強制會同時安裝在 MBR 與 Super block 當中。若先安裝 Linux ,則後續安裝 Windows 時,會強制將 MBR 的 boot loader 覆蓋掉,故無法以 windows 的 boot loader 進入 Linux 。
  4. 開機流程中,kernel 被成功載入後所執行的第一支程式為何?其 PID 為何?
    Sol. 第一支程式為 init,因此 init 的 PID 為 1。
  5. init 會去讀取 initial table 取得 run-level 資訊,initial table 檔名為何?
    Sol. /etc/inittab
  6. initial table 中 run-level 設定為 3 ,代表意義為何?如何設定?
    Sol. 開機預設在多使用者文字界面模式,以 vi 編輯 /etc/inittab,修改預設 runlevel 設定為:『id:3:initdefault: 』。
  7. initial table 中 run-level 設定為 5 ,代表意義為何?如何設定?
    Sol. 開機預設在圖形界面模式,以 vi 編輯 /etc/inittab,修改預設 runlevel 設定為:『id:5:initdefault: 』。
  8. initial table 中有如下一行,請說明其意義?
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    Sol. 設定項目 ca;不指定 runlevel;動作 ctrlaltdel 表示 [ctrl]+[alt]+[del] 三個按鍵會執行指令 /sbin/shutdown -t3 -r now。
  9. initial table 中有如下一行,請說明其意義?
    3:2345:respawn:/sbin/mingetty tty3
    Sol. 設定項目 3;runlevel 2,3,4,5 皆會執行此動作;動作 respawn 代表後面接的執行指令『/sbin/mingetty tty3』,init 仍會主動的『重新』啟動。
  10. initial table 中有如下一行,請說明其意義?
    l5:5:wait:/etc/rc.d/rc 5
    Sol. 設定項目 l5;只有 runlevel 5 會執行此動作;動作 wait 代表後面接的執行指令『/etc/rc.d/rc 5』必須要執行完畢才能繼續後面的動作。
  11. 如果預設開機 run-level 設定為 5,則開機時會到那個目錄下啟動服務?
    Sol. /etc/rc.d/rc5.d
  12. 如果預設開機 run-level 設定為 3,則開機時會到那個目錄下啟動服務?
    Sol. /etc/rc.d/rc3.d
  13. 指令 ls -l /etc/rc.d/rc3.d,其中一行最後一項顯示如下,請說明其意義?
    S10network -> ../init.d/network*
    Sol. 開機時,執行『 /etc/rc.d/init.d/network start 』,將服務 network 啟動,且其執行順序為 10。
  14. 指令 ls -l /etc/rc.d/rc3.d,其中一行最後一項顯示如下,請說明其意義?
    K09dm -> ../init.d/dm*
    Sol. 關機時,執行『 /etc/rc.d/init.d/dm stop 』,將服務 dm 關閉,且其執行順序為 09。

  DYWANG_HOME