この連載が書籍になりました! 『マインクラフトでマルチサーバーを立てよう!』好評発売中です。

仮想環境やクラウド環境でサーバー構築

2016年12月19日(月)
ecolight

本連載も最終回となります。今回は、仮想環境やクラウド環境でサーバー構築する方法を解説します。

仮想環境でサーバーを構築する

最近は家庭用のPCでもマルチコアCPUが当たり前の時代になり、仮想環境も軽快に動作するようになってきました。そこで、Minecraftの試験環境として仮想環境でサーバーを設置してみます。

仮想環境のメリット

仮想環境のメリットとして、環境の起動・停止や複製・バックアップ等が比較的容易でさまざまな検証に使用できること、サーバーマシンを用意しなくても複数のOSを並列動作できることが挙げられます。サーバーの停止ではCPUやメモリの状態も含めて保存しておくことが可能で、Minecraftサーバーを起動した状態で保管しておくこともできます。

例えば、「PvPサーバーや分散サーバーを立てる」で分散サーバーについて解説しましたが、実際にサーバー機を用意する場合の設定や動作を仮想環境で検証できるでしょう(図1)。

図1:ハイパーバイザー方式の仮想化の例

Windows 10 Proで仮想環境を構築する

仮想環境を構築するにはさまざまな方法がありますが、今回は「Windows 10 Pro」に標準搭載されている「Hyper-V」で仮想環境を構築していきます。ゲストOSには筆者が使い慣れているという理由でLinuxディストリビューションの1つである「CentOS」を利用します。

Hyper-Vを有効にする

まずは、Hyper-Vを有効にする必要があります。「プログラムと機能」から「Windowsの機能の有効化または無効化」を参照しましょう。「プログラムと機能」はタスクバーのスタートメニュー(Windowsアイコン)を右クリックすると簡単に開けます(図2)。

図2:「プログラムと機能」から「Windowsの機能の有効化または無効化」参照する

「Windowsの機能」ダイアログ画面が開いたら、「Hyper-V」を有効に設定して再起動します(図3)。

図3:「Hyper-V」を有効にする

このとき、Hyper-Vプラットフォームを有効化できない(チェックが付けられない)ことがありますが、その場合はマザーボードのBIOSで仮想化支援機能を有効化した上で再度Hyper-Vの有効化操作を実施する必要があります。

BIOSメニューにおける項目名はメーカーによりさまざまですが、大抵はCPU系の設定画面に項目があります。ここで「仮想化テクノロジ」「ハードウェアによるデータ実行防止」の各項目を有効化する必要があり、Intel系では「Intel Virtualization Technology」や「Execute Disable Bit」などの文言になっていると思います。無事にHyper-Vを有効化できたら、スタートメニューなどからHyper-Vマネージャーを起動しましょう(図4)。

図4:Hyper-Vマネージャーを起動する

Hyper-Vマネージャーが起動したら、まずは仮想マシンがネットワークへ接続できるように仮想スイッチを追加しましょう。マネージャーの右側のメニューから「仮想スイッチマネージャー」を選択します(図5)。

図5:仮想スイッチマネージャーを起動する

仮想スイッチマネージャーが開いたら「新しい仮想ネットワークスイッチ」を選択し、「仮想スイッチの作成」で「外部」を選択して「仮想スイッチの作成」ボタンをクリックします(図6)。プロパティの設定画面が表示されるので、任意の名前を付けて「OK」ボタンを押して完了しましょう。

図6:仮想スイッチを作成する

仮想環境の作成

続けて、いよいよ仮想環境を作成していきます。Hyper-Vマネージャー右側のメニューから「新規」→「仮想マシン」を選択して「仮想マシンの新規作成ウィザード」を開始しましょう(図7)。

図7:仮想マシンの新規作成を開始する

まずは「名前」を決めます。適当な分かりやすい名前で大丈夫です。ここでは「Minecraftサーバー」としました。デフォルトではシステムディスク上のProgramData配下に保存されますが、容量の都合で他の場所が良ければ「仮想マシンを別の場所に格納する」にチェックを入れ、任意の場所を選択しましょう(図8)。

図8:仮想マシンの名前を決める

次に仮想マシンの世代を選択します(図9)。世代はインストールするゲストOSによって異なりますが、今回はCentOS 7.x系をインストールする予定なのでどちらでも構いません。なお、画面の下方にある「仮想マシンの世代のサポートの詳細」をクリックすると対応する世代や動作の詳細な説明を参照できます。ここでは第1世代を選択します。

図9:仮想マシンの世代を選択する

次に割り当てメモリを指定します。ゲストOSの推奨メモリサイズ+Minecraftサーバーで使用するメモリサイズを指定しましょう。ここでは4GB(4096MB)指定しました。「この仮想マシンに動的メモリを使用します。」にチェックを付けておくと、メモリが不足した場合に動的にメモリを確保するようになります。物理メモリのサイズに不安がある場合はチェックを付けておくと良いでしょう(図10)。

図10:仮想マシンの割り当てメモリを指定する

続く「ネットワークの構成」では、先ほど作成した仮想スイッチを選択します(図11)。

図11:仮想マシンに仮想スイッチを指定する

次に仮想ハードディスクを作成します。名前や場所は任意ですが、これもゲストOSが使用する最低サイズやMinecraftサーバーで使用するサイズを見積もっておきましょう。ここでは容量に余裕のある物理HDD上に127GBを確保するようにしました(図12)。

図12:仮想マシンに物理ハードディスクを設定する

OSのイメージファイルを入手する

あとはOSをインストールするだけです。ここで、先にインストールするOSのイメージファイルを入手しておきます。今回はCentOS 7.x系をインストールするので、CentOSの公式ページからDVD ISOイメージをダウンロードしましょう(図13)。

図13:DVD ISOを選択してCentOSのISOイメージファイルをダウンロード

「DVD ISO」をクリックすると複数のダウンロードミラーサイトが一覧表示されるので、国内のドメインから適当に選択してダウンロードします(図14)。

図14:Actual Countryのミラーサイト一覧から適当にダウンロード先を選択

ダウンロードが完了したら「仮想マシンの新規作成ウィザード」に戻り、ダウンロードしたDVD ISOイメージファイルを指定して「次へ」をクリックしましょう(図15)。

図15:CentOSのDVD ISOイメージファイルをインストールメディアに指定

最後に新規作成する仮想マシンの説明が表示されるので、確認して「完了」ボタンをクリックすると仮想マシンが作成されます(図16)。

図16:仮想マシンの説明を確認し「完了」ボタンをクリック

仮想マシンが作成されると、Hyper-Vマネージャーの仮想マシン一覧に作成した名前(Minecraftサーバー)の仮想マシンが追加されます(図17)。

図17:作成した仮想マシンが一覧に追加された

CentOSのインストールとSpigotサーバーの構築

ここからはCentOSをインストールし、JavaおよびSpigotサーバーを構築していきます。本来であればCentOSの設定はいろいろなセキュリティ対策を勘案しながら行う必要がありますが、とりあえずここでは「Spigotサーバーを動作させること」を目的に手短に実施していきます。

CentOSのインストール

それではCentOSをインストールしましょう。仮想マシンの一覧から前項で作成した仮想マシンを選択し、右クリックメニューから「接続」を選択すると、仮想マシン用のコンソールが起動します(図18)。

図18:仮想マシン用のコンソールを起動

この状態ではまだ停止しているので、上部の「操作」メニューから「起動」します。電源ボタンのアイコンからも起動できます。1分程度経過するとインストールディスクからブートを開始します(図19)。

図19:インストールディスクから起動

CentOSのインストールウィザードが起動したら、インストール時に使用する言語から「日本語」を選択し「続行」ボタンをクリックします(図20)。

図20:インストールに使用する言語を選択

続く「インストールの概要」画面から必要な設定を行っていきます。まずは「ソフトウェアの選択」をクリックして開きましょう(図21)。

図21:「インストールの概要」画面で「ソフトウェアの選択」をクリック

「ソフトウェアの選択」画面では「ベース環境」の一覧から「インフラストラクチャサーバー」を、「選択した環境のアドオン」の一覧から「FTPサーバー」と「Javaプラットフォーム」にチェックを入れて「完了」をクリックします(図22)。

図22:使用する構成に合わせてソフトウェアを選択。後から個別に手動インストールしても良い

「インストールの概要」画面に戻り、今度は「インストール先」を選択します。「インストール先」画面では「ローカルの標準ディスク」に先ほど指定した仮想ハードディスクが選択されていることを確認して「完了」をクリックします(図23)。

図23:インストールする仮想ディスクを確認する

再び「インストールの概要」画面に戻り、最後に「ネットッワークとホスト名」を選択します。「ネットワークとホスト名」画面では仮想スイッチへ接続します。

先ほど仮想スイッチを「外部」に設定したので、現在使用しているマシンがルーターなどに接続されている場合は自動的にローカルIPアドレスが割り当てられて表示されます。「ホスト名」には適当に分かりやすい名前を付けておきます。設定を終えたら「完了」ボタンで戻りましょう(図24)。

図24:ネットワークに接続

ここまでの設定を終えたら、「インストールの概要」画面右下の「インストールの開始」ボタンをクリックします。インストールを開始するとアカウントを設定する画面が表示されるので、ROOTパスワードの設定とユーザーの作成を行います。ここではROOTパスワードのみを設定したケースで説明を進めます(図25)。ROOTパスワードの設定画面の説明は見た通りなので割愛します。

図25:ROOTパスワードを設定。本来ならばユーザーも作成し適切な権限を与える作業が必要

インストールが完了したら、「再起動」ボタンを押して再起動します(図26)。

図26:ROOTパスワード設定などを実施したことを確認して「再起動」する

JDKのインストール

再起動後に「設定したホスト名+login:」でログインプロンプトが表示されたらOKです。先ほど設定したROOTパスワードを入力してログインしましょう。ログインユーザー名は「root」です。パスワードは入力中非表示なので間違えないように入力しましょう(図27)。

図27:ログイン

ログインができたら、以下のコマンドを実行してyumのパッケージを最新にしておきます(少し時間がかかります)。

yum -y update

「Complete!」と表示されたら完了です。続いて、Javaのバージョンを確認します(図28)。

図28:Javaのバージョンを確認

この時点で期待したバージョンになっていれば問題ありませんが、そうではない場合にはアップデートしましょう。今回は、まだCentOSのパッケージとしては提供されていない最新版のJavaをインストールします。

URLを指定してwgetコマンドでファイルを取得しても良いのですが、今回はせっかくなのでFTPでアップロードしてみましょう。まず、JavaのダウンロードページからLinux版の最新JDKをダウンロードします。なおMinecraftサーバーに4GB以上のメモリを割り当てる場合は必ず64bit版をダウンロードしてください(図29)。

図29:Javaの最新版をダウンロードする

まず、FTP接続するためにIPアドレスを確認します。「ifconfig」コマンドや「ip addr show」コマンドを実行しましょう(図30)。

図30:FTP接続するためにローカルIPアドレスを確認する

次に、確認したIPアドレスにFTPクライアントを用いて接続します(図31)。

図31:FTPクライアント(WinSCP)で接続する例

接続できたら/tmpに移動して、ダウンロードしたJDKファイルを左側のペインから右側のペインにドラッグ&ドロップします(図32)。

図32:JDKを/tmpにアップロードする

これで、無事にアップロードできました。アップロードしたファイルが/tmp配下に格納されていることを確認してみましょう(図33)。

図33:/tmpにアップロードしたファイルを確認する

それでは、yumを使用してJDKをインストールしましょう。以下のコマンドで実行します。

yum -y localinstall jdk-<version>-linux-x64.rpm

インストールが完了したら、alternativesコマンドで使用するJavaを切り替えます。

alternatives --config java

インストールされているJDKの中から選択する番号が表示されるので、最新のJDKの番号を入力して[Enter]キーで確定します。切り替え後はJavaのversionオプションで結果を確認しておきましょう(図34)。

図34:使用するJavaの切り替え結果を確認する

Spigotのインストール

続けて、Spigotの導入準備をします。まずは以下のコマンドでgitをインストールしましょう。

yum -y install git

あとは「MODサーバーの立ち上げとプラグインによる機能追加」の解説を参考にspigotをビルドします。今回はMinecraftのバージョン1.10.2を指定してビルドしてみます。

mkdir ~/spigot
cd ~/spigot
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
java -jar BuildTools.jar --rev 1.10.2

ビルドが完了したら、起動用のディレクトリを用意して起動確認してみます。

mkdir ~/minecraft_server
cp spigot-1.10.2.jar ~/minecraft_server/
cd ~/minecraft_server/
java -jar spigot-1.10.2.jar

環境が整えられていれば一度Minecraftサーバーが立ち上がり、eula.txt(EULA(end-user license agreements:ソフトウェア利用許諾契約)。第1回参照)が出力されていることを確認できるでしょう(図35)。

図35:eula.txtが出力されていることを確認する

viエディタなどでeula.txtを開き、同意後に再度実行して確認してみましょう。正常に起動できたでしょうか。ただし、この時点ではまだクライアントからは接続できません。

次に、以下の要領でファイアーウォールの定義ファイルを追加します。

cd /usr/lib/firewalld/services
cp ssh.xml minecraft.xml
vi minecraft.xml

viの部分は使い慣れたエディタで問題ありません。Minecraft.xmlの内容を以下のような形で書き換えます。

<?xml version="1.0" encoding="utf-8"?>
<service> 
<short>MINECRAFT</short>
<description> minecraft server firewall rule.</description>
  <port protocol="tcp" port="25565"/>
</service>

ファイアーウォールの定義ファイルを追加したら、以下のコマンドで定義ファイルの読み込みと定義の有効化/恒久設定化をします。

firewall-cmd --reload
firewall-cmd --add-service=minecraft --zone=public
firewall-cmd --add-service=minecraft --zone=public --permanent

これで仮想マシンのローカルIPアドレスを指定してMinecraftから接続できるようになったと思います。

CentOSに合わせて起動/停止を管理する

次にOSの起動/停止時にMinecraftサーバーも自動的に起動/停止するようにしてみましょう。以下のコマンドでscreenコマンドを導入します。screenコマンドでは、バックグラウンドでコマンド入力受付可能な非同期プロセスを立ち上げることができます。

yum -y install screen

また、Minecraftサーバーの関連ファイルを管理者用の実行ファイルとして/usr/local/binに移動しておきましょう。

cd ~/
mv minecraft_server/ /usr/local/bin/

まずはサーバーの起動処理と生存監視のために、以下のスクリプトを/usr/local/bin/minecraft_server/start.shとして作成します。

#!bin/sh
# Minecraft サーバー起動・監視スクリプト

# 設定
MEM="2048m"
HEALTHCHECK=5

# 多重起動チェック
if [ 1 -eq `screen -ls | grep "mcserver" | wc -l` ] ; then
    logger -s -p user.info -t [server] Already started Minecraft server.
    exit 1
fi

# 起動
cd $(dirname $0)
logger -s -p user.info -t [server] Start Minecraft server.
screen -AmdS mcserver java -server -Xms${MEM} -Xmx${MEM} -jar spigot-1.10.2.jar

# 監視
while [ 1 -eq `screen -ls | grep "mcserver" | wc -l` ] ; do
    sleep ${HEALTHCHECK}
done

次にサーバーの停止とタイムアウト監視のために、以下のスクリプトを /usr/local/bin/minecraft_server/stop.shとして作成します。

#!bin/sh
# Minecraft サーバー停止スクリプト

# 設定
STOP_INTERVAL=10
HEALTHCHECK=5
TIMEOUT=120

# 多重停止防止
if [ 0 -eq `screen -ls | grep "mcserver" | wc -l` ] ; then
    logger -s -p user.info -t [server] Already Minecraft server stopped.
    exit 1
fi

# 停止(サーバー内に告知してから停止する)
cd $(dirname $0)
screen -S mcserver -X stuff $"say サーバーを停止します(${STOP_INTERVAL}秒前)\r"
sleep ${STOP_INTERVAL}
screen -S mcserver -X stuff $'stop\r'

# 監視
COUNT=0
while [ 1 -eq `screen -ls | grep "mcserver" | wc -l` ] ; do
    sleep ${HEALTHCHECK}
    COUNT=$(( COUNT + HEALTHCHECK ))
    if [ $COUNT -gt $TIMEOUT ] ; then
        # タイムアウト
        logger -s -p user.err -t [server] Minecraft server stop timeout detected.
        pkill -9 java
        logger -s -p user.err -t [server] Minecraft server force stopped.
        exit 2
    fi
done
logger -s -p user.info -t [server] Minecraft server stop successful.

スクリプトに実行属性を付加しておきます。

cd /usr/local/bin/minecraft_server/
chmod +x start.sh stop.sh

ここで、サーバー起動/停止時にスクリプトが実行されるようにsystemdのUNIT設定ファイルを作成します。以下の内容で/etc/systemd/system/mcserver.serviceファイルを作成します。

[Unit]
Description=Minecraft Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/minecraft_server/start.sh
ExecStop=/usr/local/bin/minecraft_server/stop.sh
Restart = always

[Install]
WantedBy=multi-user.target

定義の意味は以下の通りです。

Description:スクリプトの説明を記載する
After:指定したUNITの起動後に起動する。*.targetはUNITをまとめたもの
Type = simple:ExecStartのコマンド実行時点で起動完了と認識する
ExecStart:start/reloadの際に実行される起動コマンドを指定する
ExecStop:stop/reloadの際に実行される停止コマンドを指定する
Restart = always:意図しない終了を検知した場合に自動的に再起動する
WantedBy = multi-user.target:従来のランレベル3相当。起動ターゲットを指定する

上記ファイルの作成後、以下コマンドでsystemdにスクリプトを登録し、Minecraftサーバーを起動します。

systemctl daemon-reload
systemctl enable mcserver.service
systemctl start mcserver.service

これでrebootしても連動してMinecraftサーバーの停止と開始処理が行われるようになりました。加えて、systemdがinfoレベルで出力するsyslogが一部過剰なので抑止する設定をしておきます。

echo 'if $programname == "systemd" and ($msg contains "Starting Session" or $msg contains "Started Session" or $msg contains "Created slice" or $msg contains "Starting user-") then stop' >/etc/rsyslog.d/ignore-systemd-session-slice.conf
systemctl restart rsyslog

仮想環境については以上です。Hyper-Vマネージャーから対象の仮想マシンを「保存」するとOSをシャットダウンせずに作業状態を保存できます。また、対象のマシンを「エクスポート」すると環境をファイルに出力でき、Hyper-Vマネージャーの右側のメニューから「仮想マシンのインポート」を選択して環境を増やすこともできます。次に紹介するクラウド環境でのサーバー構築でも、仮想環境を駆使すると「どれぐらいのリソースを要するか」を測りやすいと思いますので、ぜひ活用してみましょう。

クラウド環境でサーバー構築する

ここでは、Microsoft Azure上にMinecraftサーバーを構築してみます。クラウド環境と言っても、今回はIaaSの「Virtual Machines」を利用し、PaaSの「Cloud Services」には触れません。Virtual Machinesの利用については、単純にMinecraftサーバーを立てるだけであればWeb上の手続きが介在する以外はローカルマシンにおける仮想環境でのサーバー構築と大きな差異はありません。

Microsoft Azureのアカウントを作成する

まず、Microsoft Azureのアカウントを作成します。Microsoft Azureの公式ページから「無料アカウント」→「無料で始める」とページを辿り、メールアドレスを入力して登録を開始します(図36)。

図36:Microsoft Azureの無料アカウントを作成する

必要な情報を入力していき、登録が完了するとMicrosoft AzureのPortal画面に遷移します(図37)。

図37:Microsoft AzureのPortal画面が表示される

仮想マシンの構築と同様に、CentOSの仮想マシンをMicrosoft Azure上に用意してみましょう。Portal画面の左側のメニューから「新規」→「Compute」→「すべて表示」を選び、一覧から「CentOS-based7.2」を選択します(図38)。

図38:「Compute」の一覧から「CentOS」を選択する

次に、仮想マシンの作成に必要な各種設定を行います(図39)。無料のお試し期間は特に課金されることはないはずなので、自由に設定してどんなものか確認しましょう。通信速度の問題があるため「場所」は国内をお勧めします。

図39:仮想マシンの設定(スペックなど)を決める

ひと通りの設定が完了すると、Portal画面に戻ります。ここで仮想マシン構築の進捗状況が確認できるので、完了するまで待ちましょう(図40)。

図40:仮想マシンのデプロイが完了するまで待つ

仮想マシンの構築が完了したら「仮想マシン」をクリックして操作画面を開きます。表示されている「パブリックIPアドレス」を控えておきましょう(図41)。

図41:「仮想マシン」の操作画面を開く

ログインして環境構築と設定を行う

仮想マシンは実行中の状態になっているので、SSHクライアントから接続してみましょう。IPアドレスは上で控えた「パブリックIPアドレス」で、ユーザー名とパスワードは仮想マシン作成時に設定したものを使用します。

ログインできたら、CentOS側は「仮想環境でサーバー構築する」の項で実施したのと同じような手順で環境を構築します。実際に環境を構築したりMinecraftサーバーを起動したりすると仮想マシンの操作画面上に各リソースの使用状況がリアルタイムに反映されます。今後本格的に利用していく場合には課金やスケール変更などの際の目安にすると良いでしょう(図42)。

図42:「仮想マシン」の操作画面上からリソースの使用状況が分かる

この時点ではまだMinecraftサーバーとして公開できないため、ネットワークの設定を追加していきます。仮想マシン画面の左側のメニューから「ネットワークインタフェース」を選択し、自動生成されたネットワークインタフェースを選択します。次に表示されたネットワークインタフェースの画面から更に「ネットワークセキュリティグループ」を選択します(図43)。

図43:ネットワークセキュリティグループを開く

「ネットワークセキュリティグループ」画面を開いたら「受信セキュリティ規則」をクリックして「追加」ボタンからMinecraftサーバー用の通信許可設定を追加します。「優先度」や「名前」は任意、「ソース」は「Any」、「サービス」は「カスタム」、「プロトコル」と「ポート」は「TCP」の「25565」番を「許可」にします(図44)。

図44:Minecraftのサーバーポートを開放する

あとはCentOS側でMinecraftサーバーを立ち上げれば、最初に控えたパブリックIPアドレスでMinecraftのクライアントからサーバーに接続できるはずです(図45)。

図45:Minecraftのクライアントからサーバーに接続してみる

以上、クラウド環境でのMinecraftサーバー構築について簡単に解説しました。こういったクラウド環境では細かい機能やスケーラビリティのようなクラウド特有の長所に意識が向きがちですが、自宅に専用のMinecraftサーバーを持つのと比較すると物理的な設置場所や電気・回線料金、ハードウェアトラブルの対応といった面で手間が掛からないだけでも非常に優位性があります。

おわりに

今回は、仮想環境やクラウド環境におけるMinecraftサーバーの構築について解説しました。これで全11回にわたる本連載は終了となりますが、サーバー運営の魅力や技術はまだまだ数多くあります。是非本連載を読んでいる皆さんの手でマルチサーバーを構築・運営していただき、Minecraft界隈を盛り上げる仲間が1人でも増えると嬉しいです。長期間ご愛読いただき、ありがとうございました!

本連載について

Minecraftの公式記事ではありません。本連載の内容はMojangから承認されているわけではなく、Mojangとは関係ありません。

Minecraftの非公式日本ユーザーフォーラム管理人

同フォーラムに付帯する生活系マルチサーバーもMinecraft製品版発売以降個人運営を続けている。ご相談などありましたらフォーラム(http://forum.minecraftuser.jp/)やTwitter@ecolightまで。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています