没有权限的用户为什么可以执行`sync`命令?


11

当前在Ubuntu Linux上,但是我在其他OS上也注意到了这一点。显然,任何用户都可以执行该sync命令-但是为什么呢?我只能看到缺点:由于不必要的磁盘写入,系统速度变慢。

为什么每个用户都可以执行sync


1
关于这个主题的我的问题是:甚至有一种方法可以防止用户使用sync()?
Bonsi Scott

@BonsiScott当然,您可以从可执行文件中删除权限位。但是我不知道这样做时是否会发生故障。
jippie 2012年

不仅任何用户都可以运行同步,而且您也不需要帐户。帐户“同步”运行/bin/sync作为其外壳,所以你可以无需登录同步。
CAMH

那有什么用?顺便说一句,我当前正在使用的盒子上的同步帐户上没有密码,因此无法使用。
jippie 2012年

建议生产系统减少- sync调用之间的等待时间(例如,在HP-Unix上)。原因是避免由于将大量未完成的写入一次全部写入磁盘而导致不必要的等待。
Nils 2012年

Answers:


16

对于没有特权的用户,有很多方法可以降低系统速度,并且运行同步远没有效率更高。另一方面,将文件系统数据提交到磁盘是相当合法的请求,因此禁止用户(以及他们的进程)这样做是多余的。

无论如何,对于您的“不必要的磁盘写入”声明,我都是不同意的。这些写入肯定是必要的,并且无论如何会在一段时间后自动发生。

甚至无法保证同步调用将完全取决于其实现而做任何特别的事情。正如POSIX标准所定义的,调用同步只是OS刷新其文件系统缓存的“建议”,它不一定强制立即进行刷新。更准确地说,这些调用要求OS安排缓存刷新,但是不能保证它会在预定的时间之前发生,尽管Linux实现确实在返回之前等待它发生。

而且,连续多次调用sync不会降低系统的速度,因为一旦刷新了缓存,如果没有进程正在积极地写入文件,则缓存为空,因此sync是no-op。

如果您确实要阻止用户在系统上运行同步,则可以运行以下命令:

mv /bin/sync /bin/.sync
ln /bin/true /bin/sync

用户只会注意到这一点,并且不会产生负面影响,除非是那些仅运行同步然后在不卸载它们的情况下删除存储设备(例如usb拇指驱动器)的人,但是这些用户无论如何都已经做出了愚蠢的举动。

请注意,我不建议将先前的/ bin / sync链接与/ bin / true一起使用。sync在某些情况下肯定有用。例如,如果您担心会在短期内发生严重关机(电源不足,系统崩溃等),这将有助于保留文件系统的内容。这就是我所说的合法​​要求。


2
@jippie所有sync二进制文件所做的只是调用sync()函数,所以(真正的问题是,就像Bonsi Scott所说的那样),为什么内核允许无特权的用户调用sync()
Michael Mrozek

2
@jippie我认为您错过了重点。同步所做的一切只是(立即)提交到必须要提交的磁盘上的东西。当我卸下闪存驱动器时,我想确保写入的所有内容均已写入。而且,尽管应该用umount来保证这一点,但是我不确定,所以我(作为用户)需要确保在提取之前。强制系统将缓冲区刷新到磁盘没有任何危害。最糟糕的是,在系统主动刷新缓冲区时,有些事情会滞后一秒钟。危险在于拒绝用户使用此功能。
killermist 2012年

2
@killermist:同步不是强制性的,只是建议。同步可能会以成功退出状态返回,而没有将任何内容刷新到磁盘,更不用说磁盘本身也可能延迟引擎盖下的写入。尽管我通常都认为Windows缺少必要的功能,但同步命令将是我最不关心的问题。
jlliagre 2012年

3
@killermist @jippie是正确的。您应该更好地信任umount,无论使用哪种操作系统,它始终会刷新缓冲区(除非磁盘已耗尽...),而不是sync不能保证根据操作系统来执行缓冲区操作。请注意,Linux sync等待刷新生效,因此也可以信任。
jlliagre 2012年

1
linux.die.net/man/2/sync- >根据标准规范(例如POSIX.1-2001),sync()计划写入,但可能在完成实际写入之前返回。但是,由于1.3.20版Linux实际上确实在等待。(这仍然不能保证数据的完整性:现代磁盘具有较大的缓存。)
Bonsi Scott

5

sync不会对系统造成任何伤害。它可以减慢速度,但与运行访问磁盘的程序相比,它的速度不会更快。为什么要限制它?

有充分的理由允许任何用户运行sync。如果即使系统崩溃或掉电,也必须执行一些操作才能执行此操作。例如,考虑一个接收电子邮件的邮件传输代理。一旦将包含电子邮件的文件写入假脱机,它将调用sync,然后它才回复发送方机器,通知它已收到电子邮件。如果它没有呼叫sync,并且接收机器在发送接收通知之后但在将文件提交到磁盘之前就断电,那么电子邮件将丢失。

操作系统会延迟磁盘写入以提高效率。他们不知道应用程序何时真正需要进行写操作。因此,应用程序可以通过sync(1)sync(2)和来告诉操作系统现在编写fsync(2)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.