3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GoogleCloudでパルワールド鯖を構築する話 -その2 構築編-

3
Posted at

はじめに

前回の記事「GoogleCloudでパルワールド鯖を構築する話 -その1 スペック選定編-」に引き続き、今回はCompute Engineを使用したパルワールド鯖の構築作業に進みます。作業の流れは以下のようになります。

作業の流れ

  1. インスタンス作成
  2. 依存パッケージの導入
  3. FWルールの作成と接続
  4. (Ex.) ワールドデータの移植

1.インスタンス作成

まずはインスタンスをコンソールから作成していきます。なお今回は下記の構成で作成しました。

項目 設定値
リージョン asia-northeast1
マシンタイプ e2-custom-4-24576(4 vCPU, 24GBメモリ)
プロビジョニングモデル 標準
OS Debian 12 (Bookworm)
ディスク バランス標準ディスク (40GB)
ネットワーク プレミアムティア
ネットワークタグ 任意の値

軽く調べた限りではe2-standard-4(4 vCPU、2コア、16GBメモリ)、標準永続ディスク10GBでも動作している方がいらっしゃるようなので、ここまでのスペックが必要かは分かりません。ここら辺のスペック評価については次の記事で取り扱う予定です。

2.依存パッケージの導入

コンソールから作成ボタンを押下すると数秒でインスタンスが立ち上がります。作成後は対象のインスタンスを選択し、詳細タブに表示されているSSHというボタンからインスタンスへの接続を開始しましょう。操作にはブラウザでのSSH表示がおすすめです。
接続できた後は下記のコマンドを順々に実行していきます。

なおパルワールドの公式サイトにはサーバー構築に必要最低限の手順が記載されています。クロスプレイを前提にしたサーバーを構築する際の注意点など、意外と重要な情報が載っていたりするので構築の前に一度目を通しておくことをおすすめします。

初期設定

OSのアップデートとライブラリの追加を最初に行っておきます。

bash
sudo dpkg --add-architecture i386
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl lib32gcc-s1

仮想メモリの作成(※任意)

パルワールドではプレイ時間が長くなるとメモリの使用量も上昇していくという情報を耳にしました。
Out of Memoryによる強制停止を防ぐために一応スワップ領域を確保しておきます。

bash
# 8GBのスワップファイルを作成して有効化 
sudo fallocate -l 8G /swapfile 
sudo chmod 600 /swapfile 
sudo mkswap /swapfile 
sudo swapon /swapfile 

# 再起動後もスワップ設定を維持する 
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

専用ユーザーの作成

セキュリティ強化を目的にプロセスを隔離するための専用ユーザーpalworldを作成しておきます。

bash
# パスワードログインを持たない palworld ユーザーを作成
sudo adduser --disabled-password --gecos "" palworld

# palworld ユーザーに切り替える(プロンプトの左側が palworld@〜 に変わります)
sudo -i -u palworld

SteamCMDの導入

SteamCMDは32ビットで動作します。そのためまず最初に32ビットライブラリの有効化を実施しています。

bash
# SteamCMD用のディレクトリを作成してダウンロード・解凍
mkdir ~/steamcmd && cd ~/steamcmd
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -

※余談
SteamCMD(Steam Console Client)はSteamのコマンドライン版ツールで、LinuxのようなGUI画面を持たないOSのサーバーでSteamから配信されているゲームをダウンロード、インストールする際に必要となります。

パルワールドのサーバーデータダウンロード

SteamCMDを利用して、パルワールドのサーバーデータをダウンロードします。

bash
# インストール先を ~/palserver と指定し、匿名ログインでアプリをダウンロード
~/steamcmd/steamcmd.sh +force_install_dir ~/palserver +login anonymous +app_update 2394010 validate +quit

SDKエラーの事前回避

パルワールドのLinuxではsteamclient.soが見つからない旨のエラーが頻繁に発生することが報告されています。
これを事前に回避するためにファイルを規定の場所にコピーしておきます。

bash
mkdir -p ~/.steam/sdk64/
cp ~/steamcmd/linux64/steamclient.so ~/.steam/sdk64/

実行権限の付与

bash
chmod +x ~/palserver/PalServer.sh

サーバーパスワードの設定

bash
mkdir -p ~/palserver/Pal/Saved/Config/LinuxServer/
cp ~/palserver/DefaultPalWorldSettings.ini ~/palserver/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
nano ~/palserver/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

ファイルが開いたら、矢印キーで右にスクロールし、ServerPassword="" と AdminPassword="" のダブルクォーテーションの中に任意のパスワードを入力して保存(Ctrl+O → Enter → Ctrl+X)します。

保存が完了したらここで初期ユーザーにスイッチします。

bash
exit

自動起動とバックグラウンド稼働の設定

bash
echo "[Unit]
Description=Palworld Dedicated Server
Wants=network-online.target
After=network-online.target

[Service]
User=$USER
ExecStart=/home/$USER/palserver/PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/palserver.service

sudo systemctl daemon-reload
sudo systemctl enable --now palserver

3.FWルールの作成と接続

最後に外部からプレイヤーが接続できるようにするためのVPCファイアウォールの設定を進めます。
基本的にはデフォルトの設定で問題ありませんが、一部値については設定した値を指定しましょう。

項目 設定値
ターゲット 指定されたターゲットタグ
ターゲットタグ 設定した任意の値
送信元 IPv4 範囲 0.0.0.0/0
プロトコル UDP
ポート 8211
ネットワークタグ 設定した任意の値
作成が完了したらいよいよ接続を開始します。
コンソールからインスタンスの外部IPを確認し、パルワールドからIPを入力します。併せてポート番号とパスワードが要求されるので設定した値を入力します。
入力が完了しワールドに入れれば作業は完了です。

EX.ワールドデータの移植

構築作業を進めている段階で既にゲームを進めてしまっており、折角なので作成したサーバーにワールドデータを移植することにしました。
移植手順は単純で「ワールドデータ(.wld)とワールドの設定情報を手元に用意する」→「インスタンスの所定の位置にファイルを配置し設定ファイルを編集する」という流れになります。

ワールドデータと設定情報の用意

ワールドデータは以下の手順で確認できます。

  • キーボードの Windowsキー + R を押してファイル名を指定して実行を開く。

  • 以下の文字列をコピペしてEnterを押す。 %LOCALAPPDATA%\Pal\Saved\SaveGames

  • ズラッと数字が並んだフォルダ(SteamID)があるので開く。

  • その中に「英数字の羅列のフォルダ(例: 3F5B2A... のような名前)」があるので、これがワールドデータを格納している

フォルダの中身を開き、Level.sav、LevelMeta.sav、Players フォルダなどが含まれていることを確認してください。
確認完了後はフォルダ自体をZIP化しておきましょう。

ワールドの設定情報についてはパルワールドを起動し、設定画面に遷移することで確認できます。
次の手順でサーバーの PalWorldSettings.ini に手動で反映させる必要があるため、デフォルトから変更している項目がある場合はメモしておきましょう。

ワールドデータの上書き移植

用意したワールドデータを移植する手順は以下の通りです。

  • ZIPファイルをアップロードする
    SSH接続画面からZIPファイルをアップロードしてください。
  • 解凍ツールのインストールとサーバーの一時停止
    アップロードが完了したら安全にデータを上書きするためにサーバープロセスを停止します。
bash
sudo systemctl stop palserver
sudo apt install -y unzip
  • ワールドデータの上書き移植
bash
# 解凍先ディレクトリを作成してZIPを解凍
mkdir -p extracted_save
unzip -q save.zip -d extracted_save

# サーバーが現在使用しているセーブデータフォルダのパスを自動取得
DEST_DIR=$(find /home/palworld/palserver/Pal/Saved/SaveGames/0 -mindepth 1 -maxdepth 1 -type d | head -n 1)

# 解凍したデータの中から Level.sav があるディレクトリ(データ本体)を特定
SRC_DIR=$(find extracted_save -type f -name "Level.sav" | head -n 1 | xargs dirname)

# 念のためテストプレイ時のデータをバックアップ
sudo cp -R "$DEST_DIR" ~/backup_test_world

# 友人データの中身をサーバーのフォルダへ上書きコピーし、権限をパルワールド用ユーザーに修正
sudo cp -R "$SRC_DIR"/* "$DEST_DIR"/
sudo chown -R palworld:palworld "$DEST_DIR"

# 起動
sudo systemctl start palserver

キャラデータ復旧

パルワールドにはローカル環境から専用サーバーへ移行する際の仕様上、ゲストだったプレイヤーのキャラクターデータはそのまま引き継がれますが、元ホストのキャラクターだけは新規プレイヤーと誤認され、初期化されてしまうという問題があるようです。

この問題を解決するために有志の方がデータ変換ツールを作成されました。これを使用してホストのキャラデータを復旧する作業を実施します。

  • 元ホストが1人でサーバーに接続する
    接続すると最初にキャラクター表示画面が表示されます。適当なキャラクターを作成してワールドに降り立ち、何もせずにすぐログアウトしてください。これを行うことで書き換え先となるキャラクターの器を作ります。

  • ツールの準備と新しいIDの特定
    Pythonで記述されたデータ変換ツールをダウンロードします。併せてバックアップ(extracted_save)と現在の状態を比較して、新しいIDを自動的に特定します。

bash
# サーバーを停止
sudo systemctl stop palserver

# ツールの準備
sudo apt update && sudo apt install -y python3 curl unzip
curl -L -o fix-host-save.zip https://github.com/xNul/palworld-host-save-fix/archive/refs/heads/main.zip
unzip -q -o fix-host-save.zip
cd palworld-host-save-fix-main

# セーブデータディレクトリのパスを取得
SAVE_DIR=$(find /home/palworld/palserver/Pal/Saved/SaveGames/0 -mindepth 1 -maxdepth 1 -type d | head -n 1)

# 「旧データに存在せず、今回新しく作られたID(あなたの器)」を抽出
for file in "$SAVE_DIR/Players/"*.sav; do
  filename=$(basename "$file")
  if [ -z "$(find ~/extracted_save -name "$filename")" ]; then
    NEW_GUID="${filename%.sav}"
    break
  fi
done

echo "特定されたあなたの新しいID: $NEW_GUID"
  • セーブデータの書き換え
    特定したIDを用いて書き換え処理を走らせます。
bash
python3 fix-host-save.py "$SAVE_DIR" 00000000000000000000000000000001 "$NEW_GUID"
  • 権限の修正と再起動
bash
sudo chown -R palworld:palworld "$SAVE_DIR"
sudo systemctl start palserver

マップデータ復旧

パルワールドではキャラクターのレベルや拠点のデータはサーバー側に保存されますが、「地図をどこまで埋めたか(探索状況)」だけは、各プレイヤーの自分のPC(クライアント側)に保存されています。 そのためゲーム起動後、新規作成された地図データを既存の地図データで上書きする必要があります。
手順は以下の通りです。

  1. キーボードの Windowsキー + R を押して「ファイル名を指定して実行」を開く。
  2. %LOCALAPPDATA%\Pal\Saved\SaveGames と入力してEnterを押す。
  3. 数字が並んだフォルダ(SteamID)を開く。
  4. いくつか英数字の羅列のフォルダがあるので古いフォルダにある**LocalData.sav** というファイルを新しいフォルダにコピーする。

設定ファイル編集

ワールド設定をデフォルト値から変更している場合は以下の手順に従いPalWorldSettings.iniを編集しておきましょう。

  1. サーバーの停止
bash
sudo systemctl stop palserverv
  1. 設定ファイルの編集
bash
sudo nano /home/palworld/palserver/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

PalWorldSettings.iniはカンマ区切りで1行に全ての設定値がまとめられているので、キーボードの Ctrl + W を押し、検索モードを用いて該当の設定値を編集することをおすすめします。
3. サーバーの再起動

bash
sudo systemctl start palserver

結論

今回の記事ではパルワールド鯖の構築作業を進めました。当初はキャラデータやマップデータの引き継ぎが上手くいかない事象が発生し、若干手間取りましたが、最終的には無事全てのデータをCompute Engineのインスタンスに移すことができました。

次の「GoogleCloudでパルワールド鯖を構築する話 -その3 評価編-」では実際にパルワールドをプレイし、得られたメトリクスデータから最適なスペックの再定義を行います。本記事からご興味を持っていただけた方は下記のリンクから閲覧頂けると幸いです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?