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

GRUB2をUSBメモリにインストール

ウェブ造ホーム前へ次へ
GRUB2をUSBメモリにインストールする方法は?

GRUB2をUSBメモリにインストール

GRUB2をUSBメモリにインストール

 今回、一部OSのLive版、もしくはその機能をも備わったものも含みますが、CentOS/Fedora/Debian/Ubuntu/FreeBSD/NetBSD/OpenBSDのインストーラ/アップデータ、更にClonezilla/GPartedといったツールをUSBメモリ上でマルチブートさせるにあたりGRUB2を使うこと、また、GRUB2専用のパーティションを用意することにしました。

 前のページで述べたようにパーティションをMBRではなくGPTでフォーマットする場合には、Linuxでは、gdiskやpartedコマンド、または、GUIツールGPartedなどを使用します。([追記:2016/10/02]LinuxのfdiskはGPTに未対応だったように思いますが、ディストロによるのか、Debian Jessieでは機能しているように見えるので近年、対応している模様、*BSD、例えば、NetBSDのfdiskコマンドはGPTに対応していない為、gptコマンド、マウントする場合などは、付随してdkctlコマンドを使います。)

 ちなみに今回の検証では、最も手軽でわかりやすいGPartedを使いました。

 尚、USBメモリにブートローダをインストールしておけば、USBメモリ自体におけるLive版OSやインストーラ・アップデータのマルチブートのみならず、何らかの事情でHDD上のブートローダが機能しなくなった場合などにも重宝します。

USBメモリのデバイスを確認

 USBメモリが割り当てられたシステム上のデバイスを確認するには、Linux/*BSDなら[ dmesg | less ]ほか[dmesg]コマンドで、また、Linuxなら[blkid]コマンドでも確認することができます。

 [blkid]コマンドは、例えば、[sudo blkid]などroot権限でのみ実行可能です。

GRUB2をUSBメモリの先頭にインストールする場合

 GRUB2をUSBメモリの先頭にインストールするには、[grub2-install](ディストロによってはGRUB2でも[grub-install])を実行します。

$ sudo grub2-install /dev/sdf
Installation finished. No error reported.
$

 USBメモリのデバイスが/dev/sdfの場合はこのようになり、[ Installation finished. No error reported. ]と表示されれば、成功です。

GRUB2をUSBメモリの特定のパーティションにインストールする場合

 USBメモリ自体の先頭ではなく、特定のパーティションにGRUB2をインストールするには、[--force]オプションと[--boot-directory]オプション付きで後者にマウントポイントを設定、最後にUSBメモリのデバイスを指定して実行します。

 よってUSBメモリに割り当てられたデバイスが/dev/sdf、GRUB2をインストールしたいパーティションが/dev/sdf2、そのマウントポイントが/mnt/usbでブートディレクトリが、その直下のbootディレクトリの場合は、次のようになります。

$ sudo mount /dev/sdf2 /mnt/usb
$ sudo mkdir /mnt/usb/boot
$ sudo grub2-install --force --boot-directory=/mnt/usb/boot /dev/sdf
...
...
Installation finished. No error reported.
$

 GRUB2の[--boot-directory]オプションは、GRUB2はデフォルトでは[/boot/grub]([/boot/grub2])を、つまり、そこにある[grub.cfg]を参照しますが、これを変更したい場合に使うものとされています。

 特定のディレクトリにGRUB2をインストールした場合、数行に渡ってWarningが出力されるかもしれませんが、最終的に[ Installation finished. No error reported. ]と表示されれば、成功です。

 ただ、結局、その後、[sudo grub2-install /dev/sdf]も実行しておかないと動かなかった気が。。。

 但し、環境によっては、[--force]オプション付きで実行しても特定パーティションへのインストールができないケースもあるようです。

 その場合は、他のUSBメモリを試してみるしかないでしょう。

 尚、誤用ではありますが、GRUB Legacyのオプションである[--root-directory]オプションをGRUB2で使っている例がインターネット上にあったりして、これでもうまくいったような気がしなくもありません。

 ただ、GRUB2の仕様上、[--root-directory]オプションは存在しない一方、より明確にマルチブートを想定したオプションとして[--boot-directory]と[--force]オプションが用意されています。

 以下参考までにGRUB LegacyとGRUB2の関連ヶ所の原文の抜粋と訳及びその解釈を掲載しておきます。

 GRUB Legacy(GNU GRUB Manual 0.97)の『16 Invoking grub-install/grub-installの実行』には、以下の一文と例が掲載されています。

16 Invoking grub-install
...
--root-directory=dir
Install GRUB images under the directory dir instead of the root directory. This option is useful when you want to install GRUB into a separate partition or a removable disk. Here is an example in which you have a separate boot partition which is mounted on /boot:
 
grub-install --root-directory=/boot hd0

 これは、

--root-directory=dir

 ルートディレクトリの代わりにディレクトリ[dir]の直下にGRUBイメージをインストール。このオプションは、分割した任意のパーティションやリムーバブルディスクにGRUBをインストールしたい場合に便利です。ここにあるのは、[/boot]上にマウントされる任意の分割済みパーティションがある場合の例です。
grub-install --root-directory=/boot hd0

という意味でしょう。

 例が紛らわしいですが、よく読むとここでいう[/boot]というのは任意のマウントポイントの例であり、ルート直下のbootディレクトリという意味ではないことがわかります。

 また、『分割した任意のパーティションやリムーバブルディスクにGRUBをインストールするのに便利なオプション』ということなのでマウントポイント[/boot]には、[/dev/sdb]や[/dev/hdc]、更にはその下のディレクトリを[mount]してもよいと解釈して良いでしょう。

 また、同じくGRUB用のデフォルトのブートエントリを設定するプログラムについて書かれた『19 Invoking grub-set-default/grub-set-defaultの実行』の中にも同じオプションがあります。

19 Invoking grub-set-default
...
--root-directory=dir
Use the directory dir instead of the root directory (i.e. /) to define the location of the default file. This is useful when you mount a disk which is used for another system.

 これは、

--root-directory=dir

 デフォルトファイルの場所を定義する為にルートディレクトリ(例 / )の代わりにディレクトリ[dir]を使用。これは、他のシステム用に使われるディスクをマウントする際に便利です。

という意味でしょう。

 ここでは、「他のシステム用に使われるディスクをマウントする場合」が想定されているので、やはり、[grub-install]に関しても[--root-directory]オプションについては、他のパーティションにインストールすることも想定されていると解釈して良いでしょう。

 一方、GRUB2(GNU GRUB Manual 2.00)の『3.1 Installing GRUB using grub-install/grub-installを使ったGRUBのインストール』には、[--boot-directory]についてGRUB Legacyの[--root-directory]と同じ説明がなされ、追加でUSBドライブを上手く認識できないBIOS向けの説明もなされています。

 また、同じく『5.3 Multi-boot manual config/マルチブートの手作業による構成』には、

5.3 Multi-boot manual config
 
Currently autogenerating config files for multi-boot environments depends on os-prober and has several shortcomings. While fixing it is scheduled for the next release, meanwhile you can make use of the power of GRUB syntax and do it yourself. A possible configuration is detailed here, feel free to adjust to your needs.
First create a separate GRUB partition, big enough to hold GRUB. Some of the following entries show how to load OS installer images from this same partition, for that you obviously need to make the partition large enough to hold those images as well. Mount this partition on/mnt/boot and disable GRUB in all OSes and manually install self-compiled latest GRUB with:
 
    grub-install --boot-directory=/mnt/boot /dev/sda
 
In all the OSes install GRUB tools but disable installing GRUB in bootsector, so you'll have menu.lst and grub.cfg available for use. Also disable os-prober use by setting:
 
    GRUB_DISABLE_OS_PROBER=true
 
in /etc/default/grub
...

とあり、これは、

--root-directory=dir

 現在、マルチブートにおいて自動生成される一連の構成ファイルは、[os-prober]に依存し、いくつかの短所が存在します。

 これらは、次回のリリースで改善されるべくスケジュールに入っていますが、その間、GRUBの機能を使って利用者自身が、自分で作成することはできます。

 使用可能な構成は、ここで詳述しますので自身の必要に応じて自由にやってみて下さい。

 まずは、GRUBを保持するに足る十分な大きさのGRUBパーティションを分割、作成します。

 次に挙げるいくつかのエントリは、同一のパーティションからOSのインストーライメージを読み込む方法について示しますが、当然ながら、それらのイメージ全てを保持するに十分なパーティションを作成する必要があることは言うまでもありません。

 [/mnt/boot]上にこのパーティションをマウントし、全てのOS(のインストーライメージ)にあるGRUBを無効にし、次のコマンドを使ってセルフコンパイルした最新のGRUBを手動でインストールします。

    grub-install --boot-directory=/mnt/boot /dev/sda

 全てのOSについてGRUBツールをインストールしますが、ブートセクタにインストール済みのGRUBだけは無効にすることで[menu.lst]や[grub.cfg]を使うことができるようになるでしょう。

 また、以下の設定をすることによって[os-prober]を無効にします。

GRUB_DISABLE_OS_PROBER=true
...

という意味でしょう。

 この後にWindowsやFreeBSDなどの設定方法が記されています。

 また、[--force]オプションとの兼ね合いについては、[info grub2]や[info grub2-install]にも先の「問題のあるBIOSにおける対策」としての[grub-install/grub2-install]との併用例はあるものの、もう少し補足が欲しいところ。。。というわけで[grub2-install -h]でヘルプを表示すると

$ grub2-install -h
 
...
--force    install even if problems are detected
...

とあり、これは、

...
--force    問題が検出された場合でさえインストール
...

という意味でしょうから「強制」の為のオプションであり、しかも「インストール」時に使われるという意味と解釈してよいでしょう。

 こうしたことからもGRUB2では、明白にマルチブートが想定されていますし、『28 Invoking grub-install/grub-isntallを実行する』にも例示されていますが、[--boot-directory]オプションで他のパーティションやその階層下をマウントして指定することも当然ながら想定済みであることから特定のパーティションへのGRUB2のインストールも想定されており、更に何か問題があった場合でもインストールする為にある[--force]オプションは、[grub-install/grub2-install]との併用もアリと解釈して良いでしょう。

 それに(次回改訂されて改善される予定だけど今は例を参考にしつつ)「 feel free to adjust to your needs/自身の必要に応じて自由にやってみて」(できればできるってことだし、できなきゃできないってことだから。。。)とありますしね。

ウェブ造ホーム前へ次へ