OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

Minecraft Java Edition Server 1.20.2をROCK 5AのUbuntu 22.04.3 LTSで稼働させる

カテゴリ:OSSセットアップ | ソフトウェア:Minecraft | タグ:
最終更新日:2024-02-05 | 公開日:2023-12-12

目次

概要

 Radxa社製のシングルボードコンピュータであるROCK 5AにMinecraft Java Edition Serverをインストールして利用しているので、 構築手順について紹介します。これまで本手順で構築したMinecraft ServerにLAN内の3ユーザで接続して利用していますが、 特段スペック不足などの問題を感じることはありません。 安定して利用できていると思います。今回の前提として下記ページの手順に沿ってROCK 5Aを初期設定したうえで本ページの手順で構築しました。

 Ubuntu 22.04.3 LTSをROCK 5Aへインストール後の初期設定

 今回はスペックに余裕のあるROCK 5Aを利用しましたが、おそらくRaspberry Pi 4Bでもほぼ同じ手順で構築できると思います。 Raspberry Pi 4BはROCK 5Aに比べるとベンチマーク結果がかなり低いので、性能不足を懸念して試しませんでしたが、 ボードのコストとしては安上がりでOSのバリエーションも広いので、時間ができたら試してみようと思います。

■Geekbench 5.4.0の結果比較(自己所有のSBCで測定)
SBCSingle-Core ScoreMulti-Core Score
Raspberry Pi 4 Model B 4GB226528
ROCK 5A 16GB5882,634

構成

サーバ構成

ハードウェア

 ハードウェアはROCK 5Aのメモリ16GBモデルを使用しました。ハードウェアスペックは以下のとおりです。 PoE HatはRaspberry Pi 4B用のものを流用しています。

 電源はPoEで供給。モニタとキーボード、マウスは接続しておらず、Windows PCからSSHして設定しました。

■ハードウェアスペック
項目内容
SoCRockchip RK3588S
CPU4x Cortex-A76
4x Cortex-A55
GPUMali G610 MC4 ※レビューサイト情報
メモリ64bit 3200Mb/s LPDDR4 16GB
有線ネットワーク2.5 GbE LAN with Power over Ethernet (PoE)
ストレージeMMC 64GB

OS

Ubuntu 22.04.3 LTS arm64 ※ROCK 5公式イメージ

ソフトウェア・パッケージ

  • openjdk-17-jdk
  • server.jar

環境構築

インストール

JDK/JREのインストール確認

 Minecraft Server 1.20.2はjarファイルとして提供されているため、JVMで起動します。 ROCK 5A用のRadxa公式OSイメージ(Ubuntu 22.04.3 LTS)には初期状態ではJDKがインストールされていなかったので、 まず初めにOpenJDKをインストールします。以降の操作はすべてrockユーザで実行しています。

rock@rock-5a:~$ dpkg --list | grep openjdk ←何も表示されないので初期状態ではインストールされていない

インストール対象パッケージ名の確認

 Minecraft Server 1.20.2の動作要件はJDK/JREのバージョン17となっていたため、OpenJDK 17をインストールします。 (JREでも良いのですが、大は小を兼ねるでJDKの方をインストールします)

rock@rock-5a:~$ apt search openjdk-17
Sorting... Done
Full Text Search... Done
openjdk-17-dbg/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 arm64
  Java runtime based on OpenJDK (debugging symbols)

openjdk-17-demo/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 arm64
  Java runtime based on OpenJDK (demos and examples)

openjdk-17-doc/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 all
  OpenJDK Development Kit (JDK) documentation

openjdk-17-jdk/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 arm64 ←これをインストールする
  OpenJDK Development Kit (JDK)

openjdk-17-jdk-headless/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 arm64
  OpenJDK Development Kit (JDK) (headless)

openjdk-17-jre/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 arm64
  OpenJDK Java runtime, using Hotspot JIT

openjdk-17-jre-headless/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 arm64
  OpenJDK Java runtime, using Hotspot JIT (headless)

openjdk-17-jre-zero/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 arm64
  Alternative JVM for OpenJDK, using Zero

openjdk-17-source/jammy-security,jammy-updates 17.0.8.1+1~us1-0ubuntu1~22.04 all
  OpenJDK Development Kit (JDK) source files

rock@rock-5a:~$

OpenJDK 17のインストール

 一つ前の手順で調べたパッケージ名を指定してインストールします。

rock@rock-5a:~$ sudo apt install openjdk-17-jdk
[sudo] password for rock: ←rockユーザのパスワードを入力
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  radxa-system-config-common
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
  adwaita-icon-theme at-spi2-core ca-certificates-java fontconfig fontconfig-config fonts-dejavu-core
  fonts-dejavu-extra gtk-update-icon-cache hicolor-icon-theme humanity-icon-theme java-common libatk-bridge2.0-0
  libatk-wrapper-java libatk-wrapper-java-jni libatk1.0-0 libatk1.0-data libatspi2.0-0 libcairo-gobject2 libcairo2
  libdatrie1 libdeflate0 libdrm-amdgpu1 libdrm-common libdrm-nouveau2 libdrm-radeon1 libdrm2 libfontconfig1
  libfontenc1 libfreetype6 libfribidi0 libgail-common libgail18 libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin
  libgdk-pixbuf2.0-common libgif7 libgl1 libgl1-amber-dri libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0 libglx0
  libgraphite2-3 libgtk2.0-0 libgtk2.0-bin libgtk2.0-common libharfbuzz0b libice-dev libjbig0 libjpeg-turbo8 libjpeg8
  liblcms2-2 libllvm15 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpcsclite1
  libpixman-1-0 libpng16-16 libpthread-stubs0-dev librsvg2-2 librsvg2-common libsensors-config libsensors5 libsm-dev
  libthai-data libthai0 libtiff5 libwebp7 libx11-dev libxau-dev libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0
  libxcb-present0 libxcb-randr0 libxcb-render0 libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1-dev
  libxcomposite1 libxcursor1 libxdamage1 libxdmcp-dev libxfixes3 libxft2 libxi6 libxinerama1 libxkbfile1 libxmu6
  libxmuu1 libxpm4 libxrandr2 libxrender1 libxshmfence1 libxt-dev libxt6 libxv1 libxxf86dga1 libxxf86vm1
  openjdk-17-jdk-headless openjdk-17-jre openjdk-17-jre-headless shared-mime-info ubuntu-mono x11-utils x11proto-dev
  xorg-sgml-doctools xtrans-dev
Suggested packages:
  default-jre gvfs libice-doc liblcms2-utils pcscd librsvg2-bin lm-sensors libsm-doc libx11-doc libxcb-doc libxt-doc
  openjdk-17-demo openjdk-17-source visualvm libnss-mdns fonts-ipafont-gothic fonts-ipafont-mincho fonts-wqy-microhei
  | fonts-wqy-zenhei fonts-indic mesa-utils
The following NEW packages will be installed:
  adwaita-icon-theme at-spi2-core ca-certificates-java fontconfig fontconfig-config fonts-dejavu-core
  fonts-dejavu-extra gtk-update-icon-cache hicolor-icon-theme humanity-icon-theme java-common libatk-bridge2.0-0
  libatk-wrapper-java libatk-wrapper-java-jni libatk1.0-0 libatk1.0-data libatspi2.0-0 libcairo-gobject2 libcairo2
  libdatrie1 libdeflate0 libdrm-amdgpu1 libdrm-common libdrm-nouveau2 libdrm-radeon1 libdrm2 libfontconfig1
  libfontenc1 libfreetype6 libfribidi0 libgail-common libgail18 libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin
  libgdk-pixbuf2.0-common libgif7 libgl1 libgl1-amber-dri libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0 libglx0
  libgraphite2-3 libgtk2.0-0 libgtk2.0-bin libgtk2.0-common libharfbuzz0b libice-dev libjbig0 libjpeg-turbo8 libjpeg8
  liblcms2-2 libllvm15 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpcsclite1
  libpixman-1-0 libpng16-16 libpthread-stubs0-dev librsvg2-2 librsvg2-common libsensors-config libsensors5 libsm-dev
  libthai-data libthai0 libtiff5 libwebp7 libx11-dev libxau-dev libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0
  libxcb-present0 libxcb-randr0 libxcb-render0 libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1-dev
  libxcomposite1 libxcursor1 libxdamage1 libxdmcp-dev libxfixes3 libxft2 libxi6 libxinerama1 libxkbfile1 libxmu6
  libxmuu1 libxpm4 libxrandr2 libxrender1 libxshmfence1 libxt-dev libxt6 libxv1 libxxf86dga1 libxxf86vm1
  openjdk-17-jdk openjdk-17-jdk-headless openjdk-17-jre openjdk-17-jre-headless shared-mime-info ubuntu-mono x11-utils
  x11proto-dev xorg-sgml-doctools xtrans-dev
0 upgraded, 116 newly installed, 0 to remove and 1 not upgraded.
Need to get 177 MB of archives.
After this operation, 507 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y ←Yを入力
Get:1 http://ports.ubuntu.com/ubuntu-ports jammy-security/main arm64 libfribidi0 arm64 1.0.8-2ubuntu3.1 [26.4 kB]
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 shared-mime-info arm64 2.1-2 [453 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libdrm-common all 2.4.113-2~ubuntu0.22.04.1 [5,450 B]
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libdrm2 arm64 2.4.113-2~ubuntu0.22.04.1 [39.1 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 libpng16-16 arm64 1.6.37-3build5 [189 kB]
Get:6 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 libxmuu1 arm64 2:1.1.3-3 [10.4 kB]
Get:7 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 hicolor-icon-theme all 0.17-2 [9,976 B]
Get:8 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libgdk-pixbuf2.0-common all 2.42.8+dfsg-1ubuntu0.2 [5,530 B]
Get:9 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 libjpeg-turbo8 arm64 2.1.2-0ubuntu1 [129 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 libjpeg8 arm64 8c-2ubuntu10 [2,264 B]
(========== 中略 ==========)
Processing triggers for ca-certificates (20230311ubuntu0.22.04.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

done.
done.
Processing triggers for libc-bin (2.35-0ubuntu3.4) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libgdk-pixbuf-2.0-0:arm64 (2.42.8+dfsg-1ubuntu0.2) ...

OpenJDK 17のインストール確認

 簡易的にjavaコマンドでバージョンを表示できることを確認します。

rock@rock-5a:~$ java -version
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu122.04, mixed mode, sharing)

Minecraft Serverをインストールするディレクトリの作成

 Minecraft Serverは /opt ディレクトリ配下にインストールすることにします。 インストール先のディレクトリ名称は minecraft-server-1.20.2-java とします。 Java Editionのサーバを稼働させた後にBedrock Editionのサーバも稼働させる予定なので、識別できるように -java を付与しています。 また、今後複数バージョンをインストールした際にも同じパスで起動できるように、 バージョン番号を抜いたシンボリックリンク minecraft-server-java を作成しておき、シンボリックリンクの方をパスとして使用します。

rock@rock-5a:~$ cd /opt/
rock@rock-5a:/opt$ sudo mkdir minecraft-server-1.20.2-java
[sudo] password for rock: ←rockユーザのパスワードを入力
rock@rock-5a:/opt$ sudo chown rock:rock minecraft-server-1.20.2-java
rock@rock-5a:/opt$ sudo ln -s ./minecraft-server-1.20.2-java ./minecraft-server-java
rock@rock-5a:/opt$ ls -l
total 108928
drwxr-xr-x 6 rock  rock       4096 Dec  9 15:04 minecraft-server-1.20.2-java
lrwxrwxrwx 1 root  root         30 Dec  9 15:06 minecraft-server-java -> ./minecraft-server-1.20.2-java

Minecraft Serverのjarファイルのダウンロード

 Minecraft Java Edition Serverの本体であるjarファイルをダウンロードします。 ダウンロード元はMinecraftの公式サイトです。

rock@rock-5a:/opt$ cd minecraft-server-java/
rock@rock-5a:/opt/minecraft-server-java$ wget https://piston-data.mojang.com/v1/objects/5b868151bd02b41319f54c8d4061b8cae84e665c/server.jar
--2023-11-26 11:20:29--  https://piston-data.mojang.com/v1/objects/5b868151bd02b41319f54c8d4061b8cae84e665c/server.jar
Resolving piston-data.mojang.com (piston-data.mojang.com)... 13.107.213.46, 13.107.246.46, 2620:1ec:46::46, ...
Connecting to piston-data.mojang.com (piston-data.mojang.com)|13.107.213.46|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 48285806 (46M) [application/octet-stream]
Saving to: ‘server.jar’

server.jar                    100%[=================================================>]  46.05M  28.0MB/s    in 1.6s

2023-11-26 11:20:30 (28.0 MB/s) - ‘server.jar’ saved [48285806/48285806]

rock@rock-5a:/opt/minecraft-server-java$ ls -l
total 47160
-rw-rw-r-- 1 rock rock 48285806 Sep 20 18:10 server.jar

jarファイルのリネーム

 jarファイル名を変更する必然性はそれほどないのですが、 どのバージョンのjarか分からないと今後不便そうなので、リネームします(しなくてもいいです)。 ダウンロードした元ファイルは取っておきたいので、リネームと言いつつファイル名を変更してコピーしています。 以降本ページでは minecraft_server.1.20.2.jar をMinecraft Serverのjarファイルとして使用しています。

rock@rock-5a:/opt/minecraft-server-java$ cp -piv server.jar minecraft_server.1.20.2.jar
'server.jar' -> 'minecraft_server.1.20.2.jar'
rock@rock-5a:/opt/minecraft-server-java$ ls -l
total 94312
-rw-rw-r-- 1 rock rock 48285806 Sep 20 18:10 minecraft_server.1.20.2.jar
-rw-rw-r-- 1 rock rock 48285806 Sep 20 18:10 server.jar

設定

各種設定ファイル生成のためにMinecraft Serverを起動

 Minecraft Serverを起動すると各種ディレクトリやファイルが自動生成されるので、起動します。 なお、初回は必ず起動に失敗します。EULA(End-User License Agreement)に同意していないためです。

rock@rock-5a:/opt/minecraft-server-java$ java -Xms2G -Xmx2G -jar minecraft_server.1.20.2.jar --nogui
Unpacking 1.20.2/server-1.20.2.jar (versions:1.20.2) to versions/1.20.2/server-1.20.2.jar
Unpacking com/github/oshi/oshi-core/6.4.5/oshi-core-6.4.5.jar (libraries:com.github.oshi:oshi-core:6.4.5) to libraries/com/github/oshi/oshi-core/6.4.5/oshi-core-6.4.5.jar
Unpacking com/google/code/gson/gson/2.10.1/gson-2.10.1.jar (libraries:com.google.code.gson:gson:2.10.1) to libraries/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar
Unpacking com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar (libraries:com.google.guava:failureaccess:1.0.1) to libraries/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar
Unpacking com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar (libraries:com.google.guava:guava:32.1.2-jre) to libraries/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar
Unpacking com/mojang/authlib/5.0.47/authlib-5.0.47.jar (libraries:com.mojang:authlib:5.0.47) to libraries/com/mojang/authlib/5.0.47/authlib-5.0.47.jar
Unpacking com/mojang/brigadier/1.1.8/brigadier-1.1.8.jar (libraries:com.mojang:brigadier:1.1.8) to libraries/com/mojang/brigadier/1.1.8/brigadier-1.1.8.jar
Unpacking com/mojang/datafixerupper/6.0.8/datafixerupper-6.0.8.jar (libraries:com.mojang:datafixerupper:6.0.8) to libraries/com/mojang/datafixerupper/6.0.8/datafixerupper-6.0.8.jar
Unpacking com/mojang/logging/1.1.1/logging-1.1.1.jar (libraries:com.mojang:logging:1.1.1) to libraries/com/mojang/logging/1.1.1/logging-1.1.1.jar
Unpacking commons-io/commons-io/2.13.0/commons-io-2.13.0.jar (libraries:commons-io:commons-io:2.13.0) to libraries/commons-io/commons-io/2.13.0/commons-io-2.13.0.jar
Unpacking io/netty/netty-buffer/4.1.97.Final/netty-buffer-4.1.97.Final.jar (libraries:io.netty:netty-buffer:4.1.97.Final) to libraries/io/netty/netty-buffer/4.1.97.Final/netty-buffer-4.1.97.Final.jar
Unpacking io/netty/netty-codec/4.1.97.Final/netty-codec-4.1.97.Final.jar (libraries:io.netty:netty-codec:4.1.97.Final) to libraries/io/netty/netty-codec/4.1.97.Final/netty-codec-4.1.97.Final.jar
Unpacking io/netty/netty-common/4.1.97.Final/netty-common-4.1.97.Final.jar (libraries:io.netty:netty-common:4.1.97.Final) to libraries/io/netty/netty-common/4.1.97.Final/netty-common-4.1.97.Final.jar
Unpacking io/netty/netty-handler/4.1.97.Final/netty-handler-4.1.97.Final.jar (libraries:io.netty:netty-handler:4.1.97.Final) to libraries/io/netty/netty-handler/4.1.97.Final/netty-handler-4.1.97.Final.jar
Unpacking io/netty/netty-resolver/4.1.97.Final/netty-resolver-4.1.97.Final.jar (libraries:io.netty:netty-resolver:4.1.97.Final) to libraries/io/netty/netty-resolver/4.1.97.Final/netty-resolver-4.1.97.Final.jar
Unpacking io/netty/netty-transport/4.1.97.Final/netty-transport-4.1.97.Final.jar (libraries:io.netty:netty-transport:4.1.97.Final) to libraries/io/netty/netty-transport/4.1.97.Final/netty-transport-4.1.97.Final.jar
Unpacking io/netty/netty-transport-classes-epoll/4.1.97.Final/netty-transport-classes-epoll-4.1.97.Final.jar (libraries:io.netty:netty-transport-classes-epoll:4.1.97.Final) to libraries/io/netty/netty-transport-classes-epoll/4.1.97.Final/netty-transport-classes-epoll-4.1.97.Final.jar
Unpacking io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-x86_64.jar (libraries:io.netty:netty-transport-native-epoll:4.1.97.Final:linux-x86_64) to libraries/io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-x86_64.jar
Unpacking io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-aarch_64.jar (libraries:io.netty:netty-transport-native-epoll:4.1.97.Final:linux-aarch_64) to libraries/io/netty/netty-transport-native-epoll/4.1.97.Final/netty-transport-native-epoll-4.1.97.Final-linux-aarch_64.jar
Unpacking io/netty/netty-transport-native-unix-common/4.1.97.Final/netty-transport-native-unix-common-4.1.97.Final.jar (libraries:io.netty:netty-transport-native-unix-common:4.1.97.Final) to libraries/io/netty/netty-transport-native-unix-common/4.1.97.Final/netty-transport-native-unix-common-4.1.97.Final.jar
Unpacking it/unimi/dsi/fastutil/8.5.12/fastutil-8.5.12.jar (libraries:it.unimi.dsi:fastutil:8.5.12) to libraries/it/unimi/dsi/fastutil/8.5.12/fastutil-8.5.12.jar
Unpacking net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar (libraries:net.java.dev.jna:jna:5.13.0) to libraries/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar
Unpacking net/java/dev/jna/jna-platform/5.13.0/jna-platform-5.13.0.jar (libraries:net.java.dev.jna:jna-platform:5.13.0) to libraries/net/java/dev/jna/jna-platform/5.13.0/jna-platform-5.13.0.jar
Unpacking net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar (libraries:net.sf.jopt-simple:jopt-simple:5.0.4) to libraries/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar
Unpacking org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar (libraries:org.apache.commons:commons-lang3:3.13.0) to libraries/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar
Unpacking org/apache/logging/log4j/log4j-api/2.19.0/log4j-api-2.19.0.jar (libraries:org.apache.logging.log4j:log4j-api:2.19.0) to libraries/org/apache/logging/log4j/log4j-api/2.19.0/log4j-api-2.19.0.jar
Unpacking org/apache/logging/log4j/log4j-core/2.19.0/log4j-core-2.19.0.jar (libraries:org.apache.logging.log4j:log4j-core:2.19.0) to libraries/org/apache/logging/log4j/log4j-core/2.19.0/log4j-core-2.19.0.jar
Unpacking org/apache/logging/log4j/log4j-slf4j2-impl/2.19.0/log4j-slf4j2-impl-2.19.0.jar (libraries:org.apache.logging.log4j:log4j-slf4j2-impl:2.19.0) to libraries/org/apache/logging/log4j/log4j-slf4j2-impl/2.19.0/log4j-slf4j2-impl-2.19.0.jar
Unpacking org/joml/joml/1.10.5/joml-1.10.5.jar (libraries:org.joml:joml:1.10.5) to libraries/org/joml/joml/1.10.5/joml-1.10.5.jar
Unpacking org/slf4j/slf4j-api/2.0.7/slf4j-api-2.0.7.jar (libraries:org.slf4j:slf4j-api:2.0.7) to libraries/org/slf4j/slf4j-api/2.0.7/slf4j-api-2.0.7.jar
Starting net.minecraft.server.Main
[11:32:35] [ServerMain/ERROR]: Failed to load properties from file: server.properties
java.nio.file.NoSuchFileException: server.properties
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:92) ~[?:?]
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106) ~[?:?]
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?]
        at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:218) ~[?:?]
        at java.nio.file.Files.newByteChannel(Files.java:380) ~[?:?]
        at java.nio.file.Files.newByteChannel(Files.java:432) ~[?:?]
        at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:422) ~[?:?]
        at java.nio.file.Files.newInputStream(Files.java:160) ~[?:?]
        at ajr.b(SourceFile:62) ~[server-1.20.2.jar:?]
        at ajo.a(SourceFile:138) ~[server-1.20.2.jar:?]
        at ajp.<init>(SourceFile:12) ~[server-1.20.2.jar:?]
        at net.minecraft.server.Main.main(SourceFile:112) ~[server-1.20.2.jar:?]
        at net.minecraft.bundler.Main.lambda$run$0(Main.java:54) ~[?:?]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
[11:32:35] [ServerMain/WARN]: Failed to load eula.txt
[11:32:35] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

EULA(End-User License Agreement)への同意

 一つ前の手順でMinecraft Serverを起動したことで各種ファイルが生成されています。 その中に eura.txt がありますので、エディタで開いて false(不同意) を true(同意) に変更します。 これで次回以降はMinecraft Serverを起動できるようになります。

rock@rock-5a:/opt/minecraft-server-java$ ls -l
total 94336
-rw-rw-r-- 1 rock rock      158 Nov 26 11:32 eula.txt ←このファイルを編集する
drwxrwxr-x 8 rock rock     4096 Nov 26 11:32 libraries
drwxrwxr-x 2 rock rock     4096 Nov 26 11:32 logs
-rw-rw-r-- 1 rock rock 48285806 Sep 20 18:10 minecraft_server.1.20.2.jar
-rw-rw-r-- 1 rock rock 48285806 Sep 20 18:10 server.jar
-rw-rw-r-- 1 rock rock     1285 Nov 26 11:32 server.properties
drwxrwxr-x 3 rock rock     4096 Nov 26 11:32 versions
rock@rock-5a:/opt/minecraft-server-java$ vi eula.txt
ファイル名:/opt/minecraft-server-java/eura.txt
※以下、該当箇所を変更※
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Sun Nov 26 11:32:35 JST 2023
eula=true ←初期状態はfalseとなっているのでtrueに変更する

Minecraft Serverの起動・接続・停止確認

 Minecraft ServerはjavaコマンドでJVMを起動します。 必要なヒープメモリは手探りなので、最小値(Xms)・最大値(Xmx)に共に2GBを指定することで2GB固定としています。 Minecraft Server公式サイトの起動例ではヒープサイズに1024Mが指定されていたので、1GBでも足りるのかもしれません。

 以下のようにjavaコマンドで起動するとフォアグラウンドで動き続けます。 ユーザがMinecraft Serverに接続したり切断したりするとその都度メッセージが表示されます。 Minecraft Serverを停止したいときは stop と入力すると停止します。

rock@rock-5a:/opt/minecraft-server-java$ java -Xms2G -Xmx2G -jar minecraft_server.1.20.2.jar --nogui
Starting net.minecraft.server.Main
[11:34:41] [ServerMain/INFO]: Environment: Environment[accountsHost=https://api.mojang.com, sessionHost=https://sessionserver.mojang.com, servicesHost=https://api.minecraftservices.com, name=PROD]
[11:34:44] [ServerMain/INFO]: Loaded 7 recipes
[11:34:44] [ServerMain/INFO]: Loaded 1271 advancements
[11:34:44] [Server thread/INFO]: Starting minecraft server version 1.20.2
[11:34:45] [Server thread/INFO]: Loading properties
[11:34:45] [Server thread/INFO]: Default game type: SURVIVAL
[11:34:45] [Server thread/INFO]: Generating keypair
[11:34:45] [Server thread/INFO]: Starting Minecraft server on *:25565
[11:34:45] [Server thread/INFO]: Using epoll channel type
[11:34:45] [Server thread/INFO]: Preparing level "world"
[11:34:51] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
[11:34:52] [Worker-Main-1/INFO]: Preparing spawn area: 0%
[11:34:52] [Worker-Main-2/INFO]: Preparing spawn area: 0%
[11:34:52] [Worker-Main-4/INFO]: Preparing spawn area: 0%
[11:34:52] [Worker-Main-3/INFO]: Preparing spawn area: 0%
[11:34:53] [Worker-Main-4/INFO]: Preparing spawn area: 0%
[11:34:53] [Worker-Main-4/INFO]: Preparing spawn area: 0%
[11:34:54] [Worker-Main-1/INFO]: Preparing spawn area: 1%
[11:34:54] [Worker-Main-3/INFO]: Preparing spawn area: 2%
[11:34:55] [Worker-Main-5/INFO]: Preparing spawn area: 3%
[11:34:55] [Worker-Main-6/INFO]: Preparing spawn area: 4%
[11:34:56] [Worker-Main-5/INFO]: Preparing spawn area: 6%
[11:34:56] [Worker-Main-5/INFO]: Preparing spawn area: 6%
[11:34:57] [Worker-Main-4/INFO]: Preparing spawn area: 8%
[11:34:57] [Worker-Main-3/INFO]: Preparing spawn area: 9%
[11:34:58] [Worker-Main-6/INFO]: Preparing spawn area: 10%
[11:34:58] [Worker-Main-4/INFO]: Preparing spawn area: 13%
[11:34:59] [Worker-Main-2/INFO]: Preparing spawn area: 14%
[11:34:59] [Worker-Main-4/INFO]: Preparing spawn area: 15%
[11:35:00] [Worker-Main-5/INFO]: Preparing spawn area: 18%
[11:35:00] [Worker-Main-2/INFO]: Preparing spawn area: 21%
[11:35:01] [Worker-Main-6/INFO]: Preparing spawn area: 23%
[11:35:01] [Worker-Main-6/INFO]: Preparing spawn area: 25%
[11:35:02] [Worker-Main-4/INFO]: Preparing spawn area: 26%
[11:35:02] [Worker-Main-6/INFO]: Preparing spawn area: 30%
[11:35:03] [Worker-Main-4/INFO]: Preparing spawn area: 32%
[11:35:03] [Worker-Main-6/INFO]: Preparing spawn area: 33%
[11:35:04] [Worker-Main-3/INFO]: Preparing spawn area: 37%
[11:35:04] [Worker-Main-5/INFO]: Preparing spawn area: 39%
[11:35:05] [Worker-Main-7/INFO]: Preparing spawn area: 42%
[11:35:05] [Worker-Main-5/INFO]: Preparing spawn area: 43%
[11:35:06] [Worker-Main-7/INFO]: Preparing spawn area: 44%
[11:35:06] [Worker-Main-2/INFO]: Preparing spawn area: 48%
[11:35:07] [Worker-Main-7/INFO]: Preparing spawn area: 50%
[11:35:07] [Worker-Main-7/INFO]: Preparing spawn area: 54%
[11:35:08] [Worker-Main-3/INFO]: Preparing spawn area: 55%
[11:35:08] [Worker-Main-2/INFO]: Preparing spawn area: 57%
[11:35:09] [Worker-Main-7/INFO]: Preparing spawn area: 61%
[11:35:09] [Worker-Main-4/INFO]: Preparing spawn area: 63%
[11:35:10] [Worker-Main-6/INFO]: Preparing spawn area: 68%
[11:35:10] [Worker-Main-3/INFO]: Preparing spawn area: 69%
[11:35:11] [Worker-Main-3/INFO]: Preparing spawn area: 71%
[11:35:11] [Worker-Main-2/INFO]: Preparing spawn area: 74%
[11:35:12] [Worker-Main-7/INFO]: Preparing spawn area: 78%
[11:35:12] [Worker-Main-7/INFO]: Preparing spawn area: 81%
[11:35:13] [Worker-Main-7/INFO]: Preparing spawn area: 83%
[11:35:13] [Worker-Main-2/INFO]: Preparing spawn area: 84%
[11:35:14] [Worker-Main-2/INFO]: Preparing spawn area: 86%
[11:35:14] [Worker-Main-4/INFO]: Preparing spawn area: 91%
[11:35:15] [Worker-Main-1/INFO]: Preparing spawn area: 93%
[11:35:15] [Worker-Main-7/INFO]: Preparing spawn area: 94%
[11:35:16] [Worker-Main-7/INFO]: Preparing spawn area: 97%
[11:35:16] [Server thread/INFO]: Time elapsed: 25292 ms
[11:35:16] [Server thread/INFO]: Done (31.136s)! For help, type "help" ←ここまでが起動メッセージ
[12:26:16] [User Authenticator #1/INFO]: UUID of player hogehoge is abcdefgh-ijkl-mnop-qrst-uvwxyz123456 ←ユーザがMinecraftでサーバに接続すると表示される
[12:26:17] [Server thread/INFO]: hogehoge[/192.168.0.101:59778] logged in with entity id 348 at (133.5, 81.0, 51.5)
[12:26:17] [Server thread/INFO]: hogehoge joined the game
[12:28:48] [Server thread/INFO]: hogehoge lost connection: Disconnected ←ユーザがMinecraftでサーバから切断すると表示される
[12:28:48] [Server thread/INFO]: hogehoge left the game
stop ←stop と入力するとMinecraft Serverが停止する
[12:47:11] [Server thread/INFO]: Stopping the server
[12:47:11] [Server thread/INFO]: Stopping server
[12:47:11] [Server thread/INFO]: Saving players
[12:47:11] [Server thread/INFO]: Saving worlds
[12:47:12] [Server thread/INFO]: Saving chunks for level 'ServerLevel[world]'/minecraft:overworld
[12:52:01] [Server thread/INFO]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_end
[12:52:01] [Server thread/INFO]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_nether
[12:52:01] [Server thread/INFO]: ThreadedAnvilChunkStorage (world): All chunks are saved
[12:52:01] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[12:52:01] [Server thread/INFO]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[12:52:01] [Server thread/INFO]: ThreadedAnvilChunkStorage: All dimensions are saved

 ここまででMinecraft Serverの起動・停止ができて普通に接続して遊ぶことができます。 以降はやや冗長かもしれませんが、SystemdでMinecraft Serverの起動停止を管理できるようにします。

Systemdで起動を管理するためのシェルスクリプト作成

 Minecraft Serverの起動を管理しやすくするために、Systemdへ登録します。 Systemdから実行する起動(start.sh)・停止(stop.sh)用のシェルスクリプトを作成します。 Minecraft Serverのフォルダを見たときに、起動中であることがわかるように起動後にPIDファイルを作成します。 PIDファイルを作成するために起動後に実行するシェルスクリプトとして startpost.sh も作成します。

■作成するシェルスクリプト
シェルスクリプト名用途
start.shMinecraft Server起動用
startpost.shMinecraft Server起動後にPIDファイル作成用
stop.shMinecraft Server停止用、PIDファイルを元に停止するプロセスを特定
rock@rock-5a:/opt/minecraft-server-java$ vi start.sh
ファイル名:/opt/minecraft-server-java/start.sh
※ファイルを新規作成※
#!/bin/bash
cd /opt/minecraft-server-java/
exec java -Xms2G -Xmx2G -jar minecraft_server.1.20.2.jar --nogui
rock@rock-5a:/opt/minecraft-server-java$ vi startpost.sh
ファイル名:/opt/minecraft-server-java/startpost.sh
※ファイルを新規作成※
#!/bin/bash
cd /opt/minecraft-server-java/
PID=`ps -ef | grep minecraft_server | grep -v grep | awk '{print $2}'`
echo $PID > minecraft-server-java.pid

 停止する際にはjavaプロセスにSIGTERMシグナルを送信して停止します。

rock@rock-5a:/opt/minecraft-server-java$ vi stop.sh
ファイル名:/opt/minecraft-server-java/stop.sh
※ファイルを新規作成※
#!/bin/bash
cd /opt/minecraft-server-java/
PID=`cat minecraft-server-java.pid`
kill $PID
rm -rf minecraft-server-java.pid

シェルスクリプトのパーミッション変更

 シェルスクリプトに実行権限を付与します。

rock@rock-5a:/opt/minecraft-server-java$ ls -l st*.sh
-rw-rw-r-- 1 rock rock 152 Dec 10 20:10 startpost.sh
-rw-rw-r-- 1 rock rock 108 Dec 10 15:25 start.sh
-rw-rw-r-- 1 rock rock 122 Dec  9 15:04 stop.sh
rock@rock-5a:/opt/minecraft-server-java$ chmod ug+x st*.sh
rock@rock-5a:/opt/minecraft-server-java$ ls -l st*.sh
-rwxrwxr-- 1 rock rock 152 Dec 10 20:10 startpost.sh
-rwxrwxr-- 1 rock rock 108 Dec 10 15:25 start.sh
-rwxrwxr-- 1 rock rock 122 Dec  9 15:04 stop.sh

Systemdのユニットファイルの作成

 Minecraft Serverの起動をSystemdで管理するために、Minecraft Serverサービスのユニットファイルを作成します。 先ほど作成したstart.sh、startpost.sh、stop.shはこのファイルで指定します。 なお、今回のようにstop.shでjavaプロセスをSIGTERMシグナルで停止する場合、終了のステータスコードが143となります。 Systemdは標準でステータスコードが0のときだけ成功とみなすので、systemctl statusで確認すると起動が失敗しているように見えてしまいます。 実害はないかもしれませんが、あまり見た目が良くないので、ステータスコード143も成功だということを明示するためにSuccessExitStatusの設定を入れています。

rock@rock-5a:/opt/minecraft-server-java$ cd /etc/systemd/system/
rock@rock-5a:/etc/systemd/system$ sudo vi minecraft-server-java.service
[sudo] password for rock: ←rockユーザのパスワードを入力
ファイル名:/etc/systemd/system/minecraft-server-java.service
※ファイルを新規作成※
[Unit]
Description=Minecraft Java Edition Server

[Service]
User=root
Type=simple
ExecStart=/opt/minecraft-server-java/start.sh
ExecStartPost=/opt/minecraft-server-java/startpost.sh
ExecStop=/opt/minecraft-server-java/stop.sh
SuccessExitStatus=143 ←ステータスコード0以外に、143の時も成功であることを明記
Restart=no

[Install]
WantedBy=multi-user.target

Systemdのユニットファイル変更を反映

 ユニットファイルは作成しただけだと認識されないので、コマンドで変更(追加)を反映させます。

rock@rock-5a:/etc/systemd/system$ sudo systemctl daemon-reload

SystemdからMinecraft Serverを起動してみる

 準備が整ったので、SystemdからMinecraft Serverを起動してみます。

rock@rock-5a:/etc/systemd/system$ cd /opt/minecraft-server-java/
rock@rock-5a:/opt/minecraft-server-java$ sudo systemctl start minecraft-server-java

Minecraft Serverの起動確認

 起動確認として、Minecraft Serverのjarを起動するjavaプロセスが存在していることと、 startpost.shで作成したPIDファイルが存在していることを確認します。 また、Systemdから見たステータスも確認しておきます。

rock@rock-5a:/opt/minecraft-server-java$ ps -ef | grep java
root       21109       1 99 22:26 ?        00:01:20 java -Xms2G -Xmx2G -jar minecraft_server.1.20.2.jar --nogui ←プロセスIDが21109でjavaプロセスが起動中
rock       21195   19468  0 22:26 pts/0    00:00:00 grep --color=auto java
rock@rock-5a:/opt/minecraft-server-java$ ls -l minecraft-server-java.pid
-rw-r--r-- 1 root root 6 Dec 10 22:26 minecraft-server-java.pid ←PIDファイルが生成されている
rock@rock-5a:/opt/minecraft-server-java$ cat minecraft-server-java.pid
21109 ←PIDファイルに正しくプロセスIDが書き込まれている
rock@rock-5a:/opt/minecraft-server-java$ systemctl status minecraft-server-java
● minecraft-server-java.service - Minecraft Java Edition Server
     Loaded: loaded (/etc/systemd/system/minecraft-server-java.service; disabled; vendor preset: enabled) ←disabledなので自動起動は無効になっている
     Active: active (running) since Sun 2023-12-10 22:26:14 JST; 1min 0s ago ←activeなので起動に成功している
    Process: 21110 ExecStartPost=/opt/minecraft-server-java/startpost.sh (code=exited, status=0/SUCCESS)
   Main PID: 21109 (java)
      Tasks: 53 (limit: 19141)
     Memory: 1.7G
        CPU: 1min 48.210s
     CGroup: /system.slice/minecraft-server-java.service
             mq21109 java -Xms2G -Xmx2G -jar minecraft_server.1.20.2.jar --nogui

SystemdからMinecraft Serverを停止してみる

 起動がうまく行ったので停止も確認します。

rock@rock-5a:/opt/minecraft-server-java$ sudo systemctl stop minecraft-server-java

Minecraft Serverの停止確認

 起動確認の反対で、javaプロセスが停止していることと、PIDファイルが削除されていることを確認します。 また、Systemdから見たステータスも確認します。終了のステータスコードが143となっていますが、正常に停止したと判断されています。

rock@rock-5a:/opt/minecraft-server-java$ ps -ef | grep java
rock       21245   19468  0 22:28 pts/0    00:00:00 grep --color=auto java ←Javaプロセスが停止したので表示されなくなった
rock@rock-5a:/opt/minecraft-server-java$ ls -l minecraft-server-java.pid
ls: cannot access 'minecraft-server-java.pid': No such file or directory ←PIDファイルも削除されたのでlsで表示されなくなった
rock@rock-5a:/opt/minecraft-server-java$ systemctl status minecraft-server-java
○ minecraft-server-java.service - Minecraft Java Edition Server
     Loaded: loaded (/etc/systemd/system/minecraft-server-java.service; disabled; vendor preset: enabled)
     Active: inactive (dead) since Sun 2023-12-10 22:28:29 JST; 55s ago
    Process: 21109 ExecStart=/opt/minecraft-server-java/start.sh (code=exited, status=143)
    Process: 21110 ExecStartPost=/opt/minecraft-server-java/startpost.sh (code=exited, status=0/SUCCESS)
    Process: 21227 ExecStop=/opt/minecraft-server-java/stop.sh (code=exited, status=0/SUCCESS)
   Main PID: 21109 (code=exited, status=143)
        CPU: 2min 2.021s

Minecraft Serverの自動起動を有効化

 Linux起動・停止に合わせてMinecraft Serverが自動起動・停止するように設定を変更します。

rock@rock-5a:/opt/minecraft-server-java$ sudo systemctl enable minecraft-server-java
Created symlink /etc/systemd/system/multi-user.target.wants/minecraft-server-java.service → /etc/systemd/system/minecraft-server-java.service.
rock@rock-5a:/opt/minecraft-server-java$ systemctl status minecraft-server-java
○ minecraft-server-java.service - Minecraft Java Edition Server
     Loaded: loaded (/etc/systemd/system/minecraft-server-java.service; enabled; vendor preset: enabled) ←enabledに変わったので自動起動が有効化された
     Active: inactive (dead) since Sun 2023-12-10 22:28:29 JST; 55s ago
    Process: 21109 ExecStart=/opt/minecraft-server-java/start.sh (code=exited, status=143)
    Process: 21110 ExecStartPost=/opt/minecraft-server-java/startpost.sh (code=exited, status=0/SUCCESS)
    Process: 21227 ExecStop=/opt/minecraft-server-java/stop.sh (code=exited, status=0/SUCCESS)
   Main PID: 21109 (code=exited, status=143)
        CPU: 2min 2.021s

Linuxの再起動とMinecraft Serverの起動確認

 全て設定が完了したので、Linuxを再起動してMinecraft Serverが自動起動することを確認します。

rock@rock-5a:/opt/minecraft-server-java$ sudo reboot
(========== Linux再起動後に以下を確認 ==========)
rock@rock-5a:~$ systemctl status minecraft-server-java
● minecraft-server-java.service - Minecraft Java Edition Server
     Loaded: loaded (/etc/systemd/system/minecraft-server-java.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-12-12 16:18:26 JST; 8min ago
    Process: 418 ExecStartPost=/opt/minecraft-server-java/startpost.sh (code=exited, status=0/SUCCESS)
   Main PID: 417 (java)
      Tasks: 40 (limit: 19141)
     Memory: 1.8G
        CPU: 2min 45.006s
     CGroup: /system.slice/minecraft-server-java.service
             mq417 java -Xms2G -Xmx2G -jar minecraft_server.1.20.2.jar --nogui

Warning: some journal files were not opened due to insufficient permissions.

 最後の最後でjournal filesの警告メッセージが出力されていることに気づきましたが、Minecraftで遊ぶうえでは困っていないので別途調査します。。。

その他

Minecraft Serverの動作設定について

 Minecraft Serverの動作設定(サバイバルモードとかクリエイティブモードとか・・・)を変更したい場合は、 /opt/minecraft-server-java/server.properties ファイルを編集します。 設定項目がたくさんありますが、紹介サイトなどもたくさんあるので割愛します。

利用方法

Minecraft Serverへの接続

 今回セットアップしたのはMinecraft Java Edition Serverなので、Windows、Mac、LinuxなどPCからの接続が前提となります。 以下の画像はWindows版から接続した際のスクショになります。Minecraft LauncherからJava Editionを起動します。 Java Editionの画面が表示されたら、[マルチプレイ]をクリックします。

 「警告」が表示されますが、ROCK 5Aの自家製サーバなので、気にせず[続ける]をクリックします。

 「マルチプレイで遊ぶ」画面が表示されたら、[ダイレクト接続]をクリックします。
※何度も接続して遊ぶ場合は[サーバーを追加]を選択しても良いです。IPアドレスとポート番号を保存して次回からの入力を省略できます。

 「ダイレクト接続」画面が表示されたら、サーバアドレスとしてMinecraft ServerをセットアップしたROCK 5AのIPアドレス(ここでは192.168.0.113)と ポート番号(初期値は25565になっています)を指定して『IPアドレス:ポート番号』の形式で入力し、[サーバに接続]をクリックします。 なお、ポート番号は設定ファイルの server.properties で変更できます。

 「サーバーに接続中...」画面が表示された後、サーバに保存されたWORLDでゲームが始まります。

 以下のスクショは途中まで進めた状態ですが、新規に接続した場合はスタンドアローンで新規WORLDで遊ぶ場合と同様に何も持たない状態で始まります。 画面右上に「チャットメッセージの安全性の確認ができません」と表示されている枠がありますが、すぐに消えます。

参考にしたサイト