十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MC服务器永久不删档:基于systemd的稳定运行与备份方案

MC服务器永久不删档:基于systemd的稳定运行与备份方案 很多人开过MC服务器但很少有人能把同一个存档坚持开一年。真正让服务器死掉的很少是因为有人玩腻了更多是某天凌晨服务器内存溢出、开机之后存档没同步、或者换服务端时不小心把world文件夹覆盖了。等到想恢复才发现备份还停留在三个月前。所谓“一辈子不删档”不是一句口号而是从部署架构、自动重启、定时备份到容灾恢复一系列技术动作叠加起来的结果。这篇文章围绕“我的世界MC生存服务器 26.1.2 永久不删档”这个场景讲清楚三件事怎么把MC服务端稳定地跑起来、怎么用Linux系统服务保证它挂了能自动拉起、怎么设计一套真正能用的备份恢复方案。标题里那个“26.1.2”可能是你使用的整合包或者服务端框架版本标识不同版本操作路径多少有差异但核心逻辑是一样的。读完这篇文章你能得到一份可以直接照着执行的服务器搭建和长期运维方案。1. “一辈子不删档”到底难在哪里先给一个判断搭建MC服务器从来不是技术难题真正的难点是“长期稳定运行”和“数据不丢失”。很多人的第一步就选错了方式。直接在Windows电脑上双击启动bat把服务器放在自己桌面上。这种方式短期玩没问题但你想想这几个场景电脑重启后服务器没跟着启动家里断网导致外部玩家进不来C盘空间被日志塞满Windows自动更新半夜强制重启。每发生一次服务器就下线一段时间。如果玩家登录时发现服务器不在线几次之后就不会再来了。另外MC服务器数据是实时写入的。world文件夹里保存着地图、建筑、玩家背包、箱子物品。只要这个文件夹损坏或者被误删前面所有的建设进度全部归零。很多服务器号称“永久”但没有任何备份机制一旦存档损坏整个服务器就结束了。所以要实现“一辈子不删档”技术上要做到三件事服务端能自动重启进程崩溃或系统重启后不需要人工介入。存档有定期备份并且备份存在不同位置。备份有恢复验证不只是在硬盘上存一份文件而是确认它真的能还原。把这三件事落地比下载服务端、开服这件事重要得多。2. 搭建前必懂的3个概念服务端、版本和“不删档”的含义2.1 Java版服务端与客户端的关系Minecraft Java版的服务器是一个独立的Java进程。玩家通过启动器连接服务器IP和端口。服务端种类很多Vanilla Server官方原版服务端功能最纯粹但性能一般。Spigot在插件支持上有优势适合加各种管理插件。PaperSpigot的高性能分支是目前社区主流的服务端之一优化好、稳定。Fabric / Forge适合模组生存服支持大量MOD加载。对于纯生存服务器如果不想装太多插件Paper是性价比较高的选择。如果你想做原汁原味原版生存Vanilla也够用。如果你要玩工业、魔法等模组服就需要Fabric或Forge。文章后续以Paper服务端为主线做演示因为它在兼容原版玩法的同时提供了更好的性能和崩溃处理能力。2.2 版本号怎么选MC的Java版常规版本号类似1.20、1.21这样的格式。标题里的“26.1.2”很可能是某个服务端框架、整合包或者启动器的版本标识而不是原版游戏版本号。版本选择的核心原则是客户端、服务端、插件三者的版本必须匹配。比如服务端用的是1.21玩家的客户端也应该是1.21插件也必须兼容1.21。如果版本不匹配玩家会看到“Outdated Client”或者“Incompatible”的报错。不删档服务器建议选一个已经相对稳定的版本不要一有新版本就马上升级。每次大版本升级都可能带来插件不兼容、存档格式变化、世界边界变化等问题。稳定运营比追求新特性更重要。2.3 “不删档”的三个层次第一层是“数据不删”。world文件夹里有玩家花几个月建成的建筑不能说没就没。第二层是“服务不删”。服务器进程不能动不动就退出机器重启或进程崩溃后要能自动恢复。第三层是“规则不删”。一个能长期运营的服务器通常有清晰的规则、白名单和公告玩家之间形成稳定的社区。这一层是运营问题但好的技术架构能减少运营者的精力消耗。这篇文章主要解决前两层第三层会在最佳实践部分给出建议。3. 环境准备一台能撑住“一辈子”的服务器3.1 系统选择推荐使用Linux服务器。如果之前只接触过Windows也不用害怕下面所有命令都给出了完整步骤。Ubuntu 22.04 LTS或Debian 12都是不错的选择长期支持版本更新周期长适合稳定运行。如果只有Windows服务器思路也类似只是常驻服务和定时任务要用计划任务实现。不过从运维便利性上讲Linux systemd的方案要优雅得多。3.2 Java运行环境Minecraft Java版服务端依赖Java运行环境。不同版本的MC对Java版本要求不同1.17以下Java 8或Java 111.17及以上Java 17或更高1.20.5及以上通常需要Java 21安装Java 17的命令sudo apt update sudo apt install openjdk-17-jre-headless -y安装后确认版本java -version如果显示的是OpenJDK 17.x.x就说明环境就绪。如果项目操作手册要求Java 21可以把版本号替换成21例如安装openjdk-21-jre-headless。要特别注意服务器上有多个Java版本时启动脚本里最好显式指定java路径避免系统默认版本不对导致服务端无法启动。3.3 硬件配置参考MC服务器的性能瓶颈主要在内存和CPU单核性能。2到5个玩家2核CPU 4GB内存可以跑。10到30个玩家4核CPU 8GB内存更稳妥同时要预留系统占用的内存。大量玩家或地图很大16GB内存以上并把world放在SSD磁盘上。有个容易被忽略的点JVM启动参数里要合理设置最大堆内存很多人直接给JVM分配整个服务器内存结果系统没有余量运行一段时间后直接被OOM Killer杀掉。另外磁盘IO很关键。地图生成、区块加载、玩家传送时都需要大量读写文件。用云服务器的系统盘或者SSD数据盘体验会好很多。服务器并发不高时CPU核心数不用太多但单核主频越高越好因为MC的主世界生成逻辑很多是单线程的。4. 服务端安装与基础配置4.1 创建运行目录并下载服务端建议为服务器单独创建目录不要放在root目录下。这里以/opt/mc-server为例sudo mkdir -p /opt/mc-server cd /opt/mc-server然后下载Paper服务端。以Paper 1.21为例它的核心文件一般会以paper-1.21-xxx.jar的形式发布。你可以从Paper官网或者对应仓库拿到最新下载地址。下面示例假设下载好的文件名是paper.jar# 如果服务端文件是通过wget下载需要先确认实际下载URL sudo wget https://example.com/path/to/paper.jar -O paper.jar注意上面URL是占位形式实际要用下载页面提供的真实链接。没有把握的情况下不要在命令行里随便拼URL建议先从浏览器把文件下载到本地再通过scp上传到服务器。4.2 首次启动与EULAMC服务端首次启动前需要修改一个重要文件eula.txt。这里必须先说明只需要同意EULA才能运行服务端。先启动一次服务端让它生成配置文件java -Xms2G -Xmx4G -jar paper.jar nogui启动几秒后服务端会提示EULA未接受。按CtrlC停止进程然后修改文件sudo nano eula.txt把eulafalse改成eulatrue。这个操作表示你同意Minecraft EULA条款属于合法使用范围。4.3 server.properties 核心配置再次启动并停止服务端后会生成server.properties。这是MC服务器的核心配置文件。以下列出几个最关键的配置项# server.properties 关键配置示例 motdMy Forever MC Server server-port25565 online-modetrue max-players20 view-distance10 spawn-protection0 white-listtrue enforce-secure-profiletruemotd服务器列表里显示的介绍文字。server-port默认25565不需要改除非端口被占用。online-modetrue表示开启正版验证。如果你想让Java版正版玩家和离线玩家都能进需要额外配置默认建议保持true。max-players最大同时在线人数量力而行。view-distance视距设置过大会增加CPU和内存压力。spawn-protection出生点保护范围设置为0避免出生点附近无法破坏方块。white-list设为true后只有白名单里的玩家才能进入服务器这对长期服务器很必要。enforce-secure-profile新版本服务端建议开启防止非安全配置导致的联机问题。改完配置后再次用同样的java命令启动服务端。这次应该能看到类似“Done (10.123s)!”的输出说明服务器启动成功。4.4 添加白名单玩家白名单模式下第一次进入服务器的玩家需要在控制台执行whitelist add 玩家名后续增加玩家也可以直接编辑white-list.json文件。对于管理员来说更推荐用命令而不是改文件避免JSON格式错误。5. 用systemd把MC变成常驻服务现在服务器能手动启动但关掉SSH窗口后进程可能就没了系统重启也不会自动拉起。这一步把启动过程交给systemd让它成为Linux系统的一个常驻服务。5.1 创建启动脚本先写一个启动脚本方便统一管理JVM参数和服务端文件sudo nano /opt/mc-server/start.sh内容如下#!/bin/bash cd /opt/mc-server exec java -Xms2G -Xmx4G -jar paper.jar nogui给脚本加执行权限chmod x /opt/mc-server/start.sh这里用了exec让Java进程取代当前脚本进程这样systemd能正确追踪到MC进程的PID对后续自动重启有好处。5.2 创建systemd服务文件创建服务文件sudo nano /etc/systemd/system/mc-server.service写入以下内容[Unit] DescriptionMinecraft Server Afternetwork.target [Service] Usermcserver WorkingDirectory/opt/mc-server ExecStart/opt/mc-server/start.sh Restarton-failure RestartSec15s [Install] WantedBymulti-user.target说明Usermcserver用一个普通系统账号运行MC服务不要用root。后面会创建这个用户。Restarton-failure进程崩溃或异常退出时systemd会自动拉起。RestartSec15s重启前等待15秒避免频繁崩溃时疯狂重启。WorkingDirectory确保服务端在/opt/mc-server目录下运行world文件会生成在这个目录里。5.3 创建专用系统用户sudo useradd -r -m -d /var/lib/mcserver mcserver然后把目录权限给这个用户sudo chown -R mcserver:mcserver /opt/mc-server5.4 重新加载并启动服务sudo systemctl daemon-reload sudo systemctl start mc-server sudo systemctl enable mc-server常用管理命令# 查看状态 sudo systemctl status mc-server # 查看实时日志 sudo journalctl -u mc-server -f # 重启服务器 sudo systemctl restart mc-server # 停止服务器 sudo systemctl stop mc-server到这一步服务器已经具备“挂了自动重启”和“开机自动启动”的能力。即使服务器因为内存溢出崩溃systemd也会在15秒后自动拉起来这是“不删档”的第二层保障。6. 备份与恢复真正“不删档”的关键稳定运行只是前提数据不丢才是核心。MC存档由world文件夹构成。备份策略要做到“定时、异地、可验证”三层缺一不可。6.1 备份前先安全停服或存档直接复制world文件夹如果服务器正在写入可能出现文件不一致。最简单的方案是每次备份前执行管理员命令save-off save-allsave-all会强制把内存中所有数据写入磁盘。执行完后再复制world文件夹就相对安全。如果使用Paper或Spigot备份完成后执行save-on另一种方案是使用WorldEdit或Multiverse等插件提供的快照备份插件。但插件版本可能随着MC版本升级而失效所以服务器脚本里最好保留最直接的world文件夹打包方式。6.2 编写定时备份脚本下面这个脚本每天凌晨4点把world文件夹和相关配置打成tar.gz压缩包并且只保留最近7天的备份#!/bin/bash BACKUP_DIR/opt/mc-backups WORLD_DIR/opt/mc-server/world SERVER_DIR/opt/mc-server DATE$(date %Y%m%d-%H%M%S) KEEP_DAYS7 mkdir -p $BACKUP_DIR # 通知服务器保存数据 screen -S mc-server -p 0 -X stuff save-off\n screen -S mc-server -p 0 -X stuff save-all\n # 等待5秒确保数据落盘 sleep 5 tar -czf $BACKUP_DIR/mc-$DATE.tar.gz -C $SERVER_DIR world world_nether world_the_end \ server.properties white-list.json ops.json permissions.json 2/dev/null # 恢复自动保存 screen -S mc-server -p 0 -X stuff save-on\n # 删除超过保留时间的旧备份 find $BACKUP_DIR -name mc-*.tar.gz -mtime $KEEP_DAYS -delete echo Backup completed: $BACKUP_DIR/mc-$DATE.tar.gz需要先解释一下上面的脚本用到了screen。如果你用systemd管理服务MC进程不是在screen里跑的直接往Java进程发save-all命令不方便。更好的做法是配合RCON或者使用管理插件执行远程指令。这里提供一个更通用的备份思路不依赖在服务端内发命令而是先用systemctl stop mc-server做完整备份等备份完毕再启动。停服备份方案更可靠代价就是服务器会短暂停机几十秒。对于每日备份而言完全值得#!/bin/bash BACKUP_DIR/opt/mc-backups SERVER_DIR/opt/mc-server DATE$(date %Y%m%d-%H%M%S) KEEP_DAYS7 mkdir -p $BACKUP_DIR echo Stopping Minecraft server... systemctl stop mc-server tar -czf $BACKUP_DIR/mc-$DATE.tar.gz -C $SERVER_DIR world server.properties white-list.json ops.json permissions.json echo Starting Minecraft server... systemctl start mc-server find $BACKUP_DIR -name mc-*.tar.gz -mtime $KEEP_DAYS -delete echo Backup completed: $BACKUP_DIR/mc-$DATE.tar.gz这个脚本的优点是实现简单、不会备份到写了一半的文件。缺点是备份期间玩家会掉线。如果把时间定在凌晨4点对玩家影响很小。6.3 配置定时任务把备份脚本放到/opt/mc-server/backup.sh然后执行chmod x /opt/mc-server/backup.sh sudo crontab -e添加一行0 4 * * * /opt/mc-server/backup.sh /var/log/mc-backup.log 21这表示每天凌晨4点执行备份日志写入/var/log/mc-backup.log。建议每周查看一次日志确认备份是否成功。6.4 异地备份与冷备只保留在服务器本地的备份还不够。如果服务器系统盘损坏备份也会一起丢失。最简单的办法是在备份脚本里增加一步把压缩包同步到对象存储或用rsync拷贝到另一台机器。例如用rclone同步到对象存储rclone copy /opt/mc-backups remote:mc-backups或者用rsync同步到局域网NAS。异地备份的频率可以比本地备份低比如每周同步一次。成本不高但能解决服务器整体故障时的数据恢复问题。6.5 恢复流程恢复存档时先把服务停掉systemctl stop mc-server然后删除损坏的world文件夹用备份还原cd /opt/mc-server rm -rf world world_nether world_the_end tar -xzf /opt/mc-backups/mc-YYYYMMDD-HHMMSS.tar.gz解压后恢复目录权限chown -R mcserver:mcserver /opt/mc-server systemctl start mc-server恢复完成后要登录游戏确认建筑、箱子、玩家背包都正常。如果玩家发现回档到了昨天说明备份逻辑生效如果世界空白说明备份文件损坏或路径不对需要马上排查。7. 运行验证与效果检查7.1 验证服务状态执行systemctl status mc-server预期输出里应该有Active: active (running)。如果出现failed用journalctl -u mc-server -n 50查看最近的错误日志。登录服务器控制台输入list能看到当前在线玩家列表说明服务器正常响应。7.2 验证自动重启在MC服务端控制台执行stop命令或者直接查看进程状态systemctl kill -s SIGKILL mc-server这个命令会模拟进程被异常杀死。几秒后执行systemctl status mc-server如果看到进程重新变成active (running)说明Restart机制生效。这是验证“服务不删”最直接的方式。注意生产服务器不建议随意测试最好在非玩家在线时段操作。7.3 验证备份文件每个月可以挑一次维护窗口在测试服务器上解压一次最新的备份包确认文件完整tar -tzf /opt/mc-backups/mc-20250101-040000.tar.gz | head -20然后实际启动一次测试服务端把world加载起来看是否能正常进入世界。脚本能跑通不等于数据可恢复只有实际验证过的备份才有意义。这个测试环境不需要和线上一样配置只要Java版本一致即可。8. 常见问题与排查思路问题现象可能原因排查方式解决方案启动后提示“Failed to load eula.txt”eula.txt未修改或修改未保存查看eula.txt内容将eulafalse改为eulatrue玩家连接时显示“Outdated Client/Server”客户端与服务端版本不匹配检查服务端版本与玩家客户端版本统一版本或重新下载对应版本服务端服务器能启动但外网无法连接云服务器安全组或防火墙未放行25565端口检查安全组规则和防火墙状态放行TCP 25565端口内存错误“OutOfMemoryError”JVM堆内存设置过大或过小查看日志中的内存数据根据服务器内存调整-Xms和-Xmx参数进程反复崩溃插件冲突或世界区块损坏查看崩溃报告检查latest.log禁用冲突插件或恢复备份存档存档加载失败world文件夹损坏尝试用备份恢复删除损坏存档并解压最近备份定时备份没有生成文件crontab未生效或脚本权限错误检查cron日志和脚本执行权限确认crontab路径正确chmod x脚本管理员无法使用命令op权限未设置控制台输入op命令使用op 玩家名添加管理员权限排查问题时最重要的一步是看日志。MC服务端根目录下的logs/latest.log记录了启动和运行过程中的所有关键信息。遇到异常先把日志最后50行贴出来大部分问题都能定位。9. 长期运营的工程建议9.1 用独立用户运行服务端不要用root账号运行MC服务器。万一服务端被恶意玩家利用漏洞执行命令独立用户的权限范围可以降低风险。9.2 维护稳定的版本策略设定一个“核心版本周期”。比如半年内固定在某个版本上不跟随MC新版本而频繁升级。升级前必须备份完整存档并在测试服务器上验证所有插件兼容后再切换。永久不删档不等于永久不维护维护必须建立在可回滚的基础上。9.3 拒绝下载来路不明的插件插件的核心风险是恶意代码和兼容性问题。从SpigotMC、PaperMC等官方社区下载插件不随意使用第三方整合包中的陌生插件。新增插件之前在测试服运行一段时间。9.4 做好玩家数据相关约定每个长期服务器都会有人工管理需求比如玩家拆家、刷物品、利用BUG。提前设置好白名单、领地插件或记录插件可以减少纠纷。运营者还要定期查看服务器聊天记录和日志。技术架构只是基础一个能长期运行的服务器规则通常比技术更关键。9.5 保持固定重启和备份时间每周固定时间重启一次服务器清理内存碎片也让定期维护成为习惯。重启前5分钟在服务器内公告提醒玩家退出。自动化脚本虽然能完成大部分工作但运营者仍需要每周扫一眼备份日志、磁盘空间和服务状态。9.6 写一份服务器运营文档把服务端版本、Java版本、启动参数、备份方式、恢复步骤、插件清单、玩家注意事项都写到一个文档里。这个文档的存在能避免“服务器交接三个月后没人知道密码和备份位置”的尴尬局面。回到开头那个问题能不能开一个一辈子的MC服务器从技术层面看答案是肯定的但它不是一个文件、一条命令就能实现的。真正支撑起“一辈子”的是systemd守护下的自动重启是每天凌晨自动执行并且经过验证的备份任务是版本升级时留好的回滚余地是运营者愿意每周花十几分钟检查日志和备份的习惯。这篇文章给出的方案用到的技术都很基础没有复杂的架构也没有昂贵的成本但它们组合在一起就构成了一个能长期运行的MC服务器基础设施。如果你正准备搭建自己的生存服务器建议先把systemd服务和备份脚本配置好再开始喊话招人。服务器可以慢慢宣传但存档的保护机制必须从第一天就生效。
返回列表