/linuxrc → pivot_root 切換根檔案系統 → 執行 /sbin/init。linuxrc 可為腳本或二進位,最後必須 exec /sbin/init。/init (PID 1) → 完全由用戶空間控制 → switch_root 切換根檔案系統。/init 為腳本時末行需 exec /sbin/init。BusyBox 編譯產出的 _install 目錄結構:
_install/
├── bin/busybox # 核心二進位
├── sbin/ -> ../bin/ # 系統工具連結
├── linuxrc -> bin/busybox # initrd 模式入口
└── (init 需手動建立或重命名 linuxrc)
/linuxrc,BusyBox 檢測 argv[0] 為 linuxrc 時執行內建 init 邏輯 (解析 inittab)。linuxrc 重命名/連結為 init,核心直接執行 /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)。tar -cf - . | tar -xf - 保留權限/連結/裝置節點,比 cp -a 更可靠。exec /sbin/init 留在 initramfs 環境供除錯。dracut、mkinitcpio、update-initramfs 等工具自動生成,支援模組、固件、微碼、加密、LVM、RAID、網路啟動等。exec switch_root 確保 PID 1 替換,避免殭屍進程與資源洩漏。root=, rootfstype=, rd.init= 等) 是 initramfs 與核心協作的關鍵介面。