Skip to content

Snow Leopard な MacBook を 64bit カーネルで起動する

完全 64bit 対応 をうたっている Snow Leopard ですが、現時点では 64bit カーネルで起動するのは XServe だけであり、その他 MacBook 等々は 32bit カーネルで起動します。この辺りの事情は マイコミジャーナルの記事 に詳しいのですが、大方の推測は「64bit のドライバ不足により、とりあえずは XServe のみ、64bit カーネルへ移行」というもののようです。

OS X:32 ビットまたは 64 ビットカーネルで起動する - Apple サポート に記載されていますが、MacBook Pro のように 64bit カーネル対応機種であれば、OS 起動時に「6」と「4」のキーを押していれば、64bit カーネルで起動してくるそうです(手元に MacBook Pro が無い為、未確認です)。しかし、最近の MacBook はハードウェア的には 64bit カーネルに対応しているものの、ソフトウェア的な制限により、64bit で起動させないようにしてあるそうです。理由ですが、前述したマイコミジャーナルの記事によると、「MacBook Pro などの上位機種と差別化を図る為」だそうです。

しかし、Apple から発表されている方法ではありませんが、以下の方法により MacBook でも 64bit カーネルで起動させることが出来ました。ただし、USB シリアル変換ケーブルやイーモバイルが認識されず、結果的に 32bit カーネルに戻すことになりました。

EFI が 64bit 対応であることを確認する

EFI が 64bit 対応であることを確認します。EFI が 32bit 対応だと、そもそも 64bit カーネルをロードすることは出来ません。

1
2
$ ioreg -l -p IODeviceTree | grep firmware-abi
    | |   "firmware-abi" = <"EFI64">

ちなみに 32bit カーネルで起動している状態で uname コマンドを実行した結果は、以下のように表示されました。

1
2
$ uname -a
Darwin eco-no-macbook.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:47:34 PDT 2009; root:xnu-1456.1.25~1/RELEASE_I386 i386

ブートローダを改造する

ブートローダをバイナリエディタで改造し、64bit カーネルをロード出来るようにします。まず、ホームディレクトリにブートローダのコピーを取得します。

1
cp /System/Library/CoreServices/boot.efi ~/boot-k64.efi

次に、バイナリエディタを使ってコピーしたブーロローダを改造します。今回はバイナリエディタにフリーウェアの 0xED を使いました。0xED を起動し、メニューから File → Open を選び、ホームディレクトリにコピーした boot-k64.efi ファイルを選択して開きます。

01

MacBook の場合、オフセット位置 0x266e8 を 00 から 04 に書き換えることになりますので、まず該当のオフセット位置へジャンプする為に、メニューの Edit → Find → Go to Offset を選択します。

02

表示されたダイアログに 266e8 と入力して OK を押します。

03

該当のオフセット位置へジャンプしたら、そのまま「04」(ゼロ・ヨン)と入力して、オフセット位置を書き換えます。

04

最後に、メニューの File → Save を選択して変更を保存したら、ファイルの改造は終了です。

64bit 対応ブートローダの配置と起動設定

次に、先ほど改造した 64bit 対応ブートローダを適切な位置(/System/Library/CoreServices)に配置し、chflags でロックします。

1
2
$ sudo cp ~/boot-k64.efi /System/Library/CoreServices/
$ sudo chflags uchg /System/Library/CoreServices/boot-k64.efi

続いて、OS の起動時に自動的に 64bit 対応ブートローダが読み込まれるようにします。先ほど、改造&配置した 64bit 対応ブートローダを bless して OS のブートメニューに登録した後、systemsetup で起動時に 64bit カーネルが起動されるよう、設定変更します。

1
2
$ sudo bless --folder /System/Library/CoreServices --file /System/Library/CoreServices/boot-k64.efi
$ sudo systemsetup -setkernelbootarchitecture x86_64

起動するカーネル種別は、実際には /Library/Preferences/SystemConfiguration/com.apple.Boot.plist ファイルに保存されています。systemsetup により 64bit カーネルで起動するように設定した場合、以下の内容になっていました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ cat /Library/Preferences/SystemConfiguration/com.apple.Boot.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Kernel</key>
    <string>mach_kernel</string>
    <key>Kernel Architecture</key>
    <string>x86_64</string>
    <key>Kernel Flags</key>
    <string></string>
</dict>
</plist>

32bit カーネルで起動するように戻す場合は、以下を実行します。

1
2
$ sudo bless --folder /System/Library/CoreServices --file /System/Library/CoreServices/boot.efi
$ sudo systemsetup -setkernelbootarchitecture i386

上記の設定変更を実施した後、/Library/Preferences/SystemConfiguration/com.apple.Boot.plist は以下のような内容になっていました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ cat /Library/Preferences/SystemConfiguration/com.apple.Boot.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Kernel</key>
    <string>mach_kernel</string>
    <key>Kernel Architecture</key>
    <string>i386</string>
    <key>Kernel Flags</key>
    <string></string>
</dict>
</plist>

これで再起動以降、MacBook が 64bit カーネルで起動するようになるはずです。再起動後、uname すると以下のように表示されていました。

1
2
$ uname -a
Darwin eco-no-macbook.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:46:25 PDT 2009; root:xnu-1456.1.25~1/RELEASE_X86_64 x86_64

ただし、冒頭に記載した通り、USB シリアル変換ケーブルやイーモバイルが 64bit カーネルでは認識されず、利用出来ない為、結果的に 32bit カーネルに戻すことになってしまいました。今後、各種デバイス向け 64bit ドライバーが出揃うことに期待します。