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

*BSDをUSBメモリ/GRUB2/GPTでマルチブート

ウェブ造ホーム前へ次へ
*BSDをUSBメモリ/GRUB2/GPTでマルチブートするには?

*BSDをUSBメモリ/GRUB2/GPTでマルチブート

*BSDをUSBメモリ/GRUB2/GPTでマルチブート

 FreeBSD/NetBSD/OpenBSDでは、意図せず、専用パーティション内で専用ローダのチェーンロード、同じくカーネルコール、他と同一パーティションでのISOブート(ISOディスクイメージから直接起動)と3者3様となりました。

 その内、専用パーティションを必要としたFreeBSDとNetBSDについては、前者は、ハイブリッドISOになっているようでUSBメモリにも利用でき、後者は、ハイブリッドISOではないようでUSBメモリスティック用イメージを使うことになりました。

 一方、共通点としてGRUB2のkfreebsd/knetbsd/kopenbsdでローダーやカーネルをロードすることができました。

 尚、後述の通り、FreeBSDとNetBSD、OpenBSDだけなら基本パーティション2つ、データ保存用に1つ、GRUBを専用パーティションに入れるにしても4つあればよく、MBRパーティションでも充分であり、結果GPT対応のGRUB2でなくともGRUB LegacyでもOKです。

 そもそも今回は、インストーラを中心にCentOS/Fedora、Debian/Ubuntu、FreeBSD/NetBSD/OpenBSD、更にレスキューツールとしてClonezilla、GpartedのLive版をマルチブート構成としたLive USBにしてみようということで始めたのですが、結果的に単独で基本パーティションを要したのがFreeBSDとNetBSDのみでGRUB用とデータ保存用にパーティションを確保しても4つで事足りる為、MBRパーティションでも、よってGRUB Legacyでも可能だったわけで、ということであれば、このページの例だとFreeBSD/NetBSDにおいてはchainloderによる方法でも可能でしょう。

[追記:2016/08/09]
 が、後述のようにNetBSDのインストーラはISOブートする方法もあることがわかり、よってmsdos形式でもどうしても基本パーティションが必要となるのは、現時点でISOブートする方法がわからないFreeBSD1つ分だけです。)

FreeBSD

menuentry 'FreeBSD-10.1-RELEASE-i386-bootonly' {
    set root=(hd0,gpt7)
# この方が無難 => set root=(hd0,7)
    kfreebsd /boot/loader
}
menuentry ' ' { echo }

 FreeBSDは試行錯誤した結果、専用のパーティションが必要と判断し、ddコマンドでそこにISOディスクイメージを埋め込みました。(FreeBSDインストーラ兼Liveイメージ)

 FreeBSDをGRUB2で起動する方法は、コマンドラインから[info grub2]で参照したマニュアル内にも例示されていましたが、FreeBSDに慣れていないことから[pool]って何?とかピンとこなかったので、とある米英語のQ&Aサイトの回答にあったすごくシンプルな方法をそのまま使わせて頂くことにしました。

 この方法の場合、[kfreebsd]でFreeBSD標準の[loader]をチェーンロードするだけです。

 ただ、FreeBSD標準のloaderをチェーンロードしただけだからか、これによって起動する画面は、インストール後に見ることになるはずのFreeBSD標準のメニュー画面のようにも見えますが、よく見ると違うような。。。ISOディスクイメージ自体はbootonly仕様なのでデフォルトのマルチユーザーモードを選べば自ずとbootonly用カーネルを起動、最終的に[Install]、[Upgrade]、[Live]を選択可能な昔ながらのテキストベースのグラフィカル風対話式メニューが表示されます。

 ここでFreeBSDは、root=(hd0,gpt7)とGPTの7番め(GRUB2ではパーティションは1からカウント)のパーティションに入れていますが、問題なく起動できます。

NetBSD

menuentry 'NetBSD-6.1.2-i386' {
#    insmod part_gpt
    set root=(hd0,gpt4)
# この方が無難 => set root=(hd0,4)
    knetbsd /netbsd
}
menuentry ' ' { echo }

 NetBSDも試行錯誤の末、専用のパーティションが必要と判断し、ddコマンドでそこにUSBメモリスティック用イメージを埋め込みました。(how to install netbsd from an usb memory stick )

 NetBSDをGRUB2で起動する方法については、コマンドラインから[info grub2]で参照したマニュアル内にドンピシャの記述があり、[knetbsd]の引数としてその名も[netbsd]というカーネルを渡すだけです。

 起動画面は、NetBSDの標準的な昔ながらのテキストベースのグラフィカル風対話式メニューです。

 ここでNetBSDは、root=(hd0,gpt4)と(MBRでは基本パーティション3に続く拡張パーティションの論理パーティションは5から始まるので有り得ない)GPTの4番め(GRUB2ではパーティションは1からカウント)のパーティションに入れていますが、問題なく起動できます。

 また、NetBSDのmenuentryでは、当初[insmod part_gpt]でモジュールを読み込んでいましたが、標準で読み込んでくれているようで他では入れなくても起動できていることもあり、コメントアウト。

 GRUB2が賢いので?むしろ、(hd0,gptX)は、(hd0,X)としても認識されるようです。

 NetBSDに限りませんが、NetBSDのブートローダーをチェーンロードすることもできます。

[追記:2016/08/09]
menuentry 'NetBSD-7.0-i386' {
    set root=(hd0,gpt2)
# この方が無難 => set root=(hd0,2)
    set isofile="/NetBSD-7.0-i386.iso"
    loopback loop $isofile
    knetbsd (loop)/i386/binary/kernel/netbsd-INSTALL.gz
}
menuentry ' ' { echo }

 NetBSDでもUSBメモリからISOブートでインストーラを起動する方法がわかりました。(たぶん、大丈夫だとは思いますが、インストールできるか否かは未確認です。)

 grubメニューでloopbackしてls (loop)/などでディレクトリを追っては、netbsdじゃないし、sysinstじゃないしと繰り返し探した結果、netbsd-INSTALL.gzに辿り着きました。

 超軽量でブートオンリーなboot.isoやboot-com.isoに含まれる/netbsdや/sysinstだと、どうもloopbackで指定することはできない模様である為、ISOブートできなかったのですが、これらが含まれる分か、容量の嵩むNetBSD-${uname -r}-${uname -m}.isoには、圧縮したカーネルも含まれ、なぜか、これならloopbackでISOブートもできました。

[追記:2016/10/29]

 (内蔵LANアダプタが時々不調な為、USB無線LANアダプタやUSB有線LANアダプタを使うノートPCで今回は、)USB有線LANアダプタを使ったからか、NetBSD 7.0.1から7.0.2へアップグレードしようと起動すると一時的にリポジトリにアクセスできない旨のメッセージが表示され、継続できなかった為、試しに[e:Utility menu]から[c:Config network]を選択してネットワーク設定(ネットワークインタフェースを選択)してみたところ、インターネットに接続でき、アップデートを完了させること(結果、ISOブートしたsysinstが機能することの確認)ができました。

[追記:2016/10/30]

 内蔵LANアダプタが機能する別のデスクトップPCでも試してみたところ同じくネットワークが自動構成されず、[e:Utility menu]から[c:Config network]を選択してネットワークを構成する必要があったのでUSB有線LANアダプタに起因するものではく、ノートPC、デスクトップPCのNetBSDで共通することと言えば、いろいろやっている内にネットワークインタフェースが複数でき、そのままにしてあり、構成する際にそれらは全てリストされるので1つじゃないから絞り込めないからか、そういえば、sysinstをディスク(内蔵HDD/SSD)においてブートしたら、やはりネットワークが構成されず、その際はUSBメモリからやり直すことにしたので、その方法でもネットワークを設定すればできるのかどうか試してみないとわかりませんが、もしかするとISOブート(直接インストーラを指定して起動したこと?)に起因する可能性もある?ちなみに今回のデスクトップPCでは、GPT形式・MBR形式両方のUSBメモリで試しましたが結果は同じでした。)

[追記:2016/11/30]

 NetBSD Liveイメージの作成にある通り、NetBSDインストール済みのLiveイメージもknetbsd /netbsdやchainloader +1で起動でき、ひと手間かければマルチブート可能であることも確認できました。

[追記:2017/01/19]

 先のNetBSD-`uname -r`-`uname -m`.isoを、ISOブートではなく、dd埋め込みにすれば、インストーラ・アップデータに加え、CLIベースのNetBSD Liveとして利用するにも十分と思われるコマンド群が含まれます。(ISOブートの場合、起動するのは、インストール用カーネルである為、同じNetBSD-`uname -r`-`uname -m`.isoでもコマンドは減る。)

OpenBSD

menuentry 'OpenBSD_5_4_install54' {
    set root=(hd0,gpt3)
# この方が無難 => set root=(hd0,3)
    set directory="/OpenBSD_5_4_install54"
    set isofile="$directory/install54.iso"
    loopback loop $isofile
    kopenbsd (loop)/5.4/i386/bsd.rd
}
menuentry ' ' { echo }

 OpenBSDは、なんとなく開くことになったISOディスクイメージ内のINSTALL.i386を一通り読んだ結果、FreeBSDやNetBSDと違ってISOディスクイメージをloopbackする方法でインストーラ/アップデータ用カーネルを直接読み込めばよさそうだと思え、やってみたところ、あっさりできました。

 INSTALL.i386の内容のほとんどは、ほかでも共通するような内容ですが、OpenBSDがここまでユーザーフレンドリーだったとは!と驚きの余り、ついつい読破してしまいました。

 OpenBSDのカーネルbsd+baseで最小限の構成が一通り含まれるISOは、当該パーティション内にOpenBSD用(ISO用で他と一緒でもよい)のディレクトリを用意した上、単にファイルとしてISOディスクイメージをそこにコピー、loopbackし、GRUB2が持つ[kopenbsd]にOpenBSD用のインストール/アップグレード用カーネルである[bsd.rd]を指定するだけで簡単に起動(ISOブート)でき、同一パーティション内にある他のOSやツールともOpenBSDをUSBメモリ/GRUB2/GPTでマルチブートすることができました。

 この指定で起動すると[(I)nstall]/[(U)pgrade]/[(S)hell](でi/u/s)を選択するshellベースの対話式メニューが起動します。

 ちなみにOpenBSDには、約7MBという極小ブートISOもありますが、install54でもFreeBSDと変わらない容量だったこと、そこまで極小でなくてもいいかと思い後者を選びました。

 インストールして運用する場合などパーティションに埋め込む場合には、先のFreeBSDやNetBSDのケース同様、kopenbsdでカーネルを呼べばよいでしょう。

 尚、FreeBSDやNetBSDでも試しにOpenBSDのようなISOブートもやってみましたが、起動できず、やはり、専用パーティションが必要なようです。

[追記:2016/08/09]
 NetBSDのインストーラは前述のようにISOブートする方法もあることがわかりました。

備考

 *BSDにおいてパーティション埋め込みでGRUB2を使う場合には、Live USBに仕込んだインストーラーでもHDDなどにインストールした*BSDでも同じ(メニューの記述)方法でOKです。

 ちなみにmenuentry ' ' { echo }は、とりあえず空行を入れたくてなんとなく書いてみたら期待通りでしたが、他にちゃんとしたやり方があるのかどうかは調べてません。

ウェブ造ホーム前へ次へ