[超详细] 树莓派5 搭建MC服务器 全过程记录

Coast23

前言

我有一块8GB RAM的RaspBerry Pi 5, 一直在吃灰. 后来决定在上面搭建一个Minecraft服务器供同学游玩, 然而搭建的时候还是踩了不少坑. 比如, 原来的官方RaspBerry Pi OS是基于Debian Bullseye的, 但新版改成Debian Bookworm了, 网上的很多教程都不再适用. 再如, 还要解决宿舍断电公网访问的问题, 网上似乎没有把整个搭建过程讲的非常清楚的文章, 于是我便决定把我的搭建过程记录下来, 或许可以帮到 同样想用树莓派搭建Minecraft服务器的人 (真的会有人用树莓派干这事吗).

不过, 由于我对Linux不是很熟悉, 一些解决方案很可能不是最优的, 所以我的思路和操作只供参考, 也欢迎大佬在评论区提出更好的思路.

当然, 这里的大部分操作也适用于非RaspBerry Pi OS的Linux服务器.

这篇文章是萌新向 (虽然我清楚, 想到用Linux作为服务器的应该都是大佬), 每一步我都会啰嗦地讲解, 以保证小白也能看懂. 大佬可以不看或者根据目录跳着看.

在一番折腾后, 你将:

  • 失去金钱和时间
  • 获得游戏的快乐
  • 学习相关命令
  • 积累运维经验

准备工作

要有一块RaspBerry Pi 5, MicroSD卡建议用闪迪等大厂的卡, 64GB 以上最好.

如果已经设置好系统, 就跳过这一步

烧录系统

给MicroSD卡烧录系统, 建议使用官方的烧录工具Raspberry Pi Imager, 小白也能轻松上手.

插入MicroSD卡, 打开烧录工具, 填写设备型号、系统(官方64位)、储存卡.

1

然后按NEXT. 编辑一下设置.

2

设置用户名和密码 (一定要设置强密码!!!), WIFI填写树莓派和PC能同时连接的设备, 这里我填的是 手机热点.

3

如果你熟悉SSH的公钥登入, 建议SERVICES页里把SSH改成公钥登入, 比用密码更安全. 但如果不熟悉且懒得折腾的话, 还是保持用密码登入吧.

再次提醒: 一定要设置强密码!!!

保存设置, 开始烧录.

烧录后把MicroSD卡插到树莓派上, 插电开机, 等待系统启动.

树莓派开机会自动连接烧录阶段保留的WIFI, PC也切换到这个WIFI下.


换源

这步讲解如何SSH登入树莓派, 并更换软件源. 会的话直接跳过就好.

需要2样东西: 树莓派的IPSSH客户端.

获取树莓派IP

其实就是获取局域网其它设备的IP. 方法不少, 工具也很多.

如果连的是路由器, 可以直接登入路由器后台查看.

或者使用一些局域网IP扫描工具, 这里推荐2个:

  • WNetWatcher: 最推荐, 体积小, 扫描快, 界面干净, 下载链接在官网最下面.
  • Advanced IP Scanner: 功能全面, 但相应地, 体积大, 扫描也慢, 需要自己指定IP段.

WNetWatcher v2.42为例, 下载解压后, 运行程序, 程序启动会自动扫描, 不出意外就能看到树莓派的IP了.


SSH连接树莓派 & 换源

然后就是SSH连接树莓派, 这里我推荐用PuTTY. 不推荐使用Xshell, 其部分版本存在后门, 不安全.

如果你的终端已经有ssh命令, 你也可以直接ssh <name>@<树莓派IP>来登入.

但我使用PuTTY, 所以接下来都是以PuTTY为例.

4

这里填入树莓派的IP地址, 端口默认22, 然后点击下方的Open.

如果有弹出PuTTY Security Alert窗口, 选择Accept即可.

然后, 在终端中输入树莓派的账号和密码(烧录系统时设置的, 注意密码没有回显, 看不到输入的密码是正常的), 回车.

登入成功后, 参照这篇文章换源.

(懒得自己再写一遍.)


安装jdk与paper端

Java服务端实在太多了, 常见的有以下几种:

  • 官方服务器: 纯原版, 最稳定, 但加不了插件和mod.
  • Forge端: 可以在服务器上装Forge Mods.
  • Fabric端: 可以在服务器上装Fabric Mods.
  • Paper: 属于Spigot的分支, 兼容大部分Bukkit和Spigot插件, 有很好的性能和优化选项.
  • Purpur: 基于Paper, 应该比Paper好使, 但我没去了解过, 不做点评.
  • Mohist: 可以同时装Forge Mods和 Bukkit/Spigot 插件, 很强大.
  • MCSManager: 非常流行的面板服, 一键部署, 功能全面.

一般来说, 用MCSManager来部署应该是最简单最方便的, 网上的教程也很多, 但是, 用面板服需要安装一些依赖, 而且很多功能可能是用不上的, 同时可能也更吃性能. 而我偏好轻量、简洁、按需添加功能的应用, 因此我没有选择用面板服.

再加上各种各样的原因, 最终我选择的是Paper端, 你可以根据自己的需求和兴趣选择其它的服务端.

以下教程是针对Paper端的, 如果想使用其它服务端, 请自行查阅对应的官方文档.


安装jdk & 配置系统变量

根据Paper(Minecraft)版本, 选择对应的Java JDK进行安装.

Paper VersionRecommened Java Version
1.8 ~ 1.11Java 8
1.12 ~ 1.16.4Java 11
1.16.5Java 16
1.17.1 ~ 1.18.1+Java 21

上表出自Paper的官方文档

我选择的Minecraft版本是1.21.1, 所以要安装JDK 21.

一般来说, 可以直接使用apt安装 openjdk-21-jdk:

sudo apt update && sudo apt install openjdk-21-jdk

但是, Debian的软件仓库更新很慢, 而OpenJDK 21又是一个相对较新的版本, 我使用上述命令的时候报错了:
E: Unable to locate package openjdk-21-jdk.

如果你能通过上述命令安装, 可以跳过以下手动安装的步骤.

前往Oracle网站, 根据系统架构选择对应下载链接.

5

如果是树莓派5 + 官方系统, 选第一个.

wget https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz
tar -zxvf jdk-21_linux-aarch64_bin.tar.gz

6

上面的步骤完成后, 当前目录会生成一个jdk-21.x.x文件夹, 可以ls查看或者直接观测tar命令的输出.

把这个文件夹移到合适的目录, 我选择的是/usr/local/.

sudo mv jdk-21.0.5 /usr/local/

接下来, 把java添加到环境变量, 也就是~/.bashrc, 在该文件末尾添加即可.

可以使用vimnano等文本编辑器, 或者直接用echo命令添加:

echo "export JAVA_HOME=/usr/local/jdk-21.0.5" >> ~/.bashrc
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc

然后, 输入java --version验证是否安装成功.

$ java --version
java 21.0.5 2024-10-15 LTS
Java(TM) SE Runtime Environment (build 21.0.5+9-LTS-239)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.5+9-LTS-239, mixed mode, sharing)

这样就说明安装成功了.


安装paper & 启动服务器

Paper官网下载需要的版本. 我选择的是1.21.1, 目前最新是1.21.4.

如果要下载旧版本, 点击官网下载按钮下面的build explorer.

我这里选择1.21.1的latest build #132 版本.

7

你可以选择PC下载后用PuTTYPSFTP传给树莓派, 或者直接复制下载链接, 然后在树莓派中用wget下载.

我演示后者.

在下载前, 先创建一个文件夹, 作为服务器的目录. 我直接在~下创建了一个paper文件夹. (太随意了吧)

mkdir ~/paper
cd ~/paper

然后下载paper.

wget https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/132/downloads/paper-1.21.1-132.jar

下载后会在目录中得到一个paper-1.21.1-132.jar文件. 如果下载的是别的版本, 文件名会不一样. 自己修改命令行里的文件名即可.

输入以下命令来第一次启动你的服务端!

java -jar paper-1.21.1-132.jar

等待片刻, 会看到这样的WARN:

Downloading mojang_1.21.1.jar
Applying patches
Starting org.bukkit.craftbukkit.Main
*** Warning, you've not updated in a while! ***
*** Please download a new build as per instructions from https://papermc.io/downloads/paper ***
[16:58:32 INFO]: [bootstrap] Running Java 21 (Java HotSpot(TM) 64-Bit Server VM 21.0.5+9-LTS-239; Oracle Corporation null) on Linux 6.6.74+rpt-rpi-2712 (aarch64)
[16:58:32 INFO]: [bootstrap] Loading Paper 1.21.1-132-ver/1.21.1@b48403b (2024-11-21T10:14:27Z) for Minecraft 1.21.1
[16:58:32 INFO]: [PluginInitializerManager] Initializing plugins...
[16:58:32 INFO]: [PluginInitializerManager] Initialized 0 plugins
[16:58:34 INFO]: [ReobfServer] Remapping server...
[16:58:46 WARN]: Failed to load eula.txt
[16:58:47 INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
[16:58:47 INFO]: [ReobfServer] Done remapping server in 13152ms.

看到Failed to load eula.txt别惊慌, 第一次启动时, 这个是正常现象. 我们需要同意eula.txt里的条款才能运行服务器.

使用vimnano等文本编辑器, 把eula.txt最后一行的eula=false改为eula=true, 或者直接输入以下命令:

sed -i '$s/false/true/' eula.txt

此时, 你可以使用ls命令查看一下目录结构, Ravelloh大佬在这篇文章中给出了每个配置项的含义, 可以参考修改服务器配置.

你可以在Paper官网Modrinth上获取想要的插件, 我这里就不介绍插件和服务器的配置了, 这需要服主自由发挥了.

一般来说, 服务器可以用这样的命令来启动:

java -Xms4G -Xmx4G -jar paper-1.21.1.jar --nogui

解释一下上面的参数:

  • -Xms4G: 最小内存分配, 这里是4GB.
  • -Xmx4G: 最大内存分配, 这里也是4GB. 一般来说这两个量设置成一样的就行, 具体大小要看你的RAM和服务器人数了.
  • -jar: 表示要执行jar文件.
  • paper-1.21.1.jar: 刚刚下载的Paper的jar文件.
  • --nogui: 启动时不显示GUI界面.

Ravelloh大佬的文章里给出了如下优化命令:

java -Xms10G -Xmx10G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper.jar --nogui

可以参考使用上述命令.

需要修改一下上述命令中的-Xms, -Xmx, 以及paper.jar. 其它保持不变.

在终端执行修改后的命令, 等待片刻, 服务器就启动好啦!


[可选] 远程桌面访问树莓派

SSH已经允许我们远程控制树莓派了, 但如果你喜欢图形化界面, 你也可以通过远程桌面来访问树莓派.

树莓派自带vnc服务, 只需要开启它就行了.

开启vnc服务

执行

sudo raspi-config

打开树莓派配置工具.

19

方向键选择选项, 选择低下的<Select><Finish>, 回车空格表示选择当前选项.

依次选择 <Interface Options> > <VNC> > Yes.

然后, 会退出配置工具并出现一些命令, 这些命令用于开启vnc服务.

这时, 建议先sudo reboot重启一下树莓派.

然后, 可简单通过如下命令判断vnc服务是否开启:

systemctl status | grep vnc

20

像这样, 就说明vnc服务已经开启了.


PC远程访问树莓派

首先, 需要一个vnc客户端, 到RealVNC官网下载.

安装, 运行. (不需要登入)

21

这里输入树莓派的IP地址, 回车.

22

输入用户名和密码, 回车.

然后就可以看到树莓派的桌面了.


外网访问服务器

如何更改WIFI

目前, 树莓派连的是手机的热点, 手机热点并不能作为长期稳定的WIFI, 所以我们需要更换树莓派的WIFI.

注意, 选取的WIFI需要满足这样的条件:

  • 长期稳定
  • PC和树莓派都能连上, 且WIFI支持局域网内设备互相访问, 否则无法SSH控制树莓派.

之所以在最开始推荐使用手机热点, 是因为遇到我觉得手机热点比路由器要稳定. (可能哪天路由器就莫名其妙连不上Internet了).

网上关于树莓派切换WIFI的文章, 都是清一色的更改wpa_supplicant.conf.

但这个方法在新版系统上失效了.

新的树莓派官方系统使用NetworkManager来管理网络, 所以我们需要使用nmcli命令来更改网络连接.

你需要掌握的3条nmcli命令

sudo nmcli device wifi rescan

该命令会重新扫描附近的WIFI.

sudo nmcli device wifi list

该命令会列出扫描到的所有WIFI.

sudo nmcli device wifi connect <SSID> password <password>

该命令会连接指定的WIFI, 其中<SSID>是WIFI的名称, <password>是WIFI的密码.

更改WIFI后, PC也要重新连接WIFI, 才能SSH连接树莓派.

树莓派会自动连接nmcli连接过的WIFI. (但断网重连机制可能有点问题)


外网访问方法1: 内网穿透

服务器虽然启动了, 但只有同一个局域网下的玩家才能访问, 连接其它WIFI的小伙伴访问不了.

内网穿透是我最开始的解决方案, 我推荐使用Sakura Frp, 具体使用请参见官方文档.

免费节点不稳定, 延迟很随机, 如果服务器要长期运行, 建议购买青铜VIP, 10元/月.

服务 > 隧道列表 > 创建隧道

8

选择节点, 设置隧道名称, 填写本地游戏端口(默认是25565), 其它依需求填写.

9

创建后, 在这里查看配置文件.

10 11

记住这个 -f xxxx:xxxx 参数.

服务 > 软件下载 > frpc

根据系统架构选择对应的版本(树莓派就选arm64), 复制下载链接, 用wget下载.

12

接着, 选择保存frpc的位置, 这里我选择的是~/natfrp.

mkdir ~/natfrp
cd ~/natfrp
wget https://nya.globalslb.net/natfrp/client/frpc/0.51.0-sakura-9.3/frpc_linux_arm64
mv frpc_linux_arm64 frpc
sudo chmod +x frpc

Tip: sudo ./执行文件时, 如果显示command not found, 就用sudo chmod +x <文件名>来添加执行权限.

之后, 就可以通过执行./~natfrp/frpc -f xxxx:xxxx来启动隧道了!

13

隧道启动后, 就可以用控制台里提供的地址来连接服务器了! (当然, 服务器需要是开启状态.)

外网访问方法2: 利用公网ipv6与DDnS

如果你的路由器支持ipv6, 且可以被外网访问, 那么恭喜你, 你不需要内网穿透了!

这篇文章里, 和frpc有关的部分, 都可以不看了. 脚本里有frpc的部分, 都可以删了.

尽管如此, 我还是建议你在读完文章的其它内容后, 最后再来阅读这部分. 因为我是在摸索完其它内容后才发现路由器支持ipv6的, 时间顺序上这个part排在最后.

接下来讲怎么判断是否符合条件, 以及如何配置DDnS.

判断是否支持ipv6

如果路由器是很老的, 那大概率是不支持了. 否则就按下面的步骤过一遍来判断.

PC连接到目标WIFI, 浏览器访问https://test-ipv6.com , 如果得分为10, 则可以进行下一步的测试了.

14

打开WNetWatcher, 如果上面有ipv6地址, 说明支持公网ipv6的可能性很高了.

15

如果没有也先别放弃, 在浏览器访问路由器的IP, 输入管理员账号密码(通常贴在路由器下面)进入路由器后台.

因为各家路由器后台管理系统都不一样, 我总结不出什么通法, 反正就每个页面都点开看看, 找找有没有ipv6的出现.

16

像我这里, 很明显是支持ipv6的.

如果找不到ipv6的选项, 那就说明你的路由器不支持公网ipv6. 如果有, 保证其是开启状态.

接下来, 找到防火墙选项, 关闭或将防护等级调低, 这一步是为了让内网暴露在公网上.

17

注意, 你需要清楚自己在做什么, 内网暴露在公网上意味着设备被攻击渗透的可能性大大增加.

如果害怕, 且没有网安经验, 还是建议不要随意关闭防火墙.

然后, 把WNetWatcher上路由器或树莓派的ipv6地址复制下来, PC切换到别的WIFI, Win+R键入cmd打开终端, 输入这样的命令:

ping -6 <ipv6地址>

如果能ping通, 如下图, 说明你的路由器支持公网ipv6!

18

如果此时树莓派上正在运行服务端, 且你可以通过[ipv6地址]:端口, 比如[2409:1145:1919:abcd:...:0721]:25565进入服务器, 那么恭喜你, 你的服务器是可以被外网访问的!

配置DDnS

经过上面的检查, 已经保证服务器可以通过ipv6地址来访问了.

那为什么还要配置DDnS(Dynamic Domain Name System)呢?

因为这个ipv6地址是动态变化的, 而我们希望它是一个固定的地址/域名. 所以就需要配置DDnS.

配置DDnS可分为3步:

  1. 找域名注册商获取域名
  2. 找DDnS服务商获取解析服务
  3. 本地配置DDnS解析更新

在撰稿时, 我原来使用的免费域名服务商(nic.us.kg)挂了…

详情请见这里

所以, 我就没打算细讲第1步和第2步的内容了.

第1步和第2步, 可以参考这篇文章.

这里讲讲第3步.

我们需要一个工具, 可以在ipv6地址发生变化时, 将新的DDnS解析提交给DDnS服务商(这里使用的是Cloudflare).

ddns-go就可以实现我们的需求.

在Release页根据系统架构下载对应的ddns-go, 如果是树莓派5, 就选择ddns-go_<version>_linux_arm64.tar.gz, 复制下载链接, 在树莓派上用wget下载. (提前cd到一个用于存放下载文件的目录)

如果卡住的话就稍微等一等, ddns-go文件挺小, 应该是能成功下载的.

下载完成后, 用tar解压, 参照README执行安装命令.

我是直接sudo ./ddns-go -s install了.

tar -zxvf <下载的.tar.gz文件>

参见README进行安装, 这里我直接执行./ddns-go -s intall了.

安装完成后, ddns-go会在9876端口上开放配置网页, 在PC浏览器上访问http://<树莓派IP>:9876, 输入树莓派的用户名和密码进入Web配置界面.

选择DDnS服务商 (NameSilo是自带DDnS服务的, 但我是从.us.kg转的NameSilo, 之前用Cloudflare, 所以我还是接着用Cloudflare了), 开启ipv6解析, 选择通过网卡获取IP, 输入你的域名, 保存.

稍等片刻, ping一下你的域名, 如果显示的是树莓派的ipv6地址, 说明DDnS配置成功了!

[可选] 设置防火墙

经过上面的步骤, 虽然可以通过域名访问服务器了 但树莓派的其它端口(如ssh22, vnc-server5900)也同时暴露在公网上了.

这非常不安全. 我们只希望服务器的25565端口被公网访问.

有多种解决思路, 这里我选择设置防火墙, 我觉得这样最安全.

防火墙一定要谨慎设置, 别把自己锁在服务器外了!

我的防火墙规则: 只允许内网设备访问22和5900端口.

我使用的命令工具是ufw. 通过sudo apt install ufw安装.

注意, ufw的默认规则是: 拒绝所有传入的连接,并允许所有传出的连接.

通过如下命令添加防火墙规则 (根据你的实际情况进行修改):


# 允许任意IP访问25565端口, 25565改成你的Minecraft服务器端口.
sudo ufw allow from any to any port 25565

# 允许3种常见的内网IP段访问22和5900端口.
sudo ufw allow from 192.168.0.0/16 to any port 22
sudo ufw allow from 192.168.0.0/16 to any port 5900
sudo ufw allow from 10.0.0.0/8 to any port 22
sudo ufw allow from 10.0.0.0/8 to any port 5900
sudo ufw allow from 172.16.0.0/12 to any port 22
sudo ufw allow from 172.16.0.0/12 to any port 5900

# 禁止所有对22和5900的访问. 这里ufw规则的检索顺序是从上到下, 先指定的规则优先生效.
sudo ufw deny 22
sudo ufw deny 5900

# 开启防火墙
sudo ufw enable

之后, 输入sudo ufw status numbered, 如果输出为:

Status: active

To Action From
-- ------ ----
[ 1] 25565 ALLOW IN Anywhere
[ 2] 22 ALLOW IN 192.168.0.0/16
[ 3] 5900 ALLOW IN 192.168.0.0/16
[ 4] 22 ALLOW IN 10.0.0.0/8
[ 5] 5900 ALLOW IN 10.0.0.0/8
[ 6] 22 ALLOW IN 172.16.0.0/12
[ 7] 5900 ALLOW IN 172.16.0.0/12
[ 8] 22 DENY IN Anywhere
[ 9] 5900 DENY IN Anywhere
[10] 25565 (v6) ALLOW IN Anywhere (v6)
[11] 22 (v6) DENY IN Anywhere (v6)
[12] 5900 (v6) DENY IN Anywhere (v6)

说明防火墙规则设置成功.

先不要关闭此时的SSH终端, 打开新的SSH终端, 如果用域名无法连接, 用本地树莓派IP可以连接, 说明防火墙设置成功.


终端会话管理 – screen

你可能意识到了这样的问题: paper.jarfrpc都会阻塞进程, 要如何同时运行它们?

你可能会觉得, 简单呀, 开2个终端不就行了? 用PuTTY连2次.

但这样还是有问题: 退出SSH终端后, 程序就中断了.

于是, 我们需要一个管理终端会话的工具, 它需要有以下功能:

  • 在不需要交互的时候, 可以把进程放到后台运行. (退出终端就不会导致程序退出)
  • 在需要交互的时候, 可以把后台的进程调到前台. (打开新终端后可以恢复对话)

这里我使用的工具是screen.

你可能也听说过相关的工具, 比如tmux. 诚然, 它比screen要强大的多, 但我觉得它有点overdesign了, screen已经能满足我的需求, 所以我还是选择screen. 以下的内容也是以screen为例.

安装screen:

sudo apt install screen

你需要掌握的screen用法

screen命令基本语法

screen [-opts] [cmd [args]]

其中, -optsscreen命令的选项, cmd是要执行的命令, args是命令的参数.
`

比较常用的-opts如下表, 我觉得英文描述很清楚, 所以就不翻译了. (也可以自行screen --help查看)

选项功能
-d (-r)Detach the elsewhere running screen (and reattach here).
-dmS nameStart as daemon: Screen session in detached mode.
-D (-r)Detach and logout remote (and reattach here).
-D -RRDo whatever is needed to get a screen session.
-h linesSet the size of the scrollback history buffer.
-ls [match] or -listDo nothing, just list our SockDir [on possible matches].
-Logfile fileSet logfile name.
-mIgnore $STY variable, do create a new screen session.
-qQuiet startup. Exits with non-zero return code if unsuccessful.
-r [session]Reattach to a detached screen process.
-RReattach if possible, otherwise start a new session.
-S socknameName this session.sockname instead of...
-UTell screen to use UTF-8 encoding.
-wipe [match]Do nothing, just clean up SockDir [on possible matches].
-xAttach to a not detached screen. (Multi display mode).
-XExecuteas a screen command in the specified session.

screen命令常见用法

  • 创建会话
screen -S <name>    # 创建名为<name>的会话并进入
screen -dmS <name> # 创建名为<name>的会话并在后台运行
  • 列出会话
screen -ls  # 列出当前用户的所有会话
  • 进入会话
screen -r <name>  # 进入名为<name>的会话
  • 退出会话
    • 如果你的当前终端正在该会话中, 按下Ctrl+A再按D即可退出会话.
    • 如果你的当前终端并不在该会话中, 会话正被另一个终端使用, 你可以用以下命令退出另一个终端中的会话:
screen -d <name>
  • 终止进程
screen -X -S <name> quit  # 终止名为<name>的会话中的所有进程

kill <pid>  # <pid>可由`screen -ls`命令获取
  • 向进程发送命令
screen -x -S <name> -p 0 -X stuff "[cmd]$(printf \\r)"
# stuff相当于往进程的输入缓冲区中输入命令, 最后的$(printf \\r)是回车符, 没有它, 命令不会被执行.

开服脚本

有了screen之后, 我们就可以方便地创建、终止、进入、退出会话了.

由此我们就可以给出开服脚本:

#!/bin/bash

# 在后台创建screen
screen -dmS mc1
screen -dmS frpc1
screen -dmS frpc2

# paper端
screen -x -S mc1 -p 0 -X stuff "cd paper$(printf \\r)"
screen -x -S mc1 -p 0 -X stuff "/usr/local/jdk-21.0.5/bin/java -Xms5G -Xmx5G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper-1.21.1.jar --nogui$(printf \\r)"
# 这里java用了全路径, 是因为脚本在某些场合执行的时候, 不会使用系统环境变量, 用全路径比较保险.
# 注意, 这里的-Xms5G -Xmx5G和最后的paper-1.21.1.jar要根据你的实际情况修改!
screen -d mc1

# 内网穿透1
screen -x -S frpc1 -p 0 -X stuff "cd natfrp$(printf \\r)"
screen -x -S frpc1 -p 0 -X stuff "./frpc -f xxxx:xxxx$(printf \\r)"
# 这里的-f xxxx:xxxx修改为你自己的配置信息, 下同
screen -d frpc1

# 内网穿透2
screen -x -S frpc2 -p 0 -X stuff "cd natfrp$(printf \\r)"
screen -x -S frpc2 -p 0 -X stuff "./frpc -f yyyy:yyyy$(printf \\r)"
screen -d frpc2

# 内网穿透3
screen -x -S frpc3 -p 0 -X stuff "cd natfrp$(printf \\r)"
screen -x -S frpc3 -p 0 -X stuff "./frpc -f zzzz:zzzz$(printf \\r)"
screen -d frpc3

# 可以对同个本地端口建立多条映射隧道, 相当于备用节点.

使用nano编辑器将上述脚本保存到~/auto/start_server.sh中 (或其它目录):

以下是保姆级教程, 给真·Linux萌新看的

nano新建start_server.sh文件:

mkdir ~/auto
nano ~/auto/start_server.sh

根据你的情况修改上述脚本, 复制后, 在PuTTY终端窗口中的打开的nano编辑器中右键即可复制, 按Ctrl+O保存, 再按Ctrl+X退出.

这之后可以执行

cat ~/auto/start_server.sh

看看输出内容是否是预期的脚本.

执行

sudo chmod +x ~/auto/start_server.sh

来赋予可执行权限.

以后就可以直接bash ~/auto/start_server.sh来启动服务器了.

服务器启动后, 可以用screen -r mc1来查看服务器后台.


设置定时开关服

我是在学校宿舍开服, 于是就面临这样一个难题: 断电. 晚上宿舍会定时断电.

我们学校的宿舍断电时间为: 周日到周四的晚上12点.

所以, 我们需要设置定时任务, 让树莓派在12点前自动停服关机.

宿舍在早上6点来电, 树莓派在重新通电后会自动开机, 于是自动开服就有2个方案: 定时开机, 开机自启.

考虑到每次开机的时候, 我不一定是想要开服, 所以我选择了定时开机.

谈到定时任务, 离不开一个强大的工具: crontab. 树莓派官方系统已经自带.

菜鸟教程上有介绍crontab命令的文章, 我这里就不赘述其用法了.

注意sudo crontab -ecrontab -e不同, 请全部使用crontab -e.

关服脚本

在使用crontab之前, 先创建一个关服脚本~/auto/stop_server.sh.

nano ~/auto/stop_server.sh

脚本内容如下:

#!/bin/bash

# 关闭服务器

screen -S mc1 -p 0 -X stuff "kickall$(printf \\r)"
# 先把所有玩家踢出去
screen -S mc1 -p 0 -X stuff "save-all$(printf \\r)"
# 保存游戏
screen -S mc1 -p 0 -X stuff "stop$(printf \\r)"
# 关服
screen -S "mc1" -X quit
# 终止 mc1 会话

# 关闭内网穿透

screen -S "frpc1" -p 0 -X stuff "^C"
screen -S "frpc1" -X quit
screen -S "frpc2" -p 0 -X stuff "^C"
screen -S "frpc2" -X quit
screen -S "frpc3" -p 0 -X stuff "^C"
screen -S "frpc3" -X quit

别忘了执行

sudo chmod +x ~/auto/stop_server.sh

来赋予可执行权限.


设置定时任务

终端键入

crontab -e

首次运行时会让你选择默认编辑器, 如果什么都不懂, 建议选择nano: 只要会Ctrl+O保存、Ctrl+X退出, 就行.

然后, 在编辑器最后添加如下内容:

55 23 * * 0-4 bash auto/stop_server.sh
# 在周日到周四, 晚上23:55分, 执行关服脚本.

57 23 * * 0-4 sudo shutdown -h now
# 在周日到周四, 晚上23:57分, 立即关机.

5 6 * * 1-5 bash auto/start_server.sh
# 在周一到周五, 早上6:05分, 执行开服脚本.

然后, 按Ctrl+O保存, 再按Ctrl+X退出.

之后, 可输入crontab -l来查看定时任务是否设置成功.

如果你想做一个定时关服提醒, 可以创建一个~/auto/warn_server.sh文件, 写入如下内容:

#!/bin/bash
screen -S mc1 -p 0 -X stuff "bc Warning: The server will be shutdown in 10 min!$(printf \\r)"
screen -d mc1

stuff后的内容就是要在paper终端中输入的命令, 我这里用的是EssentialsX插件的bc命令, 如果你没有安装EssentialsX, 把bc改成say也可以.

别忘了执行:

sudo chmox +x ~/auto/warn_server.sh

然后, crontab -e, 添加如下内容:

45 23 * * 0-4 bash auto/warn_server.sh

就可以实现关服前10分钟提醒服内玩家了.


[可选] 前台执行定时任务

crontab默认在后台执行任务. 如果你的树莓派有一块显示屏, 你希望它能显示服务器的终端, 也就是在前台执行auto/start_server.sh, 可以crontab -e并作出如下修改:

# 5 6  * * 1-5 bash auto/start_server.sh
5 6 * * 1-5 export DISPLAY=:0 && lxterminal -e "bash auto/start_server.sh"

此外, 还要在原来的start_server.sh脚本的最后一行加上screen -r mc1.

修改后的开服脚本如下:

#!/bin/bash

# 在后台创建screen
screen -dmS mc1
screen -dmS frpc1
screen -dmS frpc2

# paper端
screen -x -S mc1 -p 0 -X stuff "cd paper$(printf \\r)"
screen -x -S mc1 -p 0 -X stuff "/usr/local/jdk-21.0.5/bin/java -Xms5G -Xmx5G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper-1.21.1.jar --nogui$(printf \\r)"
# 这里java用了全路径, 是因为脚本在某些场合执行的时候, 不会使用系统环境变量, 用全路径比较保险.
# 注意, 这里的-Xms5G -Xmx5G和最后的paper-1.21.1.jar要根据你的实际情况修改!
screen -d mc1

# 内网穿透1
screen -x -S frpc1 -p 0 -X stuff "cd natfrp$(printf \\r)"
screen -x -S frpc1 -p 0 -X stuff "./frpc -f xxxx:xxxx$(printf \\r)"
# 这里的-f xxxx:xxxx修改为你自己的配置信息, 下同
screen -d frpc1

# 内网穿透2
screen -x -S frpc2 -p 0 -X stuff "cd natfrp$(printf \\r)"
screen -x -S frpc2 -p 0 -X stuff "./frpc -f yyyy:yyyy$(printf \\r)"
screen -d frpc2

# 内网穿透3
screen -x -S frpc3 -p 0 -X stuff "cd natfrp$(printf \\r)"
screen -x -S frpc3 -p 0 -X stuff "./frpc -f zzzz:zzzz$(printf \\r)"
screen -d frpc3

# 恢复 mc1 会话
screen -r mc1

树莓派5开服性能

以下数据可供参考.

在分配了6 GB内存、原版服务器(只装了一些不影响玩法的功能插件)的情况下:

  • 游戏人数在12人左右时, 仍有较流畅的游玩体验.
  • 服务器功耗在2.9W ~ 6.1W波动, 平均差不多4.5W的样子.
  • 装甲被动散热, 没有装风扇, 未出现过热现象.
  • 标题: [超详细] 树莓派5 搭建MC服务器 全过程记录
  • 作者: Coast23
  • 创建于 : 2025-02-21 16:40:28
  • 更新于 : 2025-02-24 18:24:46
  • 链接: https://coast23.github.io/2025/02/21/超详细-树莓派5-搭建MC服务器-全过程记录/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论