利尻山(鴛泊 夕日ヶ丘展望台)


Date/Time: 2018:05:27 17:41:54
Camera: RICOH
Model: GR DIGITAL 4
Exporsure Time: 1/400
FNumber: 4.5
Aperture Value: 4.3
Focal Length: 6.0

Close

y2blog » Intel Mac で Solaris : その7 Solaris on GPT

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 に戻してみても結果は同じでした.今のところマウントエラーの原因と対策方法が分かりません.

Mount Error
ルートファイルシステムのマウント失敗

残念ながら、今回の GPT パーティション形式での Solaris 稼働実験は失敗です.次は、 ZFS ファイルシステム環境で Solaris の稼働に挑戦してみようかと思います.