Minecraft Server in FreeBSD Jails Container
在 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