【GCP】在GCE上搭建Minecraft 1.17服务器
搭建Minecraft服务器。
这是我初次投稿。
2021/6/9,随着Minecraft v1.17的发布,我将构建一个全新的服务器。
可能对其他人来说没有什么参考价值,但作为个人备忘录。
怎么会
GCP公式の「GCE上にMinecraftサーバを作る」ドキュメントが消えていた、、
(※リンクは残ってるけどページがない、、)
なので記憶を頼りに(ほとんどカンニングしながら)、アレンジを加えて一から自分で作成するぜ
使用Terraform启动实例。
- スペック
項目値インスタンスタイプe2-standard-4OSCentOS 8 Streamディスクpd-standardディスク容量20GBリージョンasia-northeast1プリエンプティブルオン(重要)
-
- プリエンプティブルインスタンスとは
24時間で必ず停止
突然停止するかもしれない
その代わりめっちゃ安い
e2-standard-4 : \$0.053/hくらい (普通は\$0.174/h)
# VPCとサブネットは省略します
# GlobalIP
resource "google_compute_address" "mcs-ip" {
name = "mcs"
description = "external IP for mcs"
network_tier = "STANDARD"
region = "asia-northeast1"
}
# Minecraft Game Server
resource "google_compute_instance" "minecraft-game-server" {
machine_type = "e2-standard-4"
name = "mcs"
project = /*PROJECT_NAME*/
tags = ["minecraft-server"]
zone = "asia-northeast1-b"
boot_disk {
auto_delete = true
device_name = "mcs"
mode = "READ_WRITE"
initialize_params {
image = "https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-stream-8-v20210512"
labels = {}
size = 20
type = "pd-standard"
}
}
network_interface {
network = google_compute_network.vpc.name
network_ip = "10.0.0.3"
subnetwork = google_compute_subnetwork.subnet.name
access_config {
nat_ip = google_compute_address.mcs-ip.address
network_tier = "STANDARD"
}
}
service_account {
email = "565378471472-compute@developer.gserviceaccount.com"
scopes = [
"https://www.googleapis.com/auth/cloud-platform",
]
}
#preemptible設定
scheduling {
preemptible = true
automatic_restart = false
}
}
# allow 25565 for minecraft
resource "google_compute_firewall" "allow-mcp" {
name = "allow-mcp"
network = google_compute_network.vpc.name
allow {
protocol = "tcp"
ports = ["25565"]
}
source_ranges = ["0.0.0.0/0"]
target_tags = ["minecraft-server"]
}
- apply する
$ terraform apply
服务器内部操作
总之、暂且不论
# dnf -y update
安装wget
# dnf -y install wget
服务器下载
# useradd minecraft
# sudo su - minecraft
公式サイトからURLコピーしてくる
$ wget https://launcher.mojang.com/v1/objects/0a269b5f2c5b93b1712d0f5dc43b6182b9ab254e/server.jar
首次启动(失败!)
$ java -jar server.java nogui
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/minecraft/server/Main has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
エラー出た、、
$ java -jar server.jar --nogui
Error: LinkageError occurred while loading main class net.minecraft.server.Main
java.lang.UnsupportedClassVersionError: net/minecraft/server/Main has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 55.0
java-11-openjdkでもNG
NGか、、
看起来1.8.0的OpenJDK已经变得过时了,
→ 尝试升级到v11.0.11
→ 看来v11.0.11也已经变得过时了
→ 不如放弃,安装源代码版本
安装OpenJDK
# cd /usr/local/src
# wget https://download.java.net/java/GA/jdk16.0.1/7147401fd7354114ac51ef3e1328291f/9/GPL/openjdk-16.0.1_linux-x64_bin.tar.gz
# tar xzvf openjdk-16.0.1_linux-x64_bin.tar.gz
# mv jdk-16.0.1 /usr/local/jdk
# cd /usr/local/bin
# ln -s /usr/local/jdk/java java
$ java -version
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-24)
OpenJDK 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
首次启动
$ java -jar server.jar --nogui
[11:10:14] [main/WARN]: Failed to load eula.txt
[11:10:14] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
好的。
同意《最终用户许可协议》
$ sed -i -e 's/false/true/g' eula.txt
服务器执行 (Sā fú jī
$ java -jar -Xms4G -Xmx6G server.jar nogui
域名系统注册
没必要特意去做,不过。
确认连接
我试着启动游戏并尝试连接。
屏幕设置
安装
なんと dnf でインストールできなくなってるのでソースから、、
make , gcc ,ncurses あたりがいるみたいなのでdnfインストールしておく
# dnf -y install make ncurses-devel
ソースをDL
# cd /usr/local/src && wget http://ftp.gnu.org/gnu/screen/screen-4.8.0.tar.gz
解凍
# tar xzvf screen-4.8.0.tar.gz
# cd screen-4.8.0
コンパイル
# ./configure
# make
パス通し
# cd ../
# mv screen-4.8.0 /usr/local/screen
# ln -s /usr/local/screen/screen screen
确认
$ screen
GNU Screen version 4.08.00 (GNU) 05-Feb-20
Copyright (c) 2018-2020 Alexander Naumov, Amadeusz Slawinski
Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski
...
[Press Space or Return to end.]
输入→按下Ctrl + D退出
在屏幕上确认服务器是否已启动。
$ screen -S mcs java -Xms4G -Xmx4G -jar server.jar nogui
按下 Ctrl + A 我可以回到 D(还记得呢w)
startup-script,shutdown-script関連
ここまででゲームは問題なくできるようになったので、
自動起動、自動バックアップを入れる
ここは完全にカンニングさせていただきました。
参考:GCP初心者がGCEでマイクラサーバを建ててみた話
起動スクリプト
#!/bin/bash
(crontab -l | grep -v -F "/home/minecraft/backup.sh" ; echo "0 */1 * * * /home/minecraft/backup.sh")| crontab -
cd /home/minecraft
screen -d -m -S mcs java -Xms4G -Xmx6G -jar server.jar nogui
备份脚本
# vi /home/minecraft/backup.sh
#!/bin/bash
screen -r mcs -X stuff '/save-all\n/save-off\n'
/usr/bin/gsutil cp -R ${BASH_SOURCE%/*}/world gs://minecraft-backup-114514/$(date "+%Y%m%d-%H%M%S")-world
screen -r mcs -X stuff '/save-on\n'
- cronに登録
# crontab -e
1時間ごとにshを実行
0 */1 * * * /home/minecraft/backup.sh
感想
要安装各种各样的源码,非常麻烦。
这导致文档消失也是可以理解的。
まぁscreenをdnfできなかったのはCentOS 8 Stream使ったからなんですが、、
OpenJDKのバージョン上げないといけないのは驚いた
顺便一提,使用 Terraform 启动实例完全是自慰行为。
用控制台点点更快地启动实例。
只需要一种选项,以下为原生中文的释义:
这是经过改编后的。
-
- 追加ディスクなし
-
- プリエンプティブル オン
- OpenJDK 16.0.1 , screen-4.8.0 をソースからインストール
您是指大概发生在什么时候?