RAM Diskを使ってMinecraft のModサーバを建てた話

あらすじ

自分のMinecraftに関して思うこと(読み飛ばしてどぞ)

自分はあまりゲームをしない.
そもそもゲーム機をほぼ持っていないし, 持っていたとしても(これは中学生の時の話でその時はNintendo DS iを持っていた)内蔵ブラウザを使ってネットサーフィンをよくやっていたぐらい.

ゲーム機が子供の遊びの全盛期だった頃ゲームは持っていなかったが, いくつか年月が経ち, ゲーム機でなくともゲームができる時代になった頃, Minecraft PEにはまった. この時のデバイスはiPod touchやiPhone, iPadであった.

そしてちょっとすると, Minecraft PE(現 Minecraft)からMinecraft(現 Minecraft: Java Edition)にゲームをシフトしMod環境で遊び始める. という自分のゲーム遍歴.

Minecraft はシングルプレイも面白いが, マルチプレイはもっと面白い. これは他のゲームに比べて(他のゲームの何を知っているのか)ルールが少ない(–––RPGのようにストーリがない)ため何を協力して何を達成すべきか, プレイヤが決定できるからであると思う.

サーバ

自分がMinecraftでマルチプレイをする時どうやるかは他の人がそれをやる時と少し違うかもしれない.
今やSkypeはHangout, FaceTimeなどインターネット回線を使った音声通話ツールが巷にはあるが, それらを使って会話しつつやるというようなことはしない.
実際に会って, その場所でマルチプレイを楽しむ.
そのため, 自分はノートPCを2台持って行かなければならない. なかなか珍しい方法であると思う.
インターネットの恩恵を受けれるのにも関わらずこんなめんどくさいことをしてるのは実際に会ってやる方がやっぱり面白いから.(一緒にやる人が毎日会うような人間であるならインターネット経由でしていただろうけど)

という特異な環境においてのサーバの設定を書いていくが, 内容としてはどんな形態のマルチプレイ方法であっても参考にはなる情報がないわけではないのではないかと考えている.

また記事内でいくつか自作スクリプトを提示するが, それはあなたの環境で動くかどうか自分は知らないし, 動作に保証はない. つまり実行は自己責任とする.

本題

目次

  • 環境
  • サーバについて
  • サーバをとりあえず建てる
  • サーバの基本設定
  • サーバのRam Disk化
  • やってみた結果

環境

以下に自分がマルチプレイを行う時の環境を示す.

  • サーバ: DELL LATITUDE E6230, Ubuntu 16.04 LTS, Intel Core i5-3520M, RAM: 16GB
  • クライアント: Apple Macbook Pro (Retina, 13-inch, Early 2015), macOS High Sierra(10.13.3), Intel Core i5-5257U, RAM 8GB
  • スイッチングハブ: tp-link 8-Port Gigabit Desktop Switch (TL-SG1008D)

サーバについて

Minecraft: Java Edition(以下 Minecraft JEと呼ぶ)のサーバにはいくつか種類がある.
デフォルトの環境であるバニラな環境を提供するサーバである”バニラ(公式)サーバ”, Minecraft ForgeのModが導入された環境を提供する”Modサーバ”などがある. 詳しくはWikiを見てもらいたい.

今回導入するサーバは後者のModサーバである.
このModサーバの詳細を以下に示す.

Modサーバ環境

基本情報

  • Modサーバ本体(?): Minecraft Forge: 14.23.2.2611

導入するMod

  • The Twilight Forest: 3.5.263
  • Backpacks!: 3.4.3
  • Neat: 1.4-15
  • MineAllSMP: 2.6.5
  • CutAllSMP: 2.5.2
  • DigAllSMP: 2.3.2

サーバをとりあえず建てる

まずはサーバを最小構成で立ち上げてみる.

Minecraft Forgeの公式サイトからInstallerを入手し, シェル(”端末”だとかのアプリケーション)に以下を入力し実行する. もちろんこの時サーバのファイルを配置する場所(今回は/home/minecraft/preServer と仮定する)に移動して, である.

java -jar forge[落としてきたファイルによって名前が変わる]-installer.jar nogui --installServer

しばらくするとYou can delete this installer file now if you wishと出るので, “forge[hoge]installer.jar”を削除する.

この状態で一度サーバプログラムを起動する.

java -jar forge[hoge]-universal.jar nogui

起動したと思いきや, すぐに終了してしまうがそれが正常である. これはいくつかの設定(すべき)ファイルの生成を行なっている.

サーバを建てるためにはEULAというものに同意しなくてはならない. これは”Minecraft End User License Agreement”というものでエンドユーザライセンス条項に同意する場合のみサーバを建てることができるというものである.
EULAの内容はここ.
内容に同意できる場合, “eula.txt”というファイルを編集する.

vim eula.txt

“eula.txt” ファイルに
eula=false
と書かれているので
eula=true
と変更し, 上書きすることでEULAに同意したことになる.

この状態で再度サーバプログラムを実行する.

java -jar forge[hoge]-universal.jar nogui

シェル上で
[00:09:12] [Server thread/INFO]: Done (17.315s)! For help, type "help" or "?"

と表示されて入ればサーバを建てることに成功している.

この状態で”stop”を入力するとサーバプログラムが停止する.

サーバの基本設定

バニラ的設定

これまででサーバは建てることはできるが最適であるとは言えない.
ここからはサーバにおいてこれだけやっておくべき設定をしていく.
サーバの設定ファイルは”server.propaties”である.

vim server.properties

“server.propaties”ファイルをエディタで開き, いくつかの項目を設定する.

gamemode=0の部分ではゲームモード(0ならサバイバル, 1ならクリエイティブ)

pvp=trueはプレイヤ同士が攻撃した時ダメージが入るかどうか

max-players=20ではマルチプレイに同時参加できるプレイヤの数の上限を設定する.

view-distance=10ではチャンクチャンク表示範囲の設定

そのほかの詳しい詳細は以下のブログを参考してほしい.
サーバ設定ファイル(server.properties) | minecraft.server-memo.net

さらに起動時に指定するオプションとして-Xmx, -Xmsは重要である.
これらはjava -jar forge[hoge] noguiを実行する時にこのコマンドラインの中に指定するもので, 役割としてはヒープ領域(使用するメモリ)の割り当てである.

-Xmxオプションでは分までプログラムのヒープ領域が確保できることを示す.
もしに”2G”を指定すれば2GBまでプログラムがヒープ領域を使うことができる.

-Xmsオプションではプログラム開始時のヒープ領域のサイズを指定することができる.

これらの値は搭載している物理メモリの値を超えてはならない.
また両者の関係はXmx >= Xmsでなければならない.

もし2GBの割り当てで起動し, 最大4GBまでの割り当てを可能にするなら
java -jar forge[hoge] nogui
とする.

これ以外にも色々なオプションがある.
それらを使って行くとコマンドの量が大きくなるので小さなシェルスクリプトを書く方がいい.

Modを入れる.

ModsディレクトリにModのファイルを入れる.
終わり.

サーバのRAM Disk化

そもそもRAM Diskとは

PCは基本的にHDDやSSDなどの補助(2次)記憶装置にデータを保存し, それらを参照, 更新, 追加する.
Minecraftはこれらの記憶装置にワールドデータ(チャンク)を書き込み, またそれらを読み込んで…を行う.
つまりMinecraftをプレイするとき, 補助記憶装置では大量のI/Oが発生する(と思ってる).

そこで補助記憶装置よりも高速でI/Oのできる主記憶装置にデータを置いてしまえと言うのがRAM Disk化である.

RAM Disk化の注意点

RAM Diskは主記憶装置上にデータを置くため, 電源を切るとデータは消える.
そのため電源を切る前にデータのバックアップを取らなくてはならない.

またRAM DiskはRAMの領域の一部を占有するためRAMの容量に余裕のある場合のみ行うべきである.
余裕がないのにRAM Disk化を行うとパフォーマンスが下がる.

RAM Diskを作成する

まずマウントポイントを作成する.

mkdir /home/minecraft/mountPoint

実験としてmountPointにRamをマウントしてみる.

sudo mount -t tmpfs -o size=512m tmpfs /home/minecraft/mountPoint

この状態でdfコマンドを打つと

minecraft@example-Ubuntu:/home/minecraft# df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 8131484 0 8131484 0% /dev
tmpfs 1630364 9608 1620756 1% /run
/dev/sda6 143569624 30626908 105626748 23% /
tmpfs 8151800 276 8151524 1% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 8151800 0 8151800 0% /sys/fs/cgroup
tmpfs 1630364 64 1630300 1% /run/user/1001
tmpfs 524288 0 524288 0% /home/minecraft/mountPoint

このようにFilesystemはtmpfsで, /home/minecraft/mountPointにRAM Diskがマウントされた.

話は脱線するが少し実験を行いたい. この部分はサーバを建てるのに必要でない情報なので読み飛ばしてもらっても構わない.

———–ここから無駄話———–

実際にこれを行った時ふと思った.
「これほんまに出来てるか?」
これだけでI/Oが早くなるのは少し怪しいとは思わないだろうか(そう思うのは自分だけだろうか).
そこでより多い容量を持つRAM Diskを作成し, HDDとその場所とで書き込み速度を比べる.

まず6GBほどRAM Diskを作成する.

sudo mount -t tmpfs -o size=6g tmpfs /home/minecraft/mountPoint

そしてこのmountPointに5GBのファイルを書き込む.

sudo dd if=/dev/zero of=/home/minecraft/mountPoint/speedtest.tmp ibs=1M obs=1M count=5120

この時の出力は

5120+0 レコード入力
5120+0 レコード出力
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 1.49912 s, 3.6 GB/s

3.6GB/sで書き込んでいることがわかる.
さらに2回同じことを行い,
その平均書き込み速度は3.6GB/sで書き込みが終了するまでの平均時間は1.49秒.

HDDの方にも同じことを行う.
この時の平均書き込み速度は167MB/sで書き込みが終了するまでの平均時間は33.32秒.

RAM Diskの方が約22倍高速に書き込みが行えることがわかった.

———–ここまで無駄話———–

仕上げの設定とスクリプト

fstab編

RAM Diskは作成できるようになったが, これではまだサーバとして機能させるのには少し面倒である.

まずは前の節で書いたような長いコマンドを少し減らす. かつfstabを書いてみたかったのでそれを書く.

sudo vim /etc/fstab

自分の使い方としてはPCを立ち上げたときに自動的にマウントしない方がいい(サーバ専用機ではない)ので, /etc/fstabに以下を追記する.

tmpfs /home/minecraft/mountPoint tmpfs async,noauto,exec,rw,user,uid=[minecraftサーバを動かすユーザID],size=2G 0 0

それぞれのオプションについてはman mountあたりを見てもらいたい.

fstabにこれらを記述することによってマウントするとき,

mount /home/minecraft/mountPoint

とするだけで自動的に2GBの容量のRAM Diskが作成されることになる.

同期編

ここまででRAM Diskを作成する手順は終了しているので次は実際にRAM Disk上でModサーバを建てる.

行うことは最初の方で仮に建てたサーバのファイルをRam Disk上に持ってきて実行するだけである.

これをいちいちコマンドでやっていると面倒なのでシェルスクリプトを書いた. それが以下である.

これはORIGDIR(つまり/home/minecraft/mountPoint)をマウントし, BACKUPDIR(バックアップの内容は後述)のファイルらをmoutPointに同期している.
それらが終わると確認のためのdfを実行して, lsでカレントディレクトリのファイルを表示させている.

このスクリプトを使用して仮に建てたサーバのファイルを同期させる.
そのための準備をする. またmcrestore.shが/home/minecraft/Downloads にあるものとする.

# mcrestore.shを使えるようにする
export PATH="$PATH:/home/minecraft/script"
mv ~/Downloads/mcrestore.sh ~/script/
chmod u+x ~/script/mcrestore.sh

# バックアップ ディレクトリの作成
mkdir backups

# シンボリックリンクの作成
ln -s ~/preServer ~/backup/latest

この状態(RAM DiskはmountPointにマウントされていない)でmcrestore.shを実行すると, mountPointに/etc/fstabで指定したRam Diskがマウントされ, ~/backups/latestの内容が~/mountPointに同期される.
また, これらの作業はこの記事を上から順にやってきた場合にのみ有効で2回目以降は必要ない.
latestの更新は次のバックアップ編のmcbackup.shで行われる.

バックアップ編

RAM Disk上に保存したデータはシャットダウンすると消えてしまうので, 電源を落とす前にバックアップを取る必要がある. サーバ専用機では電源を落とす時にスクリプトを走らせるが, 今回はそれには当てはまらないためスクリプトを叩いた時にバックアップ, アンマウントするようにする.
これも以下のスクリプトを作成した.

このスクリプトはまず実際にサーバを動かすディレクトリ(ORIGDIR)の中身を~/backups/mountPoint_[月-日_時:分:秒] という名前のディレクトリに同期する.

その後~/backups/latestからのシンボリックリンクを最新の~/backups/mountPoint_[月-日_時:分:秒] に更新し, アンマウントしている.

使用するにはmcrestore.shのように~/script に配置し, 実行権を与える.

やってみた結果

この状態でMinecraft JEでマルチプレイ(なお人数は2人の模様…)を行った.

前にRAM Disk化をせずにマルチプレイをした時よりも体感できるラグが大幅に少なくなった.
もっともその時はRAMの容量も少なかったのでRAM Diskの影響なのかRAMを多く積んだ影響なのかは判断し難いところではある.(えぇ…)

まとめ

C P U パ ワ ー が 欲 し い !

そもそも持ち運ぶサーバとは. ネットに建ててアクセスしろ!

とか色々思うわけですが, ローカルでちゃちゃっとやって持っていくのがてっとり早かった…

そもそも2月は忙しく, 起きて 8〜時間労働して帰ってきて飯食ってちょっと休憩して6時間寝るみたいな生活だったので自分的には死にそうでした.
ゆっくり生きたいものです.

その忙しい2月の休みの合間にマルチプレイをして, その帰りに何を思ったのか京都に行って鹿苑寺 金閣, 下鴨神社に行って夕方に本家 第一旭 たかばし本店という名ラーメン店行って帰ってきました.

金閣行く時雪降ってき, 下鴨神社に着く頃には快晴になり出し, ラーメン並んである間には雨が降ってくるという複雑な天気でした.

その後も仕事して2月の暮れに生の鶏を食べると今度は胃腸炎になり, 寝込みました.

生の鶏は控えようというお気持ちになって今.

他にも書ける内容はいくつかありますが, 電子工作系が皆無でやりたいことの中に構想まであるのですが, やらなくてはならないこともあり3月それに取り組めるかどうか…

というところで終わりです.

参考にしたサイト

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

WordPress.com Blog. テーマ: Baskerville 2 by Anders Noren

ページ先頭へ ↑