palworldのサーバー構築方法
注意:現在のパルワールドは「Steam 版」のみ専用サーバに接続できます。
『Xbox Game Pass 版』は招待コードを使ったマルチプレイのみ可能で、その場合は最大4人までのプレイに限られます。
にょっす🐮✋
1/19に発売され、発売から約8時間で100万本突破という飛ぶ鳥を落とす勢いでプレイされているpalworld。
ポ○モンチックなオープンワールドゲームですが、私もどっぷりハマってしまいました。
なお、このpalworldはLinuxが入っているサーバーであれば入れることができ、Arkみたいな感じでワイワイマルチプレイも可能です。
筆者も友達がいないのに「いつか…いつかマルチやると…お、思うから…!!!」という理由でLinuxサーバーを建てました。Qiitaとかを見ながら建てたのですが、リリースされて数時間、数日しか経過していないのでまだまだデータが少ないみたいです。それを含めて、構築時に躓いた部分などをまとめて記載します。
サーバーはどこから借りるのがいいのか?
まず、palworldをプレイするためにLinuxで借りるサーバーの推奨スペックを確認しましょう
CPU | 4コア以上 |
メモリ | 8GB以上 |
容量 | 100GB以上(SSD推奨) |
マルチでがっつり発展していくとこれくらいのスペックが必要になるのかなぁと思います。2024年の今ですと、サーバーを借りるのは国内の会社のものが良いです。昔は海外のVPSを使っていた時期も私はありましたが、円安で凄い額請求されて全部国内に切り替えました。
とはいえど国内でも金額は上下してくるわけで、しかも色々な選択肢があります。
参考までに、私が借りているのはWebARENA IndigoというVPS会社のものです。NTTPCコミュニケーションズが運営するサーバーで、個人的に一番コスパが良いと思います。ちなみに私は以下のスペックで動かしています。
CPU | 6コア |
メモリ | 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-all
で8211/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