Goで作るモダン・ブートサーバー Day 1 - 基礎知識編

こんにちは、本日から「Go で作るモダン・ブートサーバ」という記事を書きます。 久々にブログ記事書くか〜〜〜と軽いノリで書き始めたら、思いの外長くなったので、不定期に連載します。 この記事では、Go でブートサーバーを書く前に、ブートサーバーの基本について説明します。

シリーズの記事は以下のリンクからどうぞ。

ネットワークブート

個人のマシンや小規模なサーバー群なら、マシンに 1 台ずつ OS をインストールしても大した手間ではありません。 しかし扱うマシンが多くなると、とても手動で OS インストールできなくなります。 ネットワークブート はその名の通り、ディスクではなくネットワーク経由でマシンをブートする方法です。 VM のようにイメージを用意できない物理マシンを管理するときは、OS のインストールや起動にネットワークブートを用いることが多いです。

ネットワークブートの図

ネットワークブートの環境を構築するといくつかのメリットがあります。

  • OS インストールの手間が減る
  • 複数のマシンを一元管理できる
  • OS の状態管理がいらない

OS インストールの手間が減る

1 つめのメリットは、上記にも述べた OS インストールの手間が減ることです。 もちろんマシン側で、起動時にネットワークブートを有効にする必要はありますが、それさえ有効にすれば後はネットワーク経由でにインストールを開始できます。 インストーラーを自動で設定するようにカスタマイズすれば、入電さえすればマシンの OS インストールや初期設定を自動で終わらせることができます。

複数のマシンを一元管理できる

2 つ目のメリットは、マシンの管理性の向上です。 ネットワークブートでは、起動するマシンはブートサーバーにマシンの情報を送信します。 この情報には、ネットワークの MAC アドレスや、自身のシリアル番号、製品名などが含まれます。 そのため、シリアル番号毎に IP アドレスを管理したり、モデルごとに異なる設定を管理して適用できます。

OS のメンテナンスがいらない

3 つ目のメリットは、少し特殊なケースです。 通常 OS をディスクにインストールすると、カーネルやパッケージのメンテナンスが必要になります。 例えば一部のパッケージに脆弱性が発見されると、そのパッケージをアップデートします。 アップデートを繰り返えして新規インストールの状態からどんどん乖離すると、問題発生時に再現する環境を用意するのも手間になります。 しかし OS インストールそのものをなくし、ネットワークから直接起動できれば、このメンテナンスコストも発生しません。

もちろんディスクインストールと比較すると、起動時のネットワークトラフィックは増えますが、管理コストを減らすことができます。 カーネルやパッケージのアップデートという概念がなくなり、OS の更新作業はマシンを再起動して最新のイメージをロードするのみです。 OS の状態は不変になり、Immutable Infrastructure との親和性が高くなります。

ブートサーバーを作ろう

この記事では、ネットワークブートを提供するサーバーを ブートサーバー と呼ぶことにします。 ブートサーバーを実装するには、いくつかのキーワードが登場します。

  • DHCP サーバー
  • PXE ブート
  • iPXE ブート
  • UEFI HTTP ブート

DHCP サーバー

まずはネットワークブートに欠かせない DHCP サーバーです。 DHCP サーバーは、ネットワークでおなじみの IP アドレスを自動で割り当てるプロトコルですが、ネットワークブートに必要な情報も送受信できます。 DHCP クライアントは IP アドレスの要求パケットと共に、MAC アドレスやクライアント情報を送信できます。 また DHCP サーバーからの応答パケットには、割り当てる IP アドレスと共にブートに必要な情報(ブートサーバーの IP アドレスやブートイメージの URL)を載せられます。

PXE ブート

PXE ブートは古くからあるネットワークブートの規格です。 PXE ブートは、PXE に準拠した NIC(ネットワークインターフェイスカード)が搭載されているマシンで利用できます。 PXE ブートは DHCP と TFTP を組み合わせた規格で、DHCP の応答パケットに TFTP 上のパスが返されます。 それを受け取ったクライアントは、TFTP サーバーからブートイメージをロードして、マシンは OS を起動したりインストールを開始できます。

iPXE ブート

iPXE は PXE を拡張した規格およびオープンソースのファームウェアです。 iPXE では TFTP 以外に、HTTP や iSCSI に対応しており、Wi-Fi からのブートもできます。 iPXE を組み込んでいるハードウェアは多くありませんが、柔軟性や実装の容易さから利用されることは多いです。 また QEMU などで用意されている仮想 NIC のファームウェアは、iPXE が搭載されているものが多いです。

UEFI HTTP Boot

UEFI HTTP Boot は、UEFI 自身に組み込まれているブート方式です。 PXE や iPXE と同様に、DHCP の応答パケットにある URL から、EFI アプリケーションをロードします。 UEFI は DHCP の応答パケットから EFI アプリケーションをロードして実行します。

おわりに

さて、説明ばかりになりましたが、基礎知識編はここまでです。 次の記事では早速実装といきたいところですが、まずはネットワークブートに必要な環境構築をします。 QEMU を使った仮想マシンと Linux の仮想ネットワークを使って、仮想的なブート環境を構築します。 それでは次回お楽しみに!


Profile picture

Shin'ya Ueoka

B2B向けSaaSを提供する会社の、元Webエンジニア。今はエンジニアリング組織のマネジメントをしている。