作業系統中的檔案系統, 通常使用 Buffered I/O 處理位於外部實體硬碟上之資料, Microsoft Windows 當然也不例外, 雖然近代的檔案系統管理演算法, 會盡快地將寫入快取 (Write Cache) 中的資料清空, 但是總有一些特殊情況, 管理者會自己想要將寫入快取清空, 避免橫生枝節發生資料遺失的意外, 這裡就描述一個作者碰到的情況, 同時說明如何強制讓 Windows 作業系統清空檔案系統快取。
首先回顧一下歷史, 作者在手動將 Unix 類 (例如: Linux) 的作業系統重新開機前, 通常會使用下列的命令列指令:
sync;sync;sync;shutdown -r now
前面的 3 個 sync 指令,就是告訴作業系統將檔案系統快取中的資料同步寫入硬碟,接著再將系統重新開機。 讀者可能會問為什麼是連續 3 個指令, 原因無他, 純粹是作者就讀交大資科, 剛接觸 Unix 類的作業系統時 (當時是 AIX & SunOS) , 當時系上的學長告訴我連下 3 次指令 (可能學長當時就知道這件事很重要所以要重複告訴作業系統 3 次吧) 。
今天, 作者碰到一個狀況, 自己工作所在地的大樓管理室, 通知說台電要來維護高壓電力系統, 辦公室內的插座電源可能會被斷電, 希望各單位自行關閉資訊設備, 以避免斷電、復電週期造成設備損壞。
但是,作者不想要因為這樣的通知, 就立即主動將位於工作地的 Windows 主機進行預警性關機 (因為先前曾經有說狼來了,結果狼並未現蹤的前例)。 所以作者想要將系統內主要的服務下架之後, 依舊維持 Windows 主機運作中的狀態, 如果狼真的出現了, 就讓斷電的事件讓 Windows 主機關機,復電時再讓主機自動啟動,同時恢復主要服務的正常運作。這樣作者就可以不需要在斷電、復電的週期內,監控 Windows 主機的狀況。
不過, 上述情況會碰到一個風險, 就是如果被下架的服務中, 尚有待寫入硬碟的檔案系統快取資料未被寫入硬碟, 且 Windows 作業系統的檔案系統快取管理系統, 也碰巧在斷電事件發生前, 未將寫入快取清空就發生斷電, 那麼作者就給自己挖了個坑, 自己往裡面跳。 所以為了把這個坑給事先填平, 最佳方案就是在服務下架之後, 主動告知檔案系統將寫入快取清空, 這樣就可避免這個風險, 接下來我們就來看看該怎麼做。
Sysinternals: Sync 指令
這個指令跟 Unix 類作業系統中的 sync 指令作用相似,可以用來將寫入快取資料清空,使用方式可以參考這個 連結。
Windows PowerShell: Write-VolumeCache cmdlet
這個輕量型命令 (cmdlet) 也跟 Unix 類作業系統中的 sync 指令一樣,可以用來將檔案系統的快取資料清空, 使用方式可以參考這個 連結。
使用 Sync 指令的好處是在沒有 PowerShell 的情況下也可以使用,缺點是必須使用管理員權限執行。 而 Write-volumeCache 輕量刑命令雖然不需要管理員權限就可執行, 但是系統就得安裝不能說是輕量刑的 PowerShell 套件。喜歡哪個方式就看各位讀者自己選擇囉。