该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(整理了3个小时整理好了)(超长代码预警!)
GNU/Linux(Easy)
(摘自Aimless Bits 的博客)
这个快速指南假设你已为加载 Minecraft 设定了一个用户、Minecraft 目录和运行中的服务器。它还有助于熟悉 /etc/init.d/minecraft 启动脚本。
第一步,在根目录里为虚拟硬盘创建一个目录。如“/home/username/minecraft_ramdisk”。
要将其挂载为一个虚拟硬盘,只需要简单编辑你的 /etc/fstab/ 文件:
sudo nano /etc/fstab
然后添加这行,确保路径(用户名、目录名称等)是正确的。
tmpfs /home/username/minecraft_ramdisk tmpfs defaults,size=512m 0 0
虚拟硬盘的尺寸必须比 Minecraft 的世界目录还要大。确保你已经预留多了一些空间。
重启你的计算机。虚拟硬盘现在会在你重启时加载,如果你希望立刻加载,输入
mount -t tmpfs none /home/username/minecraft_ramdisk -o size=512m
现在要做的是简单运行简单修改过的脚本,该脚本会加载硬盘上的文件到服务器里,将它们复制几次作为副本,以防止数据丢失。再次提醒,这个脚本是 Aimless Bits 脚本的修改版本。
如果你拥有 /etc/init.d/minecraft,删除它或者将其覆盖到这个脚本里。如果没有,新建一个文本文档,命名为“minecraft”,然后向它复制下列脚本内容。
#!/bin/bash# /etc/init.d/minecraft# version 0.6 2012-02-25 (YYYY-MM-DD)### BEGIN INIT INFO# Provides: minecraft# Required-Start: $local_fs $remote_fs# Required-Stop: $local_fs $remote_fs# Should-Start: $network# Should-Stop: $network# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: Minecraft server# Description: Starts the minecraft server### END INIT INFO#SettingsJARFILE='craftbukkit-beta_1.4.6-R0.3.jar'USERNAME="minecraft"MCSTORE="/home/$USERNAME/minecraft"MCPATH="/home/$USERNAME/minecraft_ramdisk"CPU_COUNT=1INVOCATION="java -Xmx2048M -Xms2048M -server -jar $JARFILE -o false"BACKUPPATH="/home/$USERNAME/minecraft_backups/"WORLD=Asgardeas_user() { if [ "`whoami`" == "$USERNAME" ] ; then bash -c "$1" else su - $USERNAME -c "$1" fi}mc_status() { ps aux |grep -F -v grep|grep -F -v SCREEN|grep -F --quiet $JARFILE return $?}mc_start() { if mc_status; then echo "Tried to start but $JARFILE was already running!" else echo "$JARFILE was not running... starting." if [ -d $MCSTORE/$WORLD.bak ]; then echo "last $WORLD.bak still exist, crashed warning! manual check required!!!" exit 1 fi cd $MCPATH if [ ! -f "$MCPATH/$JARFILE" ]; then echo "Ram drive empty... prepping." as_user "cp -R $MCSTORE/* $MCPATH/" fi as_user "cd $MCPATH && screen -dmS minecraft $INVOCATION" sleep 7 if mc_status; then echo "$JARFILE is now running." else echo "Could not start $JARFILE." fi fi}mc_saveoff() { if mc_status; then echo "$JARFILE is running... suspending saves" TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"say SERVER BACKUP STARTING. Server going readonly...\"\015'" as_user "$TO_SCREEN \"save-off\"\015'" as_user "$TO_SCREEN \"save-all\"\015'" sync sleep 10 else echo "$JARFILE was not running. Not suspending saves." fi}mc_saveon() { if mc_status; then echo "$JARFILE is running... re-enabling saves" TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"save-on\"\015'" as_user "$TO_SCREEN \"say SERVER BACKUP ENDED. Server going read-write...\"\015'" else echo "$JARFILE was not running. Not resuming saves." fi}mc_stop() { if mc_status; then echo "$JARFILE is running... stopping." TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"say SERVER SHUTTING DOWN IN 5 SECONDS. Saving map...\"\015'" as_user "$TO_SCREEN \"save-all\"\015'" sleep 5 as_user "$TO_SCREEN \"stop\"\015'" sleep 5 else echo "$JARFILE was not running." fi if mc_status; then echo "$JARFILE could not be shut down... still running." else echo "$JARFILE is shut down." fi}mc_update() { if mc_status; then echo "$JARFILE is running! Will not start update." else MC_SERVER_URL=https://minecraft.net/`wget -q -O - http://www.minecraft.net/download.jsp | grep minecraft_server.jar\ | cut -d \" -f 2` as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL" if [ -f $MCPATH/minecraft_server.jar.update ]; then if `diff $MCPATH/$JARFILE $MCPATH/minecraft_server.jar.update >/dev/null` then echo "You are already running the latest version of $JARFILE." else as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/$JARFILE" echo "Minecraft successfully updated." fi else echo "Minecraft update could not be downloaded." fi fi}mc_backup() { echo "Backing up minecraft files" as_user "tar zcf $BACKUPPATH/MCBKUP_`date "+%Y.%m.%d-%H"`.tar.gz $MCSTORE" echo "Backup complete"}mc_disksaverun() { if mc_status; then echo "Saving ramdrive to disk." if [ ! -f $MCPATH/$JARFILE ]; then echo "Error.. Minecraft not in ram" else if [ -d $MCSTORE/$WORLD.bak ]; then echo "last $WORLD.bak still exist, crashed warning! manual check required!!!" exit 1 fi if [ -d $MCSTORE/$WORLD ]; then as_user "mv $MCSTORE/$WORLD $MCSTORE/$WORLD.bak" fi TO_SCREEN="screen -p 0 -S minecraft -X eval 'stuff " as_user "$TO_SCREEN \"save-off\"\015'" as_user "$TO_SCREEN \"save-all\"\015'" as_user "cp -R $MCPATH/* $MCSTORE/" as_user "$TO_SCREEN \"save-on\"\015'" if [ -d $MCSTORE/$WORLD.bak ]; then as_user "rm -r $MCSTORE/$WORLD.bak" fi fi else echo "Service is not running" fi}mc_disksavehalt() { echo "Saving ramdrive to disk." if [ ! -f $MCPATH/$JARFILE ]; then echo "Error.. Minecraft not in ram" else if [ -d $MCSTORE/$WORLD.bak ]; then echo "last $WORLD.bak still exist, crashed warning! manual check required!!!" exit 1 fi if [ -d $MCSTORE/$WORLD ]; then as_user "mv $MCSTORE/$WORLD $MCSTORE/$WORLD.bak" fi echo "Saving, screen session closed" as_user "cp -R $MCPATH/* $MCSTORE/" if [ -d $MCSTORE/$WORLD.bak ]; then as_user "rm -r $MCSTORE/$WORLD.bak" fi fi}#Start-Stop herecase "$1" in start) mc_start ;; stop) mc_stop mc_disksavehalt ;; restart) mc_stop mc_disksavehalt mc_start ;; update) mc_stop mc_backup mc_update mc_start ;; backup) mc_disksaverun mc_saveoff mc_backup mc_saveon ;; disksavehalt) mc_disksavehalt ;; disksaverun) mc_disksaverun ;; status) if mc_status; then echo "$JARFILE is running." else echo "$JARFILE is not running." fi ;; *) echo "Usage: /etc/init.d/minecraft {start|stop|update|backup|status|restart|disksaverun}" exit 1 ;;esac
把该脚本移动到你的 /etc/init.d/ directory,然后设置它为可执行:
mv /directory/wherefileis/filename /etc/init.d/minecraftchmod a+x /etc/init.d/minecraft
注: 该脚本没有写上在该网站的其他 minecraft 初始化脚本的命令行选项! 因此重写了该脚本,加入了一些命令代码,因此虚拟硬盘服务器也可以使用命令之类去同步而不用使用其他插件来进行计划:http://pastebin.com/4ynwL2js 。如果需要命令行选项,可以使用这个。
你就快完成了!这个脚本表现的和原始的启动脚本差不多,只有一点不同的就是它把数据加载到虚拟硬盘里。你也可以修改脚本来使用 rsync 而不是 cp。
"rsync -r -t $MCSTORE/ $MCPATH/"
如果你想做其他东西,例如远程复制,但这对性能没什么影响,除非你的世界很大。
请勿跳过这个步骤!你需呀添加一个 crontab 条目来保存你的世界。因为某些原因,你要接着往下看,但是如果你不完成这个步骤,那么你在虚拟硬盘里的数据就会丢失。该脚本有2个磁盘保存函数,disksavehalt 和 disksaverun。 Disksavehalt 指定 screen 会话正在关闭还是正在备份,不会关闭地图保存。不要在 crontab 里调用这个函数,而是使用 disksave。做这个:
sudo crontab -e
然后添加下面2行:
*/5 * * * * /etc/init.d/minecraft disksaverun20 */6 * * * /etc/init.d/minecraft backup
数字代表每隔多少分钟就保存世界,如果你喜欢一个强健的安装、有力的供给备份以及工作,就减少这个数字。这个间隔最低只能为5分钟。
其他行运行 Minecraft 会每隔6小时备份一次,并且固定在:20时进行备份。不要跳过备份!这是最后一次警告!
祝你好运!