前言:
閱讀本文需要有一定linux系統使用經驗
由於多人聯機對帶寬上行要求不低,否則玩家(客戶端)會出現卡頓延遲的現象。且由於國內運營商特殊原因,家用寬帶的上傳速率和下載速率並不對等,就是說上下行帶寬不一樣,通常是下載速率遠遠大於上傳速率,鑑於這個現實情況,只有使用VPS等雲服務器才能實現這個需求,因爲一般雲服務器的上下行帶寬都會對等,而且比普遍的家用寬帶的上傳速度高,滿足多人聯機需求,對於服務器來說上傳速率纔是影響服務質量的關鍵因素,從用戶角度來說服務器的上傳速率關係到操作響應時間多與少的問題,上傳速率越大,響應時間越少,反之亦然。下面記錄一下linux環境下搭建starbound 服務端過程。
準備工作:
1.首先需要準備一臺服務器,這裏推薦使用各大供應商的VPS虛擬雲服務器。國內阿里雲騰訊雲等大廠的最低配,單核CPU,1G內存也需要約50~100人民幣一個月的租賃費用,小廠考慮到售後維護,問題反饋處理速度和公司穩定性等問題,筆者個人決定不予採用。國外老牌VPS供應商推薦使用Linode,Vultr,DigitalOcean,UpCloud等,筆者本人僅僅使用過Linode,同樣的配置比國內供應商價格便宜一半左右(5到10美元左右),就是由於國外供應商的服務器節點一般在海外,日本,韓國,澳大利亞,新加坡,美國,英國等,考慮到服務器節點地理位置離玩家越遠網絡延遲越高的問題,可以選用就近的日本或者香港(如有)節點等。筆者當時使用的是Linode日本節點,延遲大概在200~500ms毫秒左右。當然如果不考慮成本問題則選用阿里雲或者騰訊雲等國內供應商爲佳。
(補充:針對starbound的優化,筆者推薦使用2核,2G內存的配置,優先確保內存條件,玩家5人以下推薦2M帶寬,人數提高則適當增加帶寬和硬件配置)
2.服務器操作系統最低版本推薦,Ubuntu 16.04 LTS,Debian 8,Fedora 最新版,CentOS 7 ,且均爲x64位操作系統,32位操作系統則服務端不予支持,其他64位操作系統要求已安裝tmux 1.6以上和glibc 2.17以上版本的運行庫
3.steam官方服務端工具steamcmd介紹:steamcmd是steam官方推出的一款可以在linux系統環境下運行的去圖形化的可交互API指令集終端,主要用來完成建立監聽服務端的工作,具體用法可自行查閱文章篇末的參考文章3。
4.服務端選擇第三方的LinuxGSM,而不直接使用steamcmd下載官方服務端的方式,是因爲前者集成了steamcmd裏頭的功能之外,還在此基礎上添加了較爲方便的配置管理功能,如運行腳本一鍵自動連接登錄steam,自動下載starbound等功能,還有後臺運行,實時控制檯管理,日誌查看等。當然LinuxGSM不是starbound專用服務端,它還支持運行其他steam遊戲服務端,具體可自行查閱文章篇末的參考文章2,這裏不展開贅述。
開始安裝:
(以下筆者以操作系統CentOS7爲例搭建服務端)
1.安裝依賴:
[root@testserver ~]# yum install -y epel-release #安裝epel的yum源以便安裝後續依賴
[root@testserver ~]# yum install -y mailx postfix curl wget bzip2 gzip unzip python binutils bc jq tmux glibc.i686 libstdc++ libstdc++.i686 #安裝所需依賴,運行庫
2.安裝服務端:
[root@testserver ~]# adduser -d /這裏填寫安裝目錄 sbserver #創建管理和運行服務端專用系統用戶sbserver,安裝目錄根據實際選擇硬盤空間寬裕的分區即可,同時安裝目錄即sbserver用戶的家home目錄
[root@testserver ~]# passwd sbserver #給用戶sbserver設置登錄密碼,由於一般從root用戶直接切換到sbserver用戶操作,不需要每次輸入sbserver密碼,這裏的密碼可以設置得儘量複雜一點避免安全問題即可。
[root@testserver ~]# su - sbserver #切換到sbserver用戶進行後續操作
[sbserver@testserver ~]$ wget -O linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh sbserver #下載安裝服務端的腳本linuxgsm.sh並授予執行權限,最後運行腳本
[sbserver@testserver ~]$ vi lgsm/config-lgsm/sbserver/common.cfg #編輯服務端配置文件common.cfg,加入登錄steam所用的賬號和密碼,由於starbound的服務端需用戶購買後才能下載,所以必須使用已購買遊戲的steam賬號登錄
在common.cfg中寫入如下內容,並保存退出
steamuser="steam用戶名填這裏"
steampass='steam用戶密碼填這裏'
[sbserver@testserver ~]$ ./sbserver install # 開始安裝starbound服務端,中間按提示輸入登錄驗證碼,然後等待腳本運行結束
3.服務端常用命令(注意以下命令都需要在sbserver用戶下執行,否則腳本會拋出錯誤):
[sbserver@testserver ~]$ ./sbserver #顯示使用方法和幫助信息
[sbserver@testserver ~]$ ./sbserver start #啓動服務端
[sbserver@testserver ~]$ ./sbserver stop #停止服務端
[sbserver@testserver ~]$ ./sbserver restart #重啓服務端
[sbserver@testserver ~]$ ./sbserver console #打開服務端控制檯,在啓動服務端後可使用,用來監控服務端運行情況,或者執行服務端命令,在服務端窗口使用 CTRL+b 鬆開然後再單獨按d 的方式退出控制檯返回linux終端,注意,使用CTRL+c的話則是直接停止服務端並退出控制檯
[sbserver@testserver ~]$ ./sbserver update #更新服務端
[sbserver@testserver ~]$ ./sbserver validate #校驗服務端完整性,類似steam裏的校驗遊戲文件完整性
[sbserver@testserver ~]$ ./sbserver details #輸出服務端配置信息
[sbserver@testserver ~]$ ./sbserver backup #備份服務端文件
4.服務端通訊相關:
linux系統需要把服務器監聽端口(默認爲TCP協議的21025端口)在防火牆上開放,還要根據運營商提供的服務器安全策略進行相應的端口通訊放行,如阿里雲的服務器安全組策略,屬於安全組的服務器,需要在裏面添加相應的放行規則。最後就是網絡設備層(路由器,三層交換機等)也需要檢查放行相應的端口。全部放行後可以在另外一臺機器上使用“telnet 服務器IP地址 21025”的方式檢查服務端的端口是否能夠正常通訊。
初步總結:
如果只遊玩原版服務端的話,安裝進行到這裏則結束,如果還需要在服務端上安裝第三方擴展模組(即俗稱mod,什麼是mod請自行查閱資料),那麼請繼續往下看。
服務端安裝模組mod:
1.首先爲了服務端和其他一起遊玩的小夥伴安裝mod方便,需要到steam的個人創意工坊上把需要安裝的mod訂閱並添加到個人合集裏,之後會得到一個指向該合集的頁面,以及相應的網頁地址URL,例如https://steamcommunity.com/sharedfiles/filedetails/?id=1833513307
地址中的參數id的值1833513307則是該合集的編號,這個編號後面的安裝會用到。
2.新建腳本shinit.sh ,先刪除在安裝服務端時候默認下載的一些創意工坊裏的mod內容,然後調用steam的接口並生成統一下載前面提到的創意工坊mod合集的腳本moddownload.sh,腳本內容如下:
(說下腳本的具體思路:調用steam接口的時候返回的結果是JSON的數據格式,linux下可以使用jq這個工具進行數據處理並提取到需要下載的mod的編號id,創意工坊裏的模組mod跟合集一樣,在mod的介紹頁的網站地址上有其對應的編號id,在這裏就是要處理這段JSON格式的數據並得到這些mod的編號,然後傳遞給新腳本moddownload讓其批量下載到服務端中。)
#!/bin/bash
#shinit.sh
rm -rf /data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/*
cd /data/scripts/sbserver/steamcmd
echo "./steamcmd.sh +login "steam賬號填這裏" "steam密碼填這裏" +force_install_dir ../serverfiles \\" > moddownload.sh
curl -s --data "collectioncount=1&publishedfileids[0]=創意工坊mod合集id填這裏" https://api.steampowered.com/ISteamRemoteStorage/GetCollectionDetails/v1/ \
| jq '.response.collectiondetails[] | .children[] | .publishedfileid' \
| sed 's/^/+workshop_download_item 211820 /' | tr '\n' ' ' >> moddownload.sh
echo "+quit" >> moddownload.sh
chmod +x moddownload.sh
./moddownload.sh
rm -f moddownload.sh
3.在順利運行moddownload.sh腳本後,創意工坊合集裏的mod已經被正確下載到服務端裏,接下來要修改配置文件serverfiles/linux/sbinit.config讓服務端在啓動時候加載需要啓動的模組mod,由於該文件sbinit.config屬於JSON格式的文件,所以需要用以下命令處理其內容:
[sbserver@testserver linux]$ echo -e "{\n \"assetDirectories\": [\n \"../assets/\",\n \"../mods/\",\n " >> /data/scripts/sbserver/serverfiles/linux/sbinit.config
[sbserver@testserver linux]$ curl -s --data "collectioncount=1&publishedfileids[0]=合集的ID填這" https://api.steampowered.com/ISteamRemoteStorage/GetCollectionDetails/v1/ \
| jq '.response.collectiondetails[] | .children[] | .publishedfileid' \
| sed 's#^#"../../Steam/steamapps/workshop/content/211820/#' | sed 's#/"#/#' | tr -t '\n' ',' >> /data/scripts/sbserver/serverfiles/linux/sbinit.config
[sbserver@testserver linux]$ echo -e "\b\b\n ],\n \"storageDirectory\": \"../storage/\"\n}\n" >> /data/scripts/sbserver/serverfiles/linux/sbinit.config
4.最後得到配置文件sbinit.config,但筆者在啓動的時候發現生成的配置文件格式有問題,且服務端啓動時候報錯,日誌內容爲找不到配置文件sbinit.config所指向的資源目錄,故筆者將其配置文件裏的目錄全部改爲絕對路徑,並檢查其是否符合JSON的數據格式,還有排版問題等,終於順利啓動服務端,以下是整理後的配置文件sbinit.config內容,中間帶有workshop路徑行的則是需要加載的mod列表:
{
"assetDirectories": [
"/data/scripts/sbserver/serverfiles/assets/",
"/data/scripts/sbserver/serverfiles/mods/",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729791646",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729427436",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/731220462",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729492703",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/1575016526",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/763259329",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729480149",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/754350883",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/731354142",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729427744",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/1117007107",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/733238864",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729428037",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729726478",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729426722",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/807695810",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729524482",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/1264107917",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729466018",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/731957126",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729426797",
"/data/scripts/sbserver/serverfiles/steamapps/workshop/content/211820/729427264"
],
"storageDirectory": "/data/scripts/sbserver/serverfiles/storage/"
}
5.最後確認無誤後,啓動服務端並查看啓動日誌,可進入服務端的控制檯查看(怎麼啓動服務端和進入控制檯請參考上文),或者直接打開serverfiles/storage/starbound_server.log 即可,若日誌中出現mod報錯信息,則可以嘗試到mod安裝目錄下serverfiles/steamapps/workshop/content/211820/ 移除相應的mod即可,如果讀者熟悉代碼開發還可以嘗試解包自行解決異常;若日誌提示遊戲服務端配置文件serverfiles/storage/starbound_server.config 設置有誤,則默認LinuxGSM服務端會自動生成一個默認的配置文件進行替代並啓動,舊的服務端配置文件會重命名爲starbound_server.config.old,讀者可在服務端停止後,直接使用系統生成的配置文件starbound_server.config,或在其基礎上修改後,最後重新啓動服務端,直到其順利啓動,日誌不再出現影響服務端正常啓動的條目即可。至此服務端安裝模組mod完成。
總結:
總的來說寓教於樂,雖然爲了玩遊戲折騰大半天麻煩了一點,但是也學到了諸如linux下使用jq處理JSON格式數據等新東西,同時也強化了自己的分析和編寫Bash腳本的能力,看到一個內容寫的十分複雜的腳本關鍵還是要去抽絲剝繭逐層分析,在理解之後你會發現表面複雜的東西其實內裏很簡單。服務端搭建起來之後還是很有滿足感的。感謝參考文章裏的那些先行的朋友們,對長時間閱讀英文頭疼的筆者來說簡直是幫了大忙。
參考文章:
1.https://onetwo.ren/%E8%87%AA%E5%BB%BAStarbound%E7%BD%91%E6%B8%B8%E6%9C%8D%E5%8A%A1%E5%99%A8/
2.https://linuxgsm.com/lgsm/sbserver/
3.https://developer.valvesoftware.com/wiki/SteamCMD#Downloading_SteamCMD