2017-04-06

DFS-R 某些檔案不複寫的問題排除

DFS 是分散式檔案系統
DFS-R 是分散式檔案系統的複寫功能

一直以來我都覺得 Domain 環境下 DFS 相當好用
可以給 User 一個固定的連線 UNC Path, 即使 File Server 異動也不會影響到 User 既有的習慣
再加上可以使用複寫功能, 能達到備援的目的 (備援不是備份, 切記!)

但使用一陣子過後總會偶爾發現就那某些檔案無法被複寫
原因不明, 不管是改檔名或複製一份, DFS-R 都完全無動於衷, 完全沒有想要複寫的意思
剛開始, 覺得問題一定是出在 DFS-R 機制上面, 微軟一定有 Bug
在 C:\Windows\Debug 有 Dfsr00xxx.log 的 Log File 可以查看
發現不能複寫的檔案會顯示這樣的訊息
UsnConsumer::TombstoneOrDelete LDB Deleting ID Record
UsnConsumer::TombstoneOrDelete ID record deleted from USN_RECORD
但是完全沒有幫助, 找不到任何相關資訊

接著往檔案資訊去想, 在檔案資訊的 Attributes 中看到了不同之處


這是無法複寫的檔案:


這是可以複寫的檔案:

無法複寫的檔案多了一個 T 不知道是什麼屬性
基本屬性 R/A/S/H 大家都很清楚, 但 Command Line 下用 attribute 查不到 T 這個項目
最後在 這裡 找到了解答, T 是一種 Temporary 的屬性
所以應該是指該檔案屬性是暫存, 所以 DFS-R 不會理會他的關係?
但 attribute 指令不支援修改這個屬性怎麼辦呢, 往 Powershell 去想

其實在剛剛解答出處的網頁最底下有這個問題的解法:

DFSR will not replicate files if they have the temporary attribute set.
The temporary attribute can be removed by using PowerShell to subtract 0x100:

Get-childitem D:\Data -recurse | ForEach-Object -process {if (($_.attributes -band 0x100) -eq 0x100) {$_.attributes = ($_.attributes -band 0xFEFF)}}

如果怕執行下去出問題的可以先改成以下這樣, 先產生有問題檔案的報表, 手動去檢查:

Get-childitem D:\Data -recurse | ForEach-Object -process {if (($_.attributes -band 0x100) -eq 0x100) {write-host $_.Target}}

另外在這裡有更完整的解釋
https://blogs.technet.microsoft.com/askds/2008/11/11/dfsr-does-not-replicate-temporary-files/

沒有留言: