Чому непривілейований користувач може виконати команду `sync`?


11

Зараз на Ubuntu Linux, але я це помітив і на інших ОС. Мабуть, будь-який користувач може виконати syncкоманду - але чому це? Я бачу лише недолік: система сповільнюється через непотрібне записування диска.

Чому кожен користувач може виконувати sync?


1
Моє запитання щодо цієї теми було б: Чи існує навіть спосіб запобігти користувачам синхронізацію ()?
Бонсі Скотт

@BonsiScott Звичайно, ви можете видалити біти дозволу із виконуваного файлу. Але я не знаю, чи щось зламається, коли ти це зробиш.
jippie

Не тільки будь-який користувач може запустити синхронізацію, вам також не потрібен обліковий запис. Обліковий запис "синхронізація" працює /bin/syncяк його оболонка, тому ви можете синхронізуватись без входу.
camh

Для чого це корисне? До речі, у вікні синхронізації, у якому я зараз працюю, немає пароля на обліковий запис синхронізації.
джиппі

Рекомендується виробничим системам скорочувати час очікування між- syncдзвінками (наприклад, на HP-Unix). Причина полягає в тому, щоб уникнути зайвих очікувань через те, що маса видатних записів записується на диск відразу.
Нілс

Відповіді:


16

Існує безліч способів для непривілейованого користувача сповільнити систему та запустити синхронізацію - далеко не ефективніше. З іншого боку, наявність даних файлових систем на дисках є цілком законним запитом, тому забороняти користувачам (і, таким чином, їх процесам) робити це було б надмірно.

У будь-якому випадку, я не погоджуюся з вашою заявою "зайвий запис на диск". Ці записи, безумовно, необхідні і автоматично відбудуться через невеликий проміжок часу.

Навіть не існує гарантії, що синхронізуючий виклик взагалі буде робити щось особливе залежно від його реалізації. Синхронізація дзвінків - це, як визначає стандарт POSIX , лише "пропозиція" для ОС провести кеш файлової системи, але це не обов'язково змушує миттєві помилки відбуватися. Точніше, дзвінки просять ОС запланувати запланований кеш-пам'ять, але немає гарантії, що це відбудеться до запланованого часу, хоча реалізація Linux чекає, поки це відбудеться перед поверненням.

Більше того, виклик синхронізації кілька разів поспіль не настільки сповільнить системи, як колись кеші промиваються, якщо жоден процес активно не записує у файли, кеші порожні, так що синхронізація не працює.

Якщо ви дійсно хочете заборонити користувачам запускати синхронізацію у вашій системі, ви можете просто виконати наступні команди:

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

Це значною мірою буде непоміченим користувачами і не має негативних ефектів, окрім людей, які просто запускають синхронізацію, потім видаляють пристрої зберігання даних (наприклад: usb thumbdrive), не знімаючи їх, але ці користувачі в будь-якому разі вже діяли нерозумно.

Зауважте, що я не рекомендував би попереднє посилання / bin / sync з / bin / true. syncбезумовно, корисний у деяких випадках. Наприклад, якщо ви побоюєтесь жорстокого відключення (нестача електроенергії, паніка в системі, ...) незабаром, це може допомогти зберегти вміст файлових систем. Це я називаю законним запитом.


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), синхронізація () планує запис, але може повернутися до того, як буде зроблено фактичне написання. Однак, оскільки версія 1.3.20 Linux насправді чекає. (Це все ще не гарантує цілісність даних. Сучасні диски мають великі кеші.)
Бонсі Скотт

5

syncне може завдати шкоди системі. Це може уповільнити це, але не більше, ніж запуск програм, що мають доступ до диска. Чому його слід обмежувати?

Є вагома причина дозволити будь-якому користувачеві працювати sync. Це необхідно, якщо деякі операції потрібно виконувати в порядку, навіть якщо система виходить з ладу або втрачає живлення. Наприклад, розгляньте агент з передачі пошти, який отримує електронну пошту. Після того, як він записав файл, що містить електронну пошту, в котушку, він дзвонить sync, і лише після цього він відповідає на передавальну машину, повідомляючи про те, що електронний лист отримано. Якщо він не зателефонував sync, і приймаюча машина втратила живлення відразу після надсилання повідомлення про прийом, але перед тим, як зробити файл на диск, електронна пошта буде втрачена.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.