読者です 読者をやめる 読者になる 読者になる

春告げ鳥

興味のあることをごちゃ混ぜで書いているので、.カテゴリー別に閲覧することをオススメします

minecraft ramdisk化

家で立てているMinecraft サーバーがどうも重いらしいので、実行ファイル群を仮想的にメモリ上に配置するRamDisk化をしてみました。
RamDisk化するソフトはいくつかあるのですが、稼働しているサーバーは一つ前のモデルのMac Miniなので、TmpDiskというソフトを使いました。
ただ、このソフトは単に領域を確保してくれるだけなので、マウント*1して実際に動かすファイルは手動でコピーしなければいけません。

RamDisk化する点で問題なのが、「電源を切るとデータが飛んでしまう」のと「バックアップを正確に取っておかないとデータが飛んでしまう」という脅威があります。
手動でやるとミスをしてしまいそうなので、今回はシェルスクリプトを使って対処した話をします。

下準備

まずはTmpDisk用意します。
TmpDiskはドライブ名と容量を指定するだけで簡単にRamDiskを作れます。
チェックボックスを入れることによって起動時に自動でRamDiskを作る事もできます。

問題はここから。
作ったRamDiskOS Xの/dev以下に配置されます。おそらくドライブ化された順番だと思うのですが、disk0 … disk1とあり、disk0はOS X入っているドライブを指しているのだと思われます。

マウントするには

Diskutil mount disk1

という風にコマンドを打つ事によってマウントすることが出来ます。

マウントされると/Volumes直下にRamDiskを生成するときに指定したドライブ名のボリュームが出来ます。

あとはシェルスクリプトを書いて動かすだけです。

シェルスクリプト

シェルスクリプトとはLinuxOS Xなどで実行できるコマンドを一つのファイルにまとめて書くことが出来るスクリプト言語のことです。
実際にはWindowsの.batより強力で、パイプとかgrepとかの便利な機能が使えます。

シェルクスリプトにしてほしいこと
  1. minecraftフォルダをコピー
  2. minecraft serverを実行
  3. 仮想のminecraftフォルダにファイルアクセスがある度にハードディスクの方と中身を同期させる
  4. 同期を解除 ← これ重要

最後に同期を解除する必要があるのは、minecraftと同時に起動している必要があるためです。
シェルスクリプトC言語のように上から下に命令(コマンド)を実行していきます。
そのため、Minecraftサーバーが起動している間は下の命令は実行しないまま止まってしまうわけです。

そこでコマンドの後ろに&をつけることでコマンドをバックグラウンドで実行することが出来ます。
しかしこれが厄介で、バックグラウンドで実行するということはminecraftサーバーが終了してもそのまま命令は実行され続けるということです。

ではどうするかというとバックグラウンドで実行される命令のPID(プロセスID)を取得しておいて、minecraft サーバーが終了した時に同時にkillコマンドを使って終了させる事ができます。

同期は、fswatchとrsyncを組み合わせます。
fswatchは指定したフォルダ内にアクセスがあった時に後ろのコマンドを実行するというコマンドです。
日本語の文献にはあまり記載がなく、うまく動かずに悩んていたのですが、fswatchはバージョンが新しくなってから書き方が変わっていたようです。

fswatch -o path | xargs -n1 -I{} program

参考

ちなみに今回はコマンドに引数を渡す必要はないので

fswatch -r -0 path | xargs -0 -I {} program

とすることで引数を渡さずに後ろのコマンドを実行してくれます。



実際にプレイしてみましたが、もともと無線使っても全然ラグ出なかったので、違いがわからないです(爆笑)
どっちかというと回線の問題のような気もします。

おまけ

pythonスクリプト書いてブラウザからサーバーの状況確認出来るようにしてみました

f:id:ugwis:20150202100605j:plain

*1:ドライブをディレクトリから参照出来るようにすること