SwapFileを別のディスクに作る

SSDに換装してメモリをうんと積めば、スワップファイルがどうこうっていうのは気にしなくてもよさそうなんでありまして、実際問題私の(自宅の)環境もそうなんですが、外付けHDDもありますしこっちに作ってもらえばSSDに優しいかなぁっていうのと、もう一方のMac miniは5400回転のHDDでなんかあれこれ遅く(感じて)、おぉ丁度ここにSDカードがあるしスロットもあるし背面だからそうそう抜くミスもないだろうしだからこっちに作ってもらおう、っていう次第です。

普段であれば /private/var/vm に作られる swapfile* っていうファイルを別のディスクで作らせるよう設定を変更するっていうカスタマイズです。 問題があったらシングルユーザーモードで起動して復旧するべしでありますが、あくまでも自己責任でおねがいしますね。 何があっても(私自身の環境以外は)責任持てませんです。

それと、まわりくどい部分があるかも知れないです。

環境はMac OS X 10.8.2。 今の Mac mini と、1世代前の Mac mini の2台です。

まず、ディスクを用意します。 内蔵HDDでも外付HDDでもSDカードでも、書き込みのできるディスクを用意します。 ここで注意したいのが、そのディスクはマウントさせっぱなしにする、って事です。 容易にアンマウントしてよそに持っていくとかやめて!です。 だもんでSDカードがいいですねぇ。

ディスクを用意したらディレクトリ(フォルダ)を1つ作ります。 ここでは vm という名称にしました。 システムデフォルトと一緒ね。 なんなら不可視属性にするとか、 .vm なんてしてそもそも不可視にしてもいいでしょうけど、ここでは普通のディレクトリにしてます。

2013030501
2013030501 posted by (C)padmacolors

んで、ターミナルを開いてそのディレクトリをドロップします。 するとパスが表示されますですね。 あとで役立ちますよ。

んでもうひとつターミナルウインドウを開きます。 で、 su でルートになります。 sudo でもいいんですけど、個人的に sudo が好きじゃないので、 su でルートになったまま全部の作業を行い、最後にウインドウを閉じて抜けます。 ということでもうひとつ開いたウインドウではルートになってくださいね。

そしたらいったん SwapFile の生成をオフ(ジョブの停止)にします。

launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

たんに SwapFile を作りたくないのであれば、このままシステムを再起動すればいいらしいんですけど、あくまでも SwapFile は作る(作らせる)という前提ですので次に進みます。

この今オフにした com.apple.dynamic_pager.plist の内容を変更します。 場所は

/System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

ですんでコピーを取っておいてください。 コピー(バックアップ)はターミナルでもいいですし Finder でもいいですし。 ちなみに私は今回の操作でコピーを取るのを忘れました。 そういうことのないようにねぇ?

コピーを作ったら元ファイルを編集します。 今回は pico を使ってダイレクトに書き換えをします。

pico /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

2013030502
2013030502 posted by (C)padmacolors

こんな風に表示されます。 マウスは使えないのでアローキーで移動して編集をします。

編集するのは ProgramArguments キーの内容です。 デフォルトでは

sbin/dynamic_pager -F /private/var/vm/swapfile

という処理をしろっていうのを、コマンドと引数をばらした状態でそれぞれを文字列として配列に組み込んでいます。 このへん NSTask みたいな感じですね。 ってそれはいいか。 っていうかもっと大雑把ですけどこっち。

2013030503
2013030503 posted by (C)padmacolors

こんな風に ProgramArguments キーの内容を書き換えます。

<string>/bin/bash</string>
<string>-c</string>
<string>/bin/wait4path /Volumes/TimeMachine/ &amp;&amp; /sbin/dynamic_pager -F /Volumes/TimeMachine/vm/swapfile</string>

黄色がドライブ名で、その直下においた SwapFile を置くディレクトリが赤です。 適宜変更して編集します。

bash でもってオプション(-c)以降の文字列を読むっていう感じ。 んでその文字列がまたコマンドで、wait4path は指定パス(ドライブ)がマウントされるまで待つっていうすごーいコマンド。 &amp;&amp; はエスケープした状態で、普通であれば && で、直前の処理が成功したら(失敗しなかったら)以降の処理を進める、というもの。 ようするに && です。 んで、デフォルト的なコマンドを処理させる、という流れです。 SwapFile を作らせたいディレクトリの、そのドライブがマウントされていることを確認したら、SwapFile を作りますよ、ってな話です。

シンボリックリンクでどうこうっていうのはできないみたいです。 やってみたけどダメでした。 それと、&& は必ずエスケープしてね。 後、bash の -c オプションの後の文字列をダブルクォーテーションで括ってみたりもしましたけど、結局は普通に書いたほうがいいみたい。

そしてファイルを上書き(control + O)して抜けます(control + Xだったかな?)。 出来ればここでプロパティリストエディッタ的なもので内容確認するといいです。 Xcodeとかね。

次に今編集したファイルの所有者を、念のために root に(戻)しておきます。

chown root:wheel /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

そして SwapFile の生成をオン(ジョブを起動)にします。

launchctl load -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

そしてシステムを再起動します。

2013030504
2013030504 posted by (C)padmacolors

ユーティリティで確認したところ。 パスが変更され、ちゃんとファイルが生成されているのが確認できました。

以下蛇足

SwapFile をオフにするというのもいいかとは思うんですけど、個人的には SwapFile っていうのは必要悪で、あって困るのはディスクアクセスくらいなもんかなって考えています。 よってそのアクセスされるベクトルを変えた、というのが本エントリーの意義であります。 そもそも SwapFile が複数生成されぬようにメモリはふんだんに積んでおきましょう、とか、沢山生成されちゃったらシステムを再起動するのが一番ですよってな事で。