MacBook AirのSSDを4GB(搭載RAMのサイズだけ)空きを増やす方法

64GBモデルの私にとって4GBは雀のげんこつぐらい大きい。あれ、げんこつでも結局小さいか。えーと、カモネギのネギぐらいの大きさですね。微妙ですね。で、sleepimageというやつを削除すれば搭載RAMのサイズだけ空きが増えるみたい。

sleepimageとは

private/var/vmにあります。不可視ファイルだっけかな。いつも全部可視化させてるので何が見えないファイルなのかよくわからないのですが。とりあえず詳細は以下を参照。

簡単に言うとスリープ中でバッテリーが切れたとき用のRAMのバックアップファイルみたい。あとAirの場合デフォルトのスリープ設定のままで、長時間スリープ状態から復帰させるときとかもこれ使うらしいです。

だから、これがなくなって困る人は常時スリープで時々バッテリー切れおこしてるairたんを持っている人とか、あと重要なデータをRAMにふらふらさせるのが好きな人とかでしょうか。

大事っちゃあ大事なのかもだけどどうでもいいっちゃあどうでもいいんじゃねえかという印象です。とりあえずちょっと消してみましょう。

sleepimageを削除

ターミナルから、

sudo rm /private/var/vm/sleepimage

で削除できます。が、削除しただけだと再起動したときやスリープしたときとかにまた生成されました。なので、

sudo pmset -a hibernatemode 0

とします。これで生成されません。スリープモードを変えたんですね。見事に4GB空きました。やったねたえちゃん。


ちなみに、元に戻す時は、

sudo pmset -a hibernatemode 3

とすれば戻ります。Airでは3がデフォのようです。

hibernatemodeとは

今日日のMacBookは、二種類のスリープを使い分けています。「サスペンション(suspension)」と「ハイバネーション(hibernation)」。前者はRAMに通電し、後者はRAMの内容をディスクに落とした上でRAMへの通電もやめます。そこまでは他のWintelノートと同じなのですが、Wintelノートではどちらにするか明示的に指定しなければならないのに対し、MacBookでは、スリープが一定時間以上続くと、スリープしている間にサスペンションからハイバネーションに切り替わります。

http://blog.livedoor.jp/dankogai/archives/51694301.html

ハイバネーションwindowsでいうとこの休止状態みたい。サスペンションてのはサスペンド?だったらwindowsでいうとこのスタンバイ状態ですね。

それで、スリープが続くと途中でハイバネーションになるようです。デフォルトの設定では70分でハイバネーションになるんだそうで。私も数値を確認してみたところ同じでした。

確認はターミナルで、

pmset -g

でできます。詳細は、

こちらをみてください。


たとえばAirたんを電源入れたままいっつも閉じたりしている人はsleepimageあった方が良いですね。これはあれ。ハイバネーションが3ってのはデフォルトの設定で70分過ぎたらWindowsでいう休止状態に入るやつですよね。だから省電になるのです。そしてそのバイバネーションが0だとずーとスタンバイ状態なので省電じゃないわけです。

これはたぶん全国省電推奨hibernatemodeに限るの会の人たちにしてみれば、以下省略!


sleepimageそのものについては別に無くてもよさそうなので、スリープがスタンバイ状態でもいいということなら捨てればいいのではないでしょうか。

ちなみに私はhibernatemodeは3に戻しました。省電します。というかシャットダウンすりゃいいだけの話なのですが。Airはシャットダウンしても立ちあがりが早いから気にはならないんですけどね。

とりあえずまた4GB欲しくなったら0にします。

無駄に終わったのでちょっと調べた

3とか0とかなんなの!ってことで調べたら、

この値が0ならばハイバネーションせず通常のスリープのみ
この値が1ならば常にハイバネーションモードに入る
この値が3(デフォルト)ならば、通常のスリープとハイバネーションの複合モードに入る

http://d.hatena.ne.jp/riocampos/20080303/1204554071

とのこと。なるほど。

但し、ハイバネーションモードの変更は推奨しないと、man pmsetに書いてある。
どんな変更もサポートしないと。
変更するなら、以下3つのうちのどれかを推奨しているらしい。
くれぐれも、0・3・25以外を使わないようにしてくださいと。

http://d.hatena.ne.jp/zariganitosh/20110712/sleep_twice_free_memory

1は非推奨になったみたい。で、25がでてきた。25は簡単にいうとメモリを開放してからハイバネーションでスリープするタイプらしい。おお、結構いいじゃないっすか。いい仕事してるじゃないっすか25。現在はどうも0,3,25のどれかから選ぶってのが妥当みたい。

man pmsetでそれぞれ詳細が分かる。

SAFE SLEEP ARGUMENTS
hibernatemode takes a bitfield argument defining SafeSleep behavior. Passing 0 disables SafeSleep altogether, forcing the computer into a regular sleep.


0000 0001 (bit 0) enables hibernation; causes OS X to write memory state to hibernation image at sleep time. On wake (without bit 1 set) OS X will resume from the
hibernation image. Bit 0 set (without bit 1 set) causes OS X to write memory state and immediately hibernate at sleep time.


0000 0010 (bit 1), in conjunction with bit 0, causes OS X to maintain system state in memory and leave system power on until battery level drops below a near empty
threshold (This enables quicker wakeup from memory while battery power is available). Upon nearly emptying the battery, OS X shuts off all system power and hiber-
nates; on wake the system will resume from hibernation image, not from memory.


0000 1000 (bit 3) encourages the dynamic pager to page out inactive pages prior to hibernation, for a smaller memory footprint.


0001 0000 (bit 4) encourages the dynamic pager to page out more aggressively prior to hibernation, for a smaller memory footprint.


We do not recommend modifying hibernation settings. Any changes you make are not supported. If you choose to do so anyway, we recommend using one of these three set-
tings. For your sake and mine, please don't use anything other 0, 3, or 25.


hibernatemode = 0 (binary 0000) by default on supported desktops. The system will not back memory up to persistent storage. The system must wake from the contents of
memory; the system will lose context on power loss. This is, historically, plain old sleep.


hibernatemode = 3 (binary 0011) by default on supported portables. The system will store a copy of memory to persistent storage (the disk), and will power memory dur-
ing sleep. The system will wake from memory, unless a power loss forces it to restore from disk image.


hibernatemode = 25 (binary 0001 1001) is only settable via pmset. The system will store a copy of memory to persistent storage (the disk), and will remove power to
memory. The system will restore from disk image. If you want "hibernation" - slower sleeps, slower wakes, and better battery life, you should use this setting.


Please note that hibernatefile may only point to a file located on the root volume.

ああ、0はデスクトップ向けってことでしょうか。MacのデスクトップってiMacとか?macminiもかな?これらだとデフォルトで0なのかも。で、3はポータブルって書いてあるからAirだけじゃなくてProもデフォルトは3かな。25はpmsetから設定するよみたいな感じ。

あとの詳しいことは、

でどうぞ。気になるなら読んでみてください。


そういうわけで、

といったようなことになるかと思われます。


いつもスリープにさせている場合でも0にして省電気にならなければ問題ないかも。ああ、電源が確保できないときはあれですが。というか外出時はスリープじゃなくて落としますからね。

sleepimage消したところですぐにどうこうなるわけでもないし、こいつはhibernatemodeを3や25にしたらすぐ出てくるヒモ野郎なんで消してもすぐ現れます。モブキャラですね。モブなのでお好きにどうぞ。

スリープを使い分けるAppleScript

それぞれのスリープモードを使い分ける方法もありました。

SSDの消耗云々を気にしない人はこれを利用すると使い分けられて便利かも。sleepimageが生成されたり消えたりだったことが裏で起きてますが。

でまあ、URL先のやつをもうちょっと使いやすくするためにAppleScriptを書いてみました。

on run
	set modelist to {"Sleep mode (hibernatemode 0)", "Safe sleep mode (hibernatemode 3)", "Deep sleep mode (hibernatemode 25)                                 "}
	set exp to "
Sleep mode : 常にサスペンド
Safe Sleep mode : サスペンドから一定時間でハイバネーション
Deep Sleep mode : メモリを開放してからハイバネーション
"
	choose from list modelist default items "Sleep mode (hibernatemode 0)" with prompt my check_mode() & "

【変更したいスリープモードを選んでください】" & exp with title "スリープモードの変更"
	
	if result is not false then
		set modetype to last item of words of (get item 1 of result)
		if (modetype = "0") then set modenum to modetype & " ; if [ -f /var/vm/sleepimage ]; then sudo rm /var/vm/sleepimage; fi;"
		if (modetype = "3") then set modenum to modetype
		if (modetype = "25") then set modenum to modetype
		
		try
			do shell script "sudo pmset -a hibernatemode " & modenum with administrator privileges
			display dialog "変更を完了しました
" & my check_mode() buttons {"OK"} default button "OK" with title "確認"
		on error
			display dialog "スリープモードの変更をキャンセルしました
" & check_mode() buttons {"OK"} default button "OK" with title "確認"
		end try
	end if
end run

on check_mode()
	set type to (get item 2 of words of (do shell script "pmset -g|grep hibernatemode"))
	set mode to ""
	if (type = "0") then set mode to "Sleep mode (hibernatemode " & type & ")"
	if (type = "3") then set mode to "Safe Sleep mode (hibernatemode " & type & ")"
	if (type = "25") then set mode to "Deep Sleep mode (hibernatemode " & type & ")"
	return "現在の設定は \"" & mode & "\" です"
end check_mode

スクリプトメニューとかから使えばスリープのモード変更できます。適当にどうぞ。