Linuxで起動し、自動化スクリプトを実行し、自動的にWindowsから起動する必要があるアプリケーションがあります。 Kexecを使ってgrubを実行できますか?
別のユースケースは、Linuxカーネルを起動してプロセッサのマイクロコードを更新し、kexec
GRUBまたはSyslinuxを起動してWindowsを起動することです。なぜなら、マイクロコードは完全な再起動後も維持されないからです。
聞いたgrub4dos
(リンク(使用できません)、アーカイブバージョン)、ところで廃止されたようですが、GRUB2を使ってできる方法はありますか?
デフォルトではロード可能なGRUBイメージが必要ですkexec
。ここで見つけた画像を読み込もうとしています。説明するしかし、うまくいかないようです。どんなヒントでもくれてありがとう。
注:見つかったこの投稿2014年現在、kexecではこの機能は実装されていません。
答え1
これはWindowsでは可能ですが、kexec
せいぜい実験的なようです(完全にはテストされていません)。
幼虫
kexec
grub自体では不可能ですcore.img
(互換性のあるバイナリ形式がないようです)。Launchpadのバグレポート。上記のエラーはまだ再現できます。
kexec -l /boot/grub2/i386-pc/core.img
によると、kexec --help
現在、次のタイプがサポートされています。
elf-x86_64
multiboot-x86
multiboot2-x86
elf-x86
bzImage64
bzImage
beoboot-x86
nbi-x86
他のローダーをロードするには、これらの形式のいずれかを使用する必要があり、そうでない場合は互換性を追加する必要があります。 GRUBがどの形式を使用しているのかわかりません。簡単なfile
コマンドで以下を生成します。
/boot/grub2/i386-pc/core.img: data
起動可能なGRUBイメージの作成
現在、次の可能性があるようです。
grub2-mkimage
- 部分
core.img
(kernel.img
) - 一緒にまとめられて一緒に維持され
lnxboot.img
ましたcore.img
。 @Ardwenaの回答を参照してください。 lnxboot.img
カーネルとcore.img
as.tipは以下initrd
にあります。アーチスウィキそしてgrub開発者メーリングリストの古いスレッド。
ブートローダー
lnxboot.img
Linux kernel x86 boot executeable bzImage
カーネルにロードすることを意図しているようです。
その後、syslinux/isolinux/pxelinux/lilo または Linux カーネルをサポートする他のブートローダから grub2.bin をロードできます。
Kexecはそれをロードしますが、実行時に競合が発生します。
kexec -l /usr/lib/grub/i386-pc/lnxboot.img --initrd=/boot/grub2/i386-pc/core.img --debug
また、ロード時に問題があるようです(デバッグ出力の最初の数行)。
Try gzip decompression.
Try LZMA decompression.
lzma_decompress_file: read on /usr/lib/grub/i386-pc/lnxboot.img of 65536 bytes failed
[...]
Grub4Dos
Grub4Dosを簡単に見てください:
# file grub.exe
grub.exe: Linux kernel x86 boot executable bzImage, version \353kHdrS\003\002, RO-rootFS, Normal VGA
これは互換性があることを意味します。これはレガシーソフトウェアなので、私にとってはオプションではありません。
grub4dos
しかし、ダウンロードを通じて0.4.4
ロードできました。ソースフォージ次に、次を実行します。
kexec -l grub.exe
kexec -e
設定されていない場合は、しばらくしてGrub Shellに戻ります。使用したい場合は、必要に応じてgru4dos
調整してください。cmdline
このスレッドそれでも適用する必要があります。
Windows
Kexec
Windowsは単なる文章のようには見えないかもしれませんが、以前にすでに完了しました。
この方向の作業のほとんどは、以下に関連しているようです。Linuxブートプロジェクト。ジタブ
私はこれらを見つけましたスライドショーこのgithubリポジトリ。このアイテムを機能させるために記事に記載されているようです。
可能に見えますが、作業がたくさん必要です(そして「生産準備」が可能な解決策はありません。少なくともまだ見つかりませんでした)。残念なことに、LinuxBootに関するドキュメントはあまりないと思われるので、開発者に連絡する必要があるかもしれません。これを行うより直接的な方法がすでに存在する可能性があります。
答え2
kexecがWindowsに入るのが難しく複雑な理由は、すべてのオペレーティングシステムのブートローダが同様の方法でオペレーティングシステムのカーネルイメージをロードすると仮定するkexecの内部設計メカニズムに欠陥があるためです。これは明らかに真実ではありません。たとえば、一部のオペレーティングシステムのカーネルイメージは一部の特殊メモリアドレスオフセットからロードする必要があり、一部のオペレーティングシステムではオペレーティングシステムのカーネルイメージと一緒にロードするために追加のファイル(ドライバ情報を含む)が必要になる場合があります。 OSがカーネルイメージをロードする方法や将来のリリースでカーネルイメージをロードする方法を制御できないため、現在他のOS /カーネルでkexecする方法は長期的にうまく機能しません。
(私が提案したように)他のOSでkexecするより一般的で互換性のある方法は次のとおりです。リアルモードブートセクタブートコードをロードし、保護モードを終了し、リアルモードブートコードエントリポイントに直接ジャンプします。。これは、すべてのオペレーティングシステムのリアルモードブートセクタブートコードが常にすべてのメモリアドレスから起動してロードできるため、最も一般的な方法であり、BIOS(他のコンピュータメーカーは別のBIOSを作成する)がオペレーティングシステムでブートする方法です(操作システムは、システムがブートセクタのブートコードをロードする方法に独自の制限を課すことができるAppleなどの他のBIOSがシステムをインストールまたはブートすることを望んでいません。システムカーネルイメージをロードする方法に関係なく、常にすべてのオペレーティングシステムで起動できます。画像ファイルをロードすることの違いは大きくありません。
しかし、この目標を達成することは、次の理由で非常に困難です。
すべての最新のオペレーティングシステムと同様に、リアルモードから保護モードに入ると、一部のディスクリプタテーブルまたはページテーブルエントリがリアルモードメモリを上書きします。したがって、バックアップはありません。ただし、リアルモードブートコードはBIOS割り込みを使用してハードウェアIOにアクセスするため、元のリアルモードメモリマップを復元しないと、ハードディスクからカーネルイメージファイルをロードできません。この問題はトリッキーですが解決可能です。保護モードに入る前にメモリスナップショットを撮り、マシンで一度だけ実行する特別なLinuxブートローダをインストールできます。
すべてのプロセッサが保護モードからリアルモードへの復帰をうまくサポートしているわけではありません。製造コストと効率性の理由から、最新のプロセッサはオペレーティングシステムからの起動を解除する(保護モードからリアルモードへ)代わりにオペレーティングシステムから起動(リアルモードから保護モードへ)するように設計されています。したがって、保護モードから実際のモードに戻る動作は完全にテストされていないため、非常に不確実です。この動作はモデルによって異なるため、制御する方法がないため、どのプロセッサ製造元/モデルが動作するかを保証することはできません。
Intel Realモードのみが対象ですが、プロセッサの動作状態の他の遷移を含めることができます。
それでもすべてが正しく行われれば、原則として機能します。将来的には、Linuxにはマウントされた起動可能パーティションに対してkexec-ingする機能があります(ただし、ハードドライブごとに起動可能とマークされたパーティションは1つしかない可能性があるため、必ずしも起動可能としてマークする必要はありません。 BIOSはすべてのハードドライブから直接報告します)。エラーが発生し、起動が拒否されました) ハードウェア全体の再起動は不要で、これははるかに遅いです。これはLinuxにもっと光と希望をもたらします^_^
答え3
grubをインストールし、Linuxシステムをデフォルト値で起動する必要があります。
次のようにLinuxシステムでcrontabエントリを作成します。
@reboot /do/some/stuff
ここで、/do/some/stuff は、実行する必要があるすべての操作を実行するスクリプトです。スクリプトの最後に以下を追加します。
#!/bin/bash
#
# Do something here
sudo grub2-once "Windows"
sudo reboot
Windowsグラップメニュー項目が「Windows」の場合は、Windowsで再起動する必要があります。
次に再起動すると、Linuxに戻り、同じことを行います。
答え4
kexec
たとえば、lnxboot.img
2つのグラブ画像を組み合わせると機能します。core.img
cat lnxboot.img core.img > your-kexec-able.img
試してみる価値があります。
編集する:
さて、画像の内部を見てみると、lnxboot.image
それよりも「ELF」に近いようですので、lnxboot.img
それも試してみてください。
編集する:
明らかに、/boot/grub2/i386-pc/xxx.img イメージはこれに準拠していませんkexec
。それでは、いくつかの異なる形式を生成して、どれが機能するのかを確認してみてはいかがでしょうかgrub-mkimage
。マニュアルページによると、-O, --format=FORMAT
さまざまなフォーマットがサポートされています。たぶんx86_64-xen
フォーマットを試してみてください。