2013-12-20 21 views
1

根據同步手冊頁,不保證在調用同步後光盤刷新其緩存: 「根據標準規範(例如,POSIX。 1-2001)中,sync()調度寫操作,但可能在實際寫操作完成之前返回。但是,從版本1.3.20開始,Linux確實在等待(這仍不能保證數據的完整性:現代磁盤具有大緩存)。 「如何確保sync/fsync/syncfs到便攜設備後的數據完整性

而且,在fsync手冊中,沒有提到這一點。

是否有方法確保在調用同步後所有寫入光盤特別是便攜式設備(USB)都已完成?我遇到過在調用sync/fsync後數據和元數據信息沒有完全寫入光盤的情況。 我很好奇在windows/linux下的「安全刪除設備」是否知道所有數據都已被設備本身完全寫入。

回答

1

至少在原則上,這是一個Linux錯誤。同步功能的規格是數據完全寫入永久存儲器;將其留在硬件緩存中不符合。

我不知道正確的解決辦法是什麼,但你可能stracehwparm實用程序與-F選項(我認爲這是正確的),看看它在做什麼(或閱讀源代碼,但運行strace是很容易)。

+0

這是怎麼 「安全刪除設備」 的工作?它知道光盤硬件緩存已完成(因此切斷設備電源是安全的)。 – dragon135

2

我很好奇在windows/linux下「安全刪除設備」是否知道所有的數據都已被設備本身完全寫入。

對於IXish系統:

卸載USB設備的分區使用umount commandumount() system call


blockdev --flushbufs 

可能刷新設備的緩衝區,但不會再次訪問該設備和補充緩衝區保持人。


也有是在/proc文件系統這個內核接口:

/proc/sys/vm/drop_caches 

可用於沖洗不同的緩衝液:

逐字從https://www.kernel.org/doc/Documentation/sysctl/vm.txt

[。 ..]

要免費目錄項和inode:

echo 2 > /proc/sys/vm/drop_caches 

[...]

+0

drop_caches與設備/光盤自身的緩衝區無關,它只與內核中的髒頁有關。在調用fsync之後,內核中的緩衝區將被傳輸到設備,我不關心在那之後髒頁面是否沒有被釋放。關於blockdev的手冊--flushbufs沒有清除,它會要求設備刷新它的緩存嗎?而且似乎打開塊設備,然後調用fsync將使設備寫入其緩存/緩衝區板? – dragon135