Почему непривилегированный пользователь может выполнить команду `sync`?

11

В настоящее время на Ubuntu Linux, но я заметил это и на других ОС. По-видимому, любой пользователь может выполнить syncкоманду - но почему это? Я вижу только недостаток: замедление работы системы из-за ненужных операций записи на диск.

Почему каждый пользователь может выполнить sync?

jippie
источник
1
Мой вопрос по этой теме: есть ли способ запретить пользователям синхронизацию ()?
Бонси Скотт
@BonsiScott Конечно, вы можете удалить биты прав доступа из исполняемого файла. Но я не знаю, сломается ли что-нибудь, когда ты это сделаешь.
Джиппи
Мало того, что любой пользователь может запустить синхронизацию, вам также не нужна учетная запись. Учетная запись «sync» работает /bin/syncкак ее оболочка, поэтому вы можете синхронизировать ее без входа в систему.
camh
Для чего это нужно? Кстати, на учетной записи синхронизации, на которой я сейчас работаю, нет пароля, поэтому он не будет работать.
Джиппи
Для производственных систем рекомендуется уменьшить время ожидания между sync-calls (например, в HP-Unix). Причина заключается в том, чтобы избежать ненужных ожиданий из-за того, что масса ожидающих записей записывается на диск одновременно.
Нильс

Ответы:

16

Для непривилегированного пользователя существует множество способов замедлить работу системы, и запуск синхронизации далеко не самый эффективный. С другой стороны, наличие данных файловых систем, записанных на диск, является вполне законным запросом, поэтому запрещать пользователям (и, следовательно, их процессам) делать это было бы чрезмерно.

В любом случае, я не согласен с вашим утверждением «ненужные записи на диск». Эти записи, безусловно, необходимы и в любом случае произойдут автоматически через небольшой промежуток времени.

Нет даже гарантии, что синхронный вызов сделает что-то конкретное вообще, в зависимости от его реализации. Вызов sync - это, как определяет стандарт POSIX , всего лишь «предложение» для ОС очищать кеш файловой системы, но это не обязательно приводит к немедленному сбросу. Точнее, вызовы просят ОС запланировать очистку кеша, но нет никакой гарантии, что это произойдет раньше, чем запланированное время, хотя реализация Linux ждет его, прежде чем вернуться.

Более того, вызов sync несколько раз подряд не сильно замедлит работу системы, как если бы кэш-память очищалась, если ни один процесс не выполняет активную запись в файлы, кеш-память пуста, поэтому синхронизация невозможна.

Если вы действительно хотите запретить пользователям запускать синхронизацию в вашей системе, вы можете просто выполнить следующие команды:

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

Это было бы в значительной степени незамеченным для пользователей и не имело бы негативных последствий, за исключением тех, кто просто запускал синхронизацию, затем удалял устройства хранения (например, usb thumbdrive), не отключая их, но эти пользователи в любом случае уже действовали глупо.

Обратите внимание, что я бы не рекомендовал предыдущую ссылку / bin / sync с / bin / true. syncконечно полезно в некоторых случаях. Например, если вы опасаетесь, что в ближайшее время может произойти жестокое отключение (нехватка питания, системная паника, ...), это поможет сохранить содержимое файловых систем. Это то, что я называю законным запросом.

jlliagre
источник
2
@jippie Все, что syncделает бинарный файл - это вызывает sync()функцию, поэтому (как сказал Бонси Скотт) вы действительно спрашиваете, почему ядро ​​позволяет звонить непривилегированным пользователямsync()
Майкл Мрозек
2
@jippie Я думаю, ты упустил смысл. Все, что когда-либо делает синхронизация, - это записывает (немедленно) на диск то, что должно было быть зафиксировано в любом случае. Когда я иду, чтобы удалить флешку, я хочу убедиться, что все, что я написал на нее, действительно записано. И, хотя umount должен это гарантировать, я не уверен, поэтому я хочу (как пользователь) удостовериться, прежде чем его дернуть. Нет никакого вреда, который заставляет систему сбрасывать буферы на диск. В худшем случае некоторые вещи отстают на секунду, пока система активно очищает буферы. Опасность заключается в отказе пользователям в этой функции.
убийца
2
@killermist: синхронизация не форсирует, просто предлагает. Синхронизация может вернуться с успешным завершением работы, не сбросив что-либо на диск, не говоря уже о том, что сам диск может также задержать записи под капотом. Хотя я, как правило, разделяю мнение, что в Windows отсутствуют необходимые функции, команда синхронизации будет иметь меньшее значение для меня.
Jlliagre
3
@killermist @jippie правильно. Вы должны лучше доверять umount, что, независимо от операционной системы, всегда очищает буферы (если диск не ушел ...) вместо того, syncчтобы гарантировать, что это не гарантируется в зависимости от операционной системы. Обратите внимание, что Linux syncждет, пока сброс будет эффективным, поэтому ему тоже можно доверять.
Jlliagre
1
linux.die.net/man/2/sync -> В соответствии со стандартной спецификацией (например, POSIX.1-2001), sync () планирует записи, но может вернуться до того, как фактическая запись будет выполнена. Однако начиная с версии 1.3.20 Linux действительно ждет. (Это все еще не гарантирует целостность данных: современные диски имеют большой кэш.)
Бонси Скотт
5

syncне может причинить вред системе. Это может замедлить его, но не более, чем запуск программ, обращающихся к диску. Почему это должно быть ограничено?

Есть веская причина разрешить запуск любого пользователя sync. Это необходимо, если некоторые операции должны выполняться по порядку, даже если система выходит из строя или теряет питание. Например, рассмотрим агент передачи почты, который получает электронную почту. Как только он записывает файл, содержащий электронное письмо, в спул, он вызывает sync, и только тогда он отвечает отправляющему устройству, уведомляя его о том, что электронное письмо было получено. Если он не позвонил sync, и принимающее устройство потеряло питание сразу после отправки уведомления о приеме, но до передачи файла на диск, электронная почта будет потеряна.

Операционные системы задерживают запись на диск для эффективности. Они не могут знать, когда приложение действительно нуждается в записи. Таким образом, приложениям предоставляется способ указать операционной системе писать сейчас, с sync(1)и sync(2)и fsync(2).

Жиль "ТАК - прекрати быть злым"
источник