CentOSでのminecraft_server(マルチサーバ)バックアップ

バックアップの必要性

原因は色々とあるのですが、minecraftで遊んでいると、まれにゲームデータが壊れてしまうことがあります。

そうなると、プレイに支障をきたし、せっかく時間を掛けて作ってきた世界が突然失われてしまいます・・

ですが、バックアップさえ取っていれば世界の全消失は避けられるのです。

自分のところは大丈夫と思っていて油断していると、後で後悔する羽目になります・・・

バックアップはとても大事です!!

バックアップの方法

ということで、CentOSでの「minecraft_server(マルチサーバ)」バックアップの方法について説明していきます。

バックアップの方法は大まかに分けると、2通りの方法があります。

  • minecraftサーバを停止する方法
  • minecraftサーバを停止しない方法

それぞれに方法には、それぞれメリットとデメリットがあります。

minecraftサーバを停止する方法

メリット
 バックアップ中のデータ変更がないためチャンクエラーが発生しづらい

デメリット
 サーバが停止するので、その間遊べなくなる

サーバを停止しない方法

メリット
 サーバが動作しているので、中にいる人たちは遊び続ける事ができる

デメリット
 バックアップ中にデータ更新があるとチャンクエラー等が発生することがある

どちらのバックアップが良いのか

それぞれの方法に、メリット、デメリットがありますので、用途に合わせて最適な方法でバックアップを取りましょう。

例えば、1日1回サーバに人がいない・少ない場合にはサーバを停止してバックアップをとり、それ以外のときでバックアップを取りたいときは、サーバを停止させずにバックアップをとりあえず取っておくとかですかね。

事前準備

私が普段行っている「サーバを停止する方法」と「サーバを停止しない方法」、それぞれの手順について説明していきますが、まずは、事前準備としてバックアップしたデータの保管場所を用意していきます。

バックアップデータ保管場所作成

「df」コマンドでディスクの空き容量を確認し、どこにバックアップデータを格納するか決めます。

ディスク空き容量の確認

「df」コマンドで確認してみると、空きがあるのは「/home」なので、今回はそこにバックアップデータを格納することにします。

$ df -h
ファイルシス                       サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos_wwwxxxxxx-root    50G  1.4G   49G    3% /
devtmpfs                             991M     0  991M    0% /dev
tmpfs                               1001M     0 1001M    0% /dev/shm
tmpfs                               1001M  8.4M  993M    1% /run
tmpfs                               1001M     0 1001M    0% /sys/fs/cgroup
/dev/vda1                            497M  121M  377M   25% /boot
/dev/mapper/centos_wwwxxxxxx-home   148G   58M  148G    1% /home

※ちなみに私の環境では「minecraft_server」は「/opt/minecraft」ディレクトリに格納してあります。

バックアップデータ保存用ディレクトリの作成

私は、「minecraft_server」を「minecraft」というユーザで動作させているので、「minecraft」ユーザのホームディレクトリ「/home/minecraft」内に「mc_backup」というディレクトリを作成することにしました。

$ mkdir /home/minecraft/mc_backup/

サーバを停止してのバックアップ

「minecraft_server」を停止してバックアップする際の流れは以下の通りとなります。

  1. minecraft_serverの停止
  2. データバックアップ
  3. minecraft_serverの開始

非常にシンプルですね。

では、それぞれの項目の手順を説明させていただきます。

「minecraft_server」の停止

まずは、「minecraft_server」を停止させます。

停止方法

下記のどちらかの方法でも停止させることが出来るので、お好きな方法で停止させてください。

  • サーバのコンソールで「/stop」「stop」コマンドを実行
  • ゲーム画面上から「/stop」コマンドを実行

コンソールからの停止

「minecraft_server」が動作している、サーバのコンソール(minecraft_serverの動作ログが表示されている画面)で「/stop」「stop」コマンドを実行することで、停止させることが出来ます。

[16:52:29] [Server thread/INFO]: Using epoll channel type
[16:52:30] [Server thread/INFO]: Preparing level "world"
[16:52:30] [Server thread/INFO]: Preparing start region for level 0
[16:52:31] [Server thread/INFO]: Preparing spawn area: 31%
[16:52:32] [Server thread/INFO]: Done (1.975s)! For help, type "help" or "?"
stop   <---「/stop」「stop」と入力
[16:55:00] [Server thread/INFO]: Stopping the server
[16:55:00] [Server thread/INFO]: Stopping server
[16:55:00] [Server thread/INFO]: Saving players
[16:55:00] [Server thread/INFO]: Saving worlds
[16:55:00] [Server thread/INFO]: Saving chunks for level 'world'/Overworld
[16:55:01] [Server thread/INFO]: Saving chunks for level 'world'/Nether
[16:55:01] [Server thread/INFO]: Saving chunks for level 'world'/The End
[16:55:01] [Server Shutdown Thread/INFO]: Stopping server
[16:55:01] [Server Shutdown Thread/INFO]: Saving players
[16:55:01] [Server Shutdown Thread/INFO]: Saving worlds
[16:55:01] [Server Shutdown Thread/INFO]: Saving chunks for level 'world'/Overworld
screenを使用している場合

ちなみに、私の構築手順で「minecraft_server」構築している場合は、「screen」コマンド上で作成したコンソール上で「minecraft_server」を動作させているため、まずは、「minecraft_server」が動作視しているコンソールに接続(アタッチ)する必要があります。

PID確認

まずは、「screen -ls」コマンドで動作している「screen」の端末PIDを確認します。

$ screen -ls
There is a screen on:
        1345.minecraft  (Detached)
1 Socket in /var/run/screen/S-minecraft.
コンソールへ接続(アタッチ)

上記の場合「1345」というのが、PIDになるので「screen -r [PID]」コマンドを使用して接続(アタッチ)します。

$ screen -r 1345

これで、「minecraft_server」が動作しているコンソールに接続(アタッチ)できます。

この画面で「/stop」「stop」コマンドを実行すると、「minecraft_server」が停止しこのコンソールも終了し、元のコンソールに戻ってきます。

「/stop」「stop」コマンドを実行しないで、元のコンソールに戻るには「Ctrl」+「a」を押下した後に「Ctrl」+「d」を押すことで、元のコンソールに戻ってこれます(デタッチ)。

ゲーム画面からの停止

Level 4のオペレータ権限をもったユーザのみ実行可能ですが、ゲーム画面上で「/stop」と入力することで停止させることが出来ます。

minecraft-stop

データバックアップ

「minecraft_server」が停止しましたら、次にデータのバックアップを行っていきます。

バックアップ対象は「minecraft_server」が格納されているディレクトリをまるごとになります。

バックアップユーザについて

バックアップは、「minecraft_server」のデータ所有者と同じユーザで行います。

私の場合は、私の環境では「/opt/minecraft」ディレクトリに、「minecraft_server」のデータが格納されていて「minecraft」というユーザがデータの所有者になっているので、該当ディレクトリを「minecraft」ユーザでバックアップを行っています。

格納ディレクトリと所有者情報
$ ls -la /opt
合計 8
drwxr-xr-x.  3 root      root        22  4月  3 17:21 .
dr-xr-xr-x. 17 root      root      4096  4月  3 17:04 ..
drwxr-xr-x   4 minecraft minecraft 4096  4月 30 16:18 minecraft
データのバックアップ

「tar」コマンドで、フォルダを丸ごとバックアップしていきます。

バックアップする際には、いつバックアップしたデータか後ですぐに分かるような名前をつけておきましょう。

私はいつも「date」コマンドを使用して、バックアップ取得日時を自動的につけています。

$ cd /home/minecraft/mc_backup
$ tar cfvz minecraft_`date +%Y%m%d-%H%M%S`.tar.gz /opt/minecraft/

※ここでは、「tar」コマンドでデータのバックアップを行っていますが、それ以外の「cp」コマンド等でバックアップを行っても特に問題はありませんので、好きな方法でバックアップを行ってください。

minecraft_serverのスタート

ファイルバックアップが完了しましたら、「minecraft_server」起動させてください。

以上で、サーバを停止してのバックアップは完了です。

サーバを停止しない方法

次に、「minecraft_server」を停止させずに、バックアップをとる方法です。

バックアップの流れは下記のようになります。

  1. メモリ上のデータ保存
  2. ワールドデータの自動保存禁止
  3. データバックアップ
  4. ワールドデータの自動保存再開

メモリ上のデータ書出し

まずは、「/save-all」「save-all」コマンドで、メモリ上のデータを書き出します。

「save-all」コマンドは、下記のどちらかの方法で実行することが出来きます。

  • サーバのコンソールで「/save-all」「save-all」コマンドを実行
  • ゲーム画面上から「/save-all」コマンドを実行

サーバコンソール上から実行

「minecraft_server」が動作している、サーバのコンソール(minecraft_serverの動作ログが表示されている画面)で「/save-all」「save-all」コマンドを実行すると、ワールドデータのセーブが実行され、その旨のメッセージが表示されます。

[15:39:09] [Server thread/INFO]: Done (1.719s)! For help, type "help" or "?"
save-all  <---「/save-all」コマンド実行
[15:41:02] [Server thread/INFO]: Saving...
[15:41:02] [Server thread/INFO]: Saved the world

ゲーム画面上から実行

オペレータ権限を持ったユーザで「/save-all」コマンドを実行します。

minecraft-saveall01

ワールドデータの保存が実行され、その旨のメッセージが表示されます。

minecraft-saveall02

ワールドデータの自動保存禁止

データのバックアップ中に、ワールドデータの自動保存が発生しないよう「save-off」コマンドで、ワールドデータへの書き込みを一時的に中断します。

「save-off」は下記のどちらかの方法で実行することが出来きます。

  • サーバのコンソールで「/save-off」「/save-off」コマンドを実行
  • ゲーム画面上から「/save-off」コマンドを実行

サーバコンソール上から実行

サーバコンソール上で「/save-off」「save-off」」コマンドを実行すると、「Turned off world auto-saving」と表示され、オートセーブ機能が停止された旨のメッセージが表示されます。

/save-off  <--「/save-off」コマンドを実行
[15:42:01] [Server thread/INFO]: Turned off world auto-saving

ゲーム画面上から実行

オペレータ権限を持ったユーザで「/save-off」コマンドを実行します。

minecraft-saveoff01

ワールドデータの自動保存が無効にされた旨のメッセージが表示されます。

minecraft-saveoff02

データのバックアップ

次にバックアップをしていくのですが、バックアップ対象データは下記のものとなります。

バックアップ対象データ

  • 「world」ディレクトリ ※server.propertiesでworld名( level-name=world)を変更している場合はその名前のディレクトリ
  • banned-ips.json
  • banned-players.json
  • ops.json
  • server.properties
  • usercache.json
  • whitelist.json

サーバを停止する方法では、ディレクトリごと丸ごとバックアップしましたが、今回は「minecraft_server.jar」やログファイル等の動作や書き込みし続けているものはバックアップ対象からはずしています。

バックアップ実行

バックアップデータ保存用のディレクトリに移動して、対象ファイルをtarでバックアップしていきます。

$ cd /home/minecraft/mc_backup
$ tar cfvz minecraft_`date +%Y%m%d-%H%M%S`.tar.gz /opt/minecraft/*.json /opt/minecraft/server.properties /opt/minecraft/world

ワールドデータの自動保存再開

データのバックアップが終わったら、忘れずに「save-on」コマンドでワールドデータの自動保存を再開させてください。

「save-on」コマンドは下記のどちらかの方法で実行することが出来きます。

  • サーバのコンソールで「/save-on」「save-on」コマンドを実行
  • ゲーム画面上から「/save-on」コマンドを実行

サーバコンソール上から実行

サーバコンソール上で「/save-on」コマンドを実行すると、「Turned on world auto-saving」と表示され、オートセーブ機能が開始された旨のメッセージが表示されます。

save-on
[16:06:55] [Server thread/INFO]: Turned on world auto-saving

ゲーム画面上から実行

オペレータ権限を持ったユーザで「/save-on」コマンドを実行します。

minecraft-saveon01

ワールドデータの自動保存が有効にされた旨のメッセージが表示されます。

minecraft-saveon02

以上で、「minecraft_server」を停止させずに行うバックアップは完了です。

バックアップスクリプト

バックアップを取るのは大事なのですが、毎回手動でバックアップを取るのは結構面倒なので、「screen」コマンドを使用して、「minecraft_server」を動作させている環境限定ですが、バックアップ用スクリプトを作成してみました。

お約束

まずは、このスクリプトについてのお約束です。

  • ご利用は自己責任でお願いいたします

私の環境では何度も動作テストを行っていますが、万が一に備えて実行前に手動でバックアップをとっておいてください。

スクリプトの説明

「minecraft_server」を停止してバックアップを行うスクリプトと、停止しないでバックアップを行う2種類のスクリプトを作ってみました。

  • mc_backup_full.sh 「minecraft_server」を停止してバックアップ
  • mc_backup_hourly.sh 「minecraft_server」を停止しないでバックアップ

それぞれの、スクリプトで使われている変数の説明を下記に記述します。環境に合わせて編集してください。

変数について
変数名 説明
SERVICE miecraft_serverの実行ファイル名
現在起動させている実行ファイル名を指定します
USERNAME minecraft_server実行ユーザ
現在起動させている実行ユーザ名を指定します
SCNAME screen端末名
現在minecraft_serverを起動させているscreen端末名を指定します
MC_PATH minecraft_serverインストールディレクトリ
BK_PATH バックアップデータ格納ディレクトリ
事前にディレクトリ作成が必要
BK_TIME バックアップ取得時刻を`date +%Y%m%d-%H%M%S`で取得
BK_NAME バックアップファイル名
BK_GEN バックアップファイルの何日分残すかの設定
XMX 「minecraft_server」起動時のメモリ最大割り当て値
現在起動させている「minecraft_server」と値を等しくします
XMS 「minecraft_server」起動時のメモリ初期値
現在起動させている「minecraft_server」と値を等しくします
BK_FILE バックアップ対象データ
mc_backup_hourly.sh にのみ設定
追加でバックアップしたいデータがある場合のみ編集が必要となります

スクリプトの使い方

適当な場所に「minecraft_server」を実行させているユーザで、スクリプトを作成してください。その際には、実行権限を忘れずにあたえましょう。

スクリプトの作成

下記の例では、「/opt/minecraft」ディレクトリに「mc_backup_full.sh」作成しています。

$ vi /opt/minecraft/mc_backup_full.sh
$ chmod +x /opt/minecraft/mc_backup_full.sh

テスト方法

作成したスクリプトは、オプションに「-x」をつけて実行することで、実行内容を表示させることができるので、正常に動作するかどうかまずは、これで確認してみてください。

$ sh -x /opt/minecraft/mc_backup_full.sh
+ SERVICE=minecraft_server.jar
+ USERNAME=minecraft
+ SCNAME=minecraft
+ MC_PATH=/opt/minecraft
+ BK_PATH=/home/minecraft/mc_backup
++ date +%Y%m%d-%H%M%S
+ BK_TIME=20151002-143656
+ BK_NAME=/home/minecraft/mc_backup/mc_backup_full_20151002-143656.tar.gz
+ BK_GEN=3
+ XMX=1024M
+ XMS=1024M
+ cd /opt/minecraft


######   中略   #####

/opt/minecraft/usercache.json_20150918
/opt/minecraft/ops.json
/opt/minecraft/mc_backup_hourly.sh_20150930
/opt/minecraft/mc_backup_full.sh
+ sleep 10
+ echo 'Full Backup compleate!'
Full Backup compleate!
+ find /home/minecraft/mc_backup -name 'mc_backup_full*.tar.gz' -type f -mtime +3 -exec rm '{}' ';'
+ echo 'Starting minecraft_server.jar...'
Starting minecraft_server.jar...
+ screen -AmdS minecraft java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui

これで、途中でエラーが発生しても内容が表示されるはずです。

サーバを停止するバックアップスクリプト

こちらのスクリプトは、「minecraft_server」を停止させてから、バックアップをとるためのシェルスクリプトとなります。

私がサーバを停止して、フルバックアップを取得するときに使用しているスクリプトなので、「mc_full_backup.sh」としています。

mc_backup_full.sh

#!/bin/bash

SERVICE='minecraft_server.jar'
USERNAME='minecraft'
SCNAME='minecraft'
MC_PATH='/opt/minecraft'
BK_PATH='/home/minecraft/mc_backup'

BK_TIME=`date +%Y%m%d-%H%M%S`
BK_NAME="$BK_PATH/mc_backup_full_${BK_TIME}.tar.gz"
BK_GEN="3"

XMX="1024M"
XMS="1024M"


cd $MC_PATH

ME=`whoami`

if [ $ME == $USERNAME ] ; then
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "Full backup start minecraft data..."
      screen -p 0 -S $SCNAME -X eval 'stuff "say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map..."\015'
      sleep 10
      screen -p 0 -S $SCNAME -X eval 'stuff "save-all"\015'
      screen -p 0 -S $SCNAME -X eval 'stuff "stop"\015'
      echo "Stopped minecraft_server"
      echo "Full Backup start ..."
      tar cfvz $BK_NAME $MC_PATH
      sleep 10
      echo "Full Backup compleate!"
      find $BK_PATH -name "mc_backup_full*.tar.gz" -type f -mtime +$BK_GEN -exec rm {} \;
      echo "Starting $SERVICE..."
      screen -AmdS $SCNAME java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui
    else
      echo "$SERVICE was not runnning."
  fi
else
  echo "Please run the $USERNAME user."
fi

サーバを停止させないバックアップスクリプト

こちらのシェルスクリプトは、「minecraft_server」を停止させないでバックアップを取得します。

mc_backup_hourly.sh

私が毎時バックアップを取得するときに使用しているスクリプトなので、「mc_backup_hourly.sh」としています。

変数の内容は、「mc_backup_full.sh」と同じですが、「BK_FILE」でバックアップ対象データをしている部分だけ、追加となっています。

#!/bin/bash

SERVICE='minecraft_server.jar'
USERNAME='minecraft'
SCNAME='minecraft'
MC_PATH='/opt/minecraft'
BK_PATH='/home/minecraft/mc_backup'

BK_TIME=`date +%Y%m%d-%H%M%S`
BK_GEN="3"
BK_NAME="$BK_PATH/mc_backup_hourly_${BK_TIME}.tar"
BK_FILE="$MC_PATH/world \
        $MC_PATH/banned-ips.json \
        $MC_PATH/banned-players.json \
        $MC_PATH/ops.json \
        $MC_PATH/server.properties \
        $MC_PATH/usercache.json \
        $MC_PATH/whitelist.json"

cd $MC_PATH

ME=`whoami`

if [ $ME == $USERNAME ] ; then
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "Backup start minecraft data..."
      screen -p 0 -S $SCNAME -X eval 'stuff "save-all"\015'
      sleep 10
      screen -p 0 -S $SCNAME -X eval 'stuff "save-off"\015'
      tar cfv $BK_NAME $BK_FILE
      sleep 10
      screen -p 0 -S $SCNAME -X eval 'stuff "save-on"\015'
      echo "minecraft_server backup compleate!"
      gzip -f $BK_NAME
      find $BK_PATH -name "mc_backup_hourly_*.tar.gz" -type f -mtime +$BK_GEN -exec rm {} \;
    else
      echo "$SERVICE was not runnning."
  fi
else
  echo "Please run the echo $USERNAME user."
fi

定期バックアップ設定

上記のシェルスクリプトを「cron」に登録することで、自動的にバックアップを取れるようになります。

crontab設定

この作業は、「minecraft_server」を実行させているユーザで行う必要があります。

$ crontab -e

設定内容

今回は、毎日4:30分にサーバを停止してのバックアップを行い、毎時30分にサーバを停止させずにバックアップを行う設定となっています。

30 4 * * * /opt/minecraft/mc_backup_full.sh
30 * * * * /opt/minecraft/mc_backup_hourly.sh

バックアップの間隔は、適宜お好きなように設定してください。

crontabの詳しい設定方法はこちらのページにまとめてあります。

リストアの方法

バックアップデータからのリストア(復元)方法は非常に簡単で、作業の流れは下記のようになります。

  1. バックアップデータの解凍
  2. minecraft_serverの停止
  3. データリストア
  4. minecraft_serverの開始

バックアップデータの解凍

「tar」コマンドを使用して、リストアしたいバックアップデータを解凍します。

この作業はバックアップの際と同じ様に「minecraft_server」を動作させているユーザで行ってください。

解凍方法

$ tar xzfv バックアップデータ

下記は、実際にバックアップデータを解凍したときのログとなります。

$ tar xfzv mc_backup_full_20151002-043001.tar.gz
opt/minecraft/
opt/minecraft/minecraft_server.1.8.3.jar
opt/minecraft/minecraft_server.jar
opt/minecraft/logs/
opt/minecraft/logs/2015-04-03-1.log.gz

#####  以下略  #####

解凍が完了すると、作業を行ったディレクトリに「opt」というディレクトリがつくられ、その中の「minecraft」ディレクトリにバックアップしたデータが格納されています。

バックアップデータが格納されているディレクトリ名についてですが、私の環境では「/opt/minecraf」ディレクトリに「minecraft_server」がインストールされているため、このディレクトリ名になっていますが、別のディレクトリに「minecraft_server」をインストールし、それをバックアップした際には、そのディレクトリ名に読み替えてください。

例えば「/home/minecraft/minecraft」とディレクトリにインストールされた環境でバックアップを行い、データの解凍を行うと「home」というディレクトリが作成され、その中にバックアップデータが格納されているということになります。

minecraft_serverの停止

バックアップデータをリストアする前に、「minecraft_server」を停止させます。

停止の方法は、このページのバックアップ作業の箇所で説明していますので、そちらをご確認願います。

データリストア

データのリストアは簡単で、リストアを行いたいファイルを「cp」コマンドなどで置き換えるだけです。

ファイル単体のリストア

「server.properties」等のファイル単体をリストアしたい場合は、「cp -p」コマンドでデータをコピーしてください。

$ cp -p 解凍したバックアップデータ 現在のデータ

ワールドディレクトリのリストア

ワールドデータなどは通常「world」ディレクトリに格納されていて、そのディレクトリを丸ごとリストアする場合は「cp -Rp」コマンドを使用します。

$ cp -Rp 解凍したバックアップデータ 現在のデータ

下記は、ワールドデータをリストアした際の作業ログです。

$ cd opt/minecraft/
$ cp -Rp world/ /opt/minecraft/

minecraft_serverの開始

データのリストア作業が完了しましたら、「minecraft_server」を開始して作業は完了です。

シェアする

フォローする

コメント

  1. 名無し より:

    sava-allで保存した場合、保存したファイルはどこに保存されているんでしょうか?

    • 名無し より:

      すみません忘れてください

      • tamohiko より:

        書き込みありがとうございます。
        質問は自己解決されたのでしょうか?
        他に何か疑問点があるようでしたら、またお気軽に質問してくださいね。

  2. 名無し より:

    サーバーをstopした際に直前のサーバー起動まで、セーブデータが戻ってしまったんですが。設定に原因など考えられるでしょうか?

    • 名無し より:

      save-offにはしてないです

      • tamohiko より:

        ご質問ありがとうございます。

        サーバを停止する前に、「save-all」を実行してもセーブがされなかったということでしょうか?

        もしそうであれば、コマンド実行後に何かメッセージは表示されなかったでしょうか?もし、メッセージが表示されていた場合は、そのメッセージが内容からある程度原因が絞り込めると思われます。

        今のところ、設定でセーブを禁止するというのは「save-off」コマンド位しか思いつきません。

        「save-off」は行って無いということですが、何らかの拍子でこのコマンドが実行されてしまっていなかったか、ログを確認してみてください。

        ログは、マインクラフトのインストールディレクトリ内の「logs」というフォルダ内に作成されるので、現象が発生した日のログを確認して見てください。