palworldのサーバー構築方法

注意:現在のパルワールドは「Steam 版」のみ専用サーバに接続できます。
『Xbox Game Pass 版』は招待コードを使ったマルチプレイのみ可能で、その場合は最大4人までのプレイに限られます。

にょっす🐮✋

1/19に発売され、発売から約8時間で100万本突破という飛ぶ鳥を落とす勢いでプレイされているpalworld。

ポ○モンチックなオープンワールドゲームですが、私もどっぷりハマってしまいました。

なお、このpalworldはLinuxが入っているサーバーであれば入れることができ、Arkみたいな感じでワイワイマルチプレイも可能です。

筆者も友達がいないのに「いつか…いつかマルチやると…お、思うから…!!!」という理由でLinuxサーバーを建てました。Qiitaとかを見ながら建てたのですが、リリースされて数時間、数日しか経過していないのでまだまだデータが少ないみたいです。それを含めて、構築時に躓いた部分などをまとめて記載します。

サーバーはどこから借りるのがいいのか?

まず、palworldをプレイするためにLinuxで借りるサーバーの推奨スペックを確認しましょう

CPU4コア以上
メモリ8GB以上
容量100GB以上(SSD推奨)

マルチでがっつり発展していくとこれくらいのスペックが必要になるのかなぁと思います。2024年の今ですと、サーバーを借りるのは国内の会社のものが良いです。昔は海外のVPSを使っていた時期も私はありましたが、円安で凄い額請求されて全部国内に切り替えました。

とはいえど国内でも金額は上下してくるわけで、しかも色々な選択肢があります。

参考までに、私が借りているのはWebARENA IndigoというVPS会社のものです。NTTPCコミュニケーションズが運営するサーバーで、個人的に一番コスパが良いと思います。ちなみに私は以下のスペックで動かしています。

CPU6コア
メモリ8GB
容量SSD 160GB

一応これで月額3,410円支払っています。このくらいのスペックに加えて、大手の会社であるところを考えると安すぎるくらいだと感じております。あとはXserverとかも安いらしいですね。私はpalworld以前からWebARENA Indigoを使用していたので、Xserverを使用したことはありませんが、使用している友人の評判は良い模様です。

個人的にConohaはオススメしません。ここは値段が高いだけなのであんまり良くないです。実際に1台借りてますが、WebARENA Indigoと大差ないので推奨しません。ということで、以下からはWebARENA Indigoの使用を想定します。

実際に作ってみる

Linuxを作るにあたって、「CentOSLinux」「RockyLinux」「AlmaLinux」の3つがあってどれを選べばいいんだってなると思います。

詳しい話はしませんが、実は「CentOS Linux」は既に提供が終了し、OSサポートも8.1は2021年に、7.5は2024年6月に終了します。それを受けてCentOSの代わりとして「RockyLinux」と「AlmaLinux」が生まれました。どちらも「CentOS Linux」と同じく RHEL(Red Hat Enterprise Linux)互換のため、CentOSとほぼ同じように使えます。なので、「CentOSLinux」以外であればどっちでも良いです。どっちでもこれから打つコマンドは使えるので、好きな方でいいと思います。なお私はAlmaLinuxを使用してます。理由は特になし。

WebARENA Indigoの場合、インスタンス作成時にSSH鍵の作成を求められるはずです。何もない人はSSH鍵を作成しましょう。これがコンソールからログインする時のパスワード代わりになります。要はtxtファイルになっているサーバーに入るための鍵です。txtファイルとして保存を求められるので、忘れない場所に置いといてください。

また、Windowsで初めてこういうコマンドを打つ作業をする方はTeraTermの導入をしてください。これがなんだかんだ一番使いやすいです。

サーバーが建ち、起動したらTeraTermでサーバーコンソールにあるIPv4(127.0.0.1みたいなアドレス)をコピペしてSHA256認証でログインしましょう。ユーザー名は「RockyLinux」は「rocky」、「AlmaLinux」は「alma」です。txtファイルをTeraTermに読み込ませましょう。

1.ユーザー作成

palworldユーザーを作成します。この際にsudoのroot権限(管理者権限)を付与します。

# 管理者ユーザーに移動
sudo su

# palworld ユーザを作成
sudo useradd -m palworld

# palworld ユーザのパスワードを設定
passwd palworld

# sudo を付与
sudo usermod --append -G wheel palworld

# palworld ユーザになる
su - palworld

2.steamcmdインストール

# glibc.i686 libstdc++.i686 tar をインストール
sudo dnf install -y glibc.i686 libstdc++.i686 tar

# steamcmd_linux.tar.gz をダウンロードする
curl -o steamcmd_linux.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz

# steamcmd_linux.tar.gz の解凍
tar xf steamcmd_linux.tar.gz

# steamcmd.sh を実行
./steamcmd.sh

./steamcmd.sh実行後、プロンプトがSteam>になっていれば成功しています。

3.Palworld Detecated Serverのインストール

これはPalworldを購入しなくてもサーバーにインストール可能です。(遊ぶためにはPalworldの購入が必須)

# ユーザ認証は不要なので anonymous でログインします
> login anonymous

# /home/palworld/Steam/palworld/ をインストールディレクトリに指定します
> force_install_dir /home/palworld/Steam/palworld/

# Palworld を示す 2394010 を指定してインストール
> app_update 2394010 validate

# progress が 100 になるのを待つ

# steamcmd を抜ける
> quit

#下記のようなpalworldユーザに戻っていればOK
[palworld@localhost ~]$ 

4.サーバー起動テスト

# インストールしたディレクトリに移動
cd /home/palworld/Steam/palworld

# 起動確認
./PalServer.sh

これで、起動テストを行えますが、大体以下のようなエラーを吐きます。

[palworld@localhost palworld]$ ./PalServer.sh 
Shutdown handler: initalize.
Increasing per-process limit of core file size to infinity.
sh: xdg-user-dir: command not found
dlopen failed trying to load:
steamclient.so
with error:
steamclient.so: cannot open shared object file: No such file or directory
dlopen failed trying to load:
/home/palworld/.steam/sdk64/steamclient.so
with error:
/home/palworld/.steam/sdk64/steamclient.so: cannot open shared object file: No such file or directory
[S_API] SteamAPI_Init(): Sys_LoadModule failed to load: /home/palworld/.steam/sdk64/steamclient.so
dlopen failed trying to load:
steamclient.so
with error:

エラー内容は「steamclient.soが見つからない!」というエラーです。一旦Ctrl+cで離脱しましょう。これを回避するには以下のコマンドを実行してください。

mkdir -p /home/palworld/.steam/sdk64/

ln -s /home/palworld/linux64/steamclient.so /home/palworld/.steam/sdk64/steamclient.so

その後、もう一度./PalServer.shを実行すると結果が以下に変わっていると思います。

[palworld@localhost palworld]$ ./PalServer.sh 
Shutdown handler: initalize.
Increasing per-process limit of core file size to infinity.
sh: xdg-user-dir: command not found
dlopen failed trying to load:
steamclient.so
with error:
steamclient.so: cannot open shared object file: No such file or directory
[S_API] SteamAPI_Init(): Loaded '/home/palworld/.steam/sdk64/steamclient.so' OK.  (First tried local 'steamclient.so')
CAppInfoCacheReadFromDiskThread took 3 milliseconds to initialize
dlmopen steamservice.so failed: steamservice.so: cannot open shared object file: No such file or directory
Setting breakpad minidump AppID = 2394010
[S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.

「相変わらずエラー吐いてないか?」と思われそうな内容ですが、注目すべきは下から4行目までの部分です。succeeded.が4つあればテスト成功です。Ctrl+cで離脱して次の作業に移りましょう。

5.SELinuxの無効化

このまま常時稼働させる設定をしてもまだ動きません。SELinux(Security-Enhanced Linux)を無効化する必要があります。無効化する理由は、SELinuxを有効化した状態でsystemctlというコマンドで常時稼働を設定しようとすると、SELinuxがその稼働を止めてくるからです。

下記のコマンドで/etc/selinux/configというファイルを編集します。

vi /etc/selinux/config

そして、6行目の部分を編集します。デフォルトではSELINUX=enforcingになっていますが、これをSELINUX=disabledに書き換えてください。

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=disabled # ここをenforcingからdisabledに変更
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted

編集し終わったら:wqで保存します。

6.8211/UDPポートの解放

Palworldからサーバーに接続する際に、8211/UDPというポートを使用します。デフォルトではこのポートは閉鎖されているので、開放する必要があります。(閉鎖した状態で接続を試みても、タイムアウトします)

Linuxでポートの開放作業を行うには、Linux firewalldを使用します。デフォルトでは入っていないのでインストールしてくる必要があります。ちなみにfirewalldはsudoを付けないと怒られます。

# firewalldをインストール
sudo yum -y install firewalld

# firewalld有効化
sudo systemctl start firewalld

# 有効化になっているか確認するなら(緑ならOK)
sudo systemctl status firewalld

# 8211/UDPポートを恒久的に開放
sudo firewall-cmd --add-port=8211/udp --zone=public --permanent

# 設定を有効化
sudo firewall-cmd --reload

# 設定状態の確認
sudo firewall-cmd --list-all

sudo firewall-cmd --list-all8211/udpが表示されているならOKです。ここまで来たら作業は大詰め。

7.常時稼働するための設定とサーバー起動

systemdに登録します。なお、下記のコマンドを打っても何も出てこないと思いますが、それはそのファイルが新規作成のものだからです。

sudo vi /etc/systemd/system/palworld-dedicated.service

以下をコピペして:wqで保存

[Unit]
Description=Palworld Dedicated Server
Wants=network-online.target
After=syslog.target network.target nss-lookup.target network-online.target

[Service]
ExecStart=/home/palworld/Steam/palworld/PalServer.sh port=8211 players=32 -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS
LimitNOFILE=100000
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s INT $MAINPID
Restart=always
User=palworld
Group=palworld
TimeoutStartSec=300

[Install]
WantedBy=multi-user.target

daemon をリロードしてサーバを起動させます。ついでに自動起動設定もします。

# デーモンの再起動
sudo systemctl daemon-reload

# 自動起動設定
sudo systemctl enable palworld-dedicated.service

# サーバの起動
sudo systemctl start palworld-dedicated.service

# ゲームサーバの起動状態を確認するとき
systemctl status palworld-dedicated.service

systemctl status palworld-dedicated.serviceで緑色になっていれば正常に起動できています。

8.Palworldを起動してサーバーに接続してゲーム開始!

ゲームを起動し、「マルチプレイに参加する(専用サーバー)」を押下します。

一番下の赤枠の部分に「サーバーのIPアドレス:8211」というような入力形式で接続します。例えばサーバーのIPアドレスが「123.45.67.89」の場合は「123.45.67.89:8211」と入力します。

これでワールドに入れます。やったね。

結構サーバーを構築する文献がリリース直後すぎて煩雑してる状態でしたので、参考になれば嬉しいです。海外ニキもsteamのスレッドで困ってたみたいだし。

皆様も楽しいpalworldライフをお楽しみください。

おまけ.自動アップデートを有効化する

bashスクリプトをcronjobで定期的に回してアップデートがあるかを探してきて、なかったら何もせず、アップデートがあったら自動でアップデートしてサーバーを再起動するという簡単な仕組みです。

vi /home/palworld/palworld-update.sh

中身は以下を記述

#!/bin/sh

# Steam CMD path
Steamcmd="/home/palworld/steamcmd.sh"
install_dir="/home/palworld/Steam/palworld"

echo "# Check the environment."
date
OLD_Build=`$Steamcmd +force_install_dir $install_dir +login anonymous +app_status 2394010 +quit | grep -e "BuildID" | awk '{print $8}'`
echo "Old BuildID: $OLD_Build"

echo "# Start updating the game server..."
$Steamcmd +force_install_dir $install_dir +login anonymous +app_update 2394010 validate +quit > /dev/null

echo "# Check the environment after the update."
NEW_Build=`$Steamcmd +force_install_dir $install_dir +login anonymous +app_status 2394010 +quit | grep -e "BuildID" | awk '{print $8}'`
echo "New BuildID: $NEW_Build"

# Check if updated.
if [ $OLD_Build = $NEW_Build ]; then
    echo "Build number matches."
else
    echo "Restart palworld-dedicated.service because an game update exists."
    sudo systemctl stop palworld-dedicated.service
    sudo systemctl start palworld-dedicated.service
    systemctl status palworld-dedicated.service
fi

chmodで実行権限を付与

chmod +x /home/palworld/palworld-update.sh

cronで定期実行設定

crontab -e 

# 12時間おきとかで設定
0 */12 * * * /home/palworld/update-palworld.sh

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です