2016年2月3日水曜日

ThinkPad X1 CarbonにおけるOSX86 (Mavericks)のハマりどころ

夢の見方のお話。

ThinkPad X1 Carbonは、歴代どれもUltrabookのリファレンス的な作りをしているので非常にシステム構成が素直です。たとえば1st Gen.の場合はシステム構成がほぼほぼMacBookAir5,2と同一で、そのままわりとすんなりインストールできます。SMBIOSでどの世代の何と合致するかを調整するのが重要です。また、ドライバ類(kext)の収集と調整も重要です。

今回、筆者の手元の環境ではYosemite/El Capitanは調整があまりうまくいかなかったので、世代を落としてMavericksにしました。Yosemite以外ではWindows 10とのデュアルブートがうまく組めなかった。

DSDT.aml の取り出し方

DSDT.amlやkextの介在しないプレーンな環境で起動できるマシンならいいのですが、ThinkPad X1 Carbonはそうではないのでほかのアプローチが必要です。UbuntuなどのLinuxのライブCD(USB)から起動して、以下のコマンドで取り出せます。

sudo cat /sys/firmware/acpi/tables/DSDT > DSDT.aml

これをどこかへ待避してOS X側へ持って行き、MaciASLなどで編集していくのが基本となります。

ログイン画面直前でブラックアウトする

何もしないとログイン画面に入る手前でブラックアウトします。これはAppleIntelFramebufferCapri.kextへのpatchで対処。このパッチを充てない限り、QE/CIも正しく動作しません。

sudo cp -r /System/Library/Extensions/AppleIntelFramebufferCapri.kext ~/Desktop

sudo perl -pi -e 's|\x00\x00\x00\x00\x00\x02\x05\x00\x00\x00\x04\x0 0\x00\x07\x01\x00\x00|\x00\x00\x00\x00\x00\x02\x05 \x00\x00\x00\x08\x00\x00\x06\x00\x00\x00|g' ~/Desktop/AppleIntelFramebufferCapri.kext/Contents/MacOS/AppleIntelFramebufferCapri

sudo chown -R 0:0 /System/Library/Extensions/AppleIntelFramebufferCapri.kext
sudo chmod -R 755 /System/Library/Extensions/AppleIntelFramebufferCapri.kext
sudo touch /System/Library/Extensions

これはセキュリティアップデートなどでも更新されることがあって、ブラックアウトしたらまずここだと思って間違いないです。

なお、patchを充てる前にとりあえず起動したい場合は、ブートローダで -s してシングルユーザーモードで起動し、AppleIntelFramebufferCapri.bak などにリネームした上でリブートして、今度は -f などでキャッシュを無視すれば立ち上がると思います。

QE/CIが不完全なときは……

AppleIntelFramebufferCapri.kextのバージョンがOSバージョンと一致していないと、QE/CIへの対応は不完全なものとなります。〝チェス〟やスクリーンセーバー『Flurry』は動作していて、メニューバーが透過されなかったりターミナルの背景にブラーがかけられないなどの非動作項目があるときはこのパターンです。

ChameleonだとGUIが起きたとたんリブートすることがある(Chimeraで対処)

OSX86用のブートローダとして『Clover EFI』『Chameleon』『Chimera』などがありますが、オールドタイプなのでふだんはChameleonを使っていて、今回はどうもリブートするのがブートローダの例外処理なんじゃないかという感じだったので、設定ファイルに高い互換性があるChimeraに変えました。Chimeraなら正しくブートできます。

Windows 10とのブートチェインを組みたかったので、今回はEFIパーティションをいじるようなことはせず、そのままOS Xのパーティションに書き込んでいます。

VT-dが有効だとセーフブートしか成功しない

これは結構はまりどころで、BIOSでデフォルトONになってたりすると破滅です。ThinkPad X1 CarbonはVT-dが有効な状態ではセーフブートしかできませんでした。手探りで-xオプションを使わず起動させようとすると何日も潰すことになります。

VTはONのままでいいですが、VT-*のフィーチャーは切ったほうがよいかもしれません。Mac本体もVTは使用していますが、VT-*はファームウェアレベルで無効化されているので、それに合わせる意味ではアプローチとして正しいはずです。

command-shift-3/4でスクリーンショットが撮れない

なぜか screencapture コマンド(上記キーバインドが内部的に呼び出しているもの)は効くので、『Spark』などのキー割り当てツールで対処しましょう。標準バインドが効かない理由はよくわからない。

書き換えるkextは少ない(Vanillaに近い)

パッチを充てる必要があるkextがひとつだけなことからも、かなりシンプルにOSX86が動作する機種だと言えます。また、だいたいの非動作項目には対処方法があります。

オーディオデバイスが非動作

Intel (Vendor ID: 0x8086) のオーディオデバイス (Device ID: 0x1e20) なので、それを見るようVoodooHDA.kextのInfo.plistを書き換える必要があります。AppleHDADisabler.kextとVoodooHDA.kextが必要です。

<key>IOPCIClassMatch</key>
<string>0x1e208086</string>

これで再起動(してからサウンドの出力先を内蔵スピーカーに)すると、音が鳴ると思います。内蔵スピーカーが選べないときはVoodooHDAのバージョンを変えてみてください(手元の環境では2.8.8では非動作、2.8.4で動作)。

キーボード/マウスドライバの相性問題

TrackPointとタッチパッドが両方ある端末なのでRehabman氏がforkしているVoodooPS2Controller.kextを使うのですが、さんざん組み合わせを試した結果、手元の環境では 2014-0523 のビルドしかTrackPointとタッチパッド両方の速度が一定以上のレベルの精度を達成してくれませんでした。ほかはだいたいTrackPointが発狂してPACMANみたいな動きしかできなくなる。

なお、タッチパッドはPrtScキーで即時ON/OFFできます。おそらく(Rehabman氏が主対象としている) HP ProBook (のWindows)にそのような機能があるのでしょう。PrtScはOS Xでは動作しないキーなのでよいアプローチだと思うのですが、ThinkPad X1 Carbonでは誤操作しやすい位置にあるので、よく押してしまってタッチパッドが動いたり動かなかったりの憂き目に遭うような気がします。

スリープはできるけれども……

インストール直後からFn-F4を利用したスリープが使えるのですが、これがいわゆるハイブリッドスリープで、ストレージへのステート待避を行ってしまいます。そうすると次回起動時にChimeraが〝暗号化された仮想メモリは読めない〟旨のエラーを出して復帰できないので、まずここを直す必要があります。

ターミナルから以下の3つのコマンドを管理者権限で。

# pmset -a hibernatemode 0
# pmset -a standby 1
# pmset -a standbydelay 14400

それからorg.chameleon.boot.plistの手直しで、Kernel Flag に darkwake=1 を追加してください。

これで再起動すれば、ただのスリープ(ACPI S3)しかしなくなるはずなので、スリープしてから10日間は安心です(※standbydelayで60min*24h*10dayを指定している)。たぶん10日後にはディープスリープ(ACPI S4)に入ろうとメモリ内容の待避を行いますが、その頃にはバッテリーが切れていると思います。

たまに鞄の中で起きてしまったりしますが、その辺はご愛敬ということで(※これはOS Xの『PowerNap』によってスリープから復帰したあと、再びスリープに入るのに失敗しているため。Power Nap自体をシステム環境設定からOFFにすれば起きなくなります)。

なお、インストール時にセンサ周りのエラーは出るものの、『Insomnia X』が使えます。OSX86でLid Sleepをちゃんと無効にできるのには感動。ちょっと持ち運ぶだけのときにいちいちスリープされるのもなぁ、という場合はこちらも。

画面の輝度調整

DSDT.amlへのパッチで実現できます。以下のチュートリアルのHP ProBook用のパッチを流用しましょう(※DSDT周りの解説は非常に少ないので、このエントリ自体が大変参考になります)。

MaciASLへ指定のリポジトリを追加して、パッチ画面から〝[6.1] ACPI backlight control〟を適用すれば次の再起動後から輝度コントロールができるようになります。ただし純正のFn-F8/F9は効かない(※ちゃんとThinkPad用のパッチを書けばできるようになります)ので、Sparkなどでoption-F8/F9あたりに割り当てるのがいいんじゃないでしょうか。

あと一歩なデバイス

SDカードリーダーが非動作

Ricoh (Vendor ID: 0x1180)のSDカードリーダー(Device ID: 0xe823) なので、それを見るようVoodooSDHC.kextのInfo.plistを書き換えても、今のところ正しく読めたことがありません(フォーマットするか聞かれる程度)。

<key>IONameMatch</key>
<array>
    <string>pci1180,e823</string>
</array>
Wi-Fiは外付けするしかない

内蔵のWi-FiがIntelチップなので、OSX86では認識できません(Apple製ハードウェアにIntel製を採用したものがないことと、コミュニティでの開発も行われていない)。オンボード実装で、miniPCIなどでもないので換装も不能です。そのため、外付けのWi-Fiアダプタを使用する必要があります。

Planex『USNano2』を買ったのですが、これはOS側からは有線LANアダプタに見え、無線APへの接続は専用のユーティリティで行うものとなっています。OS側からWi-Fiアダプタとして見えるものがあればよいのですが。

あと、希少なUSBポートを1個潰してしまうのと、右側のは高速なUSB 3.0ポートなので潰すのはもったいないため、いまいちバランスの悪い場所ながらも、左側中央のUSBポートに挿しています。

あと、この手のデバイスでよくあることですが非常に派手にビカビカ光って目障りなので、3Mのラッピングフィルムでマスキングしてやりました。

ところで、こうして外付けWi-Fiでやろうとすると(まあやらなくてもだけど)大きな問題があって、Mac App Storeへサインインすることができません。Macには内蔵Wi-Fiまたは有線LAN(ネットワークインタフェース)の存在しない機種が存在しないためです。回避方法は次に。

Mac App Storeへサインインできない問題への対処

Mac App Storeというか、iCloud (iMessageおよびFaceTime含む)絡みのサービス全般にサインインしようとすると、デフォルトの状態だと『ご利用のデバイスまたはコンピュータを確認できません。詳細はサポートへご連絡ください』というエラーが表示されてサインインできません。これは上述のとおり、ThinkPad X1 Carbonには〝内蔵の〟ネットワークインタフェースが存在しない(Intel製Wi-Fiは使用不能である)からです。

世の中には同様の現象に遭遇して対応策を考える先人がいるもので、NullEthernet.kext というドライバで解決することができます。このドライバもRehabman氏の制作です(Donationしましょう)。導入方法は他と比べると多少複雑です。

  1. Release/NullEthernet.kext をKext Utilityなどで導入する
  2. MaciASLで現在使用しているDSDT.amlを開き、ツールバーの〝Patch〟から [Open] ボタンを押して、patch.txt を開いて [Apply] → [Close] とする
  3. DSDT.amlを保存する
  4. ssdt-rnme.aml を /Extra 内にファイル名を SSDT-n.aml (※nはSSDT-*.amlで最大となる数字)として保存する。SSDT.amlしかないのであればSSDT-1.aml、SSDT-2.amlまであるのであればSSDT-3.amlなどとする
  5. 再起動
  6. 『システム環境設定』の [ネットワーク] で、左下の [-] ボタンを押して現在表示されているインタフェースをすべて消去し、[適用] ボタンを押す
  7. /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist を削除する
  8. 再起動
  9. 『システム環境設定』の [ネットワーク] で、左下の [+] ボタンを押して〝Ethernet〟を追加する
  10. 続けて『システム環境設定』の [ネットワーク] で、左下の [+] ボタンを押して、必要なインタフェースを追加し直して、[適用] ボタンを押す

これでMac App StoreやiCloudなどへサインインを試みると、正しくサインインできるはずです。すごい。

ソフトウェアアップデートにアップデートできないデバイスが表示される問題

ソフトウェアアップデートは純正Macだと思い込んでいるので、非互換デバイスでもアップデートを推奨してきます。以下のようにコマンドで対処。

softwareupdate --ignore ThunderboltFirmwareUpdate1.2

〝古い〟OS Xと付き合っていく上での覚悟

OS X 10.9 Mavericksは、まだセキュリティアップデートは提供されているものの古いMac OSです。そのため、Mac App Storeでも非対応アプリが増えつつあります。

より抜本的には、OS X 10.10ないし10.11のインストール事例を後世に残していくことが必要です。本稿を読んでそれらにチャレンジし、ある程度実用的な環境を得た方は是非それをエントリにしてください。

Windowsとデュアルブート構成時の修復方法

Windowsとデュアルブートを組むと、ブートチェインがうまく回らなくなるので、ブートローダがブートデバイスを見つけられずにWindowsが起動しなくなると思います。

この場合はWindowsのインストールメディアから起動して、コマンドプロンプトから以下を試してみてください。

bootrec /RebuildBcd
bootrec /fixMbr
bootrec /fixboot

これで exit して再起動するとWindowsが起動できるようになると思います。しかし、今度はOS Xが起動できなくなるので、『Easy BCD』というツールを導入してブートメニューにOS Xを追加しましょう。

これでWindowsのブートメニューから両方のOSを起動させることができるようになりました。

もちろん、ChimeraのWindowsメニューも有効なので、永遠にチェインさせることもできますが……