1(1)/7373 更新:2015/10/17

←NTFSファイル書き込み(Mavericks/Yosemite/El Capitan編)


以下の話はOpen Firmwareを採用した最近のMacでのみ有効です。

注意このページの内容については、何ら動作を保証するものではありません。使用するときは個人の責任でお願いします。

簡単システム切替

ハードディスクを2台以上繋いでいたり、ハードディスクのパーティションを複数切ったりして、(バックアップのためなどで)複数のシステムを入れている人も多いと思います。そんな場合、通常、システムを切り替えるのに「起動ディスクコントロールパネル」(OS X の場合はシステム環境設定の起動ディスク)を使います。

でも、結構その方法は不便です。例えば、電源を入れた時に普段と違うシステムを立ち上げたいとか、システムが壊れたので別のシステムから一旦立ち上げたいとか、Linux等のMacOSでないシステムを直接立ち上げたいとか、OS 9とOS Xを立ち上げ時の気分で決めたいとか、いちいち起動ディスクコントロールパネルを使うのは面倒(^_^;)だとか...

立ち上げ時に"c"キーを押したままにしておくと、CD-ROMから立ち上がることを知っている人も多いと思いますが、それと同じような方法(特定のキーを起動時に押しておく)でいろいろなシステムを切り替えて立ち上がるようにしてしまおうということです。
それには、Open Firmwareについて、ちょっと知っておく必要があります。

Open Firmwareとは?

Open Firmwareというのは(私も詳しいわけではありませんが^_^;)、システムブートの方法やデバイスツリー(入出力機器の構成)の管理などをプラットフォームに依存せず実現しようというものです。CHRPということばを聞いたことがある人もいるかと思いますが、まぁ、そういう話が盛んだった時代の遺産ともいえます。

さて、最近のMac(いつの頃からか正確には知らないのですが、G3の頃からでしょうか?)では従来のBoot ROMに代わりOpen FirmwareによってMacOSの起動を行っています。

従来のROMにはToolBoxと呼ばれるMacOSの機能を呼び出すためのプログラムも含まれていたのですが、Open FirmwareにはToolBoxは含まれていません。
では従来のToolBoxはどこに行ってしまったかと言うと、どうやらシステムフォルダ内の"Mac OS ROM"ファイルの中にあるようです。

Macが起きる時

Mac起動時には以下の処理が行われています。

  1. POST(Power-on Self Test)コードの実行
  2. Open Firmwareイニシャライズ(デバイスツリーの構築等を含む)
  3. "bootinfo"ファイルのロードと実行
  4. ToolBox ROM Imageへ制御を渡し、MacOSを起動

上記シーケンスの中で特に重要なのは3.のところです。

"bootinfo"ファイルとは?

でも、「MacOS関係のファイル中に"bootinfo"などという名前のファイルはないぞ!」と思われるかも知れません。
ではどこにあるのでしょうか?
実は"Mac OS ROM"ファイルの中に入っているのでした。

Mac OS ROMファイルのデータフォークの中をバイナリエディタ等で覗いてみると、"<CHRP-BOOT>..."で始まるテキストが並んでいるのがわかると思います。これがbootinfoの正体です。

次に、ではどうやってMac OS ROMがbootinfoだと認識しているのでしょうか?
ここでちょっとOpen Firmwareの話に戻ります。

Open Firmwareに入る

Mac OSを起動する前にはOpen Firmwareが動いているわけですが、通常この部分は瞬間的に通り抜けるので、ほとんど気付くこともありません。でも、電源投入時(や再起動時)に Option-Command(Appleマーク)-O-F のキーを押したままにしておくと、以下のようなメッセージを画面に表示し、Open Firmwareのコマンド入力ライン上で停止します。

Apple PowerMac1,1 1.1f4 BootROM built on 04/09/99 at 13:57:32
Copyright 1994-1999 Apple Computer, Inc.
All Right Reserved.

OpenFirmware 3.1.1

To continue booting, type "mac-boot" and press return.
To shut down, type "shut-down" and press return.

 ok
0 > _

この状態でキーボードからprintenvと入力し、returnキーを押してみて下さい。すると、次のように表示されると思います。

0 > printenv
-------------- Partition: common -------- Signature: 0x70 -------------
little-endian?          false                false
    :
    :
boot-device             hd:,\\:tbxi          hd:,\\:tbxi
    :
boot-command            mac-boot             mac-boot
    :
    :
More [<space>,<cr>,q]?

Webブラウザによっては、上記の表示の中で円サイン(¥)に見えるところがあると思いますが、実際にはバックスラッシュ(\)です。また、上記が表示されている時に"q"キーを押すと、コマンドプロンプト(0 >)の表示状態になります。

この中で重要なのはboot-deviceのところです。上の例では"hd:,\\:tbxi"となっていますが、起動ディスクコントロールパネルを使って起動するOSを切り替えたことがある人なら、"/pci.../@0:7,\\:tbxi"のような長ったらしい名前になっているかも知れません。いずれにしても最後は"\\:tbxi"で終っていると思います。で、これがMac OS ROMを意味し、このあとOpen Firmwareを抜けると、Mac OS ROMを起動することになります。この設定をしっかり覚えておいて下さい。

"tbxi"というのはMac OS ROMのTypeで、ResEditなどを使ってMac OS ROMのファイル情報を見てみるとTypeがtbxiになっているのがわかると思います。

ちなみにMac OS ROMのCreatorはchrpです(^_^;

ですから"\\:tbxi"というのは"\システムフォルダ\Mac OS ROM:tbxi"の短縮型と考えれば良いと思います。

そして、"hd:"や"/pci.../@0:7"というのはMac OS ROMのあるデバイス名ということになります。"hd:"というのは、"/pci.../@0"といった名前の省略形で、devaliasと入力してreturnキーを押すと、どのような省略形が使えるかがわかります。

0 > devalias
pci              /pci
    :
    :
cd               /pci/@d/mac-io/ata-3@20000/disk@0
    :
hd               /pci/@d/pci-ata@1/ata-4@0/disk@0
ultra0           /pci/@d/pci-ata@1/ata-4@0/disk@0
ultra1           /pci/@d/pci-ata@1/ata-4@0/disk@1
    :
 ok
0 > _

普通、hdというのがデフォールトのシステムディスク、cdというのがCD-ROMに割り当てられていると思います。それ以外はハードによって違うと思いますので、自分で確かめるようにして下さい。上の例は私のPowerMac G3 B/W (rev.1)の場合です。

ここで一旦Open Firmwareを抜けて、Mac OSを起動するため、mac-boot(あるいはbootまたはbye)と入力してreturnキーを押します。

0 > mac-boot

bootinfo.txtファイルを作ろう

さて、いよいよ核心に迫ってきました。ここで、Mac OS ROMの代わりを勤めるbootinfo.txtファイルを作成します。作成には適当なエディタを使って普通のテキストファイルとして作ってもらって構いません。内容は次のようなものです。

<CHRP-BOOT>
<COMPATIBLE>
iMac,1 PowerMac1,1 PowerBook1,1 PowerMac2,1 PowerMac2,2 PowerMac3,1 PowerMac3,2 PowerMac3,3 PowerMac5,1 PowerBook2,1 PowerBook2,2 PowerBook3,1 PowerBook3,2
</COMPATIBLE>
<DESCRIPTION>
Yan's Boot Loader
</DESCRIPTION>
<BOOT-SCRIPT>
" m : Mac OS 9.x"(0d 0a)" fb8-write drop
" x : Mac OS X"(0d 0a)" fb8-write drop
" d : Darwin"(0d 0a)" fb8-write drop
" b : Mac OS 9.x (backup)"(0d 0a)" fb8-write drop
" l : Vine Linux"(0d 0a)" fb8-write drop
" c : Mac OS CD-ROM"(0d 0a)" fb8-write drop
" o : Open Firmware"(0d 0a)" fb8-write drop
" none : Mac OS X (default)"(0d 0a)" fb8-write drop
" Now Loading... " fb8-write drop
dev keyboard
0 d# 70 0 do
  get-key-map L@
  case
    00008000 of ( key is "m")
      " Mac OS 9.x..."(0d 0a)" fb8-write 2drop
      " hd:7,\\:tbxi" $boot endof
    00000010 of ( key is "x")
      " Mac OS X..."(0d 0a)" fb8-write 2drop
      " hd:3,\System\Library\CoreServices\BootX" $boot endof
    01000000 of ( key is "d")
      " Darwin..."(0d 0a)" fb8-write 2drop
      " ultra1:7,\System\Library\CoreServices\BootX" $boot endof
    04000000 of ( key is "b")
      " Mac OS 9.x (backup)..."(0d 0a)" fb8-write 2drop
      " ultra1:9,\System%20Folder\Mac%20OS%20ROM" $boot endof
    00010000 of ( key is "l")
      " Vine Linux..."(0d 0a)" fb8-write 2drop
      " ultra1:10,yaboot" $boot endof
    02000000 of ( key is "c")
      " Mac OS CD-ROM..."(0d 0a)" fb8-write 2drop
      " cd:,\\:tbxi" $boot endof
    00002000 of ( key is "o")
      drop 1
      leave endof
  endcase
  d# 100 ms
loop
0 = if ( Timeout)
  " Mac OS X..."(0d 0a)" fb8-write drop
  " hd:3,\System\Library\CoreServices\BootX" $boot
then
device-end
</BOOT-SCRIPT>
</CHRP-BOOT>

少し解説します。

まず、<CHRP-BOOT>と</CHRP-BOOT>ですが、お約束のようなものですから、この通り入力して下さい。また<DESCRIPTION>と</DESCRIPTION>で囲まれた部分は動作できる機種を現したもので、これもこのまま入力して動く場合が多いと思いますが、最近の機種では変わっているかも知れませんので、心配なら、Open Firmwareに入った時に表示される機種名を追加しておけば良いでしょう。<DESCRIPTION>と</DESCRIPTION>で囲まれた部分はこのコマンドファイルの説明ですから、まぁ、適当に入力して下さい。

肝心なのは、<BOOT-SCRIPT>と</BOOT-SCRIPT>に囲まれた部分で、ここにOpen Firmwareに与えるコマンドスクリプトを書くことになります。

最初の9行はコメントで、ダブルクォート(")で囲まれた部分がモニタに表示されます。ただし、"(od oa) は改行を示します。

次の行(dev keyboard)はキーボードデバイスを使用することを表し、その3行先のget-key-mapで、キーマップテーブルのアドレス(仮にKeyAdrとします)をスタックにセットします。

次のget-msecsで起動からの経過時間をmsec単位で取得し、7000を加算(d# 7000 +)し、コピーして(dup)スタックに積んでいます。

えー...、何を言っているのかさっぱりわからない人もいるかも知れませんが、そのような時はこの行はそのままコピーしてもらって構いません(^_^;。その際注意してほしいのは、ダブルクォート(")で囲まれた文字列の先頭には必ず空白( )が存在しなければならないということです。
Open Firmwareに与えるコマンドスクリプトはFORTHという言語が使われるのですが、FORTHにとってダブルクオート(")というのはこれだけで一つのコマンドで、"文字列をスタックに積む"という意味を持っています。また、コマンドとパラメータの間は空白で区切ることになっています。つまり、ダブルクォートのあとに空白がないとダブルクォートがコマンドだと認識できず、エラーになってしまうわけです。

このあたりの詳しいことは「お世話になったページたち」を参照して下さい。

次のbeginからuntilまでは(untilの直下にかかれた)条件式(dup get-msecs &lt;)が成立するまで、繰り返します。

さらに、"dup"によって(get-key-mapによって取得した)KeyAdrがスタックの先頭にコピーされ、"2 +"によってスタックの先頭内容に2が足され(つまりKeyAdr+2となる)、"c@"によってスタック先頭の内容を(バイト)アドレスとして、そのアドレスの内容(つまりKeyAdr+2の内容)で置き換えます。
#C的に書くと *(KeyAdr+2) がスタックの先頭に入る。

さらに、"80 ="でスタックの先頭内容が0x80と等しいかどうか判定し、その結果をスタックに置いて、"if"でスタック先頭がが真であれば、直後の命令を実行し、偽なら"else"以下の命令を実行し、スタック先頭の値は取り除かれます。
#C的に書くと if (*(KeyAdr+2) == 0x80)....else.... となる。

で、KeyAdrの内容ですが、調べた限りでは、キーを押した状態がbit単位で設定され以下のようになっています。

KeyAdr : ****abcd efghijkl mnopqrst ....

アルファベットのところは対応するキーが押されていると、"1"が立ちます。"*"のところはなんのキーに対応しているか調べていません。

これで気がついた人もいると思いますが、2つ以上のキーコンピネーションも判定することが出来ます。例えば"ab"を押しておくと *KeyAdr=0x0C となります。

さて、その次の次の行(" hd:7,\\:tbxi" $boot)ですが、(これまでの下手な解説が理解できた人にはわかると思いますが^_^;)この行が実行されるのは"m"キーが押されていた時だけです。そして実行されるのは「hdで表されるデバイスのパーティション7番のMac OS ROMファイルを読み込んで起動する」というコマンドです。hdというのは通常、プライマリIDEドライブのようです。パーティション番号はHDに1つしかシステムがない場合は指定しなくても良いようですが、2つ以上のシステムが存在する時は必ず指定する必要があります。

パーティション番号がわからない時は、一度、起動ディスクコントロールパネルで知りたいシステムを選択し、リブート後Open Firmwareに入ってprintenvでboot-deviceの設定を見ればわかります。",\\tbxi"となっている直前の数値がパーティション番号です。あるいは、Mac OS Xの場合、Terminalから"nvram -p"と打ち込むとOpenFirmware上の環境変数をすべて表示してくれますので、それで確認することもできます。

長くなりましたので、以下の行の解説は省略します。
#後はほとんど同じですし(^_^;
結局のところ、上記bootinfo.txtがやっていることは、「起動時に"m"キーが押されていたらメインHD上のMac OS 9を起動し、"x"キーが押されていたらメインHD上のMac OS Xを起動し、"l"キーが押されていたら増設HD上のLinuxPPC(yaboot)を起動し、"c"キーが押されていたらCD-ROM上のMac OSを起動し、...(以下同文^_^;) "o"キーが押されていたらOpen Firmwareの中で停止し、何も押されていなければ、メインHD上のMac OS Xを起動する」ということです。

ふたたびOpen Firmwareへ

以上のようにして作ったbootinfo.txtファイルをHDのルートフォルダ(システムフォルダが置いてある場所と同レベル、要するにデスクトップに現れるHDアイコンの中(直下))に置いておきます。

そしてもう一度Open Firmwareに入り、以下のコマンドを入力します。

0 > setenv boot-device hd:7,bootinfo.txt
 ok
0 > setenv boot-command boot
 ok
0 > _

Open Firmware内ではASCIIキーボードのキー配列しかサポートしていないため、JISキーボードを使っている場合":"キーを押しても":"が入力されません。JISキーボードで":"を入力するには"shift-;"キーを押して下さい。

"hd:7"の部分はbootinfo.txtを入れたHDのデバイス名とパーティション番号をよく確認して入力して下さい。

なお、Mac OS Xを使っているなら、Open Firmwareに入らなくてもTerminal上から以下のコマンドを入力することでも設定できる。

% sudo nvram boot-device="hd:7,bootinfo.txt"
Password:******
% sudo nvram boot-command=boot
%

もちろんPasswordは正しいものを入力して下さい。

以上で終了です。次回立ち上げからは、"m"キーや"x"キー等を押しておくことによって、いろいろなシステムを切り替えることができるようになります。

もし、万一設定ミス等でシステムが立ち上がらなくなったとか、Open Firmwareから抜けられなくなったなどの時は、立上り時に"option-command-p-r"を押しておくことによって、Open Firmwareを初期設定状態に戻すことができ、普通にMac OSが立ち上がるようになります。そこで、徐に設定をやり直せば良いでしょう。また、一度起動ディスクコントロールパネルでシステムを選択してしまうと、Open Firmware上のboot-deviceが書き換えられてしまい、元に戻ってしまいますから、もう一度(立上り時のoption-command-o-fキー押し下げによって)Open Firmwareに入り、boot-deviceを設定し直すことによってキー入力による切り換えが復活します。

それでは、お気を付けて(^_^)

お世話になったページたち