🖋️2020-05-07 🔄2020-07-30
by shibanyan_1

Minecraft Java Editionの設定 第3回 Linuxで本格マルチプレイサーバを建てる

Minecraftサーバ

このドキュメントは@ProjectCBWが利用するサーバやサービスの設定・運用手順のドキュメントを元に作成した、LinuxでのMinecraftサーバ環境構築マニュアルです。
内容的にタイトルは「Minecraftで学ぶLinuxサーバ」が適切かもしれない。

更新履歴 #

日時 内容
2020-07-30
  • Oracle JDK、OpenJDKのライセンスについて
  • 複数のOpenJDKをupdate-alternativesで管理する方法を追記
  • ufwの解説に追記
  • screenが危ないのでtmuxの解説を追加
  • msl.ps1の使い方に追記
  • AutoBackupWSL.ps1の設定に世代管理の例を追記
  • 今からやること #

    1. サーバスペックの話をするよ
    2. LinuxサーバとWindowsクライアントを接続して遠隔操作するよ
    3. LinuxサーバでMinecraftを動かす準備をするよ
    4. Minecraftサーバを動かすよ
    5. Vanilla以外の派生サーバの動かし方を教えるよ
    6. サーバのバックアップ環境をつくるよ
    7. 応用編

    Minecraftサーバが快適に動く条件 #

    • CPUの動作周波数が高い
      JavaのGC(ガベージコレクション、≒メモリ解放)はほぼ全てのスレッドを使えますが、Minecraftサーバ自体の処理はマルチスレッドで動かないので、コア数よりクロックの方が影響します。
      例えば、サーバ向けCPU Intel Xeonシリーズの多くはコア数は多いもののクロックが低いので思うように性能が出ません。

    • メモリが潤沢にある
      メモリが足りないとJavaは頻繁にGCを実行し、CPUリソースを占有します。
      また、WorldEditやその他Modを同時に動かすと、そもそも大量のメモリ資源がある前提の動作になってくるので、多めにあった方が良いでしょう。

    • ストレージが高速
      圧縮保存されているMinecraftサーバのセーブデータやCoreProtectのデータベースなど、ストレージが遅いと足を引っ張ります。

    • Linuxを使う
      同じスペックならWindowsは遅い。

    • 日本にある
      ゲームサーバ用途において光は遅いので、アメリカやシンガポールにサーバの実体があると体感で分かります。

    上記の条件を踏まえて、海外のVPSホスティングサービスVultrのプランを例として見ていく。

    プラン SSD 月額 CPUのコア数 CPUのクロック周波数 RAM Bandwidth rsync
    --bwlimit
    Cloud Compute 320GB $80 6vCore 2.5GHz 16GB 5000GB 1929KB/s
    Cloud Compute 640GB $160 8vCore 2.5GHz 32GB 6000GB 2314KB/s
    Dedicated Cloud 120GB $60 2vCore 3.6GHz 8GB 10000GB 3858KB/s

    ※CPUの動作周波数はプランには明記されていないが、cat /proc/cpuinfoの結果を貼った。

    実際に@ProjectCBWで運用している限りでは、

    • 大規模なレッドストーン回路を動かすサバイバルマルチプレイサーバ(Vanilla)
    • 参加型大人数マルチプレイサーバ(PaperMC)

    ではDedicated Cloudのような高クロックのプランが有効だった。

    これらを踏まえると、

    • 高クロックなデスクトップPCのリソースが余っている場合
      Windowsで手軽に建てる
    • そこそこのデスクトップPCが余ってる場合
      サブ機にLinuxを入れて建てる

    • 低クロックなノート、マシンスペックが足りない場合
      VPSを契約する

    • 外部に公開したり、大勢でマルチプレイする
      (光ファイバーが這い、サーバが生い茂り、メモリが床から生えてくるような逸般の誤家庭でない限り)VPSを契約する

    用意するもの #

    • Visual Studio Code(以下VSCode)
      Microsoft製。エディタ戦争を起こすつもりはないが、メモ帳やワードパッド、サクラエディタを使っているなら非効率極まりないので即インストール。
      同じくMicrosoftのRemote Development拡張機能を導入することで、SSHクライアントにもなる。
      以降の解説はVSCodeの機能を利用してより簡単に構築を進めるので、入れましょう。

    • Windows Subsystem for Linux(以下WSL)
      Microsoft製。Windows上でLinuxを動かせるやつ。
      即必要って訳じゃないけど、使わないと話にならない部分がなくはないので、入れておくとよい。

    • Linuxサーバ
      余ったPCを使っても、VPSを借りても良い。
      Ubuntu 20.04 LTSをベースに進めるので、初めての方・特に拘りがなければ同じOS・バージョンにしておくと、躓きにくくなる。

    Linux環境構築 #

    Windowsマシン上のWSLで動かす #

    Minecraftサーバ

    WSLのパフォーマンスには期待できないので、あくまで"別のLinuxサーバで動かすためのテスト用"です。
    VPSを契約する前にLinuxを試しておきたい、本番環境とは別の開発用に使う、といった用途です。

    1. Windowsの機能の有効化または無効化でWindows Subsystem for Linuxを有効にする
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
    1. Microsoft StoreでUbuntuをインストール
    Set-Location ~/Downloads
    Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing | Add-AppxPackage
    
    Minecraftサーバ

    Win - R -> wslubuntuを打って実行するとWSLが立ち上がる

    https://docs.microsoft.com/en-us/windows/wsl/install-manual#downloading-distros
    https://qiita.com/moriai/items/850ee91d60edc91e7b7e
    https://wiki.ubuntu.com/WSL

    サブPCにLinuxを入れて動かす #

    Minecraftサーバ

    "Ubuntu Server LTS"で検索してください。

    VPS Vultrで動かす #

    Minecraftサーバ

    https://www.vultr.com/

    プランには帯域幅/月の表記があるが、実際は時間毎に計算される。
    https://www.vultr.com/resources/faq/#bandwidthhourly

    超過すると余計に課金されるため、大きなデータ転送を行う時は、Minecraftサーバが快適に動く条件の表にあるように、rsync--bwlimit等で帯域を絞った方が良い。

    bwlimit(KB/s) = Bandwidth(GByte) x 1000(MByte) x 1000(KByte) / 30(day) / 24(hour) / 60(min) / 60(sec)
    
    5000x1000x1000/30/24/60/60
    

    SSHでクライアントPCからサーバを遠隔操作する #

    サブPCにLinuxを入れて動かすにしろ、VPSで動かすにしろ基本的にクライアントPC(普段お使いWindowsマシンなど)からSSHして遠隔操作するのが基本。
    そもそもLinuxはWindowsと違い、CLI(コマンドラインインターフェース)で完結する設計になっているので、直接操作したり、リモートデスクトップをする必要はない。

    VSCodeのインストール #

    クライアントPCがWindows 10 1903以降であることを前提に進めます。
    バージョンが異なる場合、手順や挙動が若干変わります。

    まず、SSHに使うクライアントを選びインストールする。

    私の場合は、

    という少々複雑な環境になっているが、趣旨から逸れるので取り敢えず

    だけでよい。

    Win - R クライアント名 メリット デメリット
    cmd コマンドプロンプト
  • Windowsの標準機能
  • 最新のWindowsでは、デフォルトでOpenSSHクライアントがインストールされている
    設定 -> アプリと機能 -> オプション機能の管理
  • rsyncが使えない
  • ペーストが右クリック
  • powershell Windows PowerShell
  • rsyncが使えない
  • ペーストが右クリック
  • PowerShellのCmdLetを叩くためのものであり、動作が異なるので不向き
  • pwsh PowerShell Core
  • PowerShell Remoting over SSHが使える
  • wsl Windows Subsystem for Linux
  • rsyncが使える
  • gitが使える
  • ペーストが右クリック
  • 環境構築が必要
  • wt Windows Terminal
  • cmd、powershell、pwsh、wslを統合できる
  • 見た目がかっこいい
  • インストールが必要
  • 信頼性に欠ける
  • code Visual Studio Code + Remote Development
  • リモート上でviの代わりにcodeが使える
  • フォルダ一覧にD&Dすれば一応ファイル転送もできる
  • Gitの差分を見られる
  • ペーストがCtrl-V
  • 環境構築が必要
  • WSLのconfigは使えるが、鍵はWindows側に必要
  • Minecraftサーバ

    ssh-keygenで鍵ペアを作成 #

    ssh-keygenで秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)の鍵ペアを生成する。
    既定値のRSAは脆弱なので、より強力な方式Ed25519を選択する。

    Windows10 1903ではOpenSSH クライアントがプリインストールされていると思いますが、それ以前では

    設定 -> アプリ -> アプリと機能 -> オプション機能

    で追加する必要があります。

    1. VSCodeで Ctrl - Shift - ` でターミナル(既定値ではPowerShell)を起動します。
    2. WindowsのOpenSSHが参照する場所にカレントディレクトリを移動します。
      PS C:\Users\sbn> cd ~/.ssh
      PS C:\Users\sbn\.ssh> ssh-keygen -t ed25519
      
    3. ssh-keygenEd25519を明示します。RSAはダメです。
      ssh-keygen -t ed25519
      
    4. 秘密鍵の保存ファイルパスを指定します。 普通にcmdを起動していれば、%USERPROFILE%の部分を抜いた相対パスで構いません。 分からない場合は、()内をコピペして実行してみて下さい。
      ssh-keygen -t ed25519
      Generating public/private ed25519 key pair.
      Enter file in which to save the key (C:\Users\sbn/.ssh/id_ed25519): hoge_id_ed25519
      
    5. パスフレーズは特に必要がなければ何も入力せずにEnter連打で構いません。
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      
    6. このように出力されたら成功です。
      The key fingerprint is:
      SHA256:juCqizoe+PRS5ZfGE3xtWwJG8J7DGZ1rIsWEH6SvGTY [email protected]
      The key's randomart image is:
      +--[ED25519 256]--+
      |        .=+      |
      |        .=+. .   |
      |       ..o=+o    |
      |      . o=o++..  |
      |    .o .E+O.o+   |
      |.  ....+** +.    |
      |..... .o+.       |
      |oooo             |
      |B=o..            |
      +----[SHA256]-----+
      
    7. %USERPROFILE%\.sshに鍵ペアが生成されている筈です。
      PS C:\Users\sbn\.ssh> ls
      
      
          ディレクトリ: C:\Users\sbn\.ssh
      
      
      Mode                LastWriteTime         Length Name
      ----                -------------         ------ ----
      -a----       2020/03/09     20:32            216 authorized_keys
      -a----       2020/02/24     19:37            411 hoge_id_ed25519       <-- この鍵ペアが生成
      -a----       2020/02/24     19:37             98 hoge_id_ed25519.pub   <-- されていれば良い
      -a----       2020/02/24     19:37            737 config
      -a----       2020/05/02     17:40           4154 known_hosts
      
    8. VSCodeで公開鍵(.pub)を開く
      code .\id_ed25519.pub
      
      ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGDSeHy7DlHIidRfT4aeNmWt/0zZNaWKyMRcchV30ISW [email protected]
      

      後で使います。

    公開鍵(.pub)は見られても問題ありません。Tシャツに印刷しても良い。
    秘密鍵は厳重に管理しましょう。

    SSH接続(パスワード認証) #

    サーバにパスワード認証でSSHする。

    ssh ユーザ名@サーバのIPアドレスまたはドメイン
    
    > ssh [email protected]
    password: (打っても・ペーストしても表示されない)
    Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-26-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
      System information as of Sun 03 May 2020 09:20:22 PM JST
    
      System load:  0.05               Processes:             110
      Usage of /:   4.2% of 108.25GB   Users logged in:       0
      Memory usage: 37%                IPv4 address for ens3: 202.182.96.243
      Swap usage:   0%
    
     * Ubuntu 20.04 LTS is out, raising the bar on performance, security,
       and optimisation for Intel, AMD, Nvidia, ARM64 and Z15 as well as
       AWS, Azure and Google Cloud.
    
         https://ubuntu.com/blog/ubuntu-20-04-lts-arrives
    
    
    0 updates can be installed immediately.
    0 of these updates are security updates.
    
    
    Last login: Sun May  3 01:26:58 2020 from XXX.XXX.XXX.XXX
    [email protected]:~# 
    

    SSH接続(公開鍵認証) #

    次に、公開鍵認証ができるよう、ssh-keygenで作成した公開鍵をサーバ側に登録する。

    # ホームディレクトリ下.sshに移動する
    cd .ssh
    bash: cd: .ssh: No such file or directory
    
    # ない場合つくる
    mkdir .ssh
    cd .ssh
    
    # ~/.ssh/authorized_keysに登録
    vi authorized_keys
    
    # 確認
    cat authorized_keys
    # ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGDSeHy7DlHIidRfT4aeNmWt/0zZNaWKyMRcchV30ISW [email protected]
    

    viエディタはIキーでInsertモードとなり、文字入力できるようになる。
    編集後はEscキーを押下し、保存して終了するには:wq、保存せずに終了するには:q!

    # SSHセッション終了
    exit
    

    クライアント側に戻り、公開鍵認証で再度SSHする。

    ssh -i 秘密鍵 ユーザ名@サーバのIPアドレスまたはドメイン
    
    cd ~/.ssh
    ssh -i example_id_ed25519 [email protected]
    

    .ssh/config #

    クライアント側に新しいファイル.ssh/configを作成する。
    configファイルをつくると、例えばssh subだけでSSHできるようになる。ヤバいですねっ!

    cd .ssh
    code config
    
    Host sub
        HostName 192.168.100.5
        User root
        IdentityFile ~/.ssh/hoge_id_ed25519
        IdentitiesOnly yes
    
    Host ex
        HostName example.com
        User sbn
        Port 23456
        IdentityFile ~/.ssh/example_id_ed25519
        IdentitiesOnly yes
    

    VSCode Remote Developmentもconfigを参照できる。

    よくあるエラー #

    • 再度SSH接続を試みても鍵認証が失敗しパスワード認証になってしまう場合
    # リアルタイムでsudoログを確認
    sudo tail -f /var/log/auth.log
    
    # 鍵認証を試みて、アクセス権エラーが出ている場合
    Authentication refused: bad ownership or modes for directory /root/.ssh
    
    # .sshディレクトリのパーミッションを変更する
    chmod 700 /root/.ssh
    
    # authorized_keysのパーミッションを変更する
    chmod 600 ~/.ssh/authorized_keys
    

    cf. https://kana-linux.info/linux/ubuntuのsudo実行ログはどこ?
    cf. https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95
    cf. https://www.atmarkit.co.jp/ait/articles/1605/23/news020.html
    cf. http://katzplus.com/centos-6/ssh/ssh-でログイン時に-authentication-refused/

    • 別のユーザがつくった.sshは、chownで所有者を変更しないとPermission Deniedになる
    chown -R username .ssh
    

    cf. http://okdtsk.hateblo.jp/entry/20111218/1324239928

    • REMOTE HOST IDENTIFICATION HAS CHANGED!
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    
    # known_hostsから削除
    ssh-keygen -R XX.XX.XXX.XXX
    

    cf. https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938

    • UNPROTECTED PRIVATE KEY FILE!
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    

    まっさらな環境ではじめてこれが出るならクリーンインストールしよう。
    WSLの鍵はPermission的に共有できないよ。

    sshd_configの設定 #

    パスワード認証の無効化やポートの設定等を必ず行う。

    sudo code /etc/ssh/sshd_config
    
    # ポートの変更
    Port 23456
    
    # パスワード認証でのログインを禁止する
    # To disable tunneled clear text passwords, change to no here!
    PasswordAuthentication no
    
    # Powershell Remorting over SSHへの対応(使う場合)
    # override default of no subsystems
    Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile
    
    # sshdの状態を確認
    sudo systemctl status sshd
    
    # 再起動
    sudo systemctl restart sshd
    

    cf. https://docs.microsoft.com/ja-jp/powershell/scripting/learn/remoting/ssh-remoting-in-powershell-core?view=powershell-6
    cf. https://qiita.com/shuthimaru/items/2334f63845d8b0d85bdd

    クライアントとサーバ間のファイル送受信 #

    サーバとのファイルのやり取りは主にrsyncscpを使用する。

    SSH 帯域制限 差分・増分転送
    rsync O O O
    scp O O X

    ネットワークを経由し、ストレージに書き込みが発生する以上、差分転送は実質的に必須条件になるため、rsyncを推奨する。
    他にもrsyncはいいことが盛り沢山なので、使わない手はない。
    https://stackoverflow.com/questions/20244585/how-does-scp-differ-from-rsync

    rsync #

    サーバとのファイルのやり取りはrsyncを使用する...のがベスト。
    残念ながらWindowsにはなくWSLを使うことになるので、SSHよくわからん状態の方はscpで手応えを得てからでも良い。

    rsync -e 'ssh -p ポート番号 -i 秘密鍵' オプション 送り元 送り先
    

    ※残念ながら.ssh/configは使えない

    クライアント -> サーバ

    • カレントディレクトリのworldフォルダを、サーバの~/Servers/Vanillaの下に送る
    rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' -av ./world [email protected]:~/Servers/Vanilla
    
    • worldフォルダの中身を、サーバのworld_newフォルダの中へ送る
    rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' -av ./world/ [email protected]:~/Servers/Vanilla/world_new/
    
    • クライアント側にないファイルをサーバからも削除する
    rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' -av --delete ./world/ [email protected]:~/Servers/Vanilla/world_new/
    

    サーバ -> クライアント

    • 2048KB/sに帯域制限してサーバからクライアント(WSLから見たH:\Backup)にバックアップする。(サーバにないものは削除する)
    rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' --bwlimit=2048 -av --delete [email protected]:~/Servers/Vanilla/world /mnt/h/Backup
    
    • セーブデータとCoreProtectのデータベースを除外して、それ以外をカレントディレクトリにバックアップする
    rsync -e 'ssh -i ~/.ssh/hoge_id_ed25519' --exclude='world/' --exclude='plugins/CoreProtect/database.db' -av --delete --delete-excluded [email protected]:~/Servers/Vanilla .
    

    scp #

    scp -P ポート番号 -i 秘密鍵のパス 送信元 送信先
    

    クライアント -> サーバ(アップロード)
    デスクトップのstructureをアップロードする例

    scp -i ~\.ssh\id_ed25519 .\Desktop\hoge.nbt [email protected]192.168.100.5:~/Servers/structures
    

    サーバ -> クライアント(ダウンロード)
    schematicをデスクトップにダウンロードする例

    scp -i .\.ssh\id_ed25519 [email protected]192.168.100.5:~/Servers/schematics/hoge.schem .\Desktop
    

    フォルダの場合は-r(recursive)が必要。
    帯域幅を超過し課金されないよう、-l 16384で転送速度を制限する。
    Vanillaのセーブデータをデスクトップにダウンロード(ファイルサイズが大きいため、実行する際は許可をとって下さい)

    scp -rp -l 16384 -i .\.ssh\id_ed25519 [email protected]192.168.100.5:~/Servers/Vanilla/world .\Desktop\
    

    cf. https://www.computerhope.com/unix/scp.htm
    cf. https://qiita.com/koara-local/items/777f2a182788a7310fcd

    パッケージの更新 #

    # アップグレード可能なパッケージを表示
    apt list --upgradable
    
    # パッケージのアップデート・アップグレード
    sudo apt update && sudo apt upgrade -y
    
    # ゴミ掃除 ログにやっておけと書かれてたら
    sudo apt autoremove -y
    
    # 必要であれば再起動
    sudo shutdown -r now
    

    cf. https://linuxfan.info/ubuntu-18-04-basic-settings

    タイムゾーンの設定 #

    cronの実行時刻やMinecraftのログがズレるので日本に設定する。

    cf. https://qiita.com/zaki-lknr/items/cd9844fa6a1efa58cab1

    # 日付、タイムゾーンの確認
    date
    Thu Mar 14 07:58:23 UTC 2019
    
    timedatectl
                          Local time: Thu 2019-03-14 07:59:35 UTC
                      Universal time: Thu 2019-03-14 07:59:35 UTC
                            RTC time: Thu 2019-03-14 07:59:36
                           Time zone: Etc/UTC (UTC, +0000)
           System clock synchronized: yes
    systemd-timesyncd.service active: yes
                     RTC in local TZ: no
    
    # 東京を探す
    timedatectl list-timezones | grep -i tokyo
    Asia/Tokyo
    
    # 東京に設定
    timedatectl set-timezone Asia/Tokyo
    

    JDKのインストール #

    Vanilla、Spigot、Fabricでは大抵Oracle OpenJDK 14などの最新のOpenJDKが使用できるが、
    PaperMCでは現在OpenJDK 13、fabric-carpetではOpenJDK 8が要件になる。

    OpenJDK 14 #

    JDK Builds from Oracle

    2020年現在、公開のMinecraftサーバに使用するJDKとして、Oracle OpenJDK(Oracle JDKではない!)を使用しても問題ない。

    Oracle JDK のライセンスに関する重要な変更

    2019年4月16日のリリースより、Oracle JDKのライセンスが変更されました。 新しいライセンス、Oracle Technology Network License Agreement for Oracle Java SEは、これまで提供してきた過去のバージョンのJDKのライセンスと大きく異なります。新しいライセンスでは、個人での利用や開発での利用などには無償で使用できます。しかし、以前のOracle JDKライセンスで許可されていたその他の目的には使用できなくなっている可能性があります。これらの製品をダウンロード、使用する前にライセンスの内容を十分にご確認ください。 FAQも合わせてご確認下さい。

    商用ライセンスおよびサポートは低コストのJava SE Subscriptionでご利用いただけます。

    また、オラクルは jdk.java.net で最新のOpenJDKリリースをオープンソースの GPL ライセンスで提供しています。

    Java SE ダウンロード

    上記は Oracle JDK(Oracle Java SE) のライセンスが「個人での利用や開発での利用などには無償」についての記述であり、jdk.java.netの OpenJDK リリースの話ではない。

    無償で Oracle Java SE バイナリを入手していた企業や組織の場合、jdk.java.net から入手可能なオクラルの OpenJDK リリースにより無償利用を継続できます。個人利用や開発用途として無償で Oracle Java SE バイナリを入手していたのであれば、Oracle Java SE リリースをjava.com (個人ユーザー向け)や Oracle Technology Network (“OTN”) (開発者向け) から引き続き入手できます。Oracle JDK や Oracle JRE をその他の用途で利用する場合、Java SE Subscription が必要となります。オラクル製品のサポートをお持ちのお客様は、My Oracle Support (MOS) 、 Oracle Software Delivery Cloud 、またはその他所定の場所から、引き続き Oracle Java SE バイナリを入手可能です。

    Oracle Java SE ライセンスFAQ

    このように、「無償で Oracle Java SE バイナリを入手していた企業や組織」が「jdk.java.net から入手可能なオクラルの OpenJDK リリースにより無償利用」する分にはまったく問題ない。

    と読み取れるが、「それ違反だよ!」という場合はTwitter @shibanyan_1へこっそり教えていただけると嬉しい。

    他にも、OpenJDKには複数のディストリビューションが存在し、中身も若干異なるため挙動が違ったりする。
    Latest release | AdoptOpenJDK - Open source, prebuilt OpenJDK binaries
    Download Java for Azure - New - Azul Systems, Inc.

    参考
    OpenJDK(Open Java Development Kit) どれを使ったら良い? - ts0818のブログ

    # カレントディレクトリ
    cd /usr/lib/jvm
    
    # 無ければディレクトリ作成
    sudo mkdir /usr/lib/jvm
    
    # OpenJDK のダウンロード (AdoptOpenJDKの例 URLはブラウザ等でリンクをコピーして置き換える)
    wget https://github.com/AdoptOpenJDK/openjdk14-binaries/releases/download/jdk-14.0.1%2B7/OpenJDK14U-jdk_x64_linux_hotspot_14.0.1_7.tar.gz
    
    # そこへ展開
    sudo tar -xvf OpenJDK14U-jdk_x64_linux_hotspot_14.0.1_7.tar.gz
    
    # 確認
    ls
    # jdk-14.0.1+7  OpenJDK14U-jdk_x64_linux_hotspot_14.0.1_7.tar.gz
    
    # シンボリックリンク作成
    sudo ln -s /usr/lib/jvm/jdk-14.0.1+7/bin/java /usr/bin/java
    # sudo ln -s /usr/lib/jvm/jdk-14.0.1+7/bin/jps /usr/bin/jps
    # sudo ln -s /usr/lib/jvm/jdk-14.0.1+7/bin/jstat /usr/bin/jstat
    
    # 確認
    java -version
    # openjdk version "14.0.1" 2020-04-14
    # OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.1+7)
    # OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.1+7, mixed mode, sharing)
    

    cf. https://qiita.com/charon/items/af0f0de2ae9adbc03bfe
    cf. https://www.linuxuprising.com/2019/01/how-to-install-openjdk-11-in-ubuntu.html
    cf. http://charleysdiary.hatenablog.com/entry/2018/12/27/013605
    cf. https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f

    OpenJDK 8 #

    # aptでインストール
    sudo apt install openjdk-8-jre
    
    # デフォルトのjavaのバーションを確認
    java -version
    # openjdk version "1.8.0_252"
    # OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1ubuntu1-b09)
    # OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
    

    update-alternatives #

    複数バージョンのJDKを使用する場合、update-alternativesで管理するとよい。
    実際には、java(/usr/bin/java)としてOpenJDK 14/usr/lib/jvm/jdk-14.0.1+7/bin/javaを使いながらOpenJDK 8を使う場合、/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/javaとフルパスを指定することになるので、必須ではない。

    update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-14.0.1+7/bin/java 1111
    

    1111の数字が大きい方が優先される

    update-alternatives --config java
    There are 2 choices for the alternative java (providing /usr/bin/java).
    
      Selection    Path                                            Priority   Status
    ------------------------------------------------------------
    * 0            /usr/lib/jvm/jdk-14.0.1+7/bin/java               1111      auto mode
      1            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
      2            /usr/lib/jvm/jdk-14.0.1+7/bin/java               1111      manual mode
    
    Press <enter> to keep the current choice[*], or type selection number: 
    

    firewallの設定 #

    VPSやVMではLinux上でのファイアウォールが無効で、VPSのWebコンソールやホストマシン側でファイアーウォールを設定する場合もある。

    # ufwが動作しているか確認
    sudo ufw status
    # Status: inactive 
    
    # ufwを有効化する
    sudo ufw enable
    
    # ufwを無効化する(既に有効化されていた場合、基本的には無効化してはダメ)
    sudo ufw disable
    
    # SSH用の22番ポートを許可する例
    sudo ufw allow 22/tcp
    
    # Minecraft Bedrock Editionサーバ用のポートを許可する例
    sudo ufw allow 19132/tcp
    
    # Minecraft Java Editionサーバに使用するような25560~25565を許可する例
    sudo ufw allow 25560:25569/tcp
    
    # 番号付きでufwのルールを表示する
    sudo ufw status numbered
    
    # 番号指定でルールを削除する
    sudo ufw delete 6
    

    crontabの設定 #

    sudo code /etc/crontab
    
    MAILTO=""
    
    # m h dom mon dow user	command
    0 6 * * * root /usr/bin/pwsh /root/Servers/AutoBackupWSL.ps1
    0 8 * * sun root /usr/bin/pwsh /root/Servers/ScoreBoard.ps1
    0 */1 * * * root /usr/bin/pwsh /root/Servers/OptifineNotifier.ps1
    */30 * * * * root /usr/bin/pwsh /root/Servers/MCServerUpdater.ps1
    #1-51/10 * * * * root /usr/bin/pwsh /root/Servers/YTNotifier.ps1
    0 */1 * * * root /usr/bin/pwsh /root/Servers/GoogleFormsSubscriber.ps1
    */30 * * * * root /usr/bin/pwsh /root/Servers/VultrBillingSubscriber.ps1
    0 */1 * * * root /usr/bin/pwsh /root/Servers/LoginSubscriber.ps1
    0 5 * * Tue,Sat root /usr/bin/pwsh /root/Servers/regenWorldResource.ps1 end
    
    
    #crondを再起動(不要だと思う)
    sudo systemctl restart cron
    

    Vanilla #

    初期設定 #

    server.jarのダウンロード #

    server.jarをMinecraft Launcherから取得 #

    クライアントにあるMinecraft Launcherの起動構成でダウンロードしたserver.jarをrsyncscpでサーバに送る。

    単一のjarファイル程度なら、VSCodeでフォルダストラクチャの中にD&Dで良いと思う。

    Minecraftサーバ

    server.jarをshで取得 #

    ダウンロード先をつくって移動

    mkdir -p ~/Servers/versions
    cd ~/Servers/versions
    

    Mojangからバージョンリストを取得

    curl 'https://launchermeta.mojang.com/mc/game/version_manifest.json' -o version_manifest.json
    

    jsonファイルをVSCodeで開く

    code version_manifest.json
    
    {"latest": {"release": "1.15.2", "snapshot": "20w18a"}, "versions": [{"id": "20w18a", "type": "snapshot", "url": "https://launchermeta.mojang.com/v1/packages/8d428d8e5a482c253f973a73d5c04ea73d0addd3/20w18a.json", "time": "2020-04-29T15:21:00+00:00", "releaseTime": "2020-04-29T15:16:34+00:00"}, {"id": "20w17a", "type": "snapshot", "url": 
    ...
    

    Alt - Shift - Fで整形できる

    ...
            {
                "id": "1.15.2",
                "type": "release",
                "url": "https://launchermeta.mojang.com/v1/packages/97e7f6c94e2f9841d128011d4d9192fabdc874d4/1.15.2.json",
                "time": "2020-04-28T06:31:30+00:00",
                "releaseTime": "2020-01-17T10:03:52+00:00"
            },
    ...
    

    version_manifest.jsonを参考に、バージョン固有のjsonを取得する

    curl 'https://launchermeta.mojang.com/v1/packages/97e7f6c94e2f9841d128011d4d9192fabdc874d4/1.15.2.json' -o 1.15.2.json
    

    VSCodeでserver.jarを検索し、ダウンロードURLを見つける(整形に時間かかるかも)

    ...
        "assets": "1.15",
        "downloads": {
            "client": {
                "sha1": "e3f78cd16f9eb9a52307ed96ebec64241cc5b32d",
                "size": 15531492,
                "url": "https://launcher.mojang.com/v1/objects/e3f78cd16f9eb9a52307ed96ebec64241cc5b32d/client.jar"
            },
            "client_mappings": {
                "sha1": "bd9efb5f556f0e44f04adde7aeeba219421585c2",
                "size": 4971989,
                "url": "https://launcher.mojang.com/v1/objects/bd9efb5f556f0e44f04adde7aeeba219421585c2/client.txt"
            },
            "server": {
                "sha1": "bb2b6b1aefcd70dfd1892149ac3a215f6c636b07",
                "size": 36175593,
                "url": "https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar"
            },
            "server_mappings": {
                "sha1": "59c55ae6c2a7c28c8ec449824d9194ff21dc7ff1",
                "size": 3737122,
                "url": "https://launcher.mojang.com/v1/objects/59c55ae6c2a7c28c8ec449824d9194ff21dc7ff1/server.txt"
            }
        },
    ...
    

    server.jarをダウンロード

    curl "https://launcher.mojang.com/v1/objects/bb2b6b1aefcd70dfd1892149ac3a215f6c636b07/server.jar" -o ~/Servers/versions/server-1.15.2.jar
    

    使い終わったjsonを削除

    # カレントディレクトリのファイル一覧
    ls
    1.15.2.jar  1.15.2.json  version_manifest.json
    
    # 全てのjsonを削除
    rm *.json
    
    # 確認
    ls
    1.15.2.jar
    

    server.jarをpwshで取得 #

    Powershellのインストール・設定

    #Mojangからバージョンリストのjsonを取得
    $Versions = Invoke-WebRequest -Uri 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | ConvertFrom-Json
    
    #結果を見る
    $Versions
    <#
    latest                             versions
    ------                             --------
    @{release=1.14.2; snapshot=1.14.2} {@{id=1.14.2; type=release; url=...
    #>
    $Versions.latest.release
    #1.14.2
    
    #バージョン固有のjsonを取得(例: 最新のリリース)
    $Latest = Invoke-WebRequest -Uri ($Versions.versions | Where-Object {$_.id -eq $Versions.latest.release}).url | ConvertFrom-Json
    
    #server.jarのダウンロードURLを取得し、ダウンロード
    Invoke-WebRequest -Uri $Latest.downloads.server.url -OutFile ~/Servers/versions/server-1.14.2.jar
    

    シンボリックリンクの作成 #

    server.jarをダウンロードした場所に移動します。

    cd ~/Servers/versions
    

    server.jarを直接使っても良いが、バージョン管理のためserver-バージョン.jarにシンボリックリンクを張る運用がオススメ。

    ~/Servers/
    +--Vanilla
    |  +--crash-reports
    |  +--debug
    |  +--logs
    |  +--world
    |  +--banned-ips.json
    |  +--banned-players.json
    |  +--eula.txt
    |  +--ops.json
    |  +--ops.txt.converted
    |  +--server.jar  -------------------------+
    |  +--server.properties                    |
    |  +--usercache.json                       |
    |  +--whitelist.json                      参照
    +--versions                                |
    |  +--server-1.14.4.jar                    |
    |  +--server-1.15.2.jar  <-----------------+
    +--msl.ps1
    
    # シンボリックリンクを作成
    ln -s ../versions/server-1.15.2.jar server.jar
    
    # 確認
    ls -la
    lrwxrwxrwx  1 1001 1001    29 Aug  9  2019 server.jar -> ../versions/server-1.15.2.jar
    
    # シンボリックリンクを上書き
    ln -sf ../versions/server-1.14.4.jar server.jar
    

    初回起動 #

    cd ~/Servers/Vanilla
    java -jar ./server.jar
    

    この時点ではサーバは起動しません。

    eula.txtの編集 #

    VSCode等のテキストエディタでfalseをtrueに書き換えて保存します(tureじゃないよ!)。
    MINECRAFT エンド ユーザー ライセンス条項に目を通しておきましょう。

    code eula.txt
    
    #By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
    #Wed Jul 18 04:41:13 UTC 2018
    eula=true
    

    server.propertiesの設定 #

    code server.properties
    
    設定項目 解説
    pvp=true プレイヤー同士で殴ることを許可するかの設定です。
    level-type=default
  • ワールド生成時の設定です。
  • flatlegacydefaultから選べます。
  • hardcore=false 難易度とは別に、リスポーンしてサバイバル等を再開できなくするモードがあります。
    所謂"ハードコア"はhardcore=true且つdifficulty=hardであることを指すようです。
    新しいバージョンでは死んでしまってもスペクテイターで閲覧は可能のようです。
    enable-command-block=true コマンドブロックを許可するかどうかを指定します。
    allow-flight=false クリエイティブ飛行を許可するかの設定です。
    level-name=world ワールドデータのディレクトリ名を指定します。
    view-distance=10
  • サーバ側の描画距離を設定します(半径)。
  • クライアント側の描画距離(描画の有無)に関係なく、プレイヤー毎の周囲がこの値だけ読み込まれるため、大きくし過ぎるとクライアント・サーバ共に多大な負荷がかかります。
  • シングルプレイとの挙動の違いは、サーバ側が10チャンククライアント側が2チャンクであっても目の前のエンティティは活性化し、32チャンクであっても一度は十分に近づかなければ描画されず、離れたチャンクの変更は更新されません。
  • ReplayModもサーバ側の描画距離に影響されます。
  • entity-broadcast-range-percentage=100
  • エンティティ描画距離を設定します(%)。
  • レッドストーン回路などに影響を与える可能性があるため、設定の変更は推奨しません。
  • generator-settings=
  • シングルワールド生成時に指定できる文字列と同様のワールド生成時の引数を指定します。
  • バージョンによっては正しく動作しない場合があります。
  • force-gamemode=false trueの場合、ログイン時にゲームモードが強制されます。
    allow-nether=true falseの場合、ネザーポータルが使えなくなります。
    gamemode=creative プレイヤーの初回ログイン時、force-gamemode=trueの場合毎ログイン時のゲームモードを設定します。
    difficulty=normal 難易度を設定します。
    この設定はクライアント側のEsc画面に表示されます。
    generate-structures=true 構成物を生成するかの設定です。
    spawn-monsters=true Mobのスポーンを許可するかの設定です。
    spawn-npcs=true NPC(村人等)のスポーンを許可するかの設定です。
    spawn-animals=true
  • falseの場合、動物がスポーンしなくなります。
  • spawn-protection=0
  • 値が1大きくなる毎に保護されるブロックの半径が1ずつ大きくなります。
  • 基本的に0に変更する場合が多いです。
  • 3
    2
    1
    3 2 1 0 1 2 3
    1
    2
    3
    white-list=true ホワイトリスト(登録したプレイヤーのみ許可)の有効/無効の設定です。
    enforce-whitelist=false trueの場合、whitelist reloadコマンドでホワイトリストを更新した時に、ホワイトリストから削除されたプレイヤーをログアウトさせます。
    player-idle-timeout=0 プレイヤーがAFK状態になってから何分でkickするかの設定です。
    0でAFKキックを無効化します。
    max-players=20 プレイヤーの最大接続数を指定します。
    max-world-size=29999984
  • ワールドボーダー(世界の境界)の半径を設定します。
  • 29999984より大きくしても無視されます。
  • max-tick-time=-1 処理が遅れるtick数を制限して、閾値を超えるとサーバが停止するようになっています。
    超高負荷を掛ける必要があり勝手に止まっては困る場合、-1で回避できます。
    enable-query=false
  • trueの場合、UT3 query protocolを使用して、サーバに関する情報を取得できるようになります。
  • query.port=25562
    enable-rcon=false
  • trueの場合、rconプロトコルを使用してMinecraftサーバと通信できます。
  • rcon.port=25575
    rcon.password=
    broadcast-console-to-ops=true op全員にコンソールで実行されたコマンド内容を送信します。
    broadcast-rcon-to-ops=true op全員にrconコンソールで実行されたコマンド内容を送信します。
    op-permission-level=4
  • 1 opはspawn-protectionを回避できます。
  • 2 opは/publish /debug以外のほぼ全てのコマンド、コマンドブロックを使用できます。
  • 3 opは/ban /opを使用できます。
  • 4 opは/stop /save /save-on /save-offを含む全てのコマンドを実行できます。
  • function-permission-level=2
    server-ip=
  • Bind Addressを設定します。
  • 例えば、127.0.0.1を指定すると自分以外のLAN内の別のマシンから接続できなくなります。
  • 複数のNICがマシンに挿さっている場合、サーバがどのインターフェースを使用するかを設定したりできます。
  • いい加減なことを書いているかもしれないので、3%くらい鵜呑みにしてください。
  • server-port=25562 サーバのポート番号を指定します。
    複数のMinecraftサーバを立てる場合はポートを変えてください。
    デフォルトは25565です。
    online-mode=true MCIDをMojangに照会するかの設定です。
    max-build-height=256 高度限界を設定します。
    level-seed= ワールド生成時のシード値を設定します。
    snooper-enabled=false Mojangへサーバの統計情報を送信するかの設定です。
    network-compression-threshold=256
  • 閾値を超えたサイズのパケットを圧縮して送信します。
  • 圧縮が行われると、サーバ側の負荷や遅延が大きくなる代わりに、回線が細いプレイヤーが接続を維持しやすくなります。
  • -1で圧縮を無効化、0で全て圧縮されます。
  • 基本的にMTU(約1500バイト、環境によって更に小さい場合あり)を超えないようにします。
  • resource-pack=
  • リソースパックのダウンロードURIを指定します。
  • ファイルパスではなくURI形式で、クライアントがアクセス可能なダウンロードリンクを指定する必要があります。
  • 1.15.2より前の一部のバージョンでは、:=\でエスケープする必要があります。http\://example.com/hoge.zip?hoge\=hoge
  • resource-pack-sha1=
  • リソースパックが正しいものかをSHA1ハッシュを用いて照合します。
  • use-native-transport=true
  • Linuxでのパケット送受信の最適化
  • prevent-proxy-connections=false
  • trueでは、サーバから送信されたプレイヤーのISPやASの情報がMojangの認証サーバからのものと異なる場合、プレイヤーは弾かれます。VPNやプロキシが使えなくなります。
  • falseでは、プレイヤーがVPNやプロキシを使ってサーバに接続することを許可します。
  • enable-status=true
  • trueでは、今まで通りクライアントのサーバリストにオンライン状態を表示します。
  • falseでは、常にオフライン表示に偽装されますが、ログインは可能です。
  • enable-jmx-monitoring=false
  • MBean net.minecraft.server:type=ServeraverageTickTime tickTimes 属性を公開し、MSPT(MilliSeconds Per Tick)を公開します。
  • JMXモニタリングを使うには、JVM引数を加える必要があります。
  • Monitoring and Management Using JMX Technology
    motd=A Minecraft Server
  • クライアントのサーバ一覧に表示される文字列です。
  • フォーマットコードを用いて文字を装飾できます。
  • Formatting codes Use in server.properties and pack.mcmeta

    https://minecraft.gamepedia.com/Server.properties

    screen, tmux #

    初回起動はSSHセッションのコンソール内でjavaプロセスを実行している状態なので、SSHセッションを終了するとMinecraftサーバが停止してしまいます。
    SSHを切断してもMinecraftサーバのプロセスを維持しMinecraftサーバコンソールへの接続を行うには、screentmuxを使用します。

    Minecraftサーバの起動

    # screenを使う場合
    screen -DmS Vanilla /usr/bin/java -jar server.jar
    
    # tmuxを使う場合(推奨)
    tmux new-session -ds Vanilla /usr/bin/java -jar server.jar
    

    セッション一覧を確認

    screen -ls
    There is a screen on:
            1302.Vanilla        (05/05/2020 09:43:27 PM)        (Detached)
    1 Socket in /run/screen/S-root.
    
    tmux ls
    Vanilla: 1 windows (created Wed Jul 29 19:32:34 2020)
    

    Minecraftサーバのコンソールを覗く(アタッチ), コンソールから出る(デタッチ)

    # アタッチ
    screen -r Vanilla
    
    # (誰かが既にアタッチしている場合)重複アタッチ
    screen -x Vanilla
    
    # デタッチ
    # Ctrl + a を2度押すとscreenコンソールが操作不能になるので注意 要するにtmuxを使うべき
    Ctrl + a -> Ctrl + d
    
    tmux attach-session -t Vanilla
    tmux a -t Vanilla
    
    Ctrl + b -> d
    

    外部からMinecraftコンソールへコマンドを実行

    # プレイヤー一覧
    screen -p 0 -S "Vanilla" -X eval "stuff 'list'\\015"
    tmux send-keys -t "Vanilla" "list" ENTER
    
    # sayでチャットを送る (再起動アナウンスの例)
    screen -p 0 -S Vanilla -X eval 'stuff "say\\040The\\040server\\040shuts\\040down\\040after\\04010\\040seconds."\\015'
    tmux send-keys -t "Vanilla" "say The server shuts down after 10 seconds." ENTER
    
    # セーブ・Minecraftサーバの停止
    screen -p 0 -S Vanilla -X eval "stuff 'stop'\\015"
    tmux send-keys -t "Vanilla" "stop" ENTER
    

    Discordへ通知できるMinecraftサーバ管理スクリプト

    Man page of SCREEN
    Tmux Cheat Sheet & Quick Reference

    Minecraftサーバ起動中のバックアップ #

    Minecraftサーバは、メモリからストレージへ定期的にオートセーブを行いますが、バックアップを走らせた時点でセーブデータがそれ単体で正常に動作する、整合性の取れたものとは限りません。
    Minecraftサーバ実行中にバックアップするとき、下記の手順を踏まければセーブデータが破損した状態でバックアップされる・バックアップにならない場合があります。

    1. save-offでオートセーブを無効化
    2. save-all flushで強制的にオンメモリのデータをストレージへセーブ
    3. rsync等を走らせる
    4. バックアップが終わったらsave-onでオートセーブを再開させる
    screen -p 0 -S Vanilla -X eval 'stuff "save-off"\\015'
    screen -p 0 -S Vanilla -X eval 'stuff "save-all\\040flush"\\015'
    rsync ~~
    screen -p 0 -S Vanilla -X eval 'stuff "save-on"\\015'
    

    とは言え、バックアップは起動中ではなくstopコマンドで停止してから、が一番確実です。

    Minecraftサーバの自動バックアップ

    Minecraftサーバコマンド #

    # プレイヤ一覧
    list
    
    # アナウンス例
    say server restart
    
    # Minecraftサーバのセーブ・停止
    stop
    
    # whitelistに追加、削除
    whitelist add Shibanyaan
    whitelist remove Shibanyaan
    
    # opに追加、削除
    op Shibanyaan
    deop Shibanyaan
    
    # 撮影用のスペクテイター切替
    gamemode spectator nyanshiba
    gamemode survival nyanshiba
    

    JVMの引数 #

    JVMの引数をチューニングすると、より良いパフォーマンスを発揮できます。
    システムメモリ > Xmx + MaxMetaspaceSize になるよう余裕を持って設定します。

    java -server -Xms24G -Xmx24G -XX:MaxNewSize=6G -XX:MetaspaceSize=6G -XX:MaxMetaspaceSize=6G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=12 -XX:ConcGCThreads=12 -XX:+DisableExplicitGC -jar server.jar
    
    java -server -Xms12G -Xmx12G -XX:MaxNewSize=3072M -XX:MetaspaceSize=3072M -XX:MaxMetaspaceSize=3072M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:+DisableExplicitGC -jar server.jar
    
    java -server -Xms6G -Xmx6G -XX:MaxNewSize=1536M -XX:MetaspaceSize=1536M -XX:MaxMetaspaceSize=1536M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=4 -XX:+DisableExplicitGC -jar server.jar
    

    https://software.fujitsu.com/jp/manual/manualfiles/m170006/b1ws1303/01z200/b1303-00-11-01-06.html

    Fabric #

    Fabricは、スナップショットの時点から新しいバージョンに対応されるほど開発が盛んな、Vanilla準拠のMinecraftの改造ツールチェーン。
    レッドストーン回路やトラップの検証に欠かせないCarpet Mod、大規模建築を効率よく進めるのに役立つWorldEditも対応している。
    Fabricサーバを建てることで、プレイヤーがそれぞれModを導入する必要もなく、これらの改造の恩恵を受けられる。

    Minecraftサーバ

    https://fabricmc.net/use/ で"Server"を選択し、Universal版のインストーラをダウンロード。

    curl https://maven.fabricmc.net/net/fabricmc/fabric-installer/0.5.2.39/fabric-installer-0.5.2.39.jar -o fabric-installer-0.5.2.39.jar
    

    https://fabricmc.net/wiki/install の通り、Fabric Installerを実行してサーバの実行ファイルfabric-server-launch.jarを生成する。

    # Fabric Installerを実行
    java -jar fabric-installer-0.5.0.33.jar server
    
    #Mon Aug 26 19:49:12 JST 2019
    serverJar=server.jar
    

    他の手順はVanillaと一緒。

    FabricへModを導入する #

    Carpet ModFabric APIWorldEdit、必要であればMaLiLibBounding Box Outline Reloadedを導入する。

    # modsへ移動して
    cd mods
    
    # そこにダウンロードするだけ(例)
    wget https://github.com/gnembon/fabric-carpet/releases/download/v1.3-frozen/fabric-carpet-1.15.1-1.3.1+v191212.jar
    wget https://media.forgecdn.net/files/2844/436/fabric-api-0.4.25%2Bbuild.282-1.15.jar
    wget 'https://ci.enginehub.org/repository/download/bt10/13391:id/worldedit-fabric-mc1.15.1-7.1.0-SNAPSHOT-dist.jar?branch=master&guest=1'
    
    wget https://media.forgecdn.net/files/2744/842/malilib-fabric-1.14.4-0.10.0-dev.20.jar
    wget https://media.forgecdn.net/files/2758/498/BBOutlineReloaded-1.0.13-1.14.4-fabric.jar
    

    このように、server.jarやfabric.jarだけでなく、structuresやschematicsもシンボリックリンクで纏めるとアクセスし易いのでオススメ。

    ~/Servers/
    +--Fabric
    |  +--config
    |  |  +--worldedit
    |  |  |  +--schematics -> ~/Servers/schematics
    |  |  |  +--sessions
    |  |  |  +--worldedit.properties
    |  +--logs
    |  |  +--2019-05-28-1.log.gz
    |  |  +--2019-05-28-2.log.gz
    |  |  +--...
    |  |  +--latest.log
    |  +--mods
    |  |  +--fabric-carpet-1.15.2-1.3.6+v200121.jar
    |  |  +--worldedit-fabric-mc1.15.1-7.1.0-SNAPSHOT-dist.jar
    |  +--world1
    |  |  +--advancements
    |  |  +--data
    |  |  +--datapacks
    |  |  +--DIM-1
    |  |  +--DIM1
    |  |  +--generated
    |  |  |  +--minecraft
    |  |  |  |  +--structures -> ~/Servers/structures
    |  |  +--playerdata
    |  |  +--poi
    |  |  +--region
    |  |  +--stats
    |  |  +--carpet.conf
    |  |  +--icon.png
    |  |  +--session.lock
    |  +--world2
    |  |  +--generated
    |  |  |  +--minecraft
    |  |  |  |  +--structures -> ~/Servers/structures
    |  |  +--...
    |  +--banned-ips.json
    |  +--banned-players.json
    |  +--eula.txt
    |  +--fabric-server-launcher.properties
    |  +--fabric.jar -> ../versions/fabric-server-launch.jar
    |  +--ops.json
    |  +--server.jar -> ../versions/server-1.15.2.jar
    |  +--server.properties
    |  +--usercache.json
    |  +--whitelist.json
    +--schematics
    |  +--*.schem
    |  +--*.schematic
    +--structures
    |  +--*.nbt
    +--versions
    |  +--fabric-installer-0.5.2.39.jar
    |  +--fabric-server-launch-1.14.4.jar
    |  +--fabric-server-launch.jar
    |  +--server-1.14.4.jar
    |  +--server-1.15.2.jar
    +--msl.ps1
    

    また、Modによっては最新のJDKに対応していない場合も多いので、その場合はOpenJDK 8を使用する。

    /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
    

    Spigot #

    Spigotは、Vanillaの動作からかなり手が加えられたCraftBukkitベースの改造されたMinecraftサーバであり、多様なプラグインがあるのが特徴。
    荒らし対策プラグインCoreProtectや軽量化プラグインClearlag、Vanillaでは難しい複雑な権限管理が行えるLuckPermsや複数のサーバを接続するプロキシBungeeCordなど、大規模マルチプレイサーバの運営ならSpigot一択である。

    Spigotをビルドする #

    Spigotはビルド済みバイナリを配布していないので、自分でビルドする必要がある。
    Windowsでもビルドツールに同梱されているPortable Gitでビルド可能だが、WSLやLinuxには初めからGitが入っているので、そちらで実行するのが早い。

    作業ディレクトリに移動

    cd /tmp
    

    ビルドツールをダウンロード https://www.spigotmc.org/wiki/buildtools

    wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
    

    ビルドツールの実行

    # 最新安定版
    java -jar BuildTools.jar --rev latest
    
    # バージョン指定
    java -jar BuildTools.jar --rev 1.15.2
    
    ~~
    Success! Everything completed successfully. Copying final .jar files now.
    Copying spigot-1.15.2-R0.1-SNAPSHOT.jar to /tmp/./spigot-1.15.2.jar
      - Saved as ./spigot-1.15.2.jar
    
    # 確認
    ls *.jar
    BuildTools.jar  spigot-1.15.2.jar
    

    PaperMC #

    PaperMCはよりパフォーマンスに重点を置いたSpigotの派生サーバであり、Spigotプラグインと互換性があります。

    https://papermc.io/downloads からPaperサーバの実行ファイルをダウンロード

    cd ~/Servers/versions
    curl https://papermc.io/api/v1/paper/1.14.4/243/download -o paper-243-1.14.4.jar
    

    Minecraftサーバのアップデート #

    1. サーバを止めて
    2. バックアップして(バックアップせずにアップデートは論外)
    3. 新しいバージョンのserver.jarをダウンロードし、入れ替えて(シンボリックリンク張り直して)
    4. 下記のように、server.jarに対するアップデート最適化の引数を組み合わせた、ヒープサイズの指定を除いたJVM引数を実行して
    java -server -jar server.jar --forceUpgrade --eraseCache
    
    1. 普段のJVM引数で起動し直す

    IPアドレスではなく、example.comで入れるようにする #

    ドメインを購入(¥1,500/年 程度)し、DNSを設定する。

    Google Domainsのカスタムリソースレコードの例
    名前 タイプ TTL データ
    vanilla A 1h (サーバのグローバルIPアドレス)
    fabric A 1h (サーバのグローバルIPアドレス)

    この例では、サーバアドレスはvanilla.example.comfabric.example.comになる。

    cf. https://ascii.jp/elem/000/000/458/458858/
    cf. https://wa3.i-3-i.info/word12301.html
    cf. https://gadget-tips.com/google-domains-dns/
    cf. http://fujiike.hateblo.jp/entry/2015/09/14/191934

    Discordへ通知できるMinecraftサーバ管理スクリプト msl.ps1 #

    • 複数のサーバの設定を一括管理できる
    • コマンド一行でサーバにメッセージやコマンドを送れる
    • Minecraftサーバ起動中のバックアップを容易にする
    • WebhookでDiscordに通知できる(上の画像)

    Powershellのインストール・設定 #

    msl.ps1はLinux・Windows双方に対応しています。
    PowerShell 7以降に対応しています。

    (Ubuntu 18.04)
    cf. https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7

    # Move to /tmp
    cd /tmp
    
    # Download the Microsoft repository GPG keys
    wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
    
    # Register the Microsoft repository GPG keys
    sudo dpkg -i packages-microsoft-prod.deb
    
    # Update the list of products
    sudo apt update
    
    # Install PowerShell
    sudo apt install -y powershell
    
    # Start PowerShell
    pwsh
    

    公式にサポートされていない Linux ディストリビューションの場合(Ubuntu 20.04)
    cf. https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7#binary-archives

    # Download the powershell '.tar.gz' archive
    curl -L -o /tmp/powershell.tar.gz https://github.com/PowerShell/PowerShell/releases/download/v7.0.0/powershell-7.0.0-linux-x64.tar.gz
    
    # Create the target folder where powershell will be placed
    mkdir -p /opt/microsoft/powershell/7
    
    # Expand powershell to the target folder
    tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/7
    
    # Set execute permissions
    chmod +x /opt/microsoft/powershell/7/pwsh
    
    # Create the symbolic link that points to pwsh
    ln -s /opt/microsoft/powershell/7/pwsh /usr/bin/pwsh
    

    msl.ps1の設定 #

    グローバル設定に各サーバ毎の設定が上書きする形になるので、共通の項目はグローバル設定に記述すると各サーバの設定を省けます。

    プロファイル名。
    コマンド実行時に使用し、Linuxではscreen名、WindowsではMainWindowTitle名になる。

    Name = "CBWSurvival"
    

    実行ファイルのパス。
    Linuxではscreen、Windowsでは"C:\jdk-14.0.1\bin\java.exe"(例)を指定する。

    File = "/usr/bin/screen"
    

    JVM引数 値は各環境のRAMの量、CPUコア数に見合った値にする。
    Linuxではscreenプロセス内でjavaプロセスを実行するので、下記のようにプロファイル名やjavaのパスを記述する必要がある。
    Windowsで既に実行ファイルのパスでjavaを指定している場合、-server -Xms...以降のみ記述すれば良い。

    Arg = "-DmS CBWSurvival /usr/bin/java -server -Xms7G -Xmx7G ... -jar server.jar"
    
    Arg = "-DmS CBWLab /usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java -server -Xms4G -Xmx4G ... -jar fabric.jar"
    

    WorkingDirectoryの場所を指定する ここがカレントディレクトリの状態でFile、Argのプロセスが実行される

    Dir = "/root/Servers/CBWSurvival"
    

    Windowsのみ ProcessWindowStyleを指定する(Hidden、Maximized、Minimized、Normal)

    Window = 'Minimized'
    

    Webhook時のusername(Discordのみ)

    UserName = "Dedicated CBWSurvival"
    

    DiscordへのWebhook時に使用するIconを設定する(この画像リンクはDiscordサーバへ追加した絵文字から)

    Icon = "https://cdn.discordapp.com/emojis/604360349461774336.png"
    

    Webhook Url

    hookUrl = 'https://discordapp.com/api/webhooks/XXXXXXXXXX' #Project:CBW server-info
    

    msl.ps1の使い方 #

    # サーバ起動
    pwsh msl.ps1 CBWSurvival start
    
    # サーバ停止(プレイヤーへのアナウンス・タイムアウトあり)
    pwsh msl.ps1 CBWSurvival stop
    
    # 忙しい人のためのサーバ停止(プレイヤーへのアナウンス・タイムアウトなし)
    pwsh msl.ps1 CBWSurvival faststop
    
    # サーバ再起動
    pwsh msl.ps1 CBWSurvival restart
    
    # 忙しい人のためのサーバ再起動
    pwsh msl.ps1 CBWSurvival fastrestart
    
    # コマンドの実行 (チャットの送信)
    pwsh msl.ps1 CBWSurvival "say hogepogepuu"
    
    # コマンドの実行 (セーブ操作)
    pwsh msl.ps1 CBWSurvival "save-off"
    pwsh msl.ps1 CBWSurvival "save-all flush"
    # rsync -av ...
    pwsh msl.ps1 CBWSurvival "save-on"
    

    (pwshコンソール限定)複数サーバ同時操作

    pwsh
    
    ./msl.ps1 CBWSurvival,CBWLab restart
    

    Minecraftサーバのバックアップ #

    Minecraftサーバの自動バックアップ #

    Minecraftサーバのリモートバックアップの設定例

    $Settings +=
    @{
       #ミラーバックアップリスト
        MirList =
        @(
            #[email protected]
            [PSCustomObject]@{
                SrcPath = "[email protected]:~/Servers"
                SrcClude = "--exclude='Fabric/world/'"
                DstPath = "D:\RemoteBackup"
                Execute = "-e 'ssh -o StrictHostKeyChecking=no -i ~/.ssh/hoge_id_ed25519' --bwlimit=3858"
                Begin =
                ({
                    #msl.ps1でsave-off, save-all flushを送る
                    $ScriptBlock =
                    ({
                        ~/Servers/msl.ps1 -Name CBWSurvival -Action "save-off"
                        ~/Servers/msl.ps1 -Name CBWSurvival -Action "save-all flush"
                    })
                    # -o StrictHostKeyChecking=no が出来なさそうなので、The authenticity of host can't be established.でyes/noを聞かれないようにしておくこと  
                    Invoke-Command -ScriptBlock $ScriptBlock -HostName "[email protected]" -KeyFilePath "~/.ssh/hoge_id_ed25519"
                })
                End =
                ({
                    #msl.ps1でsave-onを送る
                    $ScriptBlock =
                    ({
                        ~/Servers/msl.ps1 -Name CBWSurvival -Action "save-on"
                    })
                    Invoke-Command -ScriptBlock $ScriptBlock -HostName "[email protected]" -KeyFilePath "~/.ssh/hoge_id_ed25519"
                    #バックアップが終わったことを投稿
                    Send-Webhook -UserName "Shibanyan Server" -Content "192.168.100.5 のリモートバックアップが終わりました" -hookUrl 'https://discordapp.com/api/webhooks/XXXXXXXXXX'
                })
            }
        )
        #世代管理バックアップリスト
        GenList =
        @(
            [PSCustomObject]@{
                SrcPath = "D:\RemoteBackup"
                #SrcClude = "--exclude='Archive/'"
                DstParentPath = "D:"
                DstGenThold = 180
                DstGenExclude = 'RemoteBackup','200310_070002','200611_070002'
            }
            [PSCustomObject]@{
                SrcPath = "$env:APPDATA\.minecraft"
                SrcClude = "--include='*.*' --exclude='*/'"
                DstParentPath = "D:"
                DstChildPath = "/AppData/Roaming"
            }
        )
    }
    

    肥大したセーブデータをtar.bz2・tar.xzで圧縮する #

    使用しないセーブデータ等は世代管理するまでもないので、まるっとtarで固めてアーカイブ。

    # フォルダ -bzip2-> tar.bz2
    tar -cjvf filename.tar.bz2 ./folder
    
    # tar.bz2 -bunzip2-> フォルダ
    tar -xjvf filename.tar.bz2
    
    # フォルダ -xz-> tar.xz
    tar -cJvf filename.tar.xz ./folder
    
    # tar.xz -unxz-> フォルダ
    tar -xJvf filename.tar.xz