ラベルによってルートファイルシステムを Linux カーネルに渡す

ラベルによってルートファイルシステムを Linux カーネルに渡す

ラベルで 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 を使用する必要があります。

関連情報