如何從 u-boot 引導 linux rootfs,並按標籤傳遞 rootfs 分割區?
我使用 u-boot 作為引導程序,該卡是 RedPitaya。 linux是基於該卡可用的穩定ubuntu鏡像的定制Linux。
U-boot 與 linux 核心和裝置樹一起閃存在 sd 卡的第一個分割區。我正在嘗試在外部 USB HDD 上啟動根文件系統
我準確地說,如果我使用“經典”/dev/sdxn 命名約定,我可以啟動 HDD。
我已經嘗試使用以下參數,但它們都失敗了:
console=ttyPS0,115200 root=/dev/disk/by-label/ROOTFS rw rootfstype=ext4 earlyprintk rootwait isolcpus=1
console=ttyPS0,115200 root=LABEL=ROOTFS rw rootfstype=ext4 earlyprintk rootwait isolcpus=1
根據我的研究了解,/dev/disk/by-label 由 udev 填充,因此在將引導參數傳遞給 Linux 核心時,它在 u-boot 中不可用。
我還發現從標籤啟動的功能沒有整合到 Linux 核心中,正如您在這個檔案中看到的那樣do_mounts.c就在dev_t name_to_dev_t(const char *name)
函數定義之前。
所以從現在開始我想找到一種方法來啟動ROOTFS
外部USB硬碟上標記為的分割區。
我在那裡看到兩種不同的解決方案:
1 - 透過新增類似內容將按標籤引導功能整合到 Linux 核心中
if (strncmp(name, "LABEL=", 6) == 0) {
name += 6;
res = devt_from_label(name);
if (!res)
goto fail;
goto done;
}
進入do_mounts.c
並實現該功能devt_from_label
。
2 - 在 sd 卡的第二個分割區上使用一個小 rootfs 從其標籤中解析裝置名稱,並使用替換的裝置名稱重新啟動核心啟動。
你怎麼看待這件事 ?哪一個是實施起來「最簡單」的?
也許我忘記了一些重要的事情或有人已經成功地做了同樣的事情。
不管怎樣,我很高興能得到一些幫助來實現它
答案1
問題是 LABEL 和 UUID 處理不是由 Linux 核心完成的,而是透過 initramfs 完成的,您也需要提供它。如果你想繞過它,你需要使用 PARTUUID,這是透過部分命令,U-Boot 可以為你確定並傳遞。