Zapic's Blog
在Kindle上运行Minecraft服务器
2021-10-24
教程
查看标签

警告

本教程所使用的Java版本为8u73, 在此版本的Java上未默认禁止远程代码加载, 可能会导致Log4J远程代码执行漏洞被利用
请确保您使用的是最新版本的Spigot或者Paper服务端, 或者避免将服务器暴露在不信任的环境.


众所周知, Kindle是一个水墨屏的电子阅读器.
2021-10-22T16:26:46.png

但是, 他有Shell.
所以也能拿来开服.png

今天的受害者主角是一块Kindle Paperwhite 3, 拥有512M超大运存和一颗高性能的ARMv7处理器, 还有一块4G海量容量的EMMC, 用来开服真是再合适不过了.

  • Kindle Paperwhite 2 及之前的设备只有256M内存(甚至更少), 难以分配足够的内存给Minecraft服务器, 建议洗洗睡.

以下操作可能会损坏你的设备, 请谨慎行事, 注意备份.

\#0 事先准备

1. 越狱你的Kindle设备

目前通用软件越狱的方法支持固件版为=5.6.5, 或者5.10.3~5.13.3, 具体可以参考这些教程: https://bookfere.com/skills/jailbreak
如果你的固件版本不符合要求, 也可以通过硬件破解的方式进行越狱(支持任意版本固件), 可参考这篇帖子: https://tieba.baidu.com/p/6176973284

2. 安装KUAL/MRPackageInstaller/USBNetHack

KUAL提供了基本的越狱软件启动界面, MRPackageInstaller用于安装USBNetworkHack和其他的一些东西.
可在此处下载:
https://www.mobileread.com/forums/showthread.php?t=225030

KUAL:

针对5.10以上的固件, 通过刷入Update_KUALBooklet_hotfix_*_install.bin即可在主界面看到KUAL启动器.
针对其他固件, 越狱后直接将KUAL-KDK-2.0.azw2复制到documents文件夹即可启动

MRPackageInstaller:

为KUAL拓展, 将下载得到的文件直接解压进Kindle存储根目录即可.

USBNetworkHack:

为MRPackage, 需要手动安装.

  1. Update_usbnet_*_install_pw2_kt2_kv_pw3_koa_kt3_koa2_pw4_kt4.bin解压进mrpackage.
  2. 打开KUAL, 点击"Helper +"->"Install MRPackage"
  3. 等待设备重启

3. 安装Kterm

Kterm提供一个触控命令行终端, 可在SSH未准备好之前提供操作空间.
由于Kterm依赖Xorg, 会占用大量内存, 因此后期会使用SSH进行操作, 而不是Kterm.

下载地址: https://github.com/bfabiszewski/kterm/releases/download/v2.6/kterm-kindle-2.6.zip
Kterm是一个KUAL拓展, 将文件夹解压到extentions文件夹内即可.

4. 启动SSH服务器

通过KUAL启动Kterm, 输入以下命令:

killall dropbear
dropbear -n

即可以无密码的方式登录到Kindle.

* 为什么不建议修改密码或者密钥对的方式登录Kindle
Kindle的Linux环境并非标准Linux, 我们无法得知其密码是否有意义, 如果贸然修改可能会导致不可挽回的后果, 最后可能会沦落到需要用刷机版去救砖.
而关于密钥对, Kindle的root目录位于/tmp下, 重启便会清空, 每次重新启动都需要重新上传密钥对.

至此, 准备环节已经结束.

\#1 配置环境

1. 安装Java

Kindle的处理器比较特殊, 并不支持硬浮点运算, 因此需要下载特殊版本的Java.
https://www.oracle.com/java/technologies/javaseembedded8u73-downloads.html
在此处下载ejdk-8u73-linux-arm-sflt.tar.gz, 复制到Kindle内存存储空间.

通过SSH登录到Kindle, 使用以下命令解压Java:

cd /mnt/us/
tar -zxvf ./ejdk-8u73-linux-arm-sflt.tar.gz

将JRE移动出来并清理多余文件:

mv ./ejdk1.8.0_73/linux_arm_sflt/jre ./jre
rm -r ejdk-8u73-linux-arm-sflt.tar.gz ./ejdk1.8.0_73

测试Java:

/mnt/us/jre/bin/java -version

控制台输出:

java version "1.8.0_73"
Java(TM) SE Embedded Runtime Environment (build 1.8.0_73-b02, headless)
Java HotSpot(TM) Embedded Client VM (build 25.73-b02, mixed mode)

即表明Java已经能够正常运行.

2. 下载Minecraft服务端

推荐使用Paper-1.8.8: https://papermc.io/api/v2/projects/paper/versions/1.8.8/builds/443/downloads/paper-1.8.8-443.jar
可以尝试使用高版本, 但是性能可能不足.

# 创建文件夹, 存放服务端文件
mkdir mc
cd mc
# 下载服务端
wget https://papermc.io/api/v2/projects/paper/versions/1.8.8/builds/443/downloads/paper-1.8.8-443.jar

3. 创建Swapfile(极其高端先进的内存融合技术™) (可选, 强烈推荐)

通过内存融合技术™, 利用空余的存储空间, 可以使你的Kindle拥有更加充足的内存去运行Minecraft服务器.

对于Kindle Paperwhite 3来说, 创建一个128M的Swapfile已经足够Kindle去运行Minecraft服务器了.

# 创建128M的空文件
dd if=/dev/zero of=/mnt/us/swapfile bs=1M count=128
# 格式化为Swap
mkswap /mnt/us/swapfile
# 启动Swap
swapon /mnt/us/swapfile

* Swapfile并非越大越好
可用内存空间≠原始内存空间+Swapfile大小
Swapfile仅作为临时交换空间, 其效率极其低下.
过大的Swapfile是没有意义的, 因为软件运行时必然有一部分在原始内存空间内, 其占用不能被转移到Swapfile内.
因此Swapfile利用率不会太高, 但是能为Minecraft服务器提供有限的额外运行空间.
经测试, JVM内存分配等于128M不能正常启动服务器, 通过添加Swap空间可以为JVM提供192M的运行内存分配.

4. 结束无关进程

直接键入以下命令:

stop framework
stop tmd
stop webreader
stop powerd
stop cmd
stop demd
stop dpmd
stop appmgrd
stop perfd
stop stackdumpd
stop kb
stop contentpackd
stop pillow
stop todo
stop rcm
stop otav3
stop otaupd
stop volumd
stop udevd
stop dynconfig
stop lipcd
stop archive
stop x

即可结束绝大部分无关进程.

5. 开放防火墙

键入以下命令:

iptables -A INPUT -i wlan0 -p tcp -m tcp --dport 25565 -j ACCEPT

即可开放25565端口.

\#2 启动Minecraft服务器

1. 启动命令

cd /mnt/us/mc
/mnt/us/jre/bin/java -Xmx192M -jar ./paper-1.8.8-443.jar

即可启动Minecraft服务器.

首次启动需要同意EUAL, 需要使用Vi编辑文件.

vi <filename>

例如, 编辑eula.txt:

vi eual.txt

Vi使用指南可在搜索引擎内找到(接近Vim), 在此仅讲解基本使用:
1. 启动编辑模式
按下键盘上的"i"键.
2. 编辑文件
通过上下左右键移动光标, 如正常打字一样键入内容.
可能会出现上下左右无法移动光标的情况, 请自行百度解决.
3. 退出编辑模式
按下键盘上的"ESC"键
4. 保存并退出
在退出编辑模式之后, 输入":wq"即可保存并退出

2. 同意EUAL协议

编辑eual.txt, 将false改为true.

3. 轻度优化

编辑spigot.yml
修改view-distance2 (降低内存和CPU占用)

首次启动需要生成地图, 耗时可能较长:
034120z9digqqoi5r5hqpp.png

\#3 玩!

通过IP地址进入服务器, 可以看到我们的Kindle是非常的流畅:
034120z9digqqoi5r5hqpp.png
轻轻松松tps就能跑到19以上!

控制台运行时截图:
050949toou8ocwwu4wayuo.png

\#4 收工

由于使用了结束Kindle关键进程来腾出内存的方法, 此时的Kindle已经废了.png
只需要重启设备即可恢复正常:

reboot

\#5 再玩一次!

仅需要通过Kterm重新启动SSH服务端, 然后登录到SSH, 结束掉无关进程, 启动Swap, 开放防火墙即可.

swapon /mnt/us/swapfile

stop framework
stop tmd
stop webreader
stop powerd
stop cmd
stop demd
stop dpmd
stop appmgrd
stop perfd
stop stackdumpd
stop kb
stop contentpackd
stop pillow
stop todo
stop rcm
stop otav3
stop otaupd
stop volumd
stop udevd
stop dynconfig
stop lipcd
stop archive
stop x

iptables -A INPUT -i wlan0 -p tcp -m tcp --dport 25565 -j ACCEPT

再次启动Minecraft服务端:

cd /mnt/us/mc
/mnt/us/jre/bin/java -Xmx192M -jar ./paper-1.8.8-443.jar

玩!