Ubuntu 18.04 + systemd-nspawn + Forge で Minecraft Forgeサーバ

Minecraft Forgeサーバを systemd-nspawn でコンテナ化する。

```
#------------------------------------------------
# systemd-nspawn 設定 (コンテナ作成まで)
#------------------------------------------------

    #------------------------------------------------
    # ubuntu 18.04 ホストで systemd-nspawn インストール
    #------------------------------------------------
    uname -vr

        5.3.0-26-generic #28~18.04.1-Ubuntu SMP Wed Dec 18 16:40:14 UTC 2019

    sudo apt install debootstrap systemd-container

    #------------------------------------------------
    # ubuntu 18.04 コンテナの用意
    #------------------------------------------------
    sudo debootstrap --arch amd64 bionic /var/lib/machines/minecraft http://archive.ubuntu.com/ubuntu
    
    #------------------------------------------------
    # ubuntu 18.04 コンテナの sources.list の修正
    #------------------------------------------------
    sudo cp -av /var/lib/machines/minecraft/etc/apt/sources.list{,.orig}
    egrep -v '^#|^$' /etc/apt/sources.list | sudo tee -a /var/lib/machines/minecraft/etc/apt/sources.list

    #------------------------------------------------
    # ubuntu 18.04 コンテナ を起動してユーザーを追加
    #------------------------------------------------
    sudo systemd-nspawn -D /var/lib/machines/minecraft
    passwd
    useradd -m -r minecraft
    passwd minecraft
    gpasswd -a minecraft sudo

    #------------------------------------------------
    # rootログインを許可させる場合は 
    # ubuntu 18.04 コンテナ の /etc/securetty に pts/0 を追記
    #------------------------------------------------
    cp -av /etc/securetty{,.orig}
    (echo ''
     echo 'pts/0') >> /etc/securetty
    diff -u /etc/securetty.orig /etc/securetty
    
        --- /etc/securetty.orig	2020-01-19 23:38:14.927697596 +0900
        +++ /etc/securetty	2020-01-19 23:40:20.372110886 +0900
        @@ -410,3 +410,7 @@
         ttySAC1
         ttySAC2
         ttySAC3
        +
        +pts/0

    #------------------------------------------------
    # ubuntu 18.04 コンテナの resolved.conf を修正
    #------------------------------------------------
    cp -av /etc/systemd/resolved.conf{,.orig}
    diff -u /etc/systemd/resolved.conf.orig /etc/systemd/resolved.conf

        --- /etc/systemd/resolved.conf.orig	2018-04-21 01:55:56.000000000 +0900
        +++ /etc/systemd/resolved.conf	2020-01-20 00:54:57.436523023 +0900
        @@ -12,7 +12,7 @@
         # See resolved.conf(5) for details
         [Resolve]
        -#DNS=
        +DNS=8.8.8.8, 8.8.4.4
         #FallbackDNS=
         #Domains=
         #LLMNR=no

    #------------------------------------------------
    # ubuntu 18.04 コンテナからログアウトする
    #------------------------------------------------
    exit

    #------------------------------------------------
    # ubuntu 18.04 コンテナを boot する
    #------------------------------------------------
    sudo systemd-nspawn -b -D /var/lib/machines/minecraft

    #------------------------------------------------
    # ubuntu 18.04 コンテナのホスト名変更
    #------------------------------------------------
    sudo hostnamectl set-hostname minecraft-server
    sudo cp -av /etc/hosts{,.orig}
    sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'

    #------------------------------------------------
    # ubuntu 18.04 コンテナで使うものをインストール
    #------------------------------------------------
    sudo apt update
    sudo apt upgrade
    sudo apt install bind9-host wget psmisc vim lsof

    #------------------------------------------------
    # ubuntu 18.04 コンテナに OpenJDK 8 をインストール
    #------------------------------------------------
    sudo apt install software-properties-common
    add-apt-repository ppa:openjdk-r/ppa
    sudo add-apt-repository ppa:openjdk-r/ppa
    sudo apt install openjdk-8-jdk

    #------------------------------------------------
    # Ctrl+] を3回連打して ubuntu 18.04 コンテナ 終了させる
    #------------------------------------------------
    Ctrl+]
    Ctrl+]
    Ctrl+]

    #------------------------------------------------
    #  ユニットファイルの作成
    #------------------------------------------------
    sudo systemctl enable machines.target
    sudo systemctl enable systemd-nspawn@devenv.service
    (echo '[Service]'
     echo 'ExecStart='
     echo 'ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --settings=override --machine=%i'
    ) | sudo SYSTEMD_EDITOR=tee systemctl edit systemd-nspawn@minecraft.service

        #------------------------------------------------
        # ユニットファイルはこのようになる
        #------------------------------------------------
        ＃マスタ
        /lib/systemd/system/systemd-nspawn@.service
        
        # systemctl enable systemd-nspawn@devenv.service
        /etc/systemd/system/machines.target.wants/systemd-nspawn@minecraft.service
        
        # systemctl edit systemd-nspawn@minecraft.service
        /etc/systemd/system/systemd-nspawn@minecraft.service.d/override.conf

    #------------------------------------------------
    # 起動してログインしてみる
    #------------------------------------------------
    sudo machinectl start minecraft
    sudo machinectl list

        MACHINE   CLASS     SERVICE        OS     VERSION ADDRESSES
        minecraft container systemd-nspawn ubuntu 18.04   -
        
        1 machines listed.

    sudo machinectl login minecraft

        # プロンプトがでたらminecraftユーザーでログインしてみる

    #------------------------------------------------
    # 時刻合わせ
    #------------------------------------------------
    sudo timedatectl set-timezone Asia/Tokyo
    sudo sed -i.orig 's/#NTP=/NTP=ntp.nict.jp/g' /etc/systemd/timesyncd.conf

        diff -u /etc/systemd/timesyncd.conf.orig /etc/systemd/timesyncd.conf
        --- /etc/systemd/timesyncd.conf.orig	2018-04-20 16:55:56.000000000 +0000
        +++ /etc/systemd/timesyncd.conf	2020-01-19 18:44:36.395375786 +0000
        @@ -12,7 +12,7 @@
         # See timesyncd.conf(5) for details.
        
         [Time]
        -#NTP=
        +NTP=ntp.nict.jp
         #FallbackNTP=ntp.ubuntu.com
         #RootDistanceMaxSec=5
         #PollIntervalMinSec=32

    systemctl -l status systemd-timesyncd

#------------------------------------------------
# Minecraft Forgeサーバ設定 （コンテナへMinecraft Server導入まで）
#------------------------------------------------
    #------------------------------------------------
    # 最新版をダウンロード
    #------------------------------------------------
    mkdir -p /home/minecraft/minecraft_server
    cd /home/minecraft/minecraft_server
    wget -O minecraft_server.1.14.4.jar https://launcher.mojang.com/v1/objects/3dc3d84a581f14691199cf6831b71ed1296a9fdf/server.jar

    #------------------------------------------------
    # いったん起動させる
    #------------------------------------------------
    java -Xmx1024M -Xms1024M -jar minecraft_server.1.14.4.jar nogui

    #------------------------------------------------
    # 以下の状態になる
    #------------------------------------------------
    ls -l

    total 35132
    -rw-rw-r-- 1 minecraft minecraft      181 Jan 19 16:46 eula.txt
    drwxrwxr-x 2 minecraft minecraft     4096 Jan 19 16:46 logs
    -rw-rw-r-- 1 minecraft minecraft 35958734 Jul 19  2019 minecraft_server.1.14.4.jar
    -rw-rw-r-- 1 minecraft minecraft      940 Jan 19 16:46 server.properties

    #------------------------------------------------
    # eula を true にして再度起動し
    # 無事に起動したら ctrl + c で終了させる
    #------------------------------------------------
    sed -i 's/eula=false/eula=true/' eula.txt
    java -Xmx1024M -Xms1024M -jar minecraft_server.1.14.4.jar nogui

    #------------------------------------------------
    # 起動ファイルの作成
    #------------------------------------------------
    (echo '#!/bin/bash'
     echo '/usr/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.1.14.4.jar nogui'
    ) > /home/minecraft/minecraft_server/startup.sh
    chmod 755 /home/minecraft/minecraft_server/startup.sh

        #------------------------------------------------
        # /home/minecraft/minecraft_server/startup.sh
        #------------------------------------------------

        #!/bin/bash
        /usr/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.1.14.4.jar nogui

    #------------------------------------------------
    # unitファイルの作成
    #------------------------------------------------
    sudo vi /etc/systemd/system/minecraft_server.service

        #------------------------------------------------
        # /etc/systemd/system/minecraft_server.service
        #------------------------------------------------
        [Unit]
        Description=Minecraft Server
        After=network-online.target
    
        [Service]
        ExecStart=/bin/bash /home/minecraft/minecraft_server/startup.sh
        WorkingDirectory=/home/minecraft/minecraft_server
        Restart=always
        User=minecraft
        Group=minecraft
    
        [Install]
        WantedBy=multi-user.target

    #------------------------------------------------
    # minecraft server を systemctl で起動させる
    #------------------------------------------------
    sudo systemctl daemon-reload
    sudo systemctl enable minecraft_server
    sudo systemctl start minecraft_server
    sudo systemctl status minecraft_server

        #------------------------------------------------
        # systemctl status minecraft_server
        #------------------------------------------------
        ● minecraft_server.service - Minecraft Server
           Loaded: loaded (/etc/systemd/system/minecraft_server.service; enabled; vendor preset: enabled)
           Active: active (running) since Sun 2020-01-19 16:56:37 UTC; 5s ago
         Main PID: 9206 (bash)
           CGroup: /system.slice/minecraft_server.service
                   ├─9206 /bin/bash /home/minecraft/minecraft_server/startup.sh
                   └─9207 /usr/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.1.14.4.jar nogui
    
        Jan 19 16:56:40 minecraft-server bash[9206]: [16:56:40] [Server thread/INFO]: Generating keypair
        Jan 19 16:56:41 minecraft-server bash[9206]: [16:56:41] [Server thread/INFO]: Starting Minecraft server on *:25565
        Jan 19 16:56:41 minecraft-server bash[9206]: [16:56:41] [Server thread/INFO]: Using epoll channel type
        Jan 19 16:56:41 minecraft-server bash[9206]: [16:56:41] [Server thread/INFO]: Preparing level "world"
        Jan 19 16:56:41 minecraft-server bash[9206]: [16:56:41] [Server thread/INFO]: Reloading ResourceManager: Default
        Jan 19 16:56:41 minecraft-server bash[9206]: [16:56:41] [Server thread/INFO]: Loaded 6 recipes
        Jan 19 16:56:41 minecraft-server bash[9206]: [16:56:41] [Server thread/INFO]: Loaded 811 advancements
        Jan 19 16:56:42 minecraft-server bash[9206]: [16:56:42] [Server thread/INFO]: Preparing start region for dimension minecraft:ov
        Jan 19 16:56:42 minecraft-server bash[9206]: [16:56:42] [Server thread/INFO]: Preparing spawn area: 0%
        Jan 19 16:56:42 minecraft-server bash[9206]: [16:56:42] [Server thread/INFO]: Preparing spawn area: 0%

    #------------------------------------------------
    # minecraft server が 25565番ポートで起動していることを確認
    #------------------------------------------------
    ss -ant | grep 25565

        LISTEN    0        128                                                 *:25565                                                         *:*
    lsof -i:25565

        COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
        java    9207 minecraft   98u  IPv6 212425      0t0  TCP *:25565 (LISTEN)

#------------------------------------------------
# Minecraft Forge の導入
#------------------------------------------------

    #------------------------------------------------
    # forge用のディレクトリを作成
    #------------------------------------------------
    sudo systemctl stop minecraft_server
    cp -a /home/minecraft/minecraft_server /home/minecraft/forge_server
    cd /home/minecraft/forge_server

    #------------------------------------------------
    # Macのブラウザから installer.jar をダウンロードする
    #------------------------------------------------
    https://files.minecraftforge.net/


    #------------------------------------------------
    # Mac の ~/Downloads/で簡易Webサーバを立てる
    #------------------------------------------------
    ls ~/Downloads/

        forge-1.14.4-28.1.0-installer.jar

    cd ~/Downloads/ && python3 -m http.server 9999

    #------------------------------------------------
    # ubuntu 18.04 コンテナから Mac の installer.jar をダウンロードする
    #------------------------------------------------

    wget 192.168.1.57:9999/forge-1.14.4-28.1.0-installer.jar

    #------------------------------------------------
    # ubuntu 18.04 コンテナ で installer.jar を実行
    #------------------------------------------------
    java -jar forge-1.14.4-28.1.0-installer.jar nogui --installServer

    #------------------------------------------------
    # ubuntu 18.04 コンテナ で forge-1.14.4-28.1.0.jar を実行
    #------------------------------------------------
    java -Xmx1024M -Xms1024M -jar forge-1.14.4-28.1.0.jar nogui

    #------------------------------------------------
    # 起動ファイルの修正
    #------------------------------------------------
    cat /home/minecraft/forge_server/startup.sh

        #!/bin/bash
        /usr/bin/java -Xmx1024M -Xms1024M -jar forge-1.14.4-28.1.0.jar nogui

    #------------------------------------------------
    # Minecraft Forge を systemctl で起動させる
    #------------------------------------------------
    sudo systemctl daemon-reload
    sudo systemctl start minecraft_server
    sudo systemctl status minecraft_server

#------------------------------------------------
# modの導入
#------------------------------------------------

    #------------------------------------------------
    # Macのブラウザから OptiFine をダウンロードする
    #------------------------------------------------
    http://optifine.net/downloads

    #------------------------------------------------
    # Mac の ~/Downloads/で簡易Webサーバを立てる
    #------------------------------------------------
    ls ~/Downloads/

        OptiFine_1.14.4_HD_U_F5.jar
    
    cd ~/Downloads/ && python3 -m http.server 9999
    
    #------------------------------------------------
    # OptiFine_1.14.4_HD_U_F5.jar をダウンロードする
    #------------------------------------------------
    cd /home/minecraft/forge_server/mods
    wget 192.168.1.57:9999/OptiFine_1.14.4_HD_U_F5.jar

    #------------------------------------------------
    # 再起動する
    #------------------------------------------------
    sudo systemctl stop minecraft_server
    sudo systemctl start minecraft_server
    
#------------------------------------------------
# クライアントから接続する
#------------------------------------------------
問題なく接続できればOK

#------------------------------------------------
# 参考
#------------------------------------------------
https://qiita.com/hatayan1126/items/500dc025d41142bd6f84
https://minecraft.server-memo.net/forge_server_install/
https://blog.3qe.us/entry/2017/11/18/200617
https://www.minecraftforge.net/forum/topic/77611-forge-universal-error-%EF%BC%9Ano-main-manifest-attribute/
```