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