写在前面
前段时间去找nachoneko网站的时候,发现其使用的樱花网络(さくらインターネット)也有vps(另外,日本的vps真的很二次元),看到有“如何开mc服务器”的文章,点击发现是linux。中国大陆开我的世界服务器更多的可能还是windows系统。毕竟在中国,大厂的win系统批量授权,小厂直接无视版权。在海外(包括大厂的海外),windows系统和linux系统都不可以相互转换,毕竟windows系统需要额外的授权费。
这篇文章是意外的产物,只是能用,但是可以优化优化......网上教程也很多。我也不是linux用户,纯属兴趣。
省流版本
准备材料
机器
- 一台安装Ubuntu 20.04的电脑,物理内存大于2GB。
软件
- 《我的世界》基岩版服务端;
- unzip软件;
操作
- 连接机器(SSH);
- 上传服务端软件(SFTP);
- 开服;
脚本
大佬勿喷!
将<url>
替换成实际下载的连接;将<filmname>
替换为实际下载的文件名。
#!/bin/bash
downloadUrl="<url>"
filmName="<filmname>"
set -x
sudo apt -y update
sudo apt -y install screen
sudo apt -y install nano
sudo apt -y install iptables-persistent
sudo apt -y install unzip
sudo mkdir -p /opt/mcserver_be
sudo chmod -R u+rwx /opt/mcserver_be
cd /opt/mcserver_be
wget "$downloadUrl"
unzip "$filmName"
echo -e "#!/bin/bash\nexport LD_LIBRARY_PATH=.\nnohup ./bedrock_server &\nexit 0" > "/opt/mcserver_be/start.sh"
sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
sudo netfilter-persistent save
bash /opt/mcserver_be/start.sh &
echo "Success!"
exit 0
原文
机器
按照在我的世界基岩版服务端下载页面的说明,我们需要的linux必须是ubuntu,而且版本需要大于等于20.04。不支持其他linux发行版本。
我用的是虚拟机,所以能够一键修改操作系统版本,那么先装操作系统吧。
连接
我个人的习惯是直接使用root
用户并使用密码登录,虽然这不是一个好习惯:为了安全应该不使用root
用户并开放密码登录。但是为了方便,这里我就使用密码登录了。
在重置虚拟机的时候,可以设置密码,绝大部分的云虚拟机服务商都支持的。如果只能私钥登录.......懒的话使用vnc也是一个好办法(?)。
连接可以使用ssh,也可以用服务商提供的vnc啊Workbench什么的。这个看个人喜好吧,我喜欢直接在云服务商的Workbench登录,非常方便。
ssh的命令:ssh <用户名>@<地址>
比如ssh root@localhost
。如果是使用nat机器,需要把22端口映射到公网任意一个端口,ssh指定非标准端口的参数是-p
,命令是:ssh <用户名>@<地址> -p<端口号>
比如ssh root@localhost -p 10000
。
当然我选择直接使用Workbench连接,因为这台虚拟机是运行在云服务商处的.....也就是俗称的“云服务器”,所以能够享受到云服务商的“优质”的服务。Workbench链接只要按照弹窗说明输入密码,或者是填写api密钥即可登录。
安装服务端
获取服务端
基岩版的官方下载地址是:基岩版服务器下载 | Minecraft。我们要下载的服务端是linux,可以先下载到本地然后传到服务器上,也可以直接在服务器上下载。
在远程主机上打开服务端
我们先进入虚拟机中,创建一个文件夹:mkdir /mcserver
。当然,文件夹的名称随意,创建文件夹命令是:mkdir
。
然后我们进入文件夹:cd /mcserver
。进入指定文件夹的命令是:cd <路径>
。
然后下载服务端:可以使用wget
下载,也可以sftp传文件。
使用wget
获取服务端的url,然后执行wget <url>
。我现在在mc官网找到的url是:https://minecraft.azureedge.net/bin-linux/bedrock-server-1.20.73.01.zip
,那么执行的命令就是:wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.20.73.01.zip
。当然,请注意,mc版本更新极快,这只是现在的版本。最新版本需要到官网获取服务端文件。
当然这里我就不等了,在虚拟机中下载要8小时(毕竟在中国大陆),我就直接将事先准备好的文件上传到虚拟机上。
使用sftp
sftp可以理解为ftp的加强版(如果用过虚拟主机应该经常使用ftp),但是使用sftp传输文件的时候不会明文传输,能够保证文件安全。
使用登录到远程主机的命令:sftp <用户名>@<地址>
,如果不是非标端口,参数是-p
。(其实和ssh是一样的)。
登录到sftp后,使用put
命令将本机文件发送到远程主机:put <本地文件路径> <远程主机路径>
。比如:put C:\Users\admin\Downloads\bedrock-server-1.20.73.01.zip /mcserver
,这条命令表示的是:把windows环境下admin下载的文件bedrock-server-1.20.73.01.zip
发送到远程主机根目录下mcserver
文件夹中。
之后我们解压这个文件。使用wget
下载到的是一个zip文件夹,sftp无法传输文件夹所以也必须要压缩后上传。解压zip文件可以直接使用unzip
,如果远程主机上没有这个软件,可以先安装一下:apt install unzip
。(如果提示找不到软件包,可以更新一下软件包列表:apt update
)
之后我们解压文件:unzip <文件名称> -d <解压后存放的目录>
。当然,不指定存放的目录,就会默认解压到当前文件夹(强迫症可以再创建一个文件夹)。按tab
可以自动补全,比如我应该输入:unzip bedrock-server-1.20.73.01.zip
。
开放端口
和windows一样,linux系统内也有防火墙。如果在系统层面的防火墙没有开启,玩家也无法加入游戏服务器。系统防火墙和服务商提供的防火墙是不一样的。控制台的安全组配置放通端口之后,这一步是在云服务商层面完成了网络访问控制策略的设定,允许特定端口上的入站或出站流量;但是如果Linux内部的防火墙未做相应配置,可能会阻止流量到达应用服务。
《我的世界基岩版》需要放通入方向的相关端口,在Ubuntu下,防火墙管理的命令是:iptables
。如果因为游戏的默认端口是19132,所以需要开放入方向的19132端口:iptables -A INPUT -p udp --dport 19132 -j ACCEPT
。
如果虚拟机需要关机重启,则会导致上述配置的防火墙命令失效。如果需要持久性存储防火墙信息,需要安装iptables-persistent
软件(安装命令apt install iptables-persistent
),在配置完防火墙后输入netfilter-persistent save
保存当前的防火墙配置。这样之后重启虚拟机就不需要再次开放相关端口了。
如果虚拟机托管于云服务商处,可能需要从云服务商的控制台也开放相关端口;如果是nat机器,则需要在云服务商处添加相应的规则。
开服
输入LD_LIBRARY_PATH=. ./bedrock_server
(这行命令是我的世界官网给出的开服命令),就可以开服了。在命令行中会显示服务器运行的数据。
修改服务器配置
和windows一样,服务端根目录下的文件server.properties
是服务器配置。按照喜好和需求进行配置服务器。
我的喜好是在本地完成配置后重新更新到远程主机(使用sftp)。先下载原来的数据:进入sftp后使用get
命令,语法是:get <远程主机文件路径> <下载到本地的路径>
。比如我想下载到我的桌面,则是:get /mcserver/server.properties C:\Users\admin\Desktop
。之后在本地完成编辑后再使用put
上传到远程主机。在sftp中,使用put
会默认覆盖文件,所以记得做好备份哦......
当然也可以直接在远程主机上编辑文件(需要安装额外软件)。我们先安装一个编辑器软件:nano
,使用包管理软件安装则是:apt install nano
。使用nano
打开文件是:nano <文件名>
,之后在打开的界面中进行编辑。Ctrl + o
保存文件,Ctrl + x
退出编辑器。
断开ssh后保持开服
如果是使用cmd等工具,在断开ssh的一瞬间就会发现服务器被停止运行了;如果是使用云服务商的Workbench连接,在“退出实例”的时候,服务器可以正常运行,但是管理网页,服务器也会停止运行。这是因为mc服务器的进程绑定在ssh会话上。
这里需要保证mc服务器在脱离了ssh会话的情况下还可以继续运行。(不可以直接用setsid
,因为linux下mc基岩版服务器的启动命令相当于设置一个环境变量并运行软件的命令,而setsid
命令的限制,不可以执行设置变量的操作,nohup
同理)。
我们把思路打开,如果说nohup
无法设置变量,那么我们创建一个变量即可。我在这里是创建一个脚本,在脚本里设置路径,并使用nohup
保证服务器软件不会受到ssh断开的影响:创建一个.sh
的脚本,然后上传到和服务器相同的目录下,之后使用bash <脚本的文件名>.sh
。
#!/bin/bash
export LD_LIBRARY_PATH="."
nohup ./bedrock_server &
exit 0
之后,在断开ssh的情况下,mc服务器会正常运行。
关闭mc服务器
一般来说,游戏服务器存在的目的就是为了让多人随时随地访问相同的联机资源,所以需要一台单独的机器,全天开机用于提供服务。但是,也会存在一些特例:比如物理主机需要维护、需要保存存档、甚至是使用cpu积分计费的性能突发没cpu积分了。
在mc服务器的控制台中,输入stop
命令即可关闭服务器。这样是最安全的方法,会保存世界存档到磁盘。
但是如果是使用nohup
启动了一个后台进程,且退出了终端;现在又需要找到这个进程进行操作,这就比较麻烦了。需要先找到这个进程的pid。(pid:进程的识别符,同一时间内有、且只有一个,不会冲突)。我习惯使用top
命令查找进程的pid,当然也可以使用ps
查找pid。
使用top
会显示一个系统状态,类似于windows的“任务管理器”,可以使用上下键查找,使用Ctrl + c
退出。
使用ps
就是纯粹找pid了,这条命令会显示当前运行的系统进程状态信息。
之后使用kill
命令停止进程,这条命令的语法是:kill <pid>
。比如上述图片中,服务端的pid是14005,那么使用kill
结束进程就是kill 14005
。但是这样关闭游戏服务器有可能导致存档损坏。
使用screen保持持久会话
使用nohup
后,所有的输出全部被保存在nohup.out
中,虽然可以查看日志,但是无法做到在游戏服务端的控制台输入指令。可以用screen
软件保持持久会话。这是一个独立的软件,所以我们需要先安装它:apt install screen
。之后新建一个screen会话,这就像一个独立的终端:screen
。之后会弹出软件的说明,按回车即可。之后当可以正常输入命令的时候,按照官方的说明输入开服命令(LD_LIBRARY_PATH=. ./bedrock_server
)正常开服,这时候游戏控制台就会保存在这个screen的窗口中。即使关闭退出ssh的连接,游戏服务器仍然会继续运行。
如果后续再次连接ssh,只需要使用screen -r
命令即可返回screen窗口。
更多
- 为了安全考虑,其实不建议使用
root
用户,可以使用一般权限用户,使用sudo
执行需要管理员的命令。为了安全可以使用密钥对的方式验证登录。 - 如果为了方便管理,可以安装sftp管理软件,这样可以可视化管理,并且方便进行文件管理;常见的可视化sftp软件:filezilla(当然宝塔ssh也可以)
- 可以安装一些运维面板(宝塔面板居然可以开mc服,但是考虑到宝塔面板是web管理面板所以并不推荐),可以试试mcsmanager面板。
- 除了screen还有tmux这样的工具来保证服务器软件在断开ssh后还可以运行。如果使用
kill
直接关闭进程有可能导致存档损坏。 - 如果用的小服务商给的机器是nat机器,22端口的映射(当然ssh端口也是可以改的)是tcp,游戏端口的映射是udp。我的世界基岩版本的协议是udp。并且尽量将源端口和映射端口设置为相同,否则有可能出现卡在加载中的情况。
- 更新Ubuntu本地的软件包列表命令是
apt update
;升级已经安装的软件包的命令是:apt upgrade
;使用apt
命令需要以管理员用户的身份执行,一般来说如果使用的不是root用户执行需要管理员权限的命令,需要在命令前加上sudo
("superuser do",即“以超级用户权限执行”),即sudo apt update
和sudo apt upgrade
。
番外
-
日本某服务商的linux和windows不同环境的vps价格:
-
二次元满满的文档(让我大开眼界)(毕竟中国好像没有哪个服务商这么二次元)(但是插图的猫猫确实挺可爱的)
:-)