バックアップの必要性
原因は色々とあるのですが、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」を停止してバックアップする際の流れは以下の通りとなります。
- minecraft_serverの停止
- データバックアップ
- 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_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」を停止させずに、バックアップをとる方法です。
バックアップの流れは下記のようになります。
- メモリ上のデータ保存
- ワールドデータの自動保存禁止
- データバックアップ
- ワールドデータの自動保存再開
メモリ上のデータ書出し
まずは、「/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」コマンドを実行します。
ワールドデータの保存が実行され、その旨のメッセージが表示されます。
ワールドデータの自動保存禁止
データのバックアップ中に、ワールドデータの自動保存が発生しないよう「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」コマンドを実行します。
ワールドデータの自動保存が無効にされた旨のメッセージが表示されます。
データのバックアップ
次にバックアップをしていくのですが、バックアップ対象データは下記のものとなります。
バックアップ対象データ
- 「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_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
[shell]
#!/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
[/shell]
サーバを停止させないバックアップスクリプト
こちらのシェルスクリプトは、「minecraft_server」を停止させないでバックアップを取得します。
mc_backup_hourly.sh
私が毎時バックアップを取得するときに使用しているスクリプトなので、「mc_backup_hourly.sh」としています。
変数の内容は、「mc_backup_full.sh」と同じですが、「BK_FILE」でバックアップ対象データをしている部分だけ、追加となっています。
[shell]
#!/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
[/shell]
定期バックアップ設定
上記のシェルスクリプトを「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の詳しい設定方法はこちらのページにまとめてあります。
リストアの方法
バックアップデータからのリストア(復元)方法は非常に簡単で、作業の流れは下記のようになります。
- バックアップデータの解凍
- minecraft_serverの停止
- データリストア
- 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」を開始して作業は完了です。
コメント
sava-allで保存した場合、保存したファイルはどこに保存されているんでしょうか?
すみません忘れてください
書き込みありがとうございます。
質問は自己解決されたのでしょうか?
他に何か疑問点があるようでしたら、またお気軽に質問してくださいね。
サーバーをstopした際に直前のサーバー起動まで、セーブデータが戻ってしまったんですが。設定に原因など考えられるでしょうか?
save-offにはしてないです
ご質問ありがとうございます。
サーバを停止する前に、「save-all」を実行してもセーブがされなかったということでしょうか?
もしそうであれば、コマンド実行後に何かメッセージは表示されなかったでしょうか?もし、メッセージが表示されていた場合は、そのメッセージが内容からある程度原因が絞り込めると思われます。
今のところ、設定でセーブを禁止するというのは「save-off」コマンド位しか思いつきません。
「save-off」は行って無いということですが、何らかの拍子でこのコマンドが実行されてしまっていなかったか、ログを確認してみてください。
ログは、マインクラフトのインストールディレクトリ内の「logs」というフォルダ内に作成されるので、現象が発生した日のログを確認して見てください。
シェルスクリプトで停止させてからバックアップをとる場合と、停止せずにとるのではバックアップデータに違いが出るのでしょうか?
コメントありがとうございます。
サーバを停止させて取得するバックアップと停止させずに取得するバックアップの違いについて説明させていただきますね。
・サーバを停止させる場合
minecraftがインストールされているフォルダを丸ごとバックアップとっています。(全データをバックアップ)
・サーバを停止させずにとる場合
各種設定ファイルとワールドデータのみをバックアップしています。(バックアップ対象はBK_FILEで指定したもの)
こちらの場合、私は1時間ごとにバックアップをとっているため、最低限のデータだけバックアップをする形をとっています。
+ whoami
+ ME=manage
+ [ manage == manage ]
/home/manage/Servers/versions/mc_full_backup.sh: 19: [: manage: unexpected operator
+ echo Please run the manage user.
Please run the manage user.
サバを止めて保存するときにこのようなログが流れてきます。なぜでしょうか。
ken さん
コメントありがとうございます。
> サバを止めて保存するときにこのようなログが流れてきます。なぜでしょうか。
実際のスクリプトを見ていませんので、何処が原因なのかはわからないのですが、まずは作成したスクリプトに入力間違いが無いかの確認をお願いします。
ログの内容を見ると19行目あたりに何か問題がありそうなので、そのあたりを確認してみてください。
以上、よろしくお願いします。