以前は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)
コピーしました。この地点に到達するのに数日かかりましたので、誰にでも役立つことを願っています! vmlinuz
linux /vmlinuz /dev/sda2