技術答疑 · 實用指南
tar顯示「讀取時檔案改變」?先核對路徑再隱藏警告
找出精確路徑、保存原始狀態,區分目錄變化與應用資料變化。能讀取封存檔或隱藏警告,不等於備份可還原。

GNU tar的「file changed as we read it」需要逐路徑檢查,不能直接斷定整個封存檔無用或完全無害。建立、附加或更新時,退出碼1代表檔案發生變化,封存檔不是該檔案集的精確副本。改變備份工作處理方式之前,先保存證據。
1. 記錄路徑,分清輸入與輸出
保存精確指令、GNU tar版本、工作目錄、來源根目錄、排除規則、封存目的地、時間及完整錯誤輸出。tar返回後立刻取得它的退出狀態;後續指令或管線最後一個程序可能掩蓋它。也保存壓縮器與I/O失敗。警告指向檔案或目錄「.」,後續要問的問題不同。
對照封存目的地與輸入樹。若輸出建立在樹內,受控重跑時移到獨立目的地,確認該包含的輸入仍在。即使輸出檔已排除,建立它仍可能改變父目錄。別只為消除警告,把已審核的檔案集換成shell萬用字元;這可能改變隱藏檔的選取。
2. 區分資料變化與檔案系統行為
詢問資料負責人該路徑包含可捨棄快取、活動日誌、靜態資產或重要應用狀態。沒有允許捨棄的政策,別排除全部日誌、鎖定檔或名稱像暫存檔的項目。警告指向目錄時,檢查目錄活動與檔案系統或容器層,別假設全部子檔都改變。若認為穩定的來源仍持續出錯,保存版本與最小重現。
fuse-overlayfs原始問題384顯示簡單診斷有界線:報告者在排除子項時仍讓根目錄出現警告,之後縮減成改變所見目錄時間戳記的小程式。取回的記錄中問題仍未關閉。歷史案例支持檢查檔案系統層,不證明目前容器原因相同,也沒有通用修復。
3. 取得一致來源後再接受重跑
對靜態資產安排安靜且已審核的暫存來源,tar讀取時別更新。執行中的資料庫要依自己的備份文件,不能假設複製目錄就足夠。PostgreSQL目前檔案備份指南要求一般複製時關閉伺服器,或使用正確一致且含必要WAL的快照。跨磁碟區快照需協調;只禁止連線或反覆即時複製不等價。
從獲准來源建立不同名稱的封存檔,保存重跑輸出及狀態。按必要清單檢查成員,包括隱藏檔與預期排除項。適用時與穩定來源比較,在隔離位置還原代表性內容。列出檔案不能證明應用還原;有狀態資料還要做應用規定的還原檢查。替代品通過要求前保存原封存檔。
4. 把隱藏警告當作獨立政策
GNU tar將--warning=no-file-changed定義為訊息控制;--ignore-failed-read改變讀取失敗對完成狀態的影響,比隱藏單條訊息更廣。兩者都不會讓變動資料一致或補回遺漏。查閱已安裝版本文件及實際狀態,別直接照搬舊Windows、容器或tar版本的變通方式。
精確路徑與允許變化已有說明、所需內容存在且可用、其他失敗仍可見時才接受警告。別以|| true把所有非零改成功、丟棄全部錯誤輸出,或把包裝指令碼的零當作可還原。資料重要、原因不明或還原失敗時,維持未解決狀態,深入調查來源或應用備份方法。
