ラベル Grub の投稿を表示しています。 すべての投稿を表示
ラベル Grub の投稿を表示しています。 すべての投稿を表示

2015年8月25日火曜日

USB メモリが挿入されている場合のみ GRUB のデフォルトで Windows を起動

私のノート PC は Ubuntu と Windows のデュアルブート環境にしており、PC 立ち上げ時は GRUB の画面で Ubuntu と Windows を選ぶメニューが出ます。

この状態で何もしないでいると、タイムアウトしてデフォルトの Ubuntu が起動します。

今回は特別に準備した USB メモリが PC に挿入されている場合のみデフォルトを Windows に変更して、タイムアウトすると Windows が起動するようにします。

なお、USB メモリを挿入していない場合はデフォルトが Ubuntu のままなので、タイムアウトすると Ubuntu が起動します。


環境
Ubuntu 14.04 Desktop 日本語 Remix

実現方法

/boot/grub/grub.cfg の中で set default="0" となっており、私の環境では 0 は Ubuntu に対応しているのでタイムアウト時に起動する OS は Ubuntu となります。

USB メモリに SetGrubDefault という名前のファイルを配置し、GRUB 起動時にこのファイルが USB メモリに存在する場合はファイルの中身の set default="2" を実行します。

私の環境では 2 は Windows に対応しているので、結果としてタイムアウトすると Windows が起動します。


USB メモリを準備

今回は USB メモリからブートするわけではないので、ブータブルな状態になっていない (USB メモリの MBR にブート情報が書き込まれていない) USB メモリを準備します。

USB メモリにパーティション作成

こんな感じになりました。

$ sudo fdisk /dev/sdb -l
... snip ...
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     3854335     1926144    c  W95 FAT32 (LBA)

USB メモリをフォーマット

デバイス名 /dev/sdb1 は環境によって異なります。

間違って指定すると別のデバイスのデータを消してしまうので注意して下さい。

$ sudo mkfs.vfat -v -c -F 32 /dev/sdb1

USB メモリを一度抜いてから再度挿すと以下のようにマウントされました。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
... snip ...
/dev/sdb1       1.9G  4.0K  1.9G   1% /media/user/XXXX-XXXX

USB メモリに以下のファイルを設置

$ cat /media/user/XXXX-XXXX/SetGrubDefault
set default="2"

GRUB の設定を変更

/etc/grub.d/00_header を以下のように変更

$ diff -u /tmp/00_header.org /etc/grub.d/00_header
--- /tmp/00_header.org      2015-06-26 20:16:41.000000000 +0900
+++ /etc/grub.d/00_header   2015-08-25 18:27:12.284123048 +0900
@@ -75,6 +75,14 @@
 fi
 EOF
 fi
+
+cat <<EOF
+
+if [ -f (hd0,1)/SetGrubDefault ]; then
+  source (hd0,1)/SetGrubDefault
+fi
+EOF
+
 cat <<EOF

 if [ x"\${feature_menuentry_id}" = xy ]; then
  • 私の環境では GRUB で USB メモリを hd0 と認識するので (hd0,1) としています。

/boot/grub/grub.cfg に反映

$ sudo update-grub

以降は上で用意した USB メモリを挿入して PC を立ち上げるとデフォルトで Windows が起動し、USB メモリが挿入されていない場合はデフォルトで Ubuntu が起動します。


2013年1月13日日曜日

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

USB メモリに GRUB をインストールして、この USB で HDD の Ubuntu を起動します。

まずフォーマットした空の USB メモリを PC に挿します。
$ df -h
Filesystem              Size  Used Avail Use% Mounted on
... snip ...
/dev/sdb1               1.9G  4.0K  1.9G   1% /media/user/2C26-C853
マウントポイントは /media/user/2C26-C853、
USB メモリのパーティションのデバイスファイルが /dev/sdb1 なので
USB メモリ自体のデバイスファイルは /dev/sdb です。

マウントポイントとデバイスファイルを指定して GRUB をインストール
$ sudo grub-install --root-directory=/media/user/2C26-C853 /dev/sdb

これで USB メモリに GRUB をインストールできました。

USB メモリから Boot するとインストールした GRUB が起動します。
設定ファイルを用意していないのでいきなりプロンプトが表示されます。
grub> 
この状態で私の PC の場合は以下のようになってました。
Device実際の装置パーティション構成
hd0USB メモリ... 省略 ...
hd1内蔵 HDD
PartitionOS
1Winodws リカバリ用
2Windows リカバリ用
3Windows
5Ubuntu Swap
6Ubuntu /
7Ubuntu /boot
Ubuntu インストール時の GRUB は hd1 の Partition7 を指定しています。

このような構成の場合に Ubuntu を USB メモリの GRUB で起動する方法はいくつかあります。

起動方法その1

USB メモリの GRUB から hd1, Partition7 の grub.cfg を読み込んで Ubuntu を起動
grub> configfile (hd1,7)/grub/grub.cfg
grub.cfg に設定されているメニューが表示されるので Ubuntu を選択して起動します。

起動方法その2

hd1, Partition7 の GRUB をチェーンロード
grub> chainloader (hd1,7)+1
grub> boot
hd1, Partition7 の GRUB が呼び出され、その GRUB により Ubuntu を起動します。

起動方法その3

hd1, Pargition7 の kernel を読み込んで直接起動
grub> root=(hd1,7)
grub> linux /vmlinuz-3.5.0-21-generc ro root=/dev/sda7
grub> initrd /initrd.img-3.5.0-21-generic
grub> boot

なお、環境によっていろいろ異なるものがあるので
このとおりやってもうまくいかない場合も多いとは思いますが
これを参考にしてやってみて下さい。