名称
nextboot - ブートディスクにデフォルトのブートストリングブロックをインストールする

書式
nextboot [-b] filename bootstring file ... nextboot [-ed] filename

解説
FreeBSD の nextboot プログラムは、次回ブート時のブートブロックの動作を制御します。 正しいオプションと共にコンパイルされていれば、 ブートに用いるマジックナンバとデフォルトネームがあるかどうか、 ブートブロックはネームブロックをチェックします。 ブートブロックがそのようにコンパイルされている場合、 ブートが失敗したら再度ブートを試みないように ブートブロックはブロックからネームを削除します。 ブートが成功した場合に nextboot を用いてブートストリングを再インストールするのは /etc/rc の仕事です。 これにより、リモートデバッギングや 新しく信頼のおけないカーネルをインストールするといった場合に、 一度だけのブートストリングを用いることができるようになります。 コンパイル時に、ネームブロックはディスクの 2 番目の物理ブロックとして 定義されています。

次のオプションを使用可能です:

-b  ネームブロックをブートストラップする (最初に構成する) のに用いられます。 このオプションを指定しない場合、 nextboot はマジックナンバをまだもっていないブロックへの書き込みを拒否します。

-d  マジックナンバ中のビットを変更して、既存のネームブロックを 一時的に無効化します。

-e  -d オプションで無効化されたブロックに、 有効なマジックナンバを再設定します。

-e および -d のフラグは相互排除です。

解説
nextboot はまず、指定ディスクが fdisk テーブルを持ち、 そのテーブルで定義されている全パーティションがネームブロックを含んでいない ことをチェックします。 ネームブロックが使われていないことが明らかになれば、 nextboot は 引数に指定されたブートストリングを一つずつ、小さいマジックナンバを前につけ、 最後に NULL を加えてインストールします。 ストリングのリストの最後は 0xff バイトの列で区切られます。 ブートブロックがブートの度にネームブロックを書き戻す (write back) ように コンパイルされている場合、 ブートブロックはブート毎に一つずつ供給されたネームをゼロクリアします。 これは 0xff に到達するまで続き、 その時点でコンパイル時に組み込まれたブートストリングに戻ります。 この時点で、ネームブロックはゼロクリアされたネームだけになります。

使用例を示します:

       nextboot -b  /dev/rwd0 1:sd(0,a)/kernel.experimental wd(0,a)/kernel.old

これは、次回ブート時に実験カーネルを SCSI ディスクからブートしてみるよう、 ブートブトックに指示します。 何らかの理由でこれが失敗すると、その次のブートではカーネル /kernel.old を IDE ドライブからブートしようと試みます。 (書き戻しオプションが有効であると仮定しています。) これも失敗すると、コンパイル時に組み込まれたデフォルトが用いられます。

書き戻し機能が無効化されている場合、nextboot はデフォルトのブートストリングを 変更する簡便な手段となります。 もしネームブロックで指定されたファイルが存在しないと、 ネームブロックの次のネームではなく、コンパイル時にブートブロックの中に 組み込まれたネームがブート用に用いられることに注意して下さい。 ネームブロックはブート毎に 1 回だけ チェックされます。

関連項目
boot(8), disklabel(8), fdisk(8)

バグ
このプログラムは、古いブートコードとの組み合わせでのみ動作します。

プログラム全体にもっとユーザフレンドリにすべきです。 書き戻しの有効無効オプション設定はコンパイル時オプションではなく、 ディスク上にストアすべきです。 fdisk パーティションテーブルが存在しないディスク (つまり 純粋にディスクラベルだけのシステム) と共存できるように、 将来、この点に関して再考したいと考えています。

書き戻しを有効とするか否かは実行時にネームブロックで指定し、 この機能を得るためにブートブロックを書き換える必要のないようにすべきです。