Minecraft Java Edition Server 1.20.2をROCK 5AのUbuntu 22.04.3 LTSで稼働させる
目次
概要
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のバリエーションも広いので、時間ができたら試してみようと思います。
SBC | Single-Core Score | Multi-Core Score |
---|---|---|
Raspberry Pi 4 Model B 4GB | 226 | 528 |
ROCK 5A 16GB | 588 | 2,634 |
構成
サーバ構成
ハードウェア
ハードウェアはROCK 5Aのメモリ16GBモデルを使用しました。ハードウェアスペックは以下のとおりです。 PoE HatはRaspberry Pi 4B用のものを流用しています。
電源はPoEで供給。モニタとキーボード、マウスは接続しておらず、Windows PCからSSHして設定しました。
項目 | 内容 |
---|---|
SoC | Rockchip RK3588S |
CPU | 4x Cortex-A76 4x Cortex-A55 |
GPU | Mali 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
※以下、該当箇所を変更※ #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.sh | Minecraft Server起動用 |
startpost.sh | Minecraft Server起動後にPIDファイル作成用 |
stop.sh | Minecraft Server停止用、PIDファイルを元に停止するプロセスを特定 |
rock@rock-5a:/opt/minecraft-server-java$ vi 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
※ファイルを新規作成※
#!/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
※ファイルを新規作成※
#!/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ユーザのパスワードを入力
※ファイルを新規作成※ [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で遊ぶ場合と同様に何も持たない状態で始まります。 画面右上に「チャットメッセージの安全性の確認ができません」と表示されている枠がありますが、すぐに消えます。