
我正在開發一個帶有 Arm Cortex A9 的嵌入式設備。核心版本為4.16.0,由buildroot 2018.05產生。儲存記憶體是一個有多個分區的mmc。 U-boot讀取一個分割區中的uImage並啟動核心。檔案系統包含在核心映像中,並在啟動時載入到 initramfs 中(配置:BR2_TARGET_ROOTFS_INITRAMFS)。
我想使用overlayfs來使用資料夾(在mmc中)作為“用戶”文件系統,安裝到/
.
我已經嘗試成功地覆蓋/etc
一個/data/etc
通過將這些行添加到以下名稱的目錄/etc/fstab
:
/dev/mmcblk0p1 /data auto defaults 1 2
overlay /etc overlay x-systemd.requires=/data,lowerdir=/etc,upperdir=/data/etc,workdir=/data/work/etc 0 0
這是可行的,但覆蓋層是在 systemd 啟動其服務後安裝的。因此,例如網路配置是 uImage 中的配置,而不是我的user
檔案系統中的配置。我想在啟動 systemd 之前安裝覆蓋層,就在/
安裝之後。
我了解到,在啟動時,系統會在 ram 中建立第一個記憶體空間,然後在其中提取 cpio 映像。然後/
安裝在那裡,系統啟動第一個程式:systemd:/sbin/init
PID為1。
我已經閱讀了很多文章和問答網站,但我仍然不明白我必須在哪裡進行更改才能在啟動時執行覆蓋。包含該操作的文件是什麼mount /
?
答案1
此引導時操作位於 initramfs 中。您需要在您的 中新增一個腳本initramfs/scripts
,可能是init-bottom
為了根據需要(重新)掛載檔案系統,然後產生一個新的 initramfs 套件。
init
該腳本在核心進程結束時在檔案系統之前執行init
。令人困惑的原因是因為設定代碼並不直接位於檔案系統上,而是位於 initramfs 檔案中。
答案2
您需要找出疊加層的實際位置,並將其輸入到文件中
/etc/fstab
就像您在正在運行的系統中輸入它一樣。
需要注意的是:您需要將該檔案新增至 buildroot 覆蓋檔案系統中,以便在建置 rootfs 時,buildroot 包含修改後的檔案系統表。
舉個例子,假設您想要覆蓋/dev/mmc0p0超過/家,您將執行以下步驟,並使用 MYCOMP 和 MYBOARD 作為您的公司和董事會名稱:
- create a filesystem structure in a seperate directory, as
specified in the buildroot manual chapter 9.1 "Recommended
directory structure", presumably under /tmp/br_ext
- in this directory you add board/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab
and fill it with this information:
板/MYCOMP/MYBOARD/rottfs_overlay/etc/fstab:
/dev/mmc0p0 /home ext4 defaults 0 1
然後,您可以使用以下命令在 buildroot 樹中建立檔案系統:
make BR2_EXTERNAL=/tmp/br_ext menuconfig
make
重新啟動新檔案系統後,覆蓋層應該就位。