ラベルで rootfs パーティションを渡して、u-boot から Linux 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.cdev_t name_to_dev_t(const char *name)
関数定義の直前。
ROOTFS
そこで、これからは外付け USB HDD 上のというラベルの付いたパーティションを起動する方法を見つけたいと思います。
そこには 2 つの異なる解決策があります。
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 カードの 2 番目のパーティションにある小さな rootfs を使用して、ラベルからデバイス名を解決し、置き換えられたデバイス名でカーネル ブートを再起動します。
あなたはどう思いますか? どれが実装するのが「最も簡単」でしょうか?
もしかしたら、私は何か重要なことを忘れているのかもしれませんし、誰かがすでに同じことを成功しているのかもしれません。
とにかく、それを達成するために助けていただければ嬉しいです
答え1
問題は、LABEL と UUID の処理が Linux カーネルによって行われず、initramfs を介して行われることです。initramfs も提供する必要があります。これを回避したい場合は、part コマンドを介して U-Boot が決定して渡すことができる PARTUUID を使用する必要があります。