2010-03-05 67 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