跳到正文
本頁目錄

運行服務器

本指南用 lip 搭建一個 LeviLamina 服務器,並用 lip run 運行它:在 Windows 上,以及在 Linux 和 macOS 上通過 Wine。除了 lip 本身,無需下載或安裝任何東西:服務器需要的系統組件由 lip 自行安裝。

設置服務器

為服務器(即工作區)新建一個空目錄,並在其中運行 lip:

shell
mkdir my-server
cd my-server
lip setup --game 1.21.0
lip run

lip setup 選擇工作區的服務器:

  • 遊戲:版本為 --game 的 Bedrock Dedicated Server github.com/LiteLDev/bds。
  • 構建:--build windows(默認)為 Windows 版服務器,--build linux 為 Linux 版服務器(參見 Linux 版服務器)。
  • 加載器:Windows 版服務器默認為 LeviLamina,用 --no-loader 則不帶加載器。--loader levilamina@<version> 取該版本的 LeviLamina;不帶版本時,lip 取支持該遊戲版本的最新 LeviLamina。

lip setup --game 1.21.0 把遊戲 1.21.0 和支持它的最新 LeviLamina,連同 LeviLamina 依賴的包,安裝到工作區,並準備好 bedrock_server_mod.exe。lip run 隨後在工作區中運行 bedrock_server_mod.exe。

你也可以讓 LeviLamina 來選擇遊戲:lip install LeviLamina 會作為 lip setup 執行,取最新的 LeviLamina 及其支持的最新遊戲版本;lip install LeviLamina@<version> 則取該版本的 LeviLamina:

shell
lip install LeviLamina

然後用 lip install 安裝 mod。在還沒有遊戲的工作區中,安裝 mod 會失敗,並請你先運行 lip setup。

Minecraft EULA

在下載遊戲之前,lip 會給出 Minecraft 最終用戶許可協議和 Microsoft 隱私聲明的鏈接,並詢問你是否接受。輸入 yes 繼續;其他任何回答都會終止命令,不做任何改動。

lip 不會記住你的回答:每當設置安裝或改變遊戲時都會詢問。在腳本、服務或容器中,lip 的標準輸入或標準錯誤不是終端,lip 無法詢問,除非你用 --accept-eula 表示接受,否則設置會失敗:

shell
lip setup --game 1.21.0 --accept-eula

在交互界面中,當某次修改會設置遊戲時,lip 會在對話框中詢問。

改變遊戲版本

lip install 和 lip update 從不改變遊戲或加載器。當遊戲有新版本,或某個 mod 需要另一個版本時,請再次運行 lip setup:

shell
lip setup --game 1.21.50

lip 會針對新的遊戲和加載器重新解析工作區中的 mod:若某個 mod 的版本能與它們配合,則保持該版本,否則改變其版本。可以先加上 --dry-run 查看會有哪些變化。若某個 mod 沒有能與新遊戲配合的版本,lip 會列出這些 mod,並詢問是否卸載它們;lip 無法詢問時,命令會失敗並指明這些 mod,你可以先用 lip uninstall 自行卸載它們,再運行 lip setup。用工作區已有的遊戲和加載器運行 lip setup 不會改動它們,也不會詢問 EULA。

不帶加載器的 Windows 版服務器

如需運行不帶 LeviLamina 的 Windows 版服務器,請不帶加載器設置它:

shell
lip setup --game 1.21.0 --no-loader
lip run

此時 lip run 運行 bedrock_server.exe 而不是 bedrock_server_mod.exe,運行方式相同:在 Windows 上由 lip 運行,在 Linux 和 macOS 上通過 Wine 運行。需要 LeviLamina 的 mod 無法安裝到這樣的工作區中。

在 Windows 上

Windows 版服務器需要 Microsoft Visual C++ 可再發行組件包(x64)。若尚未安裝,lip 會在 lip setup 設置 Windows 版服務器時,以及在運行鉤子命令或 lip run 運行服務器之前,從 Microsoft 下載其安裝程序並運行;Windows 會請你允許它以管理員身份進行更改。參見系統依賴。

在 Linux 和 macOS 上通過 Wine 運行

無論 lip 運行在什麼系統上,它默認都安裝平臺 win-x64 的包(參見環境)。在 Linux 和 macOS 上,它通過 Wine 運行這些包的鉤子命令和 Windows 版服務器,因此同一個 Windows 版服務器可以在那裡運行。

安裝與運行

命令與 Windows 上相同:

shell
mkdir my-server
cd my-server
lip setup --game 1.21.0
lip run

lip 第一次需要 Wine 時(即 lip setup 設置 Windows 版服務器時),會下載一個 Wine 構建,用寫在 lip 中的 SHA-256 校驗它,並解壓到其數據目錄(~/.local/share/lip,參見常見問題),由所有工作區共用。隨後它向工作區的 Wine 前綴中安裝一次 Microsoft Visual C++ 可再發行組件包。兩者都不需要 root,也不需要你自己的 wine:lip 從不運行 PATH 中的 wine。參見系統依賴。

在 Windows 以外的系統上,當工作區的平臺以 win 開頭時,lip 通過它的 Wine 運行所有 Windows 程序:安裝、更新或卸載包時的鉤子命令(以 wine cmd /s /c <命令> 的形式),以及 lip run 運行的 Windows 版服務器(以 wine 加服務器文件的絕對路徑的形式,即 bedrock_server_mod.exe,不帶加載器時為 bedrock_server.exe)。Wine 把鉤子命令中的每個 " 以 \" 的形式傳給 cmd,而 cmd 不把它當作轉義,因此含有 " 的鉤子命令通過 Wine 運行時不會按原樣運行;面向 Wine 的包應避免在鉤子中使用 "。對 lip 而言,這樣的工作區中的路徑不區分大小寫,與 Wine 運行的程序看到的一樣:寫入 Plugins/a.dll 的包會寫入已有的 plugins/ 目錄,而不是在其旁邊新建目錄。

Wine 前綴

lip 為 wine 設置兩個環境變量,除非你自己設置了它們:

變量默認值
WINEPREFIX工作區中 .lip/wine 的絕對路徑,在 WINEPREFIX 未設置或為空時使用。每個工作區都有自己的前綴,由 Wine 在該工作區中首次運行時創建,並隨工作區一起移動。
WINEDEBUG-all,在 WINEDEBUG 未設置時使用:不顯示 Wine 的調試信息。如需查看,請自行設置,例如設為 err+all。

如需使用其他前綴,請為該工作區的每條 lip 命令設置 WINEPREFIX:

shell
export WINEPREFIX="$HOME/.wine-bds"
lip setup --game 1.21.0
lip run

macOS 與 arm64

Windows 版服務器是 x64 的 Windows 程序。lip 在它發佈的每個系統上都用真實的 LeviLamina 服務器測試過,配置如下:

系統由什麼運行服務器
x64 上的 WindowsWindows。
arm64 上的 WindowsWindows,由它模擬 x64。
x64 上的 Linuxlip 的 Wine。
x64 上的 macOSlip 的 Wine。
arm64 上的 macOS同一個 x64 的 Wine,由 Rosetta 2 運行。

在 x64 的 Linux 上,lip 的 Wine 是 Kron4ek/Wine-Builds 的構建;在 macOS 上,是 Gcenx/macOS_Wine_builds 的構建。

在 Apple 芯片的 Mac 上,Wine 需要 Rosetta 2,而安裝它需要管理員權限,因此 lip 不會安裝它:缺少它時,lip 會失敗並請你運行:

shell
softwareupdate --install-rosetta --agree-to-license

lip 不為 arm64 的 Linux 發佈,因為試過的辦法都無法在那裡可靠地運行 LeviLamina 服務器:

  • Hangover 能運行原版 Bedrock Dedicated Server,但 LeviLamina 修改過的服務器一啟動就失敗。
  • 由 box64 運行的 x64 Wine 會在 Windows 程序退出時將其殺死,退出碼因此丟失。
  • 由 FEX 運行的 x64 Wine 在六次嘗試中有兩次成功運行了 LeviLamina 服務器。有兩次,安裝 LeviLamina 時用來修改服務器的 PeEditor.exe 被殺死;另有兩次,服務器啟動成功,但在停止時失敗。

lip 自己下載並放置服務器的文件,不借助任何 Windows 程序。

Linux 版服務器

構建 linux 設置 Minecraft 的 Linux 版服務器,而不是 Windows 版,即變體 github.com/LiteLDev/bds#linux。LeviLamina 只加載到 Windows 版服務器中,因此 Linux 版服務器沒有加載器,需要 LeviLamina 的 mod 也無法與它一起安裝:

shell
lip setup --game 1.21.0 --build linux
lip run

lip install github.com/LiteLDev/bds#linux 以最新的遊戲版本做同樣的事,lip install github.com/LiteLDev/bds#linux@<version> 則以該版本。

lip 放置 Linux 版服務器的文件,並自己把 bedrock_server 設為可執行,不借助鉤子命令,因此沒有任何程序通過 Wine 運行,lip 也不為它安裝 Wine 或 Microsoft Visual C++ 可再發行組件包。一個工作區只有一個遊戲,因此在裝有 Windows 版服務器的工作區中設置 Linux 版服務器會替換前者,與任何遊戲的改變一樣。

在 x64 的 Linux 上,lip run 自己運行工作區根目錄下的 bedrock_server;若環境變量 LD_LIBRARY_PATH 未設置或為空,則將其設為 .,使服務器能找到其旁邊的庫。在其他系統上,lip run 對 Linux 版服務器會失敗。

早期 lip 以 --platform linux-x64 創建的工作區,若只裝有服務器,則仍可使用:lip 把其中的服務器讀作 github.com/LiteLDev/bds#linux(參見狀態文件)。

服務器運行期間

  • 控制台:服務器輸出到你的終端,你輸入的所有內容都會轉交給它,因此你可以像平常一樣輸入服務器命令。
  • 停止:按 Ctrl+C。lip 向服務器輸入 stop,服務器隨即保存世界並退出,lip 隨後退出。再次按 Ctrl+C 不會強行中斷服務器:lip 仍會等待它退出。若服務器卡住,請結束其進程。
  • 退出碼:lip run 以服務器的退出碼退出(通過 Wine 運行時為 wine 的退出碼);在 Linux 或 macOS 上服務器被信號 n 結束時為 128 + n(例如 SIGKILL 為 137),因此在失敗時重啟服務器的腳本或服務管理器可以使用它。
  • 重啟:要讓 lip 重啟崩潰(以非零退出碼退出)的服務器,請設置 lip config set restart on-failure --workspace。lip 會等待 5 秒後再次啟動它,10 分鐘內至多 5 次;你停止的服務器或以退出碼 0 退出的服務器不會被重啟。參見 lip run。
  • 每個工作區一個服務器:工作區的服務器在運行時,再次在該工作區運行 lip run 會立即失敗,無論服務器是由 lip run、交互界面還是守護進程啟動的。
  • 保持運行:lip run --managed 讓 lip 的守護進程運行服務器,使它在你關閉終端後繼續運行;再次運行 lip run --managed 即可連接到它,lip run --managed --detach 則啟動它而不連接。交互界面也以這種方式運行服務器。參見託管服務器。
  • 修改包:服務器運行期間,lip 不鎖定工作區。你可以在另一個終端中對同一工作區運行 lip install、lip update、lip uninstall 或 lip setup;服務器下次啟動時才會看到這些改動。若某個要替換或刪除的文件因被運行中的服務器打開而無法替換或刪除(在 Windows 上可能發生),該操作會失敗並被撤銷,工作區保持原樣;請停止服務器後再運行該命令。交互界面更為嚴格:某個工作區的服務器運行期間,無論它是如何啟動的,界面都不會在其中安裝、更新、卸載或設置任何內容,遊戲配置也只能查看。
  • 被中斷的操作:與任何操作一樣,lip run 會先完成或撤銷被中斷的操作;若此時另一個 lip 命令正在修改該工作區,它會立即失敗。