はじめに
本記事は筆者が久しぶりにJava版Minecraftをプレイしたくなって、サーバーをRokey Linux 8上に立ててみたときの備忘録です。
選んだOSは単純にCentOS8のサポート終了を考えて後継OS試したかったためRocky Linux 8.4。
前提条件
動作検証したのは以下です
また、firewallなどの設定は終わっているものとします。外部からの疎通がすでに取れる状態になっているということになります。Minecraftでは25565
番のポートをデフォルトで利用するようなので、変えていなければそこを開けておきましょう。設定例だけ載せておきます。ルールとかは適宜あったものがあるとおもうので。
$ firewall-cmd --permanent --add-port=25565/tcp $ firewall-cmd --reload
firewall-cmd --list-all
で確認できます。
ここでは、Minecraftのサーバーを設定する部分のみ書いていきます。サーバーマシンにターミナル接続した状態でいてください。
必要なソフトウェアのインストール
Minecraftのサーバーを動かすにはJavaが必要です。Minecraftバージョン1.18からはJava 17が必要らしいので、それをインストールします。
また、サーバーを起動し続けるためにtmux
をインストールします。昔はscreen
コマンドを使っていた記憶があるんですが、それの代替みたいですね。
$ dnf -y install java-17-openjdk $ dnf -y install tmux
1.17まではまたJavaのバージョンが異なるようなので、AdoptOpenJDKを使ったりして適宜必要なバージョンを有効にしてください。インストールした後は
alternatives --config java
とかで適用するバージョンを変更できると思います。
余談ですが、CentOS7までよくみたyum
コマンドはCentOS8からdnf
になったんでしたっけ。使い方がほぼ同じなのであまり気になったことはありませんが......。
ユーザの作成
Minecraftサーバー管理ユーザを作成します。今回はmcadmin
で作成。
$ adduser mcadmin $ passwd mcadmin
ユーザを作成したら、切り替えましょう
$ su - mcadmin
サーバーファイルのダウンロード
適当なディレクトリを作成して、サーバーをダウンロードします。
サーバーファイルのDLは
でできますね。minecraft_server.1.18.1.jar
のところを右クリックとかでリンクコピーしてくればOKです。
$ mkdir minecraft-server-1.18.1 $ cd minecraft-server-1.18.1 $ wget [ダウンロードURL]
デフォルトのファイル名は面倒なのでリネームもしておきましょう
$ mv server.jar minecraft_server.jar
起動と初期設定
サーバーは一度起動させて、EULAに同意するところまで一旦完了させておく必要があります。 ちゃちゃっとやりましょう。
$ java -Xms1024M -Xmx1024M -jar minecraft_server.jar nogui
一度目の起動はすぐ終わります。You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
とか言われているはずです。
使用許諾契約に同意できる人は同意しましょう。
$ vi eula.txt
ここのeula=false
をeula=true
に変えます。
これで再度先ほどと同じコマンドを叩くと、動作確認ができます。しばらくまって、「Done. (xxx.xxs)! For help, type "help" or "?"」と表示されていれば問題ありません。
この時点でログインができるようになっているはずです。Minecraftを起動して、サーバーIPを指定してログインしてみましょう。
自動起動設定
このままだと、サーバーを起動するときに必ずターミナルを起動したままにしないといけなかったりと不便です。なので、自動起動の設定をスクリプト化して、サービス化してしまいましょう。
起動・停止スクリプト
まずはスクリプトを書きます。場所は管理しやすいところに配置してください。
今回、screen
ではなくtmux
を使います。screen
を使ったスクリプトは色んなサイトでみたことがある気がしますが、tmux
のものはあまり見た記憶がないですね(僕だけかもしれませんが)。
以下、起動スクリプトmc_start.sh
です。変数を最初に指定しているので、そこだけ自分に合ったものに変えてください。
#!/bin/bash USERNAME='mcadmin' # ユーザ名 SERVICE='minecraft_server.jar' # サーバーファイルの名前 SCNAME='minecraft' # tmux用のセッション名 MC_PATH='/home/mcadmin/minecraft-server/' # サーバーファイルの場所 # メモリ割り当て XMX="2048M" XMS="2048M" cd $MC_PATH ME=`whoami` if [ $ME == $USERNAME ] ; then if pgrep -u $USERNAME -f $SERVICE > /dev/null then echo "$SERVICE is already running!" else echo "Starting $SERVICE..." tmux new -d -s $SCNAME java -Xmx$XMX -Xms$XMS -jar $SERVICE nogui fi else echo "Please run the minecraft user." fi
メモリ割り当ては、遊びたい規模やマシンスペックによって変わってくると思います。参考はここ↓
やっていることはユーザ識別とプロセスチェックして、問題なければ起動しているだけです。
次に、停止スクリプトmc_stop.sh
を書きます。
#!/bin/bash USERNAME='mcadmin' SERVICE='minecraft_server.jar' SCNAME='minecraft' MC_PATH='/home/mcadmin/minecraft-1.18.1-vanilla' cd $MC_PATH ME=`whoami` if [ $ME == $USERNAME ] ; then if pgrep -u $USERNAME -f $SERVICE > /dev/null then echo "Stopping $SERVICE" tmux send-keys -t $SCNAME "say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map..." C-m tmux send-keys -t $SCNAME "save-all" C-m sleep 10 tmux send-keys -t $SCNAME "stop" C-m sleep 10 else echo "$SERVICE was not runnning." fi while : do if pgrep -u $USERNAME -f $SERVICE > /dev/null; then echo "Stopping $SERVICE" sleep 10 else tmux kill-session -t $SCNAME echo "Stopped $SERVICE" break fi done else echo "Please run the minecraft user." fi
変数は相変わらず同じ。停止する前にアナウンスをするようにしています。最後のwhile
はちゃんとサーバーが終了しているかチェックして、問題なければtmux
を終了する、というものですね。強制終了しないように。
あとは実行権限をつけてあげましょう。所有者mcadminで744。
$ chown mcadmin:mcadmin # ユーザ変えずに作業していれば不要なはず $ chmod 744 mc_start.sh $ chmod 744 mc_stop.sh
試しに動かしてみましょう。
$ ./mc_start.sh
起動中の様子は、tmux
で観察できます。
$ tmux ls # tmuxで動いているセッション一覧。「minecraft」が出るはず $ tmux attach -t minecraft # 出力を見ることができる
満足したらデタッチして抜けましょう。「Ctrl+b」を押した後「d」で戻ることができます。
止めるのも確認。
$ ./mc_stop.sh
ゲーム内にログインしたままにしておけば、サーバーアナウンスを見ることができます。 10秒したらサーバーが停止します。
サービス化
起動・停止スクリプトができたらサービス化しましょう。
サービス用にファイルをつくります。ここはルートユーザしかできないので切り替えましょう。
$ su - $ vi /etc/systemd/system/minecraft-server.service
内容はこんな感じ。起動・停止スクリプトの場所は適宜書き換えましょう。
[Unit] Description=Minecraft Server After=network.target local-fs.target [Service] Type=forking User=mcadmin ExecStart=/home/mcadmin/mc_start.sh ExecStop=/home/mcadmin/mc_stop.sh [Install] WantedBy=multi-user.target
あとは有効化して起動するだけ。
$ systemctl enable minecraft-server
$ systemctl start minecraft-server
これで完了!お疲れ様でした!ログインしてみんなで遊びましょう!
おまけ(2024/02/29追記)
バックアップスクリプトも作っていたのでここに供養しておきます。
#!/bin/bash USERNAME='mcadmin' SERVICE='minecraft_server.jar' SCNAME='minecraft' MC_PATH='/home/mcadmin/minecraft-1.18.1-vanilla' BK_PATH='/home/mcadmin/backup/minecraft-1.18.1-vanilla' BK_TIME=`date +%Y%m%d-%H%M%S` BK_GEN="3" BK_NAME="$BK_PATH/mc_backup_daily_${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 in progress..." tmux send-keys -t $SCNAME "say BACKUP START..." C-m tmux send-keys -t $SCNAME "save-all" C-m sleep 10 tmux send-keys -t $SCNAME "save-off" C-m tar cfv $BK_NAME $BK_FILE sleep 10 tmux send-keys -t $SCNAME "save-on" C-m echo "Backup complete!" tmux send-keys -t $SCNAME "say BACKUP FINISHED!" C-m gzip -f $BK_NAME find $BK_PATH -name "mc_backup_daily_*.tar.gz" -type f -mtime +$BK_GEN -exec rm {} \; else echo "$SERVICE was not running." fi else echo "Please run the minecraft user." fi