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 が起動します。


0 件のコメント:

コメントを投稿