Batocera 是專為遊戲模擬而設計的系統,但「存檔」並不是存在雲端,而是實體儲存在裝置的磁碟分區中。一旦 SD 卡損壞、USB 隨身碟拔除不當、系統重刷或版本升級,都可能導致存檔遺失。存檔包含:模擬器的即時存檔(savestate)。遊戲內原生存檔(save、memory card 檔案等)部分模擬器的設定檔(例如 RetroArch 的設定、控制器配置)。 若沒有備份,所有遊戲進度可能瞬間消失。你花的所有遊戲時間跟回憶都要重來一次。
文章內容
Syncthing 備方方式
Syncthing 它是「點對點(P2P)」的同步軟體,只能在你自己控制的兩台以上設備之間直接傳輸檔案,設備可以是另一台 Batocera 或 NAS(有裝Syncthing) 或個人電腦(有裝Syncthing) 且兩台電腦在軟體有啟動的裝態下會自動同步。詳細的說明可參考 Batocera WIKI
Rclone 備方方式
rclone 為單一方向上傳或同步雲端(如 Google Drive)或 NAS 設備的程式。如果要同步至雲端依各雲端的不同,事先的需求會不一樣。詳細的操作說明各參考各網路的教學或參考 Batocera WIKI
官方提供的 SCRIPT。把它放至 /userdata/system/services 。之後可至 ES 介面操作自動啟動或執行 batocera-services enable <your_service_name> 設定開機自動啟動。個人覺的使用這個方式並不好。因為它會每 60 秒檢查檔案跟備份,對 SD 這種慢速的儲存媒體來說可能不是那麼友好。當你在玩大檔案的 ISO 遊戲是可能會卡一下。
#!/bin/bash
# ------------------------------- CONFIG BEGIN --------------------------------
# The location of Batocera data on your cloud storage.
destDir=/Batocera
# Waiting time between two backups in seconds.
# The below configuration means that the service will do a backup every minute.
waitSeconds=60
# Change name setted from rclone config as name, default is backup
rcloneName=backup
# If set to true, logs from all runs of the service are preserved.
# If set to false, only logs since the last start of the service are kept.
keepLogs=false
# -------------------------------- CONFIG END ---------------------------------
runFile=/var/run/backup-service
logFile=/var/log/backup-service.log
# This needs to be set explicitly, because $HOME is not set when the service is started by Batocera.
export RCLONE_CONFIG=/userdata/system/.config/rclone/rclone.conf
manual() {
echo "> CONFIG sync" ------------------------------------------------------------------------------------
rclone sync /userdata/system/batocera.conf ${rcloneName}:${destDir}/system --progress
echo "> SAVES sync" -------------------------------------------------------------------------------------
rclone sync /userdata/saves ${rcloneName}:${destDir}/saves --exclude "flatpak/**" --progress
echo "> ROMS sync" --------------------------------------------------------------------------------------
rclone sync /userdata/roms ${rcloneName}:${destDir}/roms --exclude "flatpak/**" --progress
echo "> BIOS sync" --------------------------------------------------------------------------------------
rclone sync /userdata/bios ${rcloneName}:${destDir}/bios --progress
}
start() {
touch ${runFile}
if [ "$keepLogs" = false ]; then
rm -f ${logFile}
fi
timeStamp="$(date)"
echo -e "\n--- SERVICE START - [${timeStamp}] ---\n" >>${logFile}
while test -e ${runFile}; do
sleep ${waitSeconds}
rclone sync /userdata/saves ${rcloneName}:${destDir}/saves --exclude "flatpak/**" --log-file ${logFile} --log-level INFO
done
}
stop() {
rm -f ${runFile}
}
status() {
if test -e ${runFile}; then
echo "Backup service is running. Logs: ${logFile}"
else
echo "Backup service is not running."
fi
}
case "$1" in
manual)
manual
;;
start)
start &
;;
stop)
stop
;;
status)
status
;;
*)
echo "Usage: https://gitlab.com/peterbozso/batocera-backup-service"
;;
esac
進階 inotifywait 加 rclone 備份方式
inotifywait
是 Linux 系統中 用來監聽檔案或目錄變化的工具也就是當檔有有新增修改刪除時會抓檔名或問錄抓出來之後再傳給 rclone 作同步處理。這樣只會處理本機端有異動的檔案而不用去比對整個存檔目錄。但可惜的是 Batocera 本身並不提供 inotifywait
程式。得去下載 Batocera 的 tool-chain (docker image) 跟 inotifywait
source code 。build 完成後再傳至遊戲機裡。
我自已本身用的程式如下
#!/bin/bash
RCLONE=/usr/bin/rclone
REMOTE="InfiniCloud:"
WATCH_DIR="/userdata/saves"
LOGFILE="/userdata/system/savesync.log"
echo "[INFO] SaveSync Service Started at $(date)" >> "$LOGFILE"
# 使用 inotifywait 監控目錄
/userdata/bin/inotifywait -m -r -e close_write,create,modify,delete "$WATCH_DIR" --format '%w%f' | while read FILE
do
echo "[INFO] Detected change in: $FILE at $(date)" >> "$LOGFILE"
# 上傳到雲端(copy = 保留遠端所有檔案,不刪除)
if ping -c 1 -W 2 8.8.8.8 >/dev/null 2>&1; then
$RCLONE --config /userdata/system/.config/rclone/rclone.conf copy "$WATCH_DIR" "$REMOTE" --log-file="$LOGFILE" --log-level INFO
fi
done
結論
依個人的環境選擇 Syncthing 或 rclone 。除非對 Linux 有點程度的可選用 inotifywait 加 rclone 。但在 x86 電腦主機上最最簡單的方式是使用 Raid 卡。用鏡像功能直接處理。