新しく無いMacでもハイバネートしよう
2005年10月に発表された新しいpowerbook(高解像度&二層焼き対応スーパードライブ)
の面白い機能はセーフスリープだ。ramの電源を落とさず(通常のスリープ)、にそ
れに加えて、セーフスリープではメモリの内容をディスクのファイルに書き出すの
だ(ハイバネート)、そのためバッテリーが切れたり、取り外されたりしても、今
までのスリープとは違い、システムの作業内容は消えない。もしPowerbookの電源
が残っていれば、通常のスリープとして復帰する。
動作の仕組みに興味がなく、すぐにセーフスリープを可能にしたいならここから。
この機能はもっぱらソフトウェアにより実現されている機能だ、Linuxではこれを
「Software Suspend」と呼んでいる。高解像度powerbookの数週間後に10.4.3がで
たが、これに「新しい機能」がいくつか追加されたっぽいのだ。
テストはすべて、iBook 1GHz(ramは1.25GB, 10.4.3)で行われた。kextstatコマン
ドでAppleKauaiATAドライバの使用が表示されてさえいれば、私は他のMacでも動く
と思う。
動作のからくり
10.4.3の変更点を探るにあたり、最初に立ち寄るところはDarwin sourcecodeだ。
xnuパッケージ(カーネルそのもの)において、hibernateでgrepコマンドをかけて
みると、xnu-792.6.22/iokit/Kernel/のディレクトリでいくつかのファイルが引っ
かかる。IOHibernateIO.cpp が特にくさい。
何度かファイルへのハイバネートをしようとして失敗した後、ATAドライバが
IOPolledInterface をサポートしていないように思えてきた。そしてついに、
AppleKauaiATAが実際に(Openfirmwareの)"ata"デバイスの"has-safe-sleep"プロパ
ティをチェックし、それが設定されているインターフェースのみ
IOPolledInterfaceが可能であることに気づいた。(これは新しいPowerBook 15"の
「ioreg -l -w 0」コマンドの出力を見ることではっきりした。)
/System/Library/Extensions内で"has-safe-sleep"でもってgrepコマンドをかけて
みるとAppleMacRISC2PE (PE="Platform Expert")が捜し物の候補のようだ。で
は、ソースをチェックしてみよう。
23 :
粗訳3:2005/12/08(木) 22:21:36 ID:x0gRW1fZ0
(MacRISC2.cppより):
bool MacRISC2PE::platformAdjustService(IOService *service)
{
bool result;
if (IODTMatchNubWithKeys(service, "kauai-ata"))
{
IORegistryEntry *devicetreeRegEntry;
OSData *tmpData;
devicetreeRegEntry = fromPath("/", gIODTPlane);
tmpData = OSDynamicCast(OSData, devicetreeRegEntry->getProperty
("has-safe-sleep")); if (tmpData != 0)
service->setProperty("has-safe-sleep", (void *) 0, (unsigned int) 0);
}
なお、新しいPowerBookのioregコマンドの出力には、確かに"has-safe-sleep"とい
うルートレベルの項目が存在した。
Macをだまそう
まず、この作業はAppleにサポートされていないということを肝に銘じておくこ
と。セーフスリープ機能が、私の知らない新しい機種のみの「ハードウェア」の機
能としサポートされているのには、きっとわけがある。警告しておく。大多数のG4
ではうまく動作するようだが、例外的に12" 867MHz PowerBookではうまくいかない
のだ。
"has-safe-sleep"プロパティを作成するため、起動時にOpenFirmwareモードでいろ
いろする必要がある。が、iBookデュアルモニタ化hackのような他の素晴しいhack
で使われているように、nvramrcコマンドを代わりにに使うのがよい。(iBookデュ
アルモニタ化hackはページの下の方で説明する。)
基本的なopenfirmwareコマンドは以下の通り。
" /" select-dev
" something" encode-string " has-safe-sleep" property
meaning "Create a 'has-safe-sleep'='something' property in / of the
device-tree".
私はセーフスリープに関連する値を設定するスクリプトをいくつか作ったので、解
凍してターミナルで実行してみてほしい。
ハイバネートhackはiBookのデュアルモニタ化hackと干渉するので、2つのhackを同
時に設定するスクリプトも入っている。このスクリプトをまだデュアルモニタ化
hackを当ててないiBookに使ってはいけない。マシンによっては危機的な状態にし
てしまう。私のバージョンのスクリプトではオリジナルがやる程のチェックを一切
しない。
25 :
粗訳5:2005/12/08(木) 22:25:30 ID:x0gRW1fZ0
うむぅ..
残されたステップはハイバネートモードを有効にすることだ。確認して欲しいの
は、最低でも物理メモリ+750MBぐらいの十分なディスクの空きがあること。ディ
スクの容量に問題がなければ、ターミナルで"sudo pmset −a hibernatemode 3"と
打って実行する。このときに/var/vm/sleepimageというファイルが作成される。
(もしあなたがセキュリティ環境設定パネルで安全な仮想メモリを有効にしている
場合、暗号化されたハイバネートモードが使われないようにするために
hibernatemode は3ではなく7を使うべきだ。私にはなぜかよく分からないが、いく
つかの理由で暗号化されたハイバネートは動作しない。ただし、安全な仮想メモリ
を有効にしていないのにhibernatemodeを7にしてはならない。)
hibernatemodeを1に設定(安全仮想メモリなら5)すると、ハイバネートした直後
に電源が落ちる。
0に設定するとハイバネート,セーフスリープは無効になる。
26 :
粗訳6:2005/12/08(木) 22:27:02 ID:x0gRW1fZ0
OpenFirmwareの変数をセットするために再起動し、液晶を閉じて、スリープランプ
が点滅するのを待ってみよう。
まだ電源をはずさずに、普通に復帰させて/var/log/system.logを見てみよう。
こんな行があればうまく動いている。
Nov 2 14:27:17 computername kernel[0]: System SafeSleep
ここまで大丈夫なようならば、実際に試して見よう。スリープさせて(ランプが点
滅したのを確認して)、電源とバッテリーを取り外す、そしてランプが消えるのを
待つ。(powerbookではしばらく点滅したままなので)
電源を元に戻し、電源ボタンを押して起動してみよう。進行状況を表示するものが
出てきて少し画面が点滅したのち、スリープしたときの状態に戻る。(多量のディ
スクアクセスを伴う)
一言警告しておくと、ハイバネートしているMacでターゲットディスクモードを使
うなということ。最終的にファイルシステムが破壊されるかもしれない。
どうでしょう?ではグッドラック。
27 :
粗訳7:2005/12/08(木) 22:30:03 ID:x0gRW1fZ0
問題点
挑戦した人たちからいくつか報告をいただいた。以下のマシンでうまく動作すると
のこと。
* iBook G4 ― 12" 1GHz, 14" 1.2GHz, G4 800MHz
* PowerBook ― 1.25GHz, 1GHz, 1.5GHz, 15" 1.67GHz
* eMac ― 1GHz (running 10.4.3 Server)
* Mac mini ― 1.4GHz
総合的に見て、2003年9月以降のほとんどの G4で動くはずである(すべてのアルミ
製powerbookを含むが、12" 867Mhzは定かではない)。誰かG5でうまく動作したな
ら興味があるのでぜひ聞かせて欲しい。
Peter Steinerからのレポートによると、彼の12" 867MHz PowerBookはセーフス
リープモードを有効にするとファンが停止し、スリープ中にマシンの時計が止まっ
てしまうそうだ。数人が12" 867MHz PowerBookでトラブっているようなので、この
機種ではこの機能を使わないのが一番だろう。
またブルートゥースがONにされ、OFFにできなくなったという報告も見かけた。何
でこのようなことが起こるのかはわからない(こういう理由だという提案は歓迎)。
スリープ中に時計が止まってしまうのを確認した人も何人かいる。モデル固有の問
題だと思われるが、よくわからない。
28 :
粗訳8:2005/12/08(木) 22:32:19 ID:x0gRW1fZ0
2人ほどからの、壊れたハイバネートイメージに関する問題の報告もみかけた、何
度再起動しても、壊れたハイバネートイメージを読み込もうとするためにカーネル
パニックを繰り返すという報告を聞いた。これは、先に述べた「安全な仮想メモ
リ」をオンにしているにもかかわらず、適切なhibernatemodeを設定していない場
合に起こりうる。
もし、壊れたハイバネートイメージで再起動とクラッシュを繰り返すようならば、
以下の手順を試してみる。
*Open Firmwareに入るために、コマンド+オプション+O+Fを押しながら再起動を
する。
*“setenv boot-image”と打ち込んでリターンを押し、起動する。(もし
OpenFirmwareパスワードを設定していると、入力を求めらる。)
Matt Johnston - matt @ ucc.asn.au
Updated 17 November 2005 (created 2 November 2005)