1
06
2008
Intel Mac で Solaris : その7 Solaris on GPT
GPT でSolaris を動かすための試行錯誤
MBR形式でのSolaris のマルチブートはそれなりに実現できましたが、やはり Mac OS X を MBR 形式のディスク構成で動かすのは不安があります.現行では GPT の ”EFI System Partition” が存在しなくても特に支障は無いようですが、今後の互換性やEFI対応OSが増えてくる事を考えるとやはりGPT形式でマルチブート環境を作りたいですね.
Apple の GPT に関するテクニカルノート( Technical Note TN2166 : Secrets of the GPT )には、Mac OS X でのGPTに関する仕様(要求)が書かれています.これによると、
・Intel Mac ではGPT, APM( Apple Partition Map ) でブート可能であるが、Appleがサポートするのは
GPTのみである.
( => MBR形式でもブート可能です )
・AppleのGUIベースのツール(インストーラーのような)は GPT 以外のディスクにはインストールできない.
・Appleはディスクのサイズに応じてGPT形式のパーティションマップを使い分けている.
tiny ( size < 1GB ), small ( 1GB <= size < 2GB ), big ( 2GB <= size )
・全てのパーティションは 4KB バウンダリーで配置される.
・big disk では常に200MBの “EFI System Partition(ESP)” を第1パーティションに置く.
各々のパーティションの後ろには128MBの空き領域を設ける.(ESPを除く)
( => 実際には HFS 以外の場合は空き領域は作成されないようです )
・“EFI System Partition(ESP)” はブート時のデバイスドライバをロードできるようにするためのものである.
Macintosh の EFI ファームウェアは “EFI System Partition(ESP)” をフルサポートしているが、現時点では
この機能を使用してはいない.
・全てのGPTディスクは Protective MBR で始まり、その中にGPTの構造とパーティションで使用される全ての
領域をカバーする1つのパーティションエントリーを含む.
(GPTに対応していないプログラムが間違ってこのGPT領域を書き換えないようにするため)
・GPTに対応したプログラムは、ブロック#1 と最終ブロックにあるGPTヘッダでGPTディスクを認識し、更に
ブロック#0 のProtective MBR の構造をチェックするようにする.
2つ以上のパーティションエントリーが有る場合や、1個のパーティションエントリーでもタイプが0xEEでない
場合は適切なGPTディスクではないので、ディスクの操作を拒否すべきである.
(この記述は、BootCampやマルチパーティション環境では矛盾していますが、恐らく原文はBootCamp発表
以前に書かれたのかもしれません.でもこのTN 自体2006年11月の掲載になっているけど...? )
GPTディスクにSolaris をインストールしてみる
Solaris のインストーラーはMBR形式のディスクは問題なくパーティションを認識してくれるようですが、GPT形式ではパーティションを誤認識してしまうようです.GPTディスクのパーティション構造を色々変えてみて、Solarisのインストーラがどのように認識するのか試してみました.ある特定の条件下では、GPTのままでもインストーラがきちんと認識するようですが、インストールそのものは失敗してしまいます.エラーの原因についてはまだよく分かりませんが、インストーラ自体にもバグがあるのかもしれません.
GPT環境でSolarisのインストールを行った例として、Paul Mitchellさんのブログ に記事が載っています.
( “How to Dual Partition a MacBook Pro with MacOS and Solaris” )
Paul Mitchellさんの手順を要約すると、
・ diskutil コマンドの ResizeVolume や BootCamp アシスタントを使って、Mac OS X の領域を縮小し、
ディスクの後方に、FAT32 のパーティションを作成する.
・ “fdisk” コマンドで “EFI System Partition” のパーティションIDを HFS+(0xAF) に変更する(見せ掛ける).
・Solaris のインストーラを起動し、シェルのコマンドラインで、Solarisの”fdisk” コマンドを用いて、
FAT32 パーティションを一旦削除し、新たに “Solaris2” (0xBF) パーティションを作成する.
このとき小細工をして、Mac OS X 用のHFS+ 領域の後ろにちょっと大きめの空き領域を作っている.
・Solaris のインストーラーのバグを回避するために、”fdisk” コマンドに小細工を施す.
・Solaris のインストール後、rEFIt を用いて Solaris をブートする.
となります.
この手順を参考に、私も色々と試行してみましたが、必ずしもこの手順に従わなくてもインストールそのものはクリアできました.但し、インストール(並びにSolarisの起動)自体は上手くできたものの、肝心のパーティションが必ずMBR 形式に変更されてしまいます.これはインストーラが内部で、”fdisk” コマンドを使ってパーティションニング(スライスの作成)を行っているのですが、困ったことにこの”fdisk” コマンドは全くGPTに対応していません.それどころか、Protective MBR の 最初のエントリーで保護されているはずの、GPTヘッダーやGPTテーブルエントリーそのものを壊してしまっています.このため、GPT 形式としては認識されず、MBR形式として扱われることになります.
Paul Mitchellさんのブログには書かれていませんが、恐らく Paul さんもSolarisのインストール後はMBR形式になっている筈です.
実験(失敗です!!!)
Solaris のインストールではMBR形式しか扱えないのであれば、先ずはGPT 形式でディスクをパーティショニングして、Solaris 用の領域を作成し、Solaris の インストール時にMBR 形式として扱い、Solaris の インストール後にまた元のGPT形式に戻してしまおうという無謀な試みを行ってみました.
前準備
予めハードディスクをGPT形式で、”EFI System Partition” 、”Leopard(HFS+)” 、”SOLARIS(Solaris1: Linux Swap)” の3つのパーティションを作成しました.ディスクの後半部分は後で好きなパーティションを追加するために空けておきました.DiskUtility を使う場合は、パーティションタイプとしてGPT形式を選び、4つのパーティションに分けて下さい.最後のパーティションを”Free Space” にしておけば、ディスクの後半部分に空き領域を作成できます.DiskUtility では Linux Swap (0x82) は作成できませんので、とりあえず ”FAT32” で作成しておき、後で iPartition2.0などのツールで Linux Swap (0x82) に変更して下さい.iPartition2.0などのツールが使える場合は最初からこれらのツールでパーティショニングをしても構いませんが、Protective MBRにきちんとパーティション構造が反映されないようなので、後で、rEFIt などのツール(gptsync)を用いてGPTのエントリーと Protective MBR のエントリーを同期させる必要があります.
sh-3.2# fdisk /dev/disk0
Disk: /dev/disk0 geometry: 12161/255/63 [195371568 sectors]
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: EE 1023 254 63 - 1023 254 63 [ 1 - 409639]
2: AF 1023 254 63 - 1023 254 63 [ 409640 - 57030480] HFS+
*3: 82 1023 254 63 - 1023 254 63 [ 57702264 - 33554432] Linux swap
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
sh-3.2# gpt -r show disk0
gpt show: disk0: Suspicious MBR at sector 0
start size index contents
0 1 MBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
409640 57030480 2 GPT part - 48465300-0000-11AA-AA11-00306543ECAC
57440120 262144
57702264 33554432 3 GPT part - 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
91256696 104114839
195371535 32 Sec GPT table
195371567 1 Sec GPT header
上記の Protective MBR の最初(#1)にある”EFI System Partition” のエントリーの “start” セクターが “1” になっていますね.本来の ”EFI System Partition” は “40” セクター目から始まるのですが、GPT非対応のアプリケーションからGPTの重要な領域を保護するために、敢えてこのように “1” セクタ目から始まっています.
後で、GPT形式に戻すため、Protective MBR、GPTヘッダ、テーブルエントリーをバックアップします.
sh-3.2# dd if=/dev/disk0 bs=512 of=MBR02.dat bs=512 count=1
dd: bs: illegal argument combination or already set
sh-3.2# dd if=/dev/disk0 bs=512 of=MBR02.dat count=1
1+0 records in
1+0 records out
512 bytes transferred in 0.001041 secs (491865 bytes/sec)
sh-3.2# dd if=/dev/disk0 bs=512 of=GPTHeaderPri02.dat count=1 iseek=1
1+0 records in
1+0 records out
512 bytes transferred in 0.001035 secs (494698 bytes/sec)
sh-3.2# dd if=/dev/disk0 bs=512 of=GPTTablePri02.dat count=32 iseek=2
32+0 records in
32+0 records out
16384 bytes transferred in 0.002316 secs (7074272 bytes/sec)
sh-3.2# dd if=/dev/disk0 bs=512 of=GPTTableSec02.dat count=32 iseek=195371535
32+0 records in
32+0 records out
16384 bytes transferred in 0.404004 secs (40554 bytes/sec)
sh-3.2# dd if=/dev/disk0 bs=512 of=GPTHeaderSec02.dat count=1 iseek=195371567
1+0 records in
1+0 records out
512 bytes transferred in 0.334491 secs (1531 bytes/sec)
Open Solaris NV-b78 のインストール
Open Solaris Express のインストールを行います.インストーラのディスクパーティションの選択ダイアログできちんとパーティションが認識されていることを確認します.上手く認識されている場合はここで一旦インストール作業を中断して下さい.もし、パーティションがきちんと認識されていない場合は、インストーラーを終了し、”fdisk” コマンドで次の操作を行って下さい.
#fdisk /dev/rdsk/c1d1 ( “c1d1” はMacBookの内蔵HDの場合の例 )
次のような対話形式のメニューが現れます(この例は、上記の設定とは別な実験を行った時のものです)
Total disk size is 12161 cylinders
Cylinder size is 16065 (512 byte) blocks
Cylinders
Partition Status Type Start End Length %
========= ====== ============ ===== === ====== ===
1 EFI 0 25 26 0
2 Other OS 25 4202 4178 34
3 Active Solaris 4219 6307 2089 17
4 Win95 FAT32 6324 8412 2089 17
SELECT ONE OF THE FOLLOWING:
1. Create a partition
2. Specify the active partition
3. Delete a partition
4. Change between Solaris and Solaris2 Partition IDs
5. Exit (update disk configuration and exit)
6. Cancel (exit without updating disk configuration)
Enter Selection:
Partition #3 の “Solaris” パーティションを “4. Change between Solaris and Solaris2 Partition IDs” で “Solaris 2” 形式に変更して下さい.”fdisk”コマンドを実行すると、この時点で MBR 形式になります.#install-solaris と入力して再度インストーラーを起動し、ディスクのパーティションが正しく認識されていることを再度確認して下さい.
ディスクのパーティションがきちんと認識されているようであれば、インストールを進めて行きますが、その前にやっておく作業があります.この作業を行わないとインストーラーが途中でエラーを起こし、インストールが上手く行きません.
コマンドラインで次の作業を行います.
#cd /sbin
#mv fdisk fdisk.org
#vi fdisk ( vi エディタが使えます)
エディタで次のシェルスクリプトを作成して下さい.(Paul Mitchellさんのブログを参照下さい)
#!/bin/sh
echo “$*” | grep -- “-F” > /dev/null
if [ $? = 1 ] ; then
/sbin/fdisk.org $*
fi
#chmod +x fdisk
これで準備は完了です.インストール作業を先に進めて下さい.
[galleria gid=”sol” bgs=”width: 600px” thumbs=”width:120px; height: 90px” ]
インストール作業が終わったら、無事Solarisが起動できることを確認します.この状態では、Solaris がハードディスクをMBR形式に強制変更した状態ですので、GPTとしては認識されません.セクタ #1 の GPTヘッダや #2〜#33 のGPTテーブルを確認して見たところ、ゼロパディングされていて完全に書き換えられてしまっています.インストーラの画面では 先頭のパーティションは “Preserved“ のはずですが、何故か書き換えられてしまっています.一般的な MBR 形式では、先頭のパーティションはトラック2から始める( 通常64セクタ目 )慣習になっているので、Solarisの “fdisk” 君は勝手にこの部分をゼロパディングしてしまうようです.
sh-3.2# diskutil list
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *93.2 Gi disk0
1: 200.0 Mi disk0s1
2: Apple_HFS Leopard 27.2 Gi disk0s2
3: 16.0 Gi disk0s3
sh-3.2# fdisk /dev/disk0
Disk: /dev/disk0 geometry: 12161/255/63 [195371568 sectors]
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: EE 1023 254 63 - 1023 254 63 [ 1 - 409639]
2: AF 1023 254 63 - 1023 254 63 [ 409640 - 57030480] HFS+
*3: BF 1023 254 63 - 1023 254 63 [ 57702264 - 33554432]
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
sh-3.2# gpt -r show disk0
gpt show: disk0: Suspicious MBR at sector 0
start size index contents
0 1 MBR
1 409639
409640 57030480 2 MBR part 175
57440120 262144
57702264 33554432 3 MBR part 191
91256696 104114872
sh-3.2#
GPT ヘッダ、テーブルを復元
Solaris のインストーラによって壊されたGPTヘッダやGPTテーブルを復元します.このときSolaris インストール前とインストール後とで、各パーティションのロケーションが変わっていないことを確認します.
sh-3.2# diskutil unmountDisk /dev/disk0
Unmount of all volumes on disk0 was successful
sh-3.2# dd if=GPTHeaderPri02.dat of=/dev/disk0 bs=512 count=1 seek=1
1+0 records in
1+0 records out
512 bytes transferred in 0.682677 secs (750 bytes/sec)
sh-3.2# dd if=GPTTablePri02.dat of=/dev/disk0 bs=512 count=32 seek=2
32+0 records in
32+0 records out
16384 bytes transferred in 0.009856 secs (1662340 bytes/sec)
sh-3.2# dd if=GPTTableSec02.dat of=/dev/disk0 bs=512 count=32 seek=195371535
32+0 records in
32+0 records out
16384 bytes transferred in 0.428162 secs (38266 bytes/sec)
sh-3.2# dd if=GPTHeaderSec02.dat of=/dev/disk0 bs=512 count=1 seek=195371567
1+0 records in
1+0 records out
512 bytes transferred in 0.394092 secs (1299 bytes/sec)
sh-3.2# gpt -r show disk0
gpt show: disk0: Suspicious MBR at sector 0
start size index contents
0 1 MBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
409640 57030480 2 GPT part - 48465300-0000-11AA-AA11-00306543ECAC
57440120 262144
57702264 33554432 3 GPT part - 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
91256696 104114839
195371535 32 Sec GPT table
195371567 1 Sec GPT header
sh-3.2# fdisk /dev/disk0
Disk: /dev/disk0 geometry: 12161/255/63 [195371568 sectors]
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: EE 1023 254 63 - 1023 254 63 [ 1 - 409639]
2: AF 1023 254 63 - 1023 254 63 [ 409640 - 57030480] HFS+
*3: BF 1023 254 63 - 1023 254 63 [ 57702264 - 33554432]
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
sh-3.2# diskutil list disk0
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *93.2 Gi disk0
DiskManagement setuid-tool failure
sh-3.2#
GPTヘッダとテーブルを復元しましたが、GPT のエントリーでは #3 のパーティションは “Linux Swap(0x82)” のままです.Protective MBR のエントリー のIDは 0xBF ですので、一致していません.このためエラーとなるようです.この状態ではApple純正のDiskUtility や diskutil コマンドはGPTの規約に従っていないので受け付けてくれないようです.Protective MBR のエントリーを 0x82 に変更したところ、今度は正しいGPTとして処理してくれました.
sh-3.2# diskutil list
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *93.2 Gi disk0
1: EFI 200.0 Mi disk0s1
2: Apple_HFS Leopard 27.2 Gi disk0s2
3: Linux Swap 16.0 Gi disk0s3
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *37.3 Gi disk1
1: EFI 200.0 Mi disk1s1
2: Apple_HFS ER105 20.0 Gi disk1s2
3: Apple_HFS LeopardGM 8.0 Gi disk1s3
4: Apple_HFS LeoServerGM 8.7 Gi disk1s4
sh-3.2# fdisk /dev/disk0
Disk: /dev/disk0 geometry: 12161/255/63 [195371568 sectors]
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: EE 1023 254 63 - 1023 254 63 [ 1 - 409639]
2: AF 1023 254 63 - 1023 254 63 [ 409640 - 57030480] HFS+
*3: 82 1023 254 63 - 1023 254 63 [ 57702264 - 33554432] Linux swap
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
sh-3.2# gpt -r show disk0
gpt show: disk0: Suspicious MBR at sector 0
start size index contents
0 1 MBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 409600 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
409640 57030480 2 GPT part - 48465300-0000-11AA-AA11-00306543ECAC
57440120 262144
57702264 33554432 3 GPT part - 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
91256696 104114839
195371535 32 Sec GPT table
195371567 1 Sec GPT header
失敗です
これで元の GPT 形式に戻ったので、Solaris が起動できるかどうか確認してみます.rEFIt のブートメニューからSolaris パーティションを選ぶとGRUBのブートメニューが現れました.どうやらSolaris パーティションには問題なくアクセスできるようです.ここまでは順調でしたが、この先のブートプロセスが Panic を起こしてしまい、強制的に再起動してしまいます.画面のメッセージがほんの一瞬しか表示されないので、何が原因か分からなかったのですが、メッセージの一部を写真に納めることができました.どうやらSolarisのルートファイルがマウントエラーを起こしてしまっているようです.ProtectiveMBR のエントリーを本来の 0xBF に戻してみても結果は同じでした.今のところマウントエラーの原因と対策方法が分かりません.
ルートファイルシステムのマウント失敗
残念ながら、今回の GPT パーティション形式での Solaris 稼働実験は失敗です.次は、 ZFS ファイルシステム環境で Solaris の稼働に挑戦してみようかと思います.