大家好,
我來分享一份詳細的操作流程,說明我是如何在將 TVS-473e 從 QTS 5.2.5 升級到 5.2.8 時,繞過惡名昭彰的 FW999、FW012 和 FW006 錯誤。如果你明明有足夠的磁碟空間,卻還是遇到「Invalid update image size」或「System update failed」這類錯誤,這篇就是寫給你的。
問題:為什麼官方更新會失敗 在深入研究更新日誌和 update.sh 行為後,發現目前 QNAP 更新邏輯有兩個主要缺陷:
-
RAMDisk 空間耗盡(錯誤 FW006): 更新腳本會嘗試將韌體解壓縮到 /mnt/update,這通常位於一個很小的 RAMDisk(約 400MB)。如果韌體及其解壓縮後的內容超過這裡的剩餘空間,過程就會以「No space left on device」錯誤終止。
-
「薛丁格掛載」問題(錯誤 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(用 mcedit 或 vi),找到嘗試將 /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… 就能讓用戶少掉很多麻煩?僅供參考。![]()
希望這能幫助到同樣卡在 FW999 迴圈的人!