QTS 更新時修復 FW012 / FW999 / FW006 錯誤(TVS-x73 及其他機型)

大家好,

我來分享一份詳細的操作流程,說明我是如何在將 TVS-473e 從 QTS 5.2.5 升級到 5.2.8 時,繞過惡名昭彰的 FW999FW012FW006 錯誤。如果你明明有足夠的磁碟空間,卻還是遇到「Invalid update image size」或「System update failed」這類錯誤,這篇就是寫給你的。

問題:為什麼官方更新會失敗 在深入研究更新日誌和 update.sh 行為後,發現目前 QNAP 更新邏輯有兩個主要缺陷:

  1. RAMDisk 空間耗盡(錯誤 FW006): 更新腳本會嘗試將韌體解壓縮到 /mnt/update,這通常位於一個很小的 RAMDisk(約 400MB)。如果韌體及其解壓縮後的內容超過這裡的剩餘空間,過程就會以「No space left on device」錯誤終止。

  2. 「薛丁格掛載」問題(錯誤 FW999): update_img.sh 腳本會嘗試將 DOM 分割區(/dev/sdd2)掛載到 /root/FLASH_RFS1。很多情況下,掛載其實成功了,但腳本誤判回傳碼或後續健全性檢查失敗,觸發「清理」程序,刪除你剛解壓的檔案,然後抱怨裝置忙碌——因為它自己剛剛掛載了!

解法:「外科手術」手動更新

如果你熟悉 CLI(還有 mcedit/vi!),這裡就是成功的路線圖:

1. 在實際資料磁碟建立工作區 不要讓 QNAP 使用 RAMDisk。建立一個指向大容量硬碟的符號連結。

mkdir -p /share/Public/fw_update
rm -rf /mnt/update
ln -sf /share/Public/fw_update /mnt/update 

2. 手動解密並解壓韌體 使用內建的 PC1 工具取得真正的 fw.tar

/sbin/PC1 d QNAPNASVERSION4 /share/Public/your_firmware.img /share/Public/fw_update/fw.tar
cd /share/Public/fw_update
tar xf fw.tar 

3. 修正「壞掉」的腳本邏輯 這就是我們超越 SoftLab 的地方。打開 update_img.sh(用 mceditvi),找到嘗試將 /dev/sdd2 掛載到 /root/FLASH_RFS1 的那一行,把那個 mount 行註解掉(行首加 #)。為什麼? 因為我們會手動掛載,不希望腳本在遇到已掛載分割區時恐慌。修改後大致如下:

mount_flash_rfs1()

{
  [ -d "$FLASH_RFS1_MP" ] || /bin/mkdir "$FLASH_RFS1_MP"
#  /bin/mount "$FLASH_RFS1" "$FLASH_RFS1_MP"
#  /bin/grep "$FLASH_RFS1_MP " /proc/mounts > /dev/null 2>&1
#  if [ $? -ne 0 ]; then
#    echo "mount $FLASH_RFS1 to $FLASH_RFS1_MP failed"
#    return 1
#  fi
  return 0
}

4. 準備環境並執行

# 確認掛載點存在並掛載分割區
mkdir -p /root/FLASH_RFS1
mount /dev/sdd2 /root/FLASH_RFS1

# 假造一個版本檔給 logger
echo “5.2.8” > ./newver

# 執行真正的映像更新腳本(worker,不是 wrapper)
./update_img.sh /share/Public/fw_update

5. 清理並重開機 如果你看到 “Update Finished”,恭喜你成功了。

umount /root/FLASH_RFS1
reboot

給 QNAP 開發者的最後想法 有趣的是,更新腳本足夠複雜,會檢查 secure boot 支援,卻會被「太成功」掛載的分割區打敗。也許加上一個簡單的 if ! mountpoint -q /root/FLASH_RFS1; then mount… 就能讓用戶少掉很多麻煩?僅供參考。:wink:

希望這能幫助到同樣卡在 FW999 迴圈的人!

非常感謝您的分享!這些資訊對我們來說非常寶貴。如果您日後遇到其他問題或有進一步的建議,請隨時告訴我們。祝您有美好的一天!