萬盛學電腦網

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

基於 initrd/initramfs 的 Mini Linux 設計:linuxrc/init 機制與 TinyCore 實戰

initrd/initramfs 核心啟動邏輯

  • initrd (傳統):核心掛載 ramdisk → 執行 /linuxrc → pivot_root 切換根檔案系統 → 執行 /sbin/init。linuxrc 可為腳本或二進位,最後必須 exec /sbin/init。
  • initramfs (現代):核心解壓 cpio 到 rootfs → 執行 /init (PID 1) → 完全由用戶空間控制 → switch_root 切換根檔案系統。/init 為腳本時末行需 exec /sbin/init。

BusyBox linuxrc/init 機制

BusyBox 編譯產出的 _install 目錄結構:


_install/
├── bin/busybox          # 核心二進位
├── sbin/ -> ../bin/     # 系統工具連結
├── linuxrc -> bin/busybox  # initrd 模式入口
└── (init 需手動建立或重命名 linuxrc)
  • initrd 模式:核心執行 /linuxrc,BusyBox 檢測 argv[0] 為 linuxrc 時執行內建 init 邏輯 (解析 inittab)。
  • initramfs 模式:需將 linuxrc 重命名/連結為 init,核心直接執行 /init。

TinyCore Linux init 實戰範例

TinyCore (含桌面 ~10MB, 核心+initramfs ~8MB) 展示極致精簡啟動邏輯:


#!/bin/sh
mount proc
# 若核心參數含 multivt,啟用多終端 inittab
grep -qw multivt /proc/cmdline && mv /etc/inittab-save /etc/inittab

# embed 模式:直接在 initramfs 運行,不切換根檔案系統
if grep -qw embed /proc/cmdline; then
    umount proc
    exec /sbin/init
fi

umount proc

# 標準模式:複製系統到 tmpfs (RAM) 再 switch_root
if mount -t tmpfs -o size=90% tmpfs /mnt; then
    if tar -C / --exclude=mnt -cf - . | tar -C /mnt/ -xf -; then
        mkdir /mnt/mnt
        exec /sbin/switch_root /mnt /sbin/init
    fi
fi

exec /sbin/init  # 失敗回退

設計亮點

  • 參數驅動行為:透過 /proc/cmdline (核心命令列參數) 決定啟動模式 (multivt, embed)。
  • RAM 根檔案系統:將整個 initramfs 複製到 tmpfs (90% 記憶體),實現極速運行、掛載後可寫入。
  • tar 管線複製:tar -cf - . | tar -xf - 保留權限/連結/裝置節點,比 cp -a 更可靠。
  • 失敗優雅回退:任何步驟失敗最終 exec /sbin/init 留在 initramfs 環境供除錯。

現代 initramfs 最佳實踐

  • 使用 dracut、mkinitcpio、update-initramfs 等工具自動生成,支援模組、固件、微碼、加密、LVM、RAID、網路啟動等。
  • 自製 init 時:務必用 exec switch_root 確保 PID 1 替換,避免殭屍進程與資源洩漏。
  • 核心命令列參數 (root=, rootfstype=, rd.init= 等) 是 initramfs 與核心協作的關鍵介面。
copyright © 萬盛學電腦網 all rights reserved