Linux核心啟動過程中,檔案系統的掛載順序與機制常讓初學者困惑。本文以嵌入式ARM平台(非initrd模式)為例,梳理從核心掛載根檔案系統到用戶空間init接管的完整流程。
mount_root()(fs/super.c)掛載NAND Flash上的root.cramfs為/。啟動參數root=/dev/mtdblock/2指定裝置。mount_devfs_fs()將裝置檔案系統掛載至/dev,提供裝置節點存取。initrd,核心會先載入initrd映像至記憶體,執行/linuxrc腳本載入驅動模組,再pivot_root切換真實根檔案系統。本例採noinitrd,故無此步驟。init(PID 1),啟動參數init=/linuxrc指定腳本。/linuxrc典型內容:
#!/bin/sh
mount -n -t ramfs ramfs /etc
cp -a /mnt/etc/* /etc
mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /
mount -f -t ramfs ramfs /etc
exec /sbin/init
/etc掛載為ramfs,實現可寫配置目錄(根檔案系統為唯讀cramfs)。/mnt/etc複製配置檔至/etc。exec /sbin/init替換進程映像,啟動標準SysV init流程。initrd,啟動時動態載入。initrd即可適配不同硬體平台,無需重編核心。initrd含NFS客戶端,支援網路開機。在/linuxrc或/etc/rc.d/rc.local、/etc/init.d/服務腳本中加入啟動命令即可。嵌入式系統常直接修改/linuxrc或建立/etc/init.d/rcS腳本。
理解掛載流程有助於診斷「找不到根裝置」、「唯讀檔案系統無法寫入配置」等常見啟動故障。