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

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

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.cdev_t name_to_dev_t(const char *name)関数定義の直前。

ROOTFSだから今からとマークされているパーティションを起動する方法を見つけたいと思います。


そこには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を介して実行されることです。これをバイパスするには、U-Bootが部分的なコマンドで決定して渡すことができるPARTUUIDを使用する必要があります。

関連情報