山城淑敬.jp

Since:2002.05.02 連絡先: shukukei@mojizuri.jp

PaperでMinecraftマルチプレイサーバを立ててみた

今回は“Paper”をインストールしてみました。


検証に使用したサーバのスペックは以下の通りです。
OS:Ubuntu 20.04 LTS (x86_64)
CPU:2コア
RAM:1GB

Java 11を使用したところ以下のようなワーニングが発生しました。

WARNING: Java 9 currently causes significant issues for a lot of Bukkit plugins due to new ClassLoading semantics.
WARNING: For the time being, it is recommended to stick with Java 8 until plugins are updated.
問題になる場合はuniverseリポジトリからJava 8をインストールして使用します。

# apt install software-properties-common
# add-apt-repository universe
# apt install openjdk-8-jre-headless
複数バージョンのJavaがインストールされている環境で、使用するJavaのバージョンを変更するためには次のコマンドを実行します。

# update-alternatives --config java
 There are 2 choices for the alternative java (providing /usr/bin/java).
 
   Selection    Path                                            Priority   Status
 ------------------------------------------------------------
 * 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode
   1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
   2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
今回は使用するJavaのバージョンは変更せず、Java 11を使用しました。

# apt install screen default-jre-headless openjdk-8-jre-headless
# su - minecraft
$ mkdir paper
$ cd paper
$ wget -O paper-1.12.2.jar https://papermc.io/api/v1/paper/1.12.2/latest/download

さっそく実行してみます。

$ java -Xms1G -Xmx1G -jar paper-1.12.2.jar
 WARNING: Java 9 currently causes significant issues for a lot of Bukkit plugins due to new ClassLoading semantics.
 WARNING: For the time being, it is recommended to stick with Java 8 until plugins are updated.
 Downloading original jar...
 Patching original jar...
 Loading libraries, please wait...
 [02:31:04 INFO]: Starting minecraft server version 1.12.2
 [02:31:04 INFO]: Loading properties
 [02:31:04 WARN]: server.properties does not exist
 [02:31:04 INFO]: Generating new properties file
 [02:31:04 WARN]: Failed to load eula.txt
 [02:31:04 INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
 [02:31:04 INFO]: Stopping server

EULAを読んで同意できる場合はeula.txtを編集してeula=trueとします。

$ vi eula.txt
 #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
 #and also agreeing that tacos are tasty.
 #Sun Jun 07 02:31:04 JST 2020
 eula=true

再び実行してみます。

$ java -Xms1G -Xmx1G -jar paper-1.12.2.jar
 WARNING: Java 9 currently causes significant issues for a lot of Bukkit plugins due to new ClassLoading semantics.
 WARNING: For the time being, it is recommended to stick with Java 8 until plugins are updated.
 Loading libraries, please wait...
 [02:34:39 INFO]: Starting minecraft server version 1.12.2
 [02:34:39 INFO]: Loading properties
 [02:34:39 INFO]: Default game type: SURVIVAL
 [02:34:39 INFO]: This server is running Paper version git-Paper-1618 (MC: 1.12.2) (Implementing API version 1.12.2-R0.1-SNAPSHOT)
 [02:34:39 INFO]: Debug logging is disabled
 [02:34:39 INFO]: Server Ping Player Sample Count: 12
 [02:34:39 INFO]: Using 4 threads for Netty based IO
 [02:34:40 INFO]: Generating keypair
 [02:34:40 INFO]: Starting Minecraft server on *:25565
 [02:34:40 INFO]: Using epoll channel type
 [02:34:40 INFO]: **** Beginning UUID conversion, this may take A LONG time ****
 
 
 ~中略~
 
 
 [02:34:52 INFO]: Done (11.632s)! For help, type "help" or "?"
 [02:34:52 INFO]: Timings Reset
 > help
 [02:35:25 INFO]: --------- Help: Index ---------------------------
 [02:35:25 INFO]: Use /help [n] to get page n of help.
 [02:35:25 INFO]: Aliases: Lists command aliases
 [02:35:25 INFO]: Bukkit: All commands for Bukkit
 [02:35:25 INFO]: Minecraft: All commands for Minecraft
 [02:35:25 INFO]: /advancement: A Mojang provided command.
 [02:35:25 INFO]: /ban: A Mojang provided command.
 [02:35:25 INFO]: /ban-ip: A Mojang provided command.
 [02:35:25 INFO]: /banlist: A Mojang provided command.
 [02:35:25 INFO]: /blockdata: A Mojang provided command.
 [02:35:25 INFO]: /clear: A Mojang provided command.
 [02:35:25 INFO]: /clone: A Mojang provided command.
 [02:35:25 INFO]: /debug: A Mojang provided command.
 [02:35:25 INFO]: /defaultgamemode: A Mojang provided command.
 [02:35:25 INFO]: /deop: A Mojang provided command.
 [02:35:25 INFO]: /difficulty: A Mojang provided command.
 [02:35:25 INFO]: /effect: A Mojang provided command.
 [02:35:25 INFO]: /enchant: A Mojang provided command.
 [02:35:25 INFO]: /entitydata: A Mojang provided command.
 [02:35:25 INFO]: /execute: A Mojang provided command.
 [02:35:25 INFO]: /fill: A Mojang provided command.
 [02:35:25 INFO]: /function: A Mojang provided command.
 [02:35:25 INFO]: /gamemode: A Mojang provided command.
 [02:35:25 INFO]: /gamerule: A Mojang provided command.
 [02:35:25 INFO]: /give: A Mojang provided command.
 [02:35:25 INFO]: /help: Shows the help menu
 [02:35:25 INFO]: /kick: A Mojang provided command.
 [02:35:25 INFO]: /kill: A Mojang provided command.
 [02:35:25 INFO]: /list: A Mojang provided command.
 [02:35:25 INFO]: /locate: A Mojang provided command.
 [02:35:25 INFO]: /me: A Mojang provided command.
 [02:35:25 INFO]: /minecraft:help: A Mojang provided command.
 [02:35:25 INFO]: /minecraft:reload: A Mojang provided command.
 [02:35:25 INFO]: /minecraft:tell: A Mojang provided command.
 [02:35:25 INFO]: /op: A Mojang provided command.
 [02:35:25 INFO]: /paper: Paper related commands
 [02:35:25 INFO]: /pardon: A Mojang provided command.
 [02:35:25 INFO]: /pardon-ip: A Mojang provided command.
 [02:35:25 INFO]: /particle: A Mojang provided command.
 [02:35:25 INFO]: /playsound: A Mojang provided command.
 [02:35:25 INFO]: /plugins: Gets a list of plugins running on the server
 [02:35:25 INFO]: /recipe: A Mojang provided command.
 [02:35:25 INFO]: /reload: Reloads the server configuration and plugins
 [02:35:25 INFO]: /replaceitem: A Mojang provided command.
 [02:35:25 INFO]: /restart: Restarts the server
 [02:35:25 INFO]: /save-all: A Mojang provided command.
 [02:35:25 INFO]: /save-off: A Mojang provided command.
 [02:35:25 INFO]: /save-on: A Mojang provided command.
 [02:35:25 INFO]: /say: A Mojang provided command.
 [02:35:25 INFO]: /scoreboard: A Mojang provided command.
 [02:35:25 INFO]: /seed: A Mojang provided command.
 [02:35:25 INFO]: /setblock: A Mojang provided command.
 [02:35:25 INFO]: /setidletimeout: A Mojang provided command.
 [02:35:25 INFO]: /setworldspawn: A Mojang provided command.
 [02:35:25 INFO]: /spawnpoint: A Mojang provided command.
 [02:35:25 INFO]: /spigot: Spigot related commands
 [02:35:25 INFO]: /spreadplayers: A Mojang provided command.
 [02:35:25 INFO]: /stats: A Mojang provided command.
 [02:35:25 INFO]: /stop: A Mojang provided command.
 [02:35:25 INFO]: /stopsound: A Mojang provided command.
 [02:35:25 INFO]: /summon: A Mojang provided command.
 [02:35:25 INFO]: /teleport: A Mojang provided command.
 [02:35:25 INFO]: /tell: A Mojang provided command.
 [02:35:25 INFO]: /tellraw: A Mojang provided command.
 [02:35:25 INFO]: /testfor: A Mojang provided command.
 [02:35:25 INFO]: /testforblock: A Mojang provided command.
 [02:35:25 INFO]: /testforblocks: A Mojang provided command.
 [02:35:25 INFO]: /time: A Mojang provided command.
 [02:35:25 INFO]: /timings: Manages Spigot Timings data to see performance of the server.
 [02:35:25 INFO]: /title: A Mojang provided command.
 [02:35:25 INFO]: /toggledownfall: A Mojang provided command.
 [02:35:25 INFO]: /tp: A Mojang provided command.
 [02:35:25 INFO]: /tps: Gets the current ticks per second for the server
 [02:35:25 INFO]: /trigger: A Mojang provided command.
 [02:35:25 INFO]: /version: Gets the version of this server including any plugins in use
 [02:35:25 INFO]: /weather: A Mojang provided command.
 [02:35:25 INFO]: /whitelist: A Mojang provided command.
 [02:35:25 INFO]: /worldborder: A Mojang provided command.
 [02:35:25 INFO]: /xp: A Mojang provided command.

実際の運用ではSystemdを使いたいため、設定を行います。

# vi /etc/systemd/system/paper.service
 [Unit]
 Description=Paper server
 After=network.target
 
 [Service]
 Type=simple
 User=minecraft
 WorkingDirectory=/home/minecraft/paper
 ExecStart=/usr/bin/sh -c '/usr/bin/screen -DmS PaperScreen /usr/bin/java -Xms1G -Xmx1G -XX:+UseG1GC -jar /home/minecraft/paper/paper-1.12.2.jar --noconsole'
 ExecStop=/usr/bin/screen -S PaperScreen -X eval 'stuff "save-all"\\015'
 ExecStop=/usr/bin/screen -S PaperScreen -X eval 'stuff "stop"\\015'
 
 TimeoutStartSec=15
 TimeoutStopSec=60
 Restart=on-failure
 
 [Install]
 WantedBy=multi-user.target

# systemctl daemon-reload

主な操作方法は以下の通りです。
・起動させるとき
  # systemctl start paper.service
・終了させるとき
  # systemctl stop paper.service
・サーバ起動時に自動的に起動させるとき
  # systemctl enable paper.service
・現在の状態を確認するとき
  # systemctl status paper.service
・ログを確認するとき
  # journalctl -u paper.service

Paperの設定についてはオンラインドキュメントを参照して行います。
https://paper.readthedocs.io/

JVMの設定については『Tuning the JVM – G1GC Garbage Collector Flags for Minecraft』を参考に調整を行いたいと考えています。

SpigotでMinecraftマルチプレイサーバを立ててみた

今回は“Spigot”をインストールしてみました。


検証に使用したサーバのスペックは以下の通りです。
OS:Ubuntu 20.04 LTS (x86_64)
CPU:2コア
RAM:1GB

SpigotのインストールにはBuildToolsを使用しますが、現時点ではJava 11には対応していないようです。

*** The version you have requested to build requires Java versions between [Java 8, Java 10], but you are using Java 11
*** Please rerun BuildTools using an appropriate Java version. For obvious reasons outdated MC versions do not support Java versions that did not exist at their release.

そのためuniverseリポジトリからJava 8をインストールします。

# apt install software-properties-common
# add-apt-repository universe
# apt install openjdk-8-jre-headless

複数バージョンのJavaがインストールされている環境で、使用するJavaのバージョンを変更するためには次のコマンドを実行します。

# update-alternatives --config java
 There are 2 choices for the alternative java (providing /usr/bin/java).
 
   Selection    Path                                            Priority   Status
 ------------------------------------------------------------
 * 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode
   1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
   2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

今回は使用するJavaのバージョンは変更せず、BuildToolsの実行時のみJava 8を指定して実行しました。

# apt install software-properties-common
# add-apt-repository universe
# apt install screen git default-jre-headless openjdk-8-jre-headless
# su - minecraft
$ mkdir spigot
$ mkdir spigot_live
$ cd spigot
$ wget -O BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
$ git config --global --unset core.autocrlf
$ /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xmx512M -jar BuildTools.jar --rev 1.12.2
 openjdk version "1.8.0_252"
 OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1ubuntu1-b09)
 OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
 minecraft@osaka:~/spigot$ /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xmx512M -jar BuildTools.jar --rev 1.12.2
 Loading BuildTools version: git-BuildTools-975b734-112 (#112)
 Java Version: Java 8
 Current Path: /home/minecraft/spigot/.
 git version 2.25.1
 BuildTools
 unconfigured@null.spigotmc.org
 Attempting to build version: '1.12.2' use --rev  to override
 Found version
 
 
 ~中略~
 
 
 Success! Everything completed successfully. Copying final .jar files now.
 Copying craftbukkit-1.12.2-R0.1-SNAPSHOT.jar to /home/minecraft/spigot/./craftbukkit-1.12.2.jar
   - Saved as ./craftbukkit-1.12.2.jar
 Copying spigot-1.12.2-R0.1-SNAPSHOT.jar to /home/minecraft/spigot/./spigot-1.12.2.jar
  - Saved as ./spigot-1.12.2.jar

さっそく実行してみます。

$ cp spigot-1.12.2.jar ../spigot_live/spigot-1.12.2.jar
$ cd ../spigot_live
$ java -Xms1G -Xmx1G -jar spigot-1.12.2.jar
 Loading libraries, please wait...
 [23:55:15 INFO]: Starting minecraft server version 1.12.2
 [23:55:15 INFO]: Loading properties
 [23:55:15 WARN]: server.properties does not exist
 [23:55:15 INFO]: Generating new properties file
 [23:55:15 WARN]: Failed to load eula.txt
 [23:55:15 INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
 [23:55:15 INFO]: Stopping server

EULAを読んで同意できる場合はeula.txtを編集してeula=trueとします。

$ vi eula.txt
 #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
 #Sat Jun 06 23:55:15 JST 2020
 eula=true

再び実行してみます。

$ java -Xms1G -Xmx1G -jar spigot-1.12.2.jar
 Loading libraries, please wait...
 [23:57:18 INFO]: Starting minecraft server version 1.12.2
 [23:57:18 INFO]: Loading properties
 [23:57:18 INFO]: Default game type: SURVIVAL
 [23:57:18 INFO]: This server is running CraftBukkit version git-Spigot-79a30d7-acbc348 (MC: 1.12.2) (Implementing API version 1.12.2-R0.1-SNAPSHOT)
 [23:57:19 INFO]: Debug logging is disabled
 [23:57:19 INFO]: Server Ping Player Sample Count: 12
 [23:57:19 INFO]: Using 4 threads for Netty based IO
 [23:57:19 INFO]: Generating keypair
 [23:57:19 INFO]: Starting Minecraft server on *:25565
 [23:57:19 INFO]: Using epoll channel type
 [23:57:19 INFO]: **** Beginning UUID conversion, this may take A LONG time ****
 
 
 ~中略~
 
 
 [23:57:40 INFO]: Done (21.146s)! For help, type "help" or "?"
 >help
 [23:58:27 INFO]: --------- Help: Index ---------------------------
 [23:58:27 INFO]: Use /help [n] to get page n of help.
 [23:58:27 INFO]: Aliases: Lists command aliases
 [23:58:27 INFO]: Bukkit: All commands for Bukkit
 [23:58:27 INFO]: Minecraft: All commands for Minecraft
 [23:58:27 INFO]: /advancement: A Mojang provided command.
 [23:58:27 INFO]: /ban: A Mojang provided command.
 [23:58:27 INFO]: /ban-ip: A Mojang provided command.
 [23:58:27 INFO]: /banlist: A Mojang provided command.
 [23:58:27 INFO]: /blockdata: A Mojang provided command.
 [23:58:27 INFO]: /clear: A Mojang provided command.
 [23:58:27 INFO]: /clone: A Mojang provided command.
 [23:58:27 INFO]: /debug: A Mojang provided command.
 [23:58:27 INFO]: /defaultgamemode: A Mojang provided command.
 [23:58:27 INFO]: /deop: A Mojang provided command.
 [23:58:27 INFO]: /difficulty: A Mojang provided command.
 [23:58:27 INFO]: /effect: A Mojang provided command.
 [23:58:27 INFO]: /enchant: A Mojang provided command.
 [23:58:27 INFO]: /entitydata: A Mojang provided command.
 [23:58:27 INFO]: /execute: A Mojang provided command.
 [23:58:27 INFO]: /fill: A Mojang provided command.
 [23:58:27 INFO]: /function: A Mojang provided command.
 [23:58:27 INFO]: /gamemode: A Mojang provided command.
 [23:58:27 INFO]: /gamerule: A Mojang provided command.
 [23:58:27 INFO]: /give: A Mojang provided command.
 [23:58:27 INFO]: /help: Shows the help menu
 [23:58:27 INFO]: /kick: A Mojang provided command.
 [23:58:27 INFO]: /kill: A Mojang provided command.
 [23:58:27 INFO]: /list: A Mojang provided command.
 [23:58:27 INFO]: /locate: A Mojang provided command.
 [23:58:27 INFO]: /me: A Mojang provided command.
 [23:58:27 INFO]: /minecraft:help: A Mojang provided command.
 [23:58:27 INFO]: /minecraft:reload: A Mojang provided command.
 [23:58:27 INFO]: /minecraft:tell: A Mojang provided command.
 [23:58:27 INFO]: /op: A Mojang provided command.
 [23:58:27 INFO]: /pardon: A Mojang provided command.
 [23:58:27 INFO]: /pardon-ip: A Mojang provided command.
 [23:58:27 INFO]: /particle: A Mojang provided command.
 [23:58:27 INFO]: /playsound: A Mojang provided command.
 [23:58:27 INFO]: /plugins: Gets a list of plugins running on the server
 [23:58:27 INFO]: /recipe: A Mojang provided command.
 [23:58:27 INFO]: /reload: Reloads the server configuration and plugins
 [23:58:27 INFO]: /replaceitem: A Mojang provided command.
 [23:58:27 INFO]: /restart: Restarts the server
 [23:58:27 INFO]: /save-all: A Mojang provided command.
 [23:58:27 INFO]: /save-off: A Mojang provided command.
 [23:58:27 INFO]: /save-on: A Mojang provided command.
 [23:58:27 INFO]: /say: A Mojang provided command.
 [23:58:27 INFO]: /scoreboard: A Mojang provided command.
 [23:58:27 INFO]: /seed: A Mojang provided command.
 [23:58:27 INFO]: /setblock: A Mojang provided command.
 [23:58:27 INFO]: /setidletimeout: A Mojang provided command.
 [23:58:27 INFO]: /setworldspawn: A Mojang provided command.
 [23:58:27 INFO]: /spawnpoint: A Mojang provided command.
 [23:58:27 INFO]: /spigot: Spigot related commands
 [23:58:27 INFO]: /spreadplayers: A Mojang provided command.
 [23:58:27 INFO]: /stats: A Mojang provided command.
 [23:58:27 INFO]: /stop: A Mojang provided command.
 [23:58:27 INFO]: /stopsound: A Mojang provided command.
 [23:58:27 INFO]: /summon: A Mojang provided command.
 [23:58:27 INFO]: /teleport: A Mojang provided command.
 [23:58:27 INFO]: /tell: A Mojang provided command.
 [23:58:27 INFO]: /tellraw: A Mojang provided command.
 [23:58:27 INFO]: /testfor: A Mojang provided command.
 [23:58:27 INFO]: /testforblock: A Mojang provided command.
 [23:58:27 INFO]: /testforblocks: A Mojang provided command.
 [23:58:27 INFO]: /time: A Mojang provided command.
 [23:58:27 INFO]: /timings: Manages Spigot Timings data to see performance of the server.
 [23:58:27 INFO]: /title: A Mojang provided command.
 [23:58:27 INFO]: /toggledownfall: A Mojang provided command.
 [23:58:27 INFO]: /tp: A Mojang provided command.
 [23:58:27 INFO]: /tps: Gets the current ticks per second for the server
 [23:58:27 INFO]: /trigger: A Mojang provided command.
 [23:58:27 INFO]: /version: Gets the version of this server including any plugins in use
 [23:58:27 INFO]: /weather: A Mojang provided command.
 [23:58:27 INFO]: /whitelist: A Mojang provided command.
 [23:58:27 INFO]: /worldborder: A Mojang provided command.
 [23:58:27 INFO]: /xp: A Mojang provided command.

実際の運用ではSystemdを使いたいため、設定を行います。

# vi /etc/systemd/system/spigot.service
 [Unit]
 Description=Spigot server
 After=network.target
 
 [Service]
 Type=simple
 User=minecraft
 WorkingDirectory=/home/minecraft/spigot_live
 ExecStart=/usr/bin/sh -c '/usr/bin/screen -DmS SpigotScreen /usr/bin/java -Xms1G -Xmx1G -XX:+UseG1GC -jar /home/minecraft/spigot_live/spigot-1.12.2.jar --noconsole'
 ExecStop=/usr/bin/screen -S SpigotScreen -X eval 'stuff "save-all"\\015'
 ExecStop=/usr/bin/screen -S SpigotScreen -X eval 'stuff "stop"\\015'
 
 TimeoutStartSec=15
 TimeoutStopSec=60
 Restart=on-failure
 
 [Install]
 WantedBy=multi-user.target

# systemctl daemon-reload

主な操作方法は次の通りです。
・起動させるとき
  # systemctl start spigot.service
・終了させるとき
  # systemctl stop spigot.service
・サーバ起動時に自動的に起動させるとき
  # systemctl enable spigot.service
・現在の状態を確認するとき
  # systemctl status spigot.service
・ログを確認するとき
  # journalctl -u spigot.service

Spigotの設定についてはWikiを参照して行います。
https://www.spigotmc.org/wiki/spigot/

CuberiteでMinecraftマルチプレイサーバを立ててみた。

Minecraftマルチプレイ用のサーバには、公式から提供されているもの以外に有志により開発が行われているものがあり、それぞれが様々な特徴を持っています。
今回はその中からC++言語で書かれ、軽量・高速・拡張性を謳っている“Cuberite”をインストールしてみました。


検証に使用したサーバのスペックは以下の通りです。
OS:Ubuntu 20.04 LTS (x86_64)
CPU:2コア
RAM:1GB

まずはファイアウォールを有効にしますが、後々の作業でSSHを使いたいため有効にしておきます。

# ufw enable
# ufw limit OpenSSH

カーネルパラメータを調整します。

# vi /etc/sysctl.conf
 net.ipv4.conf.default.rp_filter = 1
 net.ipv4.conf.default.accept_redirects = 0
 net.ipv4.conf.default.accept_source_route = 0
 net.ipv4.conf.default.send_redirects = 0
 net.ipv4.conf.all.rp_filter = 1
 net.ipv4.conf.all.accept_redirects = 0
 net.ipv4.conf.all.accept_source_route = 0
 net.ipv4.conf.all.send_redirects = 0
 net.ipv4.tcp_window_scaling = 1
 net.ipv4.tcp_moderate_rcvbuf = 1
 net.ipv4.tcp_no_metrics_save = 1
 net.ipv4.tcp_max_syn_backlog = 65535
 net.ipv4.tcp_sack = 1
 net.ipv4.tcp_timestamps = 0
 net.ipv4.tcp_fin_timeout = 5
 net.ipv4.tcp_syn_retries = 2
 net.ipv4.tcp_syncookies = 1
 net.ipv4.tcp_synack_retries = 3
 net.ipv4.tcp_tw_reuse = 1
 net.ipv4.tcp_rfc1337 = 1
 net.ipv4.tcp_keepalive_time = 65
 net.ipv4.tcp_keepalive_intvl = 65
 net.ipv4.tcp_keepalive_probes = 5
 net.ipv4.tcp_max_tw_buckets = 65535
 net.ipv4.icmp_ignore_bogus_error_responses = 1
 net.ipv4.icmp_echo_ignore_all = 1
 net.ipv4.icmp_echo_ignore_broadcasts = 1
 net.ipv4.ip_local_port_range = 9024 65535
 net.ipv4.ip_local_reserved_ports = 25565
 net.ipv4.tcp_mem = 182757 243679 365514
 net.ipv4.neigh.default.gc_thresh3 = 8192
 net.ipv6.conf.default.accept_redirects = 0
 net.ipv6.conf.default.accept_source_route = 0
 net.ipv6.conf.all.accept_redirects = 0
 net.ipv6.conf.all.accept_source_route = 0
 net.ipv6.neigh.default.gc_thresh3 = 8192
 net.core.somaxconn = 65535
 net.core.netdev_max_backlog = 182757
 kernel.sysrq = 0
 kernel.panic = 120
 kernel.dmesg_restrict = 1
 vm.swappiness = 1

txqueuelenを調整します。

# apt install ethtool
# vi /etc/systemd/system/txqueuelen.service
 [Unit]
 Description=txqueuelen
 After=network.target
 
 [Service]
 Type=oneshot
 User=root
 WorkingDirectory=/root
 ExecStart=/bin/bash -c "ip link set ens3 txqueuelen 60000"
 TimeoutSec=15
 Restart=no
 
 [Install]
 WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl enable txqueuelen.service

TCP Segmentation Offloadを無効にします。

# vi /etc/udev/rules.d/50-eth_tso.rules
 ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/sbin/ethtool -K %k tso off"
 ACTION=="add", SUBSYSTEM=="net", KERNEL=="ens*", RUN+="/sbin/ethtool -K %k tso off"

時刻同期の設定を行います。

# vi /etc/systemd/timesyncd.conf
 NTP=time.cloudflare.com
 FallbackNTP=ntp.jst.mfeed.ad.jp ntp.nict.jp time.google.com time.facebook.com

# systemctl restart systemd-timesyncd

Cuberiteをインストールします。
公式からバイナリファイルも提供されていますが、より良いパフォーマンスを得るためにソースコードからインストールすることにしました。

# apt install screen git make cmake gcc g++
# adduser minecraft --disabled-login
# su - minecraft
$ sh -c "$(wget -O - https://compile.cuberite.org)"
 
 Hello, this script will download and compile Cuberite.
 On subsequent runs, it will update Cuberite.
 The compilation and download will occur in the current directory.
 If you're updating, you should run: /compile.sh
 Compiling from source takes time, but it usually generates faster
 executables. If you prefer ready-to-use binaries or if you want
 more info, please visit:  https://cuberite.org/
 
         Choose compile mode:
         * (R)Release: Compiles normally.
                       Generates the fastest build.
 
         * (D)Debug:   Compiles in debug mode.
                       Makes your console and crashes more verbose.
                       A bit slower than Release mode. If you plan to help
                       development by reporting bugs, this is preferred.
 
 
 Choose compile mode: (r/d) (Default: "Release"): r
 
 Choose the number of compilation threads.
 You have 2 CPU threads.
 If you have enough RAM, it is wise to choose your CPU's thread count.
 Otherwise choose lower. Old Raspberry Pis should choose 1. If in doubt, choose 1.
 Please enter the number of compilation threads to use (Default: 1): 2
 
 #### Settings Summary ####
 Build Type:            Release
 Branch:                master (Currently the only choice)
 Compilation threads:   2
 CPU Threads:           2
 Previous compilation:  Not detected. We are assuming this is the first compile.sh run.
 Upstream Link:         https://github.com/cuberite/cuberite.git
 Upstream Repo:         origin
 
 After pressing ENTER, the script will connect to https://github.com/cuberite/cuberite.git
 to check for updates and/or fetch code. It will then compile your program.
 If you compiled before, make sure you're in the proper directory and that "Previous compilation" is detected.
 Press ENTER to continue...
 
 
 ~中略~
 
 
 -----------------
 Compilation done!
 
 Cuberite awaits you at:
 /home/minecraft/cuberite/build-cuberite/Server/Cuberite
 
 You can always update Cuberite by executing:
 /home/minecraft/cuberite/compile.sh
 
 Enjoy :)

さっそく実行してみます。

$ cd /home/minecraft/cuberite/build-cuberite/Server
$ ./Cuberite
 [11:44:36] --- Started Log ---
 [11:44:36] Cuberite local build build id: Unknown
 [11:44:36] from commit id: approx: 99d96337da2852b3163108334eba84e1ba806cb7 built at: approx: 2020-05-31 20:27:08 +0100
 [11:44:36] Creating new server instance...
 [11:44:36] Reading server config...
 [11:44:36] Regenerating settings.ini, all settings will be reset
 [11:44:36] Starting server...
 [11:44:36] Loading UpgradeBlockTypePalette...
 [11:44:36] Loading per-protocol palettes...
 [11:44:36] Loaded palettes for protocol versions: 1.13, 1.14.4
 [11:44:36] Compatible clients: 1.8.x, 1.9.x, 1.10.x, 1.11.x, 1.12.x
 [11:44:36] Compatible protocol versions 47, 107, 108, 109, 110, 210, 315, 316, 335, 338, 340
 [11:44:36] Regenerating webadmin.ini, all settings will be reset
 [11:44:36] WebServer: The server will run in unsecured HTTP mode.
 [11:44:36] Put a valid HTTPS certificate in file 'webadmin/httpscert.crt' and its corresponding private key to 'webadmin/httpskey.pem' (without any password) to enable HTTPS support
 [11:44:36] Creating default ranks...
 [11:44:36] Default ranks created.
 [11:44:36] Loaded 755 crafting recipes
 [11:44:36] Loaded 67 furnace recipes and 66 fuels
 [11:44:36] Loaded 49 brewing recipes
 [11:44:36] Cannot read world settings from "world/world.ini", defaults will be used.
 [11:44:36] Chosen a new random seed for world: 892289869
 [11:44:36] Cannot read world settings from "world_nether/world.ini", defaults will be used.
 [11:44:36] Chosen a new random seed for world: 1891556548
 [11:44:36] Cannot read world settings from "world_the_end/world.ini", defaults will be used.
 [11:44:36] Chosen a new random seed for world: 497712301
 [11:44:36] -- Loading Plugins --
 [11:44:36] Initialised Core
 [11:44:36] Initialized ChatLog v.3
 [11:44:36] -- Loaded 2 Plugins --
 [11:44:37] Preparing spawn (world): 13.00% (52/400; 51.23 chunks / sec)
 [11:44:38] Preparing spawn (world): 40.25% (161/400; 107.18 chunks / sec)
 [11:44:39] Preparing spawn (world): 69.00% (276/400; 113.86 chunks / sec)
 [11:44:40] Preparing spawn (world): 95.50% (382/400; 105.47 chunks / sec)
 [11:44:40] World "world": Generated spawnpoint position at {256.50, 66.00, 0.50}
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <-512 -512=""> took 0.039 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <-512 0=""> took 0.039 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <-512 512=""> took 0.062 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <0 -512=""> took 0.019 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <0 0=""> took 0.029 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <0 512=""> took 0.000 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <512 -512=""> took 0.049 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <512 0=""> took 0.000 sec
 [11:44:40] Stopwatch: CreateStructure for NetherFort at <512 512=""> took 0.033 sec
 [11:44:41] Preparing spawn (world_nether): 20.50% (82/400; 81.84 chunks / sec)
 [11:44:42] Preparing spawn (world_nether): 67.50% (270/400; 187.44 chunks / sec)
 [11:44:43] World "world_nether":Generated spawnpoint position at {24.50, 40.00, -23.50}
 [11:44:44] World "world_the_end": Did not find an acceptable spawnpoint. Generated a random spawnpoint position at {0.00, 168.00, 0.00}
 [11:44:44] WebAdmin is running on port(s) 8080
 [11:44:44] Startup complete, took 8033ms!
 help
 [11:54:45] Executing console command: "help"
 [11:54:45] ban                 - Bans a player by name.
 [11:54:45] banip               - Bans a player by IP.
 [11:54:45] banlist             - Shows a list of all players banned by name.
 [11:54:45] banlist ips         - Shows a list of all players banned by IP.
 [11:54:45] chunkstats          - Displays detailed chunk memory statistics
 [11:54:45] clear               - Clears the inventory of a player.
 [11:54:45] deop                - Resets a player's rank to default.
 [11:54:45] destroyentities     - Destroys all entities in all worlds
 [11:54:45] effect              - Adds an effect to a player.
 [11:54:45] enchant             - Adds an enchantment to a specified player's held item.
 [11:54:45] gamemode            - Changes a player's gamemode.
 [11:54:45] give                - Gives an item to a player.
 [11:54:45] gm                  - Changes a player's gamemode.
 [11:54:45] groups              - Shows a list of all the available groups.
 [11:54:45] help                - Shows the available commands
 [11:54:45] kick                - Kicks a player by name.
 [11:54:45] kill                - Kills a player.
 [11:54:45] list                - Shows a list of all connected players in a machine-readable format.
 [11:54:45] listgroups          - Shows a list of all the available groups.
 [11:54:45] listranks           - Shows a list of all the available ranks.
 [11:54:45] load                - Adds and enables the specified plugin
 [11:54:45] numchunks           - Shows number of chunks currently loaded.
 [11:54:45] op                  - Add a player to the Admin rank.
 [11:54:45] players             - Shows a list of all connected players.
 [11:54:45] plugins             - Shows a list of the plugins.
 [11:54:45] rank                - Shows or sets a player's rank.
 [11:54:45] ranks               - Shows a list of all the available ranks.
 [11:54:45] regen               - Regenerates a chunk.
 [11:54:45] reload              - Reloads all plugins
 [11:54:45] restart             - Restarts the server cleanly
 [11:54:45] save-all            - Saves all worlds.
 [11:54:45] say                 - Sends a chat message to all players.
 [11:54:45] seed                - Shows the seed of the given world name or default world, if not given.
 [11:54:45] spawn               - Returns a player to the spawn point.
 [11:54:45] spawnpoint          - Sets the spawn point for a player.
 [11:54:45] stop                - Stops the server cleanly
 [11:54:45] time                - Sets or displays the time.
 [11:54:45] time add            - Adds a given value to the current time.
 [11:54:45] time day            - Sets the time to day.
 [11:54:45] time night          - Sets the time to night.
 [11:54:45] time query daytime  - Displays the current time.
 [11:54:45] time query gametime - Displays the amount of time elapsed since start.
 [11:54:45] time set            - Sets the time to a given value.
 [11:54:45] toggledownfall      - Toggles the weather between clear skies and rain.
 [11:54:45] tp                  - Teleports a player.
 [11:54:45] tps                 - Returns the tps (ticks per second) from the server.
 [11:54:45] unban               - Unbans a player by name.
 [11:54:45] unbanip             - Unbans a player by IP.
 [11:54:45] unload              - Disables the specified plugin
 [11:54:45] unloadchunks        - Unloads all unused chunks.
 [11:54:45] unrank              - Resets a player's rank to default.
 [11:54:45] unsafegive          - Gives an item to a player, even if the item is blacklisted.
 [11:54:45] weather             - Changes the world's weather.
 [11:54:45] whitelist           - Manages the whitelist.
 [11:54:45] whitelist add       - Adds a player to the whitelist.
 [11:54:45] whitelist list      - Shows a list of all players on the whitelist.
 [11:54:45] whitelist off       - Turns off whitelist processing.
 [11:54:45] whitelist on        - Turns on whitelist processing.
 [11:54:45] whitelist remove    - Removes a player from the whitelist.

実際の運用ではSystemdを使いたいため、設定を行います。

# vi /etc/systemd/system/cuberite.service
 [Unit]
 Description=Cuberite server
 After=network.target
 
 [Service]
 Type=simple
 User=minecraft
 WorkingDirectory=/home/minecraft/cuberite/build-cuberite/Server
 ExecStart=/usr/bin/sh -c '/usr/bin/screen -DmS CuberiteScreen /home/minecraft/cuberite/build-cuberite/Server/Cuberite'
 ExecStop=/usr/bin/screen -S CuberiteScreen -X eval 'stuff "save-all"\\015'
 ExecStop=/usr/bin/screen -S CuberiteScreen -X eval 'stuff "stop"\\015'
 TimeoutStartSec=15
 TimeoutStopSec=60
 Restart=on-failure
 
 [Install]
 WantedBy=multi-user.target

# systemctl daemon-reload

主な操作方法は次の通りです。
・起動させるとき
  # systemctl start cuberite.service
・終了させるとき
  # systemctl stop cuberite.service
・サーバ起動時に自動的に起動させるとき
  # systemctl enable cuberite.service
・現在の状態を確認するとき
  # systemctl status cuberite.service
・ログを確認するとき
  # journalctl -u cuberite.service

さて、ファイアウォールの設定を行ってクライアントから接続してみます。

# ufw allow in proto tcp to any port 25565

f:id:shukukei:20200907223011p:plain


ちゃんと繋がりました。

f:id:shukukei:20200907223047p:plain


次はWebAdmin機能を試してみます。
初期状態では管理者ユーザが作成されていないので、ユーザを作成します。
変更内容を適用するためにはCuberiteを再起動する必要があるようです。

$ vi webadmin.ini
 ; This file controls the webadmin feature of Cuberite
 ; It specifies whether webadmin is enabled, and what logins are allowed.
 ; Username format: [User:*username*]
 ; Password format: Password=*password*; for example:
 ; [User:admin]
 ; Password=admin
 ; Please restart Cuberite to apply changes made in this file!
 
 [User:master]
 Password=passwd
 
 [WebAdmin]
 Ports=8080
 Enabled=1
・ログイン前

f:id:shukukei:20200907223129p:plain

・ログイン後

f:id:shukukei:20200907223203p:plain

・Chat

f:id:shukukei:20200907223240p:plain

・Manage Server

f:id:shukukei:20200907223319p:plain

・Permissions

f:id:shukukei:20200907223356p:plain

・Player Ranks

f:id:shukukei:20200907223441p:plain

・Players

f:id:shukukei:20200907223512p:plain

・Plugins

f:id:shukukei:20200907223552p:plain

・Ranks

f:id:shukukei:20200907223623p:plain

・Server Settings

f:id:shukukei:20200907223701p:plain

・Time & Weather

f:id:shukukei:20200907223738p:plain

・Whitelist

f:id:shukukei:20200907223817p:plain


設定についてはユーザーズマニュアルを参照して行います。
https://book.cuberite.org/

・サーバ負荷(接続数:1人)

f:id:shukukei:20200907223845p:plain

LXD 4.0を試してみた (備忘録)

Ubuntu 20.04への移行準備として、LXD 4.0をインストールしてみました。
作業に際して https://lxd-ja.readthedocs.io/ja/4.0/ を参照しました。

●インストール
Ubuntu 18.04とLXD 3.0の組み合わせの場合は # apt install lxd からインストールを行うことができましたが、LXD 4.0からはsnapパッケージになっているようです。

# apt install snapd
# reboot
# snap install lxd --channel=4.0/stable
# lxd init


●Proxyデバイス
せっかくなのでLXD 3.15で改良が行われたUNIX Socketを使ってみます。

例えば、ホスト側で起動しているPostgreSQLに対してコンテナ内からアクセスしたい場合は次のようになります。
# lxc config device add mastodon postgresql proxy listen=unix:/run/postgresql/.s.PGSQL.5432 connect=unix:/run/postgresql/.s.PGSQL.5432 uid=123 gid=123 mode=0660 security.uid=456 security.gid=456 bind=guest
※例はコンテナ内のpostgresのuid, gidが123、ホスト側のpostgresのuid, gidが456の場合です。 uid, gidについてはidコマンドで調べることができます。(例:# id postgres)

逆に、コンテナ内で起動しているMastodonに対してホスト側のnginxからアクセスしたい場合は次のようになります。
# lxc config device add mastodon314 web proxy listen=unix:/tmp/web.sock connect=unix:/tmp/web.sock uid=33 gid=33 mode=0600 security.uid=1001 security.gid=1001 bind=host
# lxc config device add mastodon314 streaming proxy listen=unix:/tmp/stream.sock connect=unix:/tmp/stream.sock uid=33 gid=33 mode=0600 security.uid=1001 security.gid=1001 bind=host
※例はコンテナ名がmastodon314、コンテナ内のmastodonユーザのuid, gidが1001、ホスト側のwww-dataのuid, gidが33の場合です。


●定期スナップショット
念のため、定期的にスナップショットを保存してみます。
例えば、毎時30分にスナップショットを保存、一週間分を保持する場合は以下のような設定を行います。
# lxc config set mastodon314 snapshots.expiry "1w"
# lxc config set mastodon314 snapshots.schedule "30 * * * *"
# lxc config set mastodon314 snapshots.schedule.stopped true

パソコンの初期化作業時のメモ (備忘録)

Windows10をクリーンインストールする際の作業メモ。

・ドライバのバックアップ
dism /online /export-driver /destination:"D:\DriversBackup"

・ディスク領域の初期化
Windows 10インストールUSBから起動。
コマンドプロンプトに入ってdiskpart cleanしてからdiskpart convert gptを実施。

・ドライバのリストア
pnputil /add-driver "D:\DriversBackup\*.inf" /subdirs /install

・休止状態を無効化
powercfg /hibernate off

・システムの圧縮
compact /compactos:always

複数のCAAレコードを設定すると、さくらのレンタルサーバの無料SSL証明書発行でエラーになった。

CAAレコードにLet's EncryptとGoogle Trust Servicesを設定したところ、さくらのレンタルサーバの無料SSL証明書発行でエラーになりました。

f:id:shukukei:20200907222521p:plain

『お客様のドメインにLet's Encrypt以外のCAAレコードが設定されているため、無料SSL機能をご利用いただけません。』

CAAレコードは複数指定しても問題ないはずなのですが・・・後ほどRFC 6844を読んでみようと思います。
仕方がないのでGoogle Trust ServicesのCAAレコードを一度削除してから、無料SSL証明書の申請を行いました。

余談ですが、さくらのレンタルサーバの無料SSL証明書発行ではAレコードもチェックされていますのでDNSを書き換えてからでないと無料SSL証明書の発行は行えないようです。
(サーバ移転の場合は、既存のSSL証明書を持ち込んでから無料SSL証明書に切り替えるとダウンタイム無く切り替えられると思います。)

f:id:shukukei:20200907222610p:plain

『お客様のドメインのサーバ設定が利用中のサーバとは異なるIPアドレスに設定されているため、無料SSL機能はご利用いただけません。』

Bloggerがカスタムドメインに対して発行するSSL証明書がLet's EncryptからGoogle Trust Servicesに替わっていた。

Bloggerで新たにウェブサイト(カスタムドメイン)のを立ち上げ作業を行っていたところ、SSL証明書の発行でエラーが発生したのでメモ。


CNAMEレコードを設定してから「HTTPSの使用」を有効にすると、しばらくの間は以下のメッセージが表示されるのはいつも通りですが・・・

f:id:shukukei:20200907215900p:plain

『[HTTPS の使用] を有効にする手続きを行っています。しばらくしてからもう一度ご確認ください。』


今回は、以下のエラーメッセージが表示されました。

f:id:shukukei:20200907215928p:plain

『明示的な DNS CAA レコードによって発行が禁止されたため、HTTPS SSL 証明書を処理できませんでした。』

Bloggerのヘルプサイトを英語版で検索してみたところ、CAAレコードにはletsencrypt.orgを設定するように記載があります。

f:id:shukukei:20200907220009p:plain


digコマンドにTYPE257を指定してCAAレコードを確認したところ、ちゃんとletsencrypt.orgが設定出来ていました。

f:id:shukukei:20200907220039p:plain


さて。
行き詰まってしまったので、一度CAAレコードを全て削除してSSL証明書を発行させてみたところ・・・GTS CA 1D2,Google Trust Services - GlobalSign Root CA-R2という、何処かで聞いたことのあるような名前が入っていました。
(後になってから、iodefを設定しておけば良かったかな、と思いました。)

f:id:shukukei:20200907220144p:plain


そう、数年前にニュースになっていましたね。

f:id:shukukei:20200907220217p:plain


そこでGoogle Trust Servicesのウェブサイトを確認したところ、CAAレコードには“pki.goog”を指定すれば良いとわかりました。

f:id:shukukei:20200907220247p:plain


CAAレコードにpki.googを設定したところ、今度はエラーが出ることなくSSL証明書が発行されました。
さて、解決はしましたが・・・Bloggerのドキュメントには具体的な記載を見つけられなかったので、本当にこれで良かったのかモヤモヤする結果になりました。

今後はGoogle Trust Services発行の証明書に切り替わって行くのでしょうか?
もしも、仮に、既にLet's Encryptで発行されているウェブサイトも切り替えの対象だとすると、CAAレコードの対応をしておかないと新しい証明書が発行出来ずに期限切れになってしまうのでは?と、少し心配です。(まぁ、事前告知なく切り替えることはしないと思いますが・・・もしかして、私は告知を読み落としてしまったのでしょうか?)

ところで。
このタイミングで既存のサイトの方もLet's Encrypt発行の証明書からGoogle Trust Services発行の証明書に切り替えておけないかなー?と思い、試しに「HTTPSの使用」を“いいえ”に変更して、再び“はい”にしてみたところ・・・Google Trust Services発行の証明書に切り替わりました。

証明書の有効期間は三ヵ月のようですので、Let's Encryptと同じくらいですね。

f:id:shukukei:20200907220317p:plain