気の向くままに辿るIT/ICT/IoT
システム開発

NetBSDとブートローダ

ホーム前へ次へ
NetBSDのインストールと運用/NetBSD/i386 6.1.x編

NetBSDとブートローダ

「起動可能なディスクがない」旨のエラーが表示された場合

 IBM PC/AT互換(BIOS/Intel CPU/Windowsプリインストール)機の場合、BIOSが正常なMBRを読み込み、MBRはActive(有効)となっている第1パーティションのPBRを読み込むことで第1パーティション内のOSを起動します。

 この時、OSがインストールされていない場合は当然としてMBRが壊れていたり、Activeと設定されたパーティションが存在しない場合、OSを起動することはできません。

 NetBSDでは、MBRが壊れている場合、fdiskコマンドを使ってMBRを(再)インストールすれば、簡単に修復することができますし、Activeフラグを立てることも、既存のActiveパーティションを変更することも簡単にできます。

 また、マルチブート構成で2つめ含む以降のパーティションにインストールしたOSを起動させたい場合には、予め、起動するOSを選択するためのブートローダをインストールしておくか、別途、ブートローダを入れたLiveメディアを起動してからハードディスク内のOSを選択する必要があります。

 NetBSDには、MBRに直接書き込むタイプの簡易ブートローダであるブートセレクタ[bootselect code]があり、システムインストール時に、これをインストールしてメニュー項目を設定することもできますし、これをするしないに関わらず、後からGRUB LegacyやGRUB2をインストールすることもできます。

 インストールをしたにも関わらず、「起動可能なディスクがない」旨のエラーが表示された場合は、まず、これが原因で、そうだとすれば、実際には、NetBSD自体はインストールされているものの、「起動する手段がない」という状況にあるということになります。

 こうした場合でも後述の汎用ブートローダのLiveメディアを使って一時的に起動させ、その後、通常起動できるようにしておけば、全く問題ありません。

 その前に仮に英語キーボードしか使えないという状況があった場合、一時的ながらも不便なので、その日本語キーボードと英語キーボードの対応一例を挙げておきます。

汎用ブートローダとLiveメディア

 こうした場合には、CD/DVD/USBメモリなどから汎用のブートローダを使えば、ハードディスク内のOSを起動させることができます。

# vi grub.conf
### GRUB2
...
menuentry 'NetBSD'{
    set root=(hd0,1)
    knetbsd /netbsd
}
...
### (または、)
...
menuentry 'NetBSD'{
    set root=(hd0,1)
    chainloader +1
    boot
}
...
#

(ブート後、GRUBプロンプトから)
...
ls (hd0,1)
... netbsd ...
grub > set root=(hd0,1)
grub > knetbsd /netbsd
(...etc.)

## 何れもFATパーティションの場合
set root=(hd0,msdos1)

 GRUB2専用、もしくはGRUB2を使ったブートUSBを作成するつもり、または、持っているなら、grubプロンプトやmenuetnryでNetBSDをインストールしたパーティションを[set root=]して[knetbsd /netbsd]、または、[chainloader +1]及び[boot]などとすればOKです。

 この時、パーティションのフォーマットをFATとした場合、(hd0,1)などとしても認識できなかったら(hd0,msdos1)などとすればアクセスできるでしょう。

# vi grub.cfg
### GRUB Legacy
...
title 'NetBSD'
root (hd0,0,a)
chainloader +1
...
#

(ブート後、GRUBプロンプトから)
...
ls (hd0,0,a)
... netbsd ...
grub > root (hd0,0,a)
grub > chainloader +1

 GRUB LegacyでNetBSDを起動するなら[root (hd0,0,a)](GRUB Legacyでは1つめのパーティションは0、aはBSDパーティション内のルートパーティション)、[chainloader +1]などとしておけば起動します。

 これらは、何れもルートにあるNetBSDのデフォルトのカーネル名[/netbsd]を使って起動することを前提としています。

PLoP Boot Manager
PLop Boot Manager

 もっと簡単な方法がよい場合には、起動できないPCを起動する方法FUJITSU FMV C6320でUSBブートはできるのか?にあるようにPLop Boot Managerを使うと何を設定することもなく、メニューから選択するだけでUSBだけでなく、CD/DVDやHDDからも起動させることができるので重宝します。

 これを使う場合、まず、PLop LinuxのISOディスクイメージ、もしくは、ブートマネージャのみのplpbt.isoを仮想マシンならそのまま、物理マシンならCD/DVD±RWなどに焼いてBIOSの設定でCD/DVDから起動するようにします。

 PLop Boot Managerならそのまま、PLop Linuxの場合は、ブートメニューからPLop Boot Managerを選び、マシン全体にNetBSDをインストールした場合には、[HDA HARDDISK 1]を、マルチブート構成にした場合は、パーティションの順と同様に[HDA HARDDISK 2]や[HDA HARDDISK 3]もあるはずなので対応するメニューを選択します。

NetBSDブートセレクタとNetBSDブートローダ

NetBSD/i386ブートセレクタ
bootselect code
NetBSD簡易ブートセレクタ
NetBSD/i386ブートローダ
NetBSD標準ブートローダ

 GRUB Legacy、GRUB2、PLoP Boot Managerなど何れを使ったにしてもNetBSDの簡易ブートセレクタ、もしくは、標準起動メニューが無事、表示されたことでしょう。

 尤もこれは一時的な措置です。

 次回からこれらブートメディアに入れたブートローダを使う必要なく、PCの起動後にNetBSDのブートセレクタや標準メニューが表示されるように、また、これらを含め、PC/AT互換機のMBRにNetBSD用ブートコードをインストールするには後述のようにします。

NetBSDにおけるハードディスクの認識とデバイス

 その前にこれらを行なう対象となるハードディスク名やハードディスクのキャラクタデバイス名を知る必要があります。

 NetBSDの標準メニューが表示されたら一応、[02. Single User Mode]で起動します。(個人のPCなら[1. Boot normally](マルチユーザーモード)でも構いませんが、その場合は、説明の流れの都合上、rootでログインします。)

 シングルユーザーモードで起動した場合、起動メッセージが流れて途中で停止したところで[Enter]を押すと/bin/shによるrootアカウント用シェルプロンプト[#]が表示されます。

 シングルユーザーモードで起動していれば、プロンプトの2〜3行上あたりの起動メッセージの中にディスク名が書いてあると思いますが、NetBSDの場合、HDDがIDE/ATAなら[wd]、SCSIなら[sd]、ディスク全体、もしくは1つめのBIOSパーティション(スライス)にインストールした場合には、[0]、2つめなら[1]...のように順に数字が付くので1つめ(ディスク全体に1つだけインストールしてある)なら、それぞれ[wd0]、[sd0]のようになります。

 また、NetBSDでは、i386版においては、BSDパーティションにおける[d]パーティションはディスク全体を表わすので[wd0d]、[sd0d]となり、これらは、一定の塊単位で読み書きできるブロックデバイス、これらの先頭に[r]を付加した[rwd0d]、[rsd0d]が、1バイト単位で読み書きできるキャラクタデバイスです。

 以降の説明は、HDDがIDE/ATAの1つめのパーティションの場合(NetBSDではwd0)を想定するものとします。

# mount -u -w /
#

 尚、シングルユーザーモードにおいてプロンプトに入った段階では、ハードディスク上のルート[/]パーティションは読み取り専用となっているため、[mount -u -w /]とします。

NetBSD用ブートセレクタのインストール/ブートセレクタの起動順変更

NetBSD/i386ブートセレクタ
NetBSDブートセレクタ

 マルチブート構成で複数のOSをインストール済みで他のブートローダではなく、NetBSDのブートセレクタ[bootselect code]をインストールしたい場合、また、これをインストール後にデフォルトで起動するOSを変更したい場合には、次のようにします。

# fdisk -u wd0
/dev/rwd0dでも可

 ここでNetBSD用のブートセレクタ[bootselect code]を書き込み、これによるメニューを表示させたい場合には、[fdisk -u ...]のように指定します。

 パーティション一覧が表示されるので各パーティションごとにパーティション番号を入力、サイズ指定などの変更が不要なら[Enter]、bootmenuでは、ブートセレクタで表示したいOSの(簡潔な)名称を入力などを経て書き込みます。

# fdisk -B wd0
/dev/rwd0dでも可

 NetBSD用ブートセレクタがインストールされていてマルチブート構成になっている場合にデフォルトで起動するOSを変更したい場合には、[fdisk -B ...]のように指定、デフォルトとしたいパーティション番号を入力して書き込みます。

NetBSD用標準ブートローダのインストール

NetBSD/i386ブートローダ
NetBSD標準ブートローダ

 NetBSD標準のブートローダ(ブートメニュー)の内容は、[/boot.cfg]で設定されています。

 仮想化ハイパーバイザXenのdom0やdomUやオリジナルカーネルを作成した場合などには、[/boot.cfg]を編集することになるでしょう。

 ちなみにNetBSD標準ブートローダが存在しないとか壊れているということはないとは思いますが、[installboot]コマンドを使うと、これをインストールすることもできます。

NetBSDにおけるMBRの初期化

# fdisk -i wd0
/dev/rwd0dでも可

 NetBSDにおいてMBRを明示的に書き込みたい場合には、[fdisk -i ...]を実行します。

 これでブートコードがMBRに書き込まれ、MBRが読み込まれるとアクティブなパーティションに処理を移します。

Activeパーティションがあるか確認

 ただ、MBRに書き込まれたブートコードは、アクティブ(≒有効)となっているパーティションに処理を移す為のものなので何れかのパーティション(ディスク全体を使っている場合、1つめのパーティションと同じ)が[Active]になっていないと起動しません。

# fdisk wd0
...
0: ...
...
#

 そこで念の為、[fdisk wd0]などとしてNetBSDのパーティションにあたる部分に[Active]という文字列があるかを確認、あれば、何もしなくてOKです。

# fdisk wd0
...
0: ...
...
# fdisk -a wd0
...
Do you want to change the active partition? [n] y
...
active partition: [0..4 default; 0] 0
Are you happy with this choice? [n] y
...
Should we write new partition table? [n] y
#
# fdisk wd0
...
0: ................ , Active
...
#

 もし、Activeとなっているパーティションがないとか、他のパーティションをActiveにしたい場合には、[fdisk -a wd0](IDE/ATAハードディスクの場合)とします。

 そうすると「アクティブパーティションを変更したいですか?[n]」といった旨のメッセージが表示されるので[y]として[Enter]。

 パーティション番号の指定でリストにある0から4までの内、該当する番号を入力、「この選択でいい?」といった旨のメッセージが出るので[y]。

 「パーティションテーブルに書き込みますか?」といったメッセージに対して[y]としてシェルプロンプトに戻れば設定完了です。

 ちなみに、それぞれdefaultの値なら[Enter]でも可です。

# reboot
...

 あとは、仮想マシンならISOディスクイメージ、物理マシンならCD/DVDやUSBメモリを取り出して[reboot]すれば、NetBSDの標準ブートメニューが表示されるはずです。

[追記:2016/11/25]

 インストーラを使わないNetBSD/i386のインストールでは、NetBSDのfdisk、disklabel、installbootを使ったブートローダのインストール、セカンダリブートローダのコピーなどについても書いています。

ホーム前へ次へ