2010-03-05 20 views
13

我正在寫一個備份腳本,其中如何從命令行刷新硬盤和閃存盤(或文件系統)的緩存?

  1. 將數據複製到備份磁盤。
  2. 刷新備份盤。
  3. 執行哈希完整性檢查。

之前我曾經做過sleep(60)等待一分鐘,以便數據被內核自動刷新。我猜這是過度殺傷,所以現在我試着sudo hdparm -F --verbose /dev/disk,但它報告錯誤 - HDIO_DRIVE_CMD(flushcache) failed: Invalid exchange多次。

我想知道是否有任何標準的方式來刷新緩存到硬盤。我認爲這是因爲usb-creator-gtk做到了,umount做到了。

我使用Ubuntu 9.10的x64

PS:我試圖避免「同步」,因爲這個頁面說,這是安全。 http://ubuntuforums.org/showthread.php?t=589975

+2

要清楚的是,他認爲這是'echo 3>/proc/sys/vm/drop_caches'命令並不安全。反正他錯了。 – Gabe 2010-03-05 03:01:09

回答

26

請問sync夠了嗎?

編輯:關於您的編輯 - 您試圖避免同步,因爲互聯網上的某些人在他的帖子上放CYA免責聲明?也許有什麼問題,我不知道同步,但它本身可能值得第二篇文章。

不過,從Linux信息網頁:

同步寫入內存到磁盤緩存的任何數據。這可以包括(但不限於)修改的超級塊,修改的inode, 和延遲的讀取和寫入。這必須由內核來實現; 同步程序除了執行'同步'系統調用外什麼也不做。

+1

我認爲他必須運行「同步」,而不是「男人1同步」。 :-) – bmargulies 2010-03-05 02:38:17

+0

是的,這更清楚。改變。 – Duck 2010-03-05 02:41:10

+1

在OSX上fsync是不夠的。您需要使用fcntl和F_FULLFSYNC。有人告訴我,fsync在Linux上還不夠,但我不確定。 Linux沒有F_FULLFSYNC。 – 2012-11-04 17:27:14

2

你想要fsync(man section 2)函數調用,但是如果你在腳本中這樣做,你可能會想使用sync命令(man section 8),它只是調用sync()。

+7

實際上,命令行「同步」(第8節)調用系統函數「sync()」(第2節),而不是系統函數「fsync(int fd)」(第2節)。在一種情況下,所有文件都被同步,而另一個文件仍然是打開的同步文件。 – 2013-02-12 18:45:56

+1

你是對的,馬克。哎呀! – George 2015-03-22 21:04:22

+0

哪一個是同步所有文件的,哪一個是隻同步一個的?如果您提到的fsync是同步所有待處理寫入的文件,那麼我們如何訪問它?有沒有fsync的命令? – Neal 2016-05-05 20:07:03