当前在Ubuntu Linux上,但是我在其他OS上也注意到了这一点。显然,任何用户都可以执行该sync
命令-但是为什么呢?我只能看到缺点:由于不必要的磁盘写入,系统速度变慢。
为什么每个用户都可以执行sync
?
/bin/sync
作为其外壳,所以你可以无需登录同步。
sync
调用之间的等待时间(例如,在HP-Unix上)。原因是避免由于将大量未完成的写入一次全部写入磁盘而导致不必要的等待。
当前在Ubuntu Linux上,但是我在其他OS上也注意到了这一点。显然,任何用户都可以执行该sync
命令-但是为什么呢?我只能看到缺点:由于不必要的磁盘写入,系统速度变慢。
为什么每个用户都可以执行sync
?
/bin/sync
作为其外壳,所以你可以无需登录同步。
sync
调用之间的等待时间(例如,在HP-Unix上)。原因是避免由于将大量未完成的写入一次全部写入磁盘而导致不必要的等待。
Answers:
对于没有特权的用户,有很多方法可以降低系统速度,并且运行同步远没有效率更高。另一方面,将文件系统数据提交到磁盘是相当合法的请求,因此禁止用户(以及他们的进程)这样做是多余的。
无论如何,对于您的“不必要的磁盘写入”声明,我都是不同意的。这些写入肯定是必要的,并且无论如何会在一段时间后自动发生。
甚至无法保证同步调用将完全取决于其实现而做任何特别的事情。正如POSIX标准所定义的,调用同步只是OS刷新其文件系统缓存的“建议”,它不一定强制立即进行刷新。更准确地说,这些调用要求OS安排缓存刷新,但是不能保证它会在预定的时间之前发生,尽管Linux实现确实在返回之前等待它发生。
而且,连续多次调用sync不会降低系统的速度,因为一旦刷新了缓存,如果没有进程正在积极地写入文件,则缓存为空,因此sync是no-op。
如果您确实要阻止用户在系统上运行同步,则可以运行以下命令:
mv /bin/sync /bin/.sync
ln /bin/true /bin/sync
用户只会注意到这一点,并且不会产生负面影响,除非是那些仅运行同步然后在不卸载它们的情况下删除存储设备(例如usb拇指驱动器)的人,但是这些用户无论如何都已经做出了愚蠢的举动。
请注意,我不建议将先前的/ bin / sync链接与/ bin / true一起使用。sync
在某些情况下肯定有用。例如,如果您担心会在短期内发生严重关机(电源不足,系统崩溃等),这将有助于保留文件系统的内容。这就是我所说的合法要求。
sync
二进制文件所做的只是调用sync()
函数,所以(真正的问题是,就像Bonsi Scott所说的那样),为什么内核允许无特权的用户调用sync()
umount
,无论使用哪种操作系统,它始终会刷新缓冲区(除非磁盘已耗尽...),而不是sync
不能保证根据操作系统来执行缓冲区操作。请注意,Linux sync
等待刷新生效,因此也可以信任。
sync
不会对系统造成任何伤害。它可以减慢速度,但与运行访问磁盘的程序相比,它的速度不会更快。为什么要限制它?
有充分的理由允许任何用户运行sync
。如果即使系统崩溃或掉电,也必须执行一些操作才能执行此操作。例如,考虑一个接收电子邮件的邮件传输代理。一旦将包含电子邮件的文件写入假脱机,它将调用sync
,然后它才回复发送方机器,通知它已收到电子邮件。如果它没有呼叫sync
,并且接收机器在发送接收通知之后但在将文件提交到磁盘之前就断电,那么电子邮件将丢失。
操作系统会延迟磁盘写入以提高效率。他们不知道应用程序何时真正需要进行写操作。因此,应用程序可以通过sync(1)
和sync(2)
和来告诉操作系统现在编写fsync(2)
。