Carpe Diem

備忘録。https://github.com/jun06t

マルチブート(2段階ブート)の設定

GRUBWindowsブートローダは基本そのOS内に存在するため、ブートローダを所持するOSに何らか不具合があったり、再インストール等するときに面倒なことになりがちです。 そこでブートローダを独立して使用する方法が「2段階ブート」と呼ばれる手法です。 これにはMBRとPBRの知識が必要なのでまずはそこから MBR(マスターブートレコード) ハードディスクドライブの先頭セクタ(セクタって言葉は「場所」って意味だと思えば良いかと)のこと。 OSをインストールしたときに自動的にインストールされます。 MBRは次項で説明するPBRを呼び出すことができます。 基本的にMBRは一つしかハードディスクに無いものと思ってください。 ・PBR(パーティションブートレコード) これはパーティションの先頭に作られるブートセクタ。 MBRと違ってOSの数だけ存在し、パーティションにインストールされます。 このPBRを経てOSが起動するわけです。 Linux以外は恐らく全部PBRが作られますが、Linuxもインストール時またはOS上でファイルをいじってPBRを作れます。インストール時に「拡張」や「高度な設定」で設定できます。 というわけで2段階というのは MBR→OS から MBR→PBR→OS にしようというわけです。これによってMBRが独立しているためOSの追加、削除がしやすい ・WindowsLinuxではインストールは容易だが、LinuxWindowsの順だと困難であった問題を解決 というメリットがあります。特に個人的に後者が嬉しいです。 今回の環境 /dev/sda1・・・Windows7 /dev/sda5・・・Ubuntu10.04 /dev/sda7・・・Ubuntu11.04 です。GRUBはUbuntu11.04のものを使用。つまりMBRはUbuntu11.04のGRUB 今回の設定の順番としてはLinuxGRUB設定をMBRからPBRへ移植 ②GRUBのアップデート時にMBRが更新される設定を、MBRからPBRへ変更 ③MBMをMBRへインストール となります。またこれを実装する前に以下の解説サイトで今回行うことの詳細を確認したほうがいいです。慣れた人ならGRUBが死んだりカーネルパニックになっても対応できますが、そうでない場合はきちんと把握した上で行なってください。 Tips: grub2とgrub1の扱い方(様々な再セットアップ方法等) 単純なgrub2(grub ver. 1.97以降)のPBRへの(再)セットアップ Debian系でgrub2のgrub-pcパッケージが正しく更新される為に確認しておくべきこと MBMをLinux上でインストール可能にするパッケージ では順に LinuxGRUB設定をPBRへ移植 # grub-setup -f /dev/sda7 grub-setup: warn: Attempting to install GRUB to a partitionless disk or to a partition. This is a BAD idea.. grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged.. # echo $? 0 GRUBのアップデート時にMBRが更新される設定を、MBRからPBRへ変更 これはカーネルの更新時などでGRUBがアップデートする際に、そのままの設定ではMBRの更新となり不具合が生じます。なのでアップデートした時PBRが更新されるようにします。 ファイルはこちらからダウンロードしてください。 # chmod +x update_debconf_grub-pc_install_devices.sh # sh update_debconf_grub-pc_install_devices.sh target_device: /dev/sda7 target_device_uuid: The debconf database will be updated. Proceed? yes or no [n] yes Updated successfully. ◆MBMをMBRへインストール 2通りあります。一つは本家からのデータをISOイメージに変換してCDやらUSBやらで起動時にロードさせインストールする方法 もう一つは解説サイトで配布しているインストーラを使用してインストールする方法です。 Linuxを既にインストールしている場合は後者のほうが楽なのでそちらを使用します。 こちらからファイルをダウンロードしてください。 # tar xzvf mbm-0.390-for-Linux-install-pack # cd mbm-0.390-for-Linux-install-pack/ # ./install.sh + mkdir -p /usr/local/share/mbm + mkdir -p /usr/local/sbin + install -m 444 binary/0.39-md5sum.txt binary/mbm1.bin binary/mbm2.bin /usr/local/share/mbm + install -m 554 shell-script/install-mbm /usr/local/sbin # install-mbm /dev/sda ...... デバイス ブート 始点 終点 ブロック Id システム /dev/sda1 2048 62916607 31457280 7 HPFS/NTFS/exFAT ..... /dev/sda7 * 62916608 94373887 15728640 83 Linux MBM (Multiple Boot Manager) 0.39 will be installed on /dev/sda Proceed? yes or no [n] y Installing... ...... 以上で設定は完了です。 再起動すると 最初のメニューに 1. HPFS/NTFS/ ←Windows7ブートローダ 2. HPFS/NTFS/ ←WIndows7の中身 3. HPFS/NTFS/ ←WIndows7の中身 4. +DOS Extend ←Extendでインストールした部分。 5. Diskette と出ます。私の場合Ubuntu はExtendでパーティション分けしてその後ext4でインストしたのでまとめられてます。 4. +DOS Extend でを押すと展開され 4. -DOS Extend 5.  Linux ext2fs 6.  Solaris/Linux swap 7.  Linux ext2fs 8. Diskette となります。使用するキーは主に F1・・・ヘルプの表示 F4・・・詳細な説明 SP・・・デフォルトドライブの設定 です。Windowsをインストールするパーティションはアクティブにするなどの設定が必要ですが、それもこの設定画面でできます。 選択後、次にLinux等のPBRの選択画面が表示されると思います。Windowsならそのまま起動すると思います。 またGRUB設定をMBRからPBRへ移植しましたが、以前の設定で別パーティションのOSがGRUBに残っていればPBRでも起動できます。それを元にまた別パーティションGRUB設定をPBRへ移植すればいいと思います。 ◆体験談 私が行ったのは ①Ubuntu11.04のGRUBをPBR(sda7)へ ②MBMをMBRにインストール ③Ubuntu11.04のGRUB(PBR)からUbuntu10.04に入って、Ubuntu10.04のGRUBをPBR(sda5)へ ④MBRからUbuntu10.04(PBR)へ入り、Ubuntu10.04でGRUBを更新して、GRUB設定がMBRでなくPBRで更新されることを確認 です。すべて問題なく出来ました。 特に④は複数パーティションでそれぞれGRUBがある場合どちらを使うか選択画面が出るのですが、今回はきちんと分けているおかげか出ませんでした。 ソース: Tips: マルチブートするなら2段階ブート方式に統一しよう マルチブート(デュアルブート)環境の構築 [LinuxMint12]GRUB2をPBRに再セットアップ、MBMによる2段階ブートにしました mbm を使ってマルチブートさせよう。 ◆update_debconf_grub-pc_install_devices.shのソース 一応ですがなくなってしまうと困るので


#!/bin/bash -e

export LANG=C

echon() {
	printf "%s" "$@"
}
yesno()
{
	msg="$1"
	def="$2"
	while true ; do
	echon "$msg"
	read answer
	if [ "$answer" ] ; then
		case "$answer" in
		y|Y|yes|YES)
			return 0
			;;
		n|N|no|NO)
			return 1
			;;
		*)
			echo " "
			echo "Error: Invalid response, expected \"yes\" or \"no\"."
			continue
			;;
		esac
	else
		return $def
	fi
	done
}

usage()
{
echo "usage: $0 [OPTION]"
echo
echo "    -d target_device    specify target partition by device file name"
echo "    -u uuid(preferred)  specify UUID directly"
echo "    -v                  get current value"
echo "    -h                  print this message and exit"
echo
exit
}

exec_db()
{
tempfile=$(mktemp)
chmod +x "${tempfile}"
cat>${tempfile}<