UbuntuでMinecraft鯖を建ててみよう #2

黄砂です、花粉です、PM2.5です。辛いです、眠いです、ザジテン鼻炎カプセル飲んでいるのですが、

目には効果ないししかもあれ喉乾くし、鼻水逆に止まりすぎて痛くなるし眠いし誤字るしもう散々ですけど、飲まないよりかはまだましです。

そういえば前回の記事誤字が7個ありました、皆さんは気がついたでしょうか。電車で半分寝ながら書いたあと見直し無しで投稿すると新単語生み出しちゃう。

記事書いている途中で3回ブルスクリーンになりました。花粉めっ!!!

前回の記事

UbuntuでMinecaft鯖建てる方法

春です。季節は春です。花粉の季…

 

それでは第二回Minecraft鯖を建ててみようの続きを書いてみようかと思います。

 

前回では作業用ユーザーを作成するところまでやりました。

それでは作業用ユーザーでログインしてみましょう。

前回説明した手順でアクセスすると

login as: という文字が出てくると思います。出てこない場合はIPが間違っているか何かしら間違っていると思いますので。がんばってください。

 

login as: の後に前回作成した minecraft を入力します。このあとパスワードが求められた場合はパスワードを入力してください。

ログインしたあとは最初は /home/minecraft/ ディレクトリにいると思います。

今どこにいるかわからない場合は

pwd

と打ってください。現在いるディレクトリーが表示されると思います。

/home/minecraft/ と出れば大丈夫です。

 

それではサーバファイルを用意する前にJavaSEをインストールしたいと思います。

Ubuntuではインストールする時もうすでにライブラリーとして置かれているため

apt-get install [名前] だけでインストールすることができます。

apt-get の単語の打ちにくさ…コマンドにハイフン入れる意味あるの?!

Centos では yum install [名前] でできます。

 

 

まずは今の状態では古いVerのが入っている可能性があるのでアップデートが必要です。

そのために下のコマンドを打ち込んでください。

sudo apt-get update -y
sudo apt-get upgrade -y

その後大量の文字が出て
ちょっとしたハッカー気分に最初は陥ると思いますが多分3分ぐらいで
早く終われよっというふうに飽きてきてイライラしてくると思いますが。
頑張って待機してください。

最後にdone. が表示されれば終了です。

 

Centosならここまで文字いっぱい出ないのでスッキリとした気分で終える事が
できます。

 

 

 

 

 

 

 

Centosの方はわかりやすさisわかりやすいので好きです。

 

 

 

 

次にJavaSEをインストールします。ついでにScreenと呼ばれる仮想端末ソフトも入れます。

sudo apt-get install default-jdk Screen -y

これでJavaとScreenはインストールされると思います。

apt-getからではなく最新のVerを入れたいという方はこちらの上級者向け設定の方をどうぞ

 

Centosなどでは.rpmファイルなどを yum localinstall で依存関係も解決してインストールすることができますが
Ubuntuでは依存関係を解決してくれません、更にはlocalinstallもできないので一度rpmファイルをdebファイルに変換してから
他のパッケージインストーラーでインストールする必要があります。

そのためにはまずalienと呼ばれるものをインストールします。

sudo apt-get install alien -y

次にJava公式から最新版rpmファイルをダウンロードします。

http://www.oracle.com/technetwork/java/javase/downloads/index.html

あとはダウンロードした.rpmファイルに対して

sudo alien jdk-8u***-linux-x64.rpm

を実行します。これによりrpmからdebに変換することができました。

そして出来上がったdebファイルに対して

sudo dpkg -i jdk-8u***-linux-x64.deb

で deb ファイルをインストールすることができます。

 

(sudo alien -i ~~~.rpm で変換しなくても直接インストールできるらしいけど実際はどうなのだろうか)

 

今回はそこにサーバーに必要なデータとフォルダーを入れたいと思います。

まず最初にサーバー用のフォルダーとして

mkdir ./server/ && cd ./server

と打ってください。

コマンドの意味は

mkdir = 新規フォルダーを作成する

cd = 選択しているフォルダーを移動する

というふうになります。

真ん中の && は前のコマンドと後ろのコマンドをつなげて実行する役割があり、

この場合は server という名前のフォルダーを作ったあと server フォルダーに移動するという意味となります。

(他にもパイプと呼ばれる || や => などたくさんありますが慣れてみたら使いこなしてみましょう)

 

これで 現在いるディレクトリは /home/minecraft/server/ になると思います。

もしなっていなければ別のところに server という名前のフォルダーを作ってしまったと思うので

rm ./server で削除しましょう。

 

 

それではいよいよminecraft.jar を入れていきます。

まず最初にTUSBをプレイしたいという前提で進めていきたいと思います。

wget -O minecraft_server.jar https://s3.amazonaws.com/Minecraft.Download/versions/1.10/minecraft_server.1.10.jar

これで1.10 のminecraft.jar をDLすることができます。

また1.10と書かれている部分をVer名にすると違うVerもDLできます。

それでは一度起動してみたいと思うので以下のコマンドを打ち込んでください。

java -jar minecraft.jar nogui

ちなみにnogui を外せばGUIのコンソール画面が出てきます。

その後エラー落ちで落ちると思いますがこれは eula と呼ばれるエンドユーザーライセンス条項に同意していないためです。

 

まずは以下のURLから全文を一度目を通してください。

https://account.mojang.com/documents/minecraft_eula

詳しい意味はこちらとなります。

 

1.私達が作ったゲームを無料配布しないこと。

割れ版とかForgeとかModが入ったjarファイルをそのまま配布するのはやめましょうってことですね。もちろんこんな事すれば最悪捕まります。

もちろんModも許可がなければ無断配布などもNGです。

 

2.お金を稼ぐために使うまたは商業目的で改造すること

マルチプレイの場合は全ユーザー全てフェアであること。

例えばこのエリアは月何円以上の払っている人しか入れませんなどはNGです。またゲーム内通過を現実のお金として売ることも許可されていません。

TUSBで言うなら達成率とレベルを10%上げるチートアイテム1000円で販売するよ!!って言う風なサーバーを建てることとです。

収益化関係に関してはこちらで詳しく日本語訳されています。

http://minecraft.ologies.net/2014/06/server-monetisation-qa/

原文:https://mojang.com/2014/06/lets-talk-server-monetisation/

 

つまり

無断配布するな、

商業利用するな

課金要素を組み込むとした場合はみんなフェアにサーバーの維持を原則に、

割れなどの不正ユーザーをアクセスさせない、

みんな楽しくプレイしましょう、

ということです。

 

これに違反するとアカウント停止、サーバーその物のBANがあります

 

本規約は随時変更などの加筆があるのでこの記事執筆当時とは異なっている場合があり、また一部は著者の偏見等があります。
ので事実と異なる部分があるかもしれません。

初めて鯖建てるぞーって言う人はちょっとは読みましょうてか読んで、日本語訳いっぱいあるから。

 

読んだら右のタブへ

初回のファイル生成時に eula.txt と呼ばれるものが作られます。

中身は eula = false になっているのでこれをtrue にするだけです。

ですがvim 開いてと面倒な部分があるので下記のコマンドで一発で内容の置換を行います。

( Ubuntu じゃ vim とか最初から入っていないので説明方法がわからなかった)

sed -i 's/eula=false/eula=true/' ./eula.txt

 

次はMAPを入れてみたいと思います。今回はTUSBをDLするのでminecraft.jar をDLした時と同じようにwget でDLします。

以下のコマンドを打ち込むことで TUSB12.0.8をDLしてWorldフォルダーを生成しその中にWorldの中にTUSBのデータを解答するまでの流れを一通り済ませます。

wget -O world.zip https://tusb.ml/dl/12-0-8/ && mkdir world && cd ./world && unzip ../world.zip

Worldフォルダーを作らずにそのままZIPファイルを解凍すると Serverの中にTUSBの中身がぶちまけられる事となるので気をつけましょう。

 

これで一通り準備が整いました。

あとは起動用のバッチファイルを作成するだけです。

nano ./run.sh

と打ち込むとテキストエディタが開くので、中に

#!/bin/sh
screen -S minecraft java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui

 

と書き込みその後

chmod 700 ./run.sh

とコマンドをうちファイルに実行権限を与えます。

あとは

sh run.sh

だけで起動ができます。

何も起動できていないように見えますがバッググラウンドで起動しています。

コンソールにアクセスするには

screen -r minecraft

と打ち込みます。

省略して頭文字で screen -r m だけでも大丈夫です

 

また元の画面に戻るには

Ctrl+a→d

とキーボード操作すれば戻ることができます。

 

 

 

最後に done.() が出れば起動準備は完了です。

 

 

あとはIPですがIPアドレスはSSH繋げたときと同じIPアドレスでいけます。

ローカルネットワークの場合は PC名だけでも行けるみたいです。

 

VPSの場合はポート開放やらファイアーウォール設定があると思いますが

環境それぞれなのでそれは各自調べてください。

 

 

 

 

 

 

最後に 上級者向け設定となりますが

screen -AmdS (Screen名) (コマンド)

で外からコンソールの方にコマンドを流し込むことができます。また

いちいちscreen -r などと打つのが面倒な人は

/usr/local/bin/

に直接起動バッチを入れればコマンドとなります。

 

現在私が使っている設定ファイルも公開します。

#!/bin/sh
MC_PATH_HOME="/home/minecraft"           # minecraftサーバの基本位置
MC_PATH_SERVER="${MC_PATH_HOME}/TUSB" # サーバプログラム配置位置
MC_PATH_BACKUP="/home/Data/TUSB/files/The_Unusual_SkyBlock/マップデータ/バックアップ/v13" # バックアップ配置位置
MC_PATH_DATA="${MC_PATH_SERVER}"     # サーバデータ配置位置
MC_PATH_BIN="${MC_PATH_SERVER}"     # サーバプログラム本体設置位置
MC_PATH_TMP="/tmp"       # サーバパッチ用テンポラリ位置

# マシン設定
MC_USE_CPU=1        # GCに使用するCPU数
MC_USE_MEM="512M"  # 割り当てるメモリ数
MC_MAXUSE_MEM="1G"
# Minecraft設定
MC_USER="root"                 # サーバプログラムの実行ユーザ
MC_SERVICE="minecraft_server.17w14a.jar"   # サーバプログラム名
MC_OPTION="nogui"                   # サーバプログラムオプション
MC_STOP_INTERVAL=60                 # サーバ停止時の待ち時間
MC_SCREENNAME="minecraft-tusb"    # screenの名称
# minecraftを実行するコマンド
MC_INVOCATION="java -Xmx${MC_MAXUSE_MEM} -Xms${MC_USE_MEM} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=${MC_USE_CPU} -XX:+AggressiveOpts -jar ${MC_PATH_SERVER}/${MC_SERVICE} ${MC_OPTION}"

#日付取得用
YMD=`date '+%y/%m/%d %H:%M:%S'`
MEM_USED=`free | grep Mem | awk '{ print ($3-$6-$7)/$2*100 }'`
SWAP_USED=`free | grep Swap | awk '{ print $3/$2*100 }'`
CPU_USED=`cat /proc/loadavg | cut -d ' ' -f 1 `

# バックアップ設定
MC_BACKUP_FILE=`date '+%Y-%m-%d_%H-%M-%S'`
MC_BACKUP_PREF_WORLD="world-"
MC_BACKUP_PREF_NETHER="nether-"
MC_BACKUP_PREF_SERVER="server-"
MC_BACKUP_NAME_WORLD="world"
#MC_BACKUP_NAME_NETHER="world_nether"

# 更新設定
#CraftBukkitの場合
#MC_DOWNLOAD_FILE="craftbukkit-0.0.1-SNAPSHOT.jar"
#MC_DOWNLOAD_URI="http://ci.bukkit.org/job/dev-CraftBukkit/lastSuccessfulBuild/artifact/target/craftbukkit-0.0.1-SNAPSHOT.jar"
#MC_DOWNLOAD_JP_URI="http://zeeksphere.chu.jp/minecraft/LangXForBukkit104.zip"

# 公式サーバの場合
#MC_DOWNLOAD_FILE="minecraft_server.jar"
#MC_DOWNLOAD_URI=http://www.minecraft.net/download/minecraft_server.jar?v=`date | sed "s/[^a-zA-Z0-9]/_/g"`
#MC_DOWNLOAD_JP_URI="http://zeeksphere.chu.jp/minecraft/JaModForOfficialServer.zip"

MC_DOWNLOAD_JP_FILE="jp.zip"

# コマンド送信
MC_SEND="screen -p 0 -S ${MC_SCREENNAME} -X eval"

# 表示設定
RESET=$'\e[0m'
BOLD=$'\e[1m'
RED=$'\e[1;31m'
GREEN=$'\e[1;32m'

# ユーザ別実行 #####################################################################################
ME=`whoami`
as_user() {
    if [ ${ME} == ${MC_USER} ] ; then
        bash -c "$1"
    else
        su - ${MC_USER} -c "$1"
    fi
}

# 起動処理 #########################################################################################
mc_start() {
    if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
    then
        echo "minecraft: [${GREEN}起動中${RESET}]"
    else
        echo "minecraft: [${BOLD}起動処理中...${RESET}]"
        cd ${MC_PATH_DATA}
        as_user "cd ${MC_PATH_DATA} && screen -AmdS ${MC_SCREENNAME} ${MC_INVOCATION}"
        sleep 7
        if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
        then
            echo "minecraft を起動中: [${GREEN}OK${RESET}]"
        else
            echo "minecraft を起動中: [${RED}NG${RESET}]"
        fi
    fi
}

# 停止処理 #########################################################################################
mc_stop() {
    if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
    then
        echo "minecraft: [${BOLD}停止処理中...${RESET}]"
        as_user "${MC_SEND} 'stuff \"say §c§l${MC_STOP_INTERVAL}秒後にサーバを停止します。\"\015'"
        i=${MC_STOP_INTERVAL}
        while [ ${i} -ne 0 ]
        do
            if test `expr ${i} % 30` -eq 0 -o ${i} -le 10
            then
                as_user "${MC_SEND} 'stuff \"say §c§l後${i}秒で停止されます。\"\015'"
            fi
            i=`expr ${i} - 1`
            sleep 1
        done
        as_user "${MC_SEND} 'stuff \"say §lWorldを保存します。\"\015'"
        as_user "${MC_SEND} 'stuff \"save-all\"\015'"
        as_user "${MC_SEND} 'stuff \"stop\"\015'"
        sleep 3
        mc_backup_world
        sleep 7
        if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
        then
            echo "minecraft を停止中: [${RED}NG${RESET}]"
        else
            echo "minecraft を停止中: [${GREEN}OK${RESET}]"
        fi
    else
        echo "minecraft: [${RED}停止中${RESET}]"
    fi
}

#			as_user "${MC_SEND} 'stuff \"say §a§lメモリスワップ領域:${SWAP_USED}%\"\015'"
#			as_user "${MC_SEND} 'stuff \"say §3§lCPU:${CPU}%\"\015'"
# ステータスチェック処理 ###########################################################################
mc_status() {
    if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
    then
        echo "minecraft: [${GREEN}起動中${RESET}]"
#        as_user "${MC_SEND} 'stuff \"save-all\"\015'"
#		as_user "${MC_SEND} 'stuff \"say ${YMD}§e§l--[ステータスチェック]--\"\015'"
#
#		MEM=$MEM_USED
#		SWAP=$SWAP_USED
#		CPU=$CPU_USED
#		COUNT=0
#   echo ${MEM}   ${SWAP}   ${CPU}
	
}

# バックアップ処理 #################################################################################
mc_backup_world() {

    as_user "${MC_SEND} 'stuff \"say §6§lバックアップを開始します。\"\015'"
    as_user "${MC_SEND} 'stuff \"save-all\"\015'"
    as_user "${MC_SEND} 'stuff \"save-off\"\015'"
    ARCFILE=${MC_PATH_BACKUP}/${MC_BACKUP_PREF_WORLD}${MC_BACKUP_FILE}.tgz
    TRGFILE=${MC_BACKUP_NAME_WORLD}
    echo "minecraft: [${BOLD}${MC_BACKUP_NAME_WORLD} バックアップ中...${RESET}]"
    as_user "cd ${MC_PATH_DATA} && tar -czf ${ARCFILE} ${TRGFILE}"

#   ARCFILE=${MC_PATH_BACKUP}/${MC_BACKUP_PREF_NETHER}${MC_BACKUP_FILE}.tgz
#   TRGFILE=${MC_BACKUP_NAME_NETHER}
#   echo "minecraft: [${BOLD}${MC_BACKUP_NAME_NETHER} バックアップ中...${RESET}]"
#   rm -rf nether-*
    as_user "cd ${MC_PATH_DATA} && tar -czf ${ARCFILE} ${TRGFILE}"
    echo "minecraft: [${GREEN}バックアップ完了${RESET}]"
    as_user "${MC_SEND} 'stuff \"save-on\"\015'"
    as_user "${MC_SEND} 'stuff \"say §a§lバックアップに成功しました。\"\015'"
    as_user "${MC_SEND} 'stuff \"say §a§l共有に成功しました。\"\015'"
#   sudo -u apache php /var/www/crowd/occ files:scan --all
    sudo -u httpd php /home/kusanagi/cloud/DocumentRoot/occ files:scan --all
}

mc_backup_server() {
    ARCFILE=${MC_PATH_BACKUP}/${MC_BACKUP_PREF_SERVER}${MC_BACKUP_FILE}.tgz
    TRGFILE=${MC_SERVICE}
    echo "minecraft: [${BOLD}${MC_SERVICE} バックアップ中...${RESET}]"
    as_user "cd ${MC_PATH_SERVER} && tar -czf ${ARCFILE} ${TRGFILE}"

    echo "minecraft: [${GREEN}バックアップ完了${RESET}]"
}

# サーバプログラムアップデート #####################################################################
mc_update() {
    if ps ax | grep -v grep | grep -v -i SCREEN | grep ${MC_SERVICE} > /dev/null
    then
        echo "minecraft: [${RED}サーバが起動中なのでアップデートできません。${RESET}]"
    else
        echo "minecraft: [${BOLD}サーバアップデート中...${RESET}]"
        as_user "cd ${MC_PATH_BIN} && wget -q -O ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE}.update ${MC_DOWNLOAD_URI}"

        # 日本語mod patch
        echo "minecraft: [${BOLD}日本語mod を導入中...${RESET}]"
        as_user "cd ${MC_PATH_TMP} && cp ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE}.update ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} && jar xf ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} && rm -f ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} && wget -q -O ${MC_PATH_TMP}/${MC_DOWNLOAD_JP_FILE} ${MC_DOWNLOAD_JP_URI} && unzip -q -o ${MC_PATH_TMP}/${MC_DOWNLOAD_JP_FILE} && rm -f ${MC_PATH_TMP}/${MC_DOWNLOAD_JP_FILE} && jar cMf ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} ./* && mv --force ${MC_PATH_TMP}/${MC_DOWNLOAD_FILE} ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE}.update && rm -rf ${MC_PATH_TMP}/*"

        if [ -f ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE}.update ]
        then
            if `diff ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE} $MC_PATH_BIN/${MC_DOWNLOAD_FILE}.update >/dev/null`
            then
                echo "minecraft: [${GREEN}${MC_DOWNLOAD_FILE}は最新版です${RESET}]"
                as_user "rm -f ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE}.update"
            else
                as_user "mv ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE}.update ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE}"
                as_user "ln -sf ${MC_PATH_BIN}/${MC_DOWNLOAD_FILE} ${MC_PATH_SERVER}/${MC_SERVICE}"

                echo "minecraft をアップデート: [${GREEN}OK${RESET}]"
            fi
        else
            echo "minecraft をアップデート: [${RED}NG${RESET}"
        fi
    fi
}


# 処理分岐 #########################################################################################
case "$1" in
    start)
        mc_start
        ;;
    stop)
        mc_stop
        ;;
    restart)
        as_user "${MC_SEND} 'stuff \"say §e§lサーバを再起動します。\"\015'"
        mc_stop
        mc_start
        ;;
    backup)
        mc_backup_world
        ;;
    server-backup)
        mc_backup_server
        ;;
    status)
        mc_status
        ;;
    update)
        mc_backup_server
        mc_update
        ;;
    *)
        echo "使い方: minecraft {start|stop|restart|backup|server-backup|status|update}"
esac

exit 0

これをtusbというだけの名前のファイルにして 先程のディレクトリに置けば

tusb start だけで鯖起動ができるようになります。 (権限付与も忘れずに)

 

一部重複して無駄な部分やUbuntuではテストしていませんがCentosでは起動確認済みです。

Cronなどで回せば自動バックアップができますので製作時には非常に重宝します。

 

ここから蛇足

流石にOrangePiでTUSB動かすとなると非常に重たいです。

起動だけで2分かかりました。

 

 

てかやっぱりXseverすごいGUI普通に動いてかなり驚きました。

 

 

その後なんとがラグと戦いながらチュートリアルはクリアし

羊島までいけました。

その後やっぱりラグすぎてすぐに鯖落ちしましたので。

max-tick-time=0

 

で対処しました。

 

それでもラグを収めるわけではないので、

 

初期スポーン地点から羊まで砂利の一本道ができました(ラグすぎて砂利すら落ちない)

それで普通に渡ることができました。

 

ラグがすごいと砂利の空中一本橋作って渡ることができるという新発見ができました。

 

コメントを残す