在 FreeBSD Jails 容器中部署 Minecraft Server

vermaden

另一个 ${RANDOM} 系统管理员分享他在 IT 行业的工作经验。

今天,正如我的儿子要求的那样,我们将讨论在 FreeBSD Jails 容器内部署 Minecraft server。

这有点像 Linux 上的 Docker/Podman,但更安全。

准备工作

首先,我们需要准备 **/jail** 路径,并获取所需的 FreeBSD Base System 版本。

截至今天,我们将使用 FreeBSD UNIX 的 14.2-RELEASE 版本。

**host # mkdir -p /jail/minecraft /jail/BASE**
**host # VER=$( freebsd-version | awk -F '-' '{print $1 "-" $2}' )**
**host # fetch -o /jail/BASE/${VER}-base.txz https://download.freebsd.org/releases/amd64/14.2-RELEASE/base.txz
**

接下来,我们将创建专用的 Minecraft FreeBSD Jail,并使用其自身的 Base System 内容填充它。

我们还将复制 **/var/run/dmesg.boot**,因为 Minecraft server 需要它。

**host # tar -C /jail/minecraft --unlink -xvf /jail/BASE/14.2-RELEASE-base.txz**
**host # cp /var/run/dmesg.boot /jail/minecraft/var/run/
**

创建 Jail

现在,我们将设置基本的 FreeBSD Jails 配置。

这些将是所有其他 Jails 的默认设置,除非我们重新定义它们。

**host # cat /etc/jail.conf**
exec.start   = "/bin/sh /etc/rc";
exec.stop    = "/bin/sh /etc/rc.shutdown";
exec.consolelog = "/var/log/jail_console_${name}.log";
exec.clean;
mount.devfs;

现在是我们的 Minecraft Jail 配置。

我们将使用 **em0** LAN 接口和 **10.0.0.210** IP 地址。

**host # cat /etc/jail.conf.d/minecraft.conf**
 minecraft {
 # GLOBAL
  exec.start = "/bin/sh /etc/rc";
  exec.stop = "/bin/sh /etc/rc.shutdown";
  exec.consolelog = "/var/log/jail_console_${name}.log";
  exec.clean;
  mount.devfs;
  host.hostname = ${name};
  path = /jail/${name};
 # CUSTOM   ip4.addr = 10.0.0.210;  interface = em0;  allow.raw_sockets;  allow.sysvipc;  devfs_ruleset=210;  allow.mount;  enforce_statfs=1;  allow.mount.devfs;  allow.mount.procfs;  allow.mount.fdescfs;
 }

我们现在可以启动我们的 Jail。

**host # service jail onestart minecraft**
Starting jails: minecraft.
**host # jls**
  JID IP Address   Hostname           Path
   1 10.0.0.210   minecraft           /jail/minecraft

您也可以使用我的 **jmore(8)** 工具。

**host # jmore**
JAIL    JID TYPE VER   DIR       IFACE  IP(s)
----    --- ---- ---   ---       -----  -----
classic  -  std  13.2-R /jail/classic  em0   10.0.0.199
ctld-two  -  vnet 13.2-R /jail/ctld-two  ${if}b -
ctld    -  vnet 13.2-R /jail/ctld    ${if}b -
fbsdjail  -  std  13.1-R /jail/fbsdjail  wlan0  10.0.0.43
iscsi   -  vnet 13.2-R /jail/iscsi   ${if}b -
minecraft 1  std  14.2-R /jail/minecraft em0   10.0.0.210
minio   -  std  14.0-R /jail/minio   em0   10.0.0.133
nfsd    -  vnet 14.1-R /jail/nfsd    ${if}b -
other   -  std  14.1-R /jail/other   em0   10.0.0.199
sambajail -  vnet 14.1-R /jail/sambajail ${if}b -
unfs3   -  vnet 14.1-R /jail/unfs3   ${if}b -

为了使 Minecraft Jail 在启动时永久启动,需要在 **host** 系统的 **/etc/rc.conf** 文件中添加以下内容。

**host # grep jail /etc/rc.conf**
 jail_enable=YES
 jail_devfs_enable=YES
 jail_list="minecraft"

配置 FreeBSD Jail

现在我们将进入 Minecraft Jail。

**jmore minecraft c** 等同于众所周知的 **env PS1='minecraft # ' jexec minecraft /bin/sh** 命令。

**host # jmore minecraft c**
**minecraft #** 

接下来是一些基本操作,例如 DNS 设置或切换到 **pkg(8)** FreeBSD 包管理器的 **latest** 分支。

**minecraft # echo nameserver 1.1.1.1 > /etc/resolv.conf

minecraft # mkdir -p /usr/local/etc/pkg/repos
minecraft # sed -e 's|quarterly|latest|g' /etc/pkg/FreeBSD.conf > /usr/local/etc/pkg/repos/FreeBSD.conf
minecraft # pkg search -o minecraft
**games/minecraft-client     Client for the block building game

现在我们将安装所有其他需要的软件包 – 因为 Minecraft server 需要使用 FreeBSD Ports 构建。

**minecraft # pkg install gitup bsddialog ccache portconfig openjdk21 tmux
**

由于我们需要从 FreeBSD Ports 构建 Minecraft server,因为需要手动接受(或忽略)许可,我们现在需要使用 **gitup** 工具获取 FreeBSD Ports 树。

**make config** 部分,选择 **DAEMON** 选项。

**minecraft # gitup ports**
(...)
#
# Please review the following file(s) for important changes.
#    /usr/ports/UPDATING
#    /usr/ports/mail/dspam/files/UPDATING
#
# Done.
**minecraft # cd /usr/ports/games/minecraft-server**
**minecraft # make config**
 +------------|**minecraft-server-1.21.4**|--------------+
 | 'F1' for Ports Collection help.          | 
 | +---------- RUN [select at least one] ----------+ |
 | | **new (*) DAEMON   Run as a service      **| |
 | | new ( ) STANDALONE Run the .jar file directly | |
 | +-----------------------------------------------+ |
 |        [ OK ]   [Cancel]       |
 +---------------------------------------------------+

构建

接下来,我们将构建 Minecraft server。

**minecraft # echo DISABLE_LICENSES=yes >> /etc/make.conf
minecraft # env BATCH=yes make build install clean**
(...)
When you first run minecraft-server, it will populate the file
/usr/local/etc/minecraft-server/eula.txt
It is required to read the EULA, and then set eula=true
- Configuration files can be found in /usr/local/etc/minecraft-server/
- Log and debug output files can be found in /var/log/minecraft-server/
- World files can be found in /var/db/minecraft-server/
Without daemon option:
- To run the server, run /usr/local/bin/minecraft-server
- To edit java's parameters, edit /usr/local/etc/minecraft-server/java-args.txt
- To run with a specific version of Java, set environment variable JAVA_VERSION,
 for example:
  export JAVA_VERSION=22
  /usr/local/bin/minecraft-server
 or:
  JAVA_VERSION=22 /usr/local/bin/minecraft-server
With daemon option:
- The service has been installed with the name 'minecraft'
- To adjust maximum memory usage (-Xmx), use minecraft_memx= in /etc/rc.conf
- To adjust initial memory usage (-Xms), use minecraft_mems= in /etc/rc.conf
- To add other java parameters, use minecraft_args= in /etc/rc.conf
- To run with a specific version of Java, use minecraft_java_version= in /etc/rc.conf
- To see the interactive console, type service minecraft console
===> Cleaning for minecraft-server-1.21.4

Minecraft Server 配置

正如 **pkg-message** 中建议的那样,我们将向 **/etc/fstab** 文件添加额外的虚拟文件系统。

我们还将确保在 Jail 启动时使用 **/etc/rc.local** 文件挂载它们。

**minecraft # cat << FSTAB >> /etc/fstab**
    fdesc  /dev/fd     fdescfs     rw   0    0
    proc  /proc      procfs     rw   0    0
**FSTAB**
**minecraft # echo 'mount -a' >> /etc/rc.local**
**minecraft # mount -a**
**minecraft # mount**
zroot/jail on / (zfs, local, noatime, nfsv4acls)
devfs on /dev (devfs)
fdescfs on /dev/fd (fdescfs)
procfs on /proc (procfs, local)
devfs on /dev (devfs)

我们不会在 Minecraft Jail 主 **/etc/rc.conf** 配置文件中配置所需的 Minecraft server 选项。

我们还将“接受” EULA 并在 **/usr/local/etc/minecraft-server/server.properties** 文件中创建基本的 Minecraft server 配置。

您还可以在 **/usr/local/etc/minecraft-server/java-args.txt** 文件中配置其他 Java 参数。

如果这些值对于您的用例来说太小,请增加它们。

**minecraft # cat << RC >> /etc/rc.conf**
minecraft_enable=YES
minecraft_mems=1024M
minecraft_memx=1024M
**RC**
**minecraft # echo eula=true > /usr/local/etc/minecraft-server/eula.txt**
**minecraft # cat << MINECRAFT > /usr/local/etc/minecraft-server/server.properties**
enable-jmx-monitoring=false
rcon.port=25575
level-seed=
gamemode=survival
enable-command-block=false
enable-query=false
generator-settings={}
enforce-secure-profile=true
level-name=world
motd=A Minecraft Server
query.port=25565
pvp=true
generate-structures=true
max-chained-neighbor-updates=1000000
difficulty=easy
network-compression-threshold=256
max-tick-time=60000
require-resource-pack=false
use-native-transport=true
max-players=20
online-mode=false
enable-status=true
allow-flight=false
initial-disabled-packs=
broadcast-rcon-to-ops=true
view-distance=10
server-ip=
resource-pack-prompt=
allow-nether=true
server-port=25565
enable-rcon=false
sync-chunk-writes=true
resource-pack-id=
op-permission-level=4
prevent-proxy-connections=false
hide-online-players=false
resource-pack=
entity-broadcast-range-percentage=100
simulation-distance=10
rcon.password=
player-idle-timeout=0
force-gamemode=false
rate-limit=0
hardcore=false
white-list=false
broadcast-console-to-ops=true
spawn-npcs=true
spawn-animals=true
log-ips=true
function-permission-level=2
initial-enabled-packs=vanilla
level-type=minecraft\:normal
text-filtering-config=
spawn-monsters=true
enforce-whitelist=false
spawn-protection=16
resource-pack-sha1=
max-world-size=29999984
**MINECRAFT
**

启动 Minecraft 服务

现在是时候启动已安装和配置的 Minecraft server 了。

**minecraft # service minecraft start**
Starting minecraft.
**minecraft # service minecraft status**
minecraft is running.
**minecraft # sockstat -l4**
USER   COMMAND  PID  FD PROTO LOCAL ADDRESS     FOREIGN ADDRESS   
mcserver java    33227 103 tcp4  10.0.0.210:25565   *:*
root   syslogd   7809 5  udp4  10.0.0.210:514    *:*

它似乎运行正常 – 但如果它不运行,请尝试以下命令进行调试。

**minecraft # su mcserver -c '/usr/local/bin/java -Xmx1024M -Xms1024M -jar /usr/local/minecraft-server/server.jar nogui'
**

使用 Minecraft 客户端连接

首先 – 确保您的客户端与 Minecraft server 版本相同 – 在我的例子中是 1.21.4

在我的例子中,Minecraft 客户端是从一些随机的 Windows 机器启动的 – 如下所示。

点击 Multiplayer 按钮。

现在点击 Add Server 按钮 – 这样我们就可以添加基于 FreeBSD 的 Minecraft server。

输入您喜欢的 Minecraft server 名称和 IP 地址。

稍等片刻,基于 FreeBSD 的 Minecraft server 将出现在列表中。

现在点击 Join Server 按钮加入它。

我们将看到 Connecting to the server… 消息。

…过了一会儿,我们就加入了我们的 Minecraft server。

总结

请随意添加您对个人 Minecraft server 所需的其他配置的想法。 EOF