定義されたサーバーに何をブートするかを問い合わせるにはどうすればいいですか

定義されたサーバーに何をブートするかを問い合わせるにはどうすればいいですか

次のブート シナリオを実現するために利用できるオプションは何ですか?

起動時(起動前)に、定義された Web サーバーに接続し、何を起動するかを問い合わせます(通常の応答: ローカル ハード ドライブから起動、代替応答: イメージ XYZ を起動)

目標は、クライアントでのユーザー操作を必要とせずにクライアントを再インストールできるようにすることです。これを実行する論理的な方法は PXE ブートですが、環境を制御しないため、デフォルトで通常のブート PXE が使用されると、攻撃ベクトルが開かれるため安全ではありません。

これまでに私が発見し、試したことは次のとおりです。ローカル ハード ドライブから Grub2 を起動し、iPXE をチェーンロードします。次に、iPXE は http 経由で定義された Web サーバーに接続し、iPXE スクリプトを取得します。ただし、そこからローカル ドライブから起動する方法はまだ見つかっていません (Grub を再度起動して無限ループで終了する以外)。起動したい OS は、Grub/iPXE が起動されるのと同じハード ドライブのパーティション 2 にあります。

  1. 私たちが達成しようとしていることを達成する別の方法はあるでしょうか?
  2. 2 回目の起動 (iPXE から戻ったとき) に Grub に別のオプションを選択するように指示したり、iPXE にパーティション 2 から起動するように指示したりする方法はありますか?

補足: パーティション 2 には Windows Boatloader が含まれており、Grub メニューから起動できます。

答え1

私はリモート システムをアップグレードする際に次のテクニックを使用しましたが、これはあなたにも役立つかもしれません。そのシステムでは、リセットを開始することしかできず、(ブート) 画面を見ることができませんでした。システムは grub (Ubuntu 12.04) でブートし、追加パーティションとデータ パーティションの両方がありました。秘訣は、次のものを挿入することです /etc/default/grub

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false

以下の場合を除き、常に 0 エントリ (Ubuntu 12.04) で起動します。

  • コンソールで誰かが別のものを選択する
  • Ubuntuにログインした状態で実行しgrub-reboot X、再起動します

Ubuntu から、tar ファイルをダウンロードして追加パーティションに解凍し (または手動で小さな変更を加え)、 を実行してupdate-grubgrub メニューを更新し (これにより、新しく追加された追加パーティションがスキャンされ、その OS のメニュー エントリが作成されます)、 および を使用しgrub-reboot ますreboot

マシンが復帰しない場合 (つまり、ssh猶予期間が経過しても復帰しない場合)、マシ​​ンをリセットして、何が問題だったのかを分析し、次のサイクルに進む準備ができるように、Ubuntu で再起動することができます。

起動時に適切なプログラムを実行すると、次にダウンロードする必要がある「イメージ」が何であるかを確認し、既にダウンロードされているかどうかを確認して (ダウンロードされていない場合は) インストールできます。その後、上記のように再起動します。

リーンsystemdベースのディストリビューションでは、再起動プロセスは比較的速く、代替 OS/ディストリビューションのダウンロード/インストールに大部分の時間がかかります。

答え2

私たちが探していたことを実現する方法を見つけました。grubenv のヒントを提供してくれた @jc__ と @Anthon に感謝します。

そこで私の解決策は、ブート制御サーバーに接続するためのカスタムスクリプトを含むiPXEカーネルバイナリ(.lkrn)を/bootに配置することです。

次にGrubをセットアップします

1- grubenvの変数を使用する

GRUB_DEFAULT=saved

2- Grubから/bootにiPXEをチェーンロードし、iPXEを起動する前に次のコマンドを含めます。

set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry

3- ローカルドライブからOSをロードするGrubメニューエントリを先頭に追加します。

set saved_entry='<menuentry iPXE>'
save_env saved_entry

4-何もする必要がなければ、ブート制御サーバーはiPXEにローカルドライブからブートするように指示します。

sanboot --no-describe --drive 0x80

5- Grub が再度ロードされ、ローカル ドライブで起動し、次回の起動が再び iPXE になるように設定されます。

ブート コントロール サーバーへの問い合わせを含めた Windows 10 の起動時間は約 25 秒です。つまり、実際にはかなり高速です。:)

答え3

これを実現するには、少なくとも 2 つの方法があります。

  1. を見てみましょうhttp://ipxe.org/appnote/work_around_bios_halting_on_ipxe_exit#examples、次のコマンドのいずれかが機能する可能性があります:

    chain ${server}/grub4dos.exe --config-file="find --set-root /BOOTMGR;chainloader /BOOTMGR"
    chain ${server}/grub4dos.exe --config-file="root (hd0,1);chainloader +1"
    
  2. iPXE サイトで GRUB4DOS のページを見つける前にこれをビルドしたので、現在は以下を使用しています。ISOLINUX と次の構成を含む ISO イメージを作成します。

    NOESCAPE 1
    PROMPT 0
    ALLOWOPTIONS 0
    
    DEFAULT chain-hd0-2
    LABEL chain-hd0-2
    SAY Chaining hd0 2...
    COM32 chain.c32
    APPEND hd0 2
    

    そして、以下を使用して起動します (デフォルトでは 0x80 が使用され、ローカル ディスクが上書きされるため、ここでは 0x81 を使用する必要があります)。

    sanboot --drive 0x81 ${server}/chain-hd0-2.iso
    

関連情報