萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 檔案系統初始化流程:System V init 與 LFS 實作深度解析

Linux 開機從核心交棒給 init 進程後,遵循 System V init 或 BSD 風格兩大流派。本文詳細說明 System V init 的四大階段,並以 Linux From Scratch (LFS) 實際目錄結構與腳本為例,展現完整初始化脈絡。

System V init 四大階段

  1. rc.sysinit:/etc/rc.d/rc.sysinit — 啟用 swap、磁碟檢查、設定主機名、掛載檔案系統、載入硬體模組。
  2. 預設執行層級:讀取 /etc/inittab 的 initdefault,切換至對應 rcX.d 目錄執行 S*/K* 腳本。
  3. rc.local:/etc/rc.d/rc.local — 最後執行,供管理員加入開機自啟指令。
  4. login:啟動 /bin/login 或圖形化顯示管理器。

注意:BusyBox 等嵌入式環境可能直接執行 /etc/init.d/rcS,流程簡化。

LFS /etc/inittab 範例

id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
...
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600

rc 腳本接收數字參數,對應 rcX.d 目錄;sysinit 參數對應 rcsysinit.d。

LFS /etc 目錄結構節錄

etc/
├── fstab
├── inittab
├── profile
├── rc.d/
│   ├── init.d/
│   │   ├── checkfs
│   │   ├── cleanfs
│   │   ├── modules
│   │   ├── mountfs
│   │   ├── mountkernfs
│   │   ├── network
│   │   ├── rc
│   │   ├── reboot
│   │   └── ...
│   ├── rc0.d/
│   │   ├── K80network -> ../init.d/network
│   │   ├── S60sendsignals -> ../init.d/sendsignals
│   │   └── S99halt -> ../init.d/halt
│   ├── rc1.d/ ...
│   ├── rc2.d/ ...
│   ├── rc3.d/
│   │   ├── S10sysklogd -> ../init.d/sysklogd
│   │   └── S20network -> ../init.d/network
│   ├── rc4.d/ ...
│   ├── rc5.d/ ...
│   ├── rc6.d/ ...
│   └── rcsysinit.d/
│       ├── S00mountkernfs -> ../init.d/mountkernfs
│       ├── S02consolelog -> ../init.d/consolelog
│       ├── S05modules -> ../init.d/modules
│       ├── S10udev -> ../init.d/udev
│       ├── S20swap -> ../init.d/swap
│       ├── S30checkfs -> ../init.d/checkfs
│       ├── S40mountfs -> ../init.d/mountfs
│       ├── S45cleanfs -> ../init.d/cleanfs
│       ├── S50udev_retry -> ../init.d/udev_retry
│       ├── S70console -> ../init.d/console
│       ├── S80localnet -> ../init.d/localnet
│       └── S90sysctl -> ../init.d/sysctl

S 開頭 = start (啟動),K 開頭 = stop (停止),數字越小優先度越高。

關鍵服務腳本範例:network

#!/bin/sh
. /etc/sysconfig/rc
. ${rc_functions}
. /etc/sysconfig/network

case "${1}" in
start)
    for file in ${network_devices}/ifconfig.*; do
        interface=${file##*/ifconfig.}
        [ "${interface}" = "*" ] && continue
        IN_BOOT=1 ${network_devices}/ifup ${interface}
    done
    ;;
stop)
    FILES=""
    for file in ${network_devices}/ifconfig.*; do
        FILES="${file} ${FILES}"
    done
    for file in ${FILES}; do
        interface=${file##*/ifconfig.}
        [ "${interface}" = "*" ] && continue
        IN_BOOT=1 ${network_devices}/ifdown ${interface}
    done
    ;;
restart)
    ${0} stop; sleep 1; ${0} start
    ;;
*)
    echo "Usage: ${0} {start|stop|restart}"; exit 1
    ;;
esac

透過 ifconfig.* 設定檔迴圈啟動/關閉所有介面,體現 SysV 腳本的標準化模式。

總結

System V init 以「執行層級 + 目錄化腳本」提供高度模組化的啟動管理。LFS 實作展示了最精簡且教學價值最高的結構,適合深入理解 Linux 開機機制、客製化嵌入式系統或建構教學環境。

copyright © 萬盛學電腦網 all rights reserved