Yocto イメージが起動しない

Yocto イメージが起動しない

以前はStackOverflowでこの質問をしましたが、ここで質問するのが正しい場所だと言われました。

私はYoctoを初めて使用しているので、HDDからintel-corei7-64 core-image-minimalを起動する際にいくつかの問題があります。 ddを使用してハードドライブに挿入しましたが、起動時にカーネルパニックが原因で停止します。

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown block (0,0)

私はたくさん試して解決策を見つけました。まず、GRUBにイメージを一覧表示するためにgrubインストールを実行し、ブートパーティションにgrub.cfgファイルを構成する必要がありましたが、それ以外の情報は得られませんでした。一部のフォーラムでは、これはinitramfsが欠落していることを意味すると言います。 USBフラッシュドライブで動作するため、画像自体が破損していないようです。

私のgrub.cfgは次のようになります。

set default="0"
set timeout="30"

menuentry 'Yocto' {
        insmod part_msdos
        insmod part_gpt
        insmod ext2
        insmod all_video
        set root='(hd0,gpt2)'
        linux /boot/bzImage-4.19.40-intel-pk-standard root=/dev/sda2
}

起動エラーを解決するのに役立つと思います。この時点で私ができることはほとんどありませんでした。

ありがとう

アレックス

答え1

bzImage-4.19.40-intel-pk-standard root=/dev/sda2

Uefiシェルで直接実行する方法です。しかし実際にinitrd=は抜けました!私も同じ問題がありました。 SATA/SCSI モジュールはカーネルにはなく (ほとんど) initramfs にあるモジュールです。カーネルの横にinitrd / initramfsをコピーしてinitrd=initram-cpio.gz(「画像」名を適用します)、オプションをコマンドラインに追加します。

VFS エラーは次のとおりです。あなたが提供したルート(/dev/sda2)は、私が読めないブロックデバイスにあります。


「yocto」を検索したら、以下を追加したいと思います。必要なモジュールをモジュール(「m」)の代わりに組み込みモジュール(「y」)として設定する必要があります。これにより、この「組み込み」プロジェクトの基本的なアイデアであるinitrdは必要ありません。


yoctoでもっと見つけて追加しました...

この欲望(そしてあなたのQ)は私を捨てませんでした。私は2016年lwn.netの会議/記事でこの事実を発見しました。

基本的なレベルで[… ]ヨクトそしてルート構築どちらも同じ最終製品であるルートファイルシステムを提供します。ビデオ組み込みデバイスの場合、コア、ㅏブートローダーと互換性のあるツールチェーン。

私が見るには、 "make"を使ってカーネルとモジュール、必要に応じてinitrdをコンパイルする方が良いでしょう。

なぜこの記事を書いたのか教えてください。

私はddを使って[カーネルイメージ]をハードドライブに入れます。

今これが私を混乱させます。すでにやったのと同じですdd ... of=/dev/sda。私はこう言いたいと思います:カーネルイメージをパーティションxのディレクトリにコピーしました。

これでYoctoが構築するすべてが終わりました。焼いたものカーネルとinitrd、今Linuxカーネルを起動する方法を知りませんか? ! ?


新しいミニPCキットで起動しているので、ディスクは空です。 GPTとUefiを使用することにしました。 MBRを最後に使用してから古い。まず、USBフラッシュドライブからSlackwareインストーラを起動しました。

「EFI」または「ESP」タイプを含むfdiskを使用していくつかのパーティションを作成しました。私は賢明に2GBに設定しました。一部では100MBのみをお勧めします。 ESPはBIOSでも読み取るため、vfat形式が必要です。

私が見つけた唯一の(コンパイルされた)Linuxカーネルは、インストーラとライブシステムのISOイメージにあるカーネルです。 opensuseライブUSBシステムからISOをマウントし、kernelとinitrdという2つのファイルを含むsquashs rootfsをマウントできます。

これら2つのファイル(カーネルと初期RAMディスク)を2 GB ESPにコピーしました。カーネルは3〜8MB、initrdは10〜30MBです。

UEFIシェルコマンドのようにカーネル名を入力して、カーネルを起動できるUefiシェルでBIOSを起動します。

これらすべてを把握するのに時間がかかったため、カーネルパニックが発生したときに大きな成功を収めました。

fs0: vmlinuz

これは、ファイル名 "vmlinuz"を使用してuefiプロンプトESP(例: "fs0")からカーネルを起動する方法です。

また、root=がないためパニックが発生します。私はすぐに試しました:

fs0: vmlinuz root=/dev/sda2

これにより、最初に説明したカーネルパニックが発生しました。

VFS:rootfsをマウントできません...

initrd=...cpio.gzここでは2つのパスを選択できます。カーネルをKCLオプション(カーネルコマンドライン)として追加して、カーネルに付属のinitrdを使用します。または、Fedora 29カーネルを使用してください。これは私のsdaデバイスをマウントできる唯一のカーネルです。その理由は、いくつかのKconfigオプションが組み込まれていますが、他のすべてのディストリビューションではこれをinitrd(sata、scsi、sd-mod)にモジュール化するためです。

私はArchlinuxのクイックインストールに非常に満足していますが、initrdなしで起動できるようにカーネルを直接コンパイルする必要があると思います。カーネルは独自にルートファイルシステムをマウントできる必要があります。

ご覧のとおり、コンパイルやヨクト、グラブはありません。ディストリビューションからISOに移動すると、多くの実験を行うことができます。重要な起動オプションは次のとおりです。

initrd=...img

1996-2000年のオリジナルのカーネル文書は、いくつかの場所で誤解を招く可能性があります。しかし、Almesbergerは彼のinitrdが開始が2つの段階で「許可」されることを明らかにしました。そして:rdinit=RAMディスク内のスクリプトは、「実際の」ルートとswitch_rootをマウントできます。場合によっては、2段階の起動が必要です。

カーネルソースコードで「VFS:」カーネルパニックを追跡しました。 「prepare_namespace」関数が重要です。 initrd= が与えられると、カーネルマウントの root= 部分をスキップします。ソースに「initrdがある場合は、すべての操作を実行してください」という説明があります。

root=/dev/xxyy

initrd=がない場合は、カーネルに「起動」する必要がある(ブロック)デバイスを直接通知します。 initrd では switch_root を使用できます。 Aroot=/dev/ram0には特別な意味があります。つまり、最初のラムディスクを最初から実際のルートにします。私はこれが多くの組み込みシステムに役立つと思います。 rootfs はパーティションではなく cpio ファイルにあります。

init=/sbin/init

これがカーネルが起動時に実行する最後の作業です。つまり、最初のプロセスを呼び出します。 root =と同様にinitrd =を指定すると、パラメータの解析はRAMディスクによって異なります。カーネルは root= をマウントした後にのみ「/」を理解することに注意してください。

BIOSが「Uefiシェル」に切り替わり、ディスクがGPT形式(またはハイブリッド/保護MBR)で、小さい(小さすぎない)ESP vfatパーティションを追加すると、カーネルとinitrdを起動できます。

現在の計画は、標準のSSDパーティションをマウントできるカーネルをコンパイルするため、initrdを必要としません。ポルノ「埋め込み」を行うためにyoctやgrubは必要ありません。月に2回最新のカーネルソースをコンパイルしたくない場合は...しかし、独自のディストリビューションを作成するのではなく、カーネルをコンパイルしたいと思います!

ここで止まります。私の記事からLinuxの起動アイデアを得ることを願っています。カーネルコマンドラインアドベンチャー

答え2

いよいよYoctoイメージを正常にリリースしました!

誰もが起動時に同じ問題が発生した場合は、このようにしました。

まず、通常どおりgrubインストールを実行し、EFIパーティション(私の場合は/dev/sda1)の/boot/grub/にgrub.cfgを追加しました。その後、grub.cfgファイルにsearch --set=root --file /vmlinuz追加しました。次に、sam68がgrub.cfgにファイルを追加することを提案したので、Fedora 30のファイルをルートパーティション(/ dev / sda2)にset root=(blabla)コピーしました。この地点に到達するのに数日かかりましたので、誰にでも役立つことを願っています! vmlinuzlinux /vmlinuz /dev/sda2

関連情報