チャチャチャおもちゃの抹茶っちゃ

ゲームのこととかプログラミングのこととか。気が向いたら書く。ブログタイトルは友人が考えました。

【Minecraft】Java版MinecraftのサーバーをRocky Linux 8に構築する【1.18.1】【CentOS 後継】【Rocky Linux】

はじめに

本記事は筆者が久しぶりにJavaMinecraftをプレイしたくなって、サーバーを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は

www.minecraft.net

でできますね。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=falseeula=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

メモリ割り当ては、遊びたい規模やマシンスペックによって変わってくると思います。参考はここ↓

minecraft.fandom.com

やっていることはユーザ識別とプロセスチェックして、問題なければ起動しているだけです。

次に、停止スクリプト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

参考