Як відключити системну агресивну поведінку в оболонці?


10

За замовчуванням systemd переходить до аварійної оболонки при найменшій помилці. Наприклад, якщо одне з кріплень у fstab з певних причин виходить з ладу, система стає негайно завантаженою. Я керую десятками різноманітних виробничих систем і вважаю цю поведінку дуже згубною. (Насправді я думаю, що це головний провал дизайну, але це особиста думка).

Я хотів би збільшити стійкість завантаження системи. Оптимально система завжди повинна завантажуватися, відсутні драйвери, кріплення тощо не повинні скидати аварийну оболонку, (просто показуйте попередження замість цього), якщо ця помилка не зробить вхід консолі абсолютно неможливим. Що можна запустити, те і слід запустити.

Я знаю, що systemd автоматично генерує * .mount файли з / etc / fstab, і я міг би використовувати параметр nofail з невеликим тайм-аутом x-systemd.device (або сам визначити відповідні файли .mount). Однак це не вирішило мою проблему, я хочу зробити систему більш стійкою, "латати" fstab щоразу не дуже зручно, і я не впевнений, скільки інших можливих "проблем" існує, що зробить мою систему незавантаженою лише тому, що десь розробник десь вважав, що це досить важливо.

Я начебто хотів би відновити контроль над своєю машиною і не дати системному вирішити, яка проблема є досить серйозною, щоб придушити процес завантаження. Це можливо?


що є власне проблема btw? Мені відомо два - не в змозі ввійти через ssh, і сулогін підкаже лише те, що дозволяє root, а не користувачам sudo, отримати доступ в аварійному режимі. чи покриють ті збитки, які ви зазнали?
sourcejedi

Насправді система була б набагато доступнішою, якби ці дві послуги були запущені, так. Оптимально система повинна запустити все, що можна запустити так само, як і в старі часи SysV (реєстрація помилок 'замість хворобливої ​​смерті аварійною оболонкою), і запускати оболонку лише у випадку фатальної помилки.
goteguru

Відповіді:


7

Це буквально лише збої в монтажі, це все, що вам потрібно буде змінити.

Тож на лист вашого запиту було б тривіально відповісти. Створіть файл, що випадає:

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

Я вважаю, що це не додасть жодних нових проблем, крім тих, які Linux-сисвініт вже зазнав, дозволяючи цей сценарій часткового відмови.


Однак ви також вказали на питання про те, як довго systemd повинен чекати, коли вказані блокові пристрої стануть доступними. Я не бачу способу налаштувати це, не забезпечуючи заміну генератора fstab в цілому. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

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

Технічно, якщо у вашому дистрибутиві був автономний mountallскрипт sysvinit, ви можете спробувати підключити це. Але це істотно змінить процес завантаження - це насправді більше форк. Я б не рекомендував такий підхід.


https://unix.stackexchange.com/a/393711/29483

Якщо ви шукаєте файли одиниць, то завантаження завантажується лише дуже мало emergency.target. Зазвичай це відбувається, коли .mountмодуль локальної файлової системи виходить з ладу, викликаючи local-fs.target збій. Або коли ваш initramfs не зможе встановити кореневу файлову систему, якщо ваш initramfs використовує systemd.

local-fs.targetмає OnFailure=emergency.target. І це виходить з ладу, тому що одиниці для локальних файлових систем автоматично додаються до списку Потрібні local-fs.target (якщо вони не є DefaultDependencies=no).

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount

2
Я припускаю, що я мушу вкласти [Unit]\nOnFailure= в свій nofail.conf. Здається, можна налаштувати час очікування в /etc/systemd/system.conf (за допомогою загальної опції DefaultTimeoutStartSec). Мої системи, як правило, досить швидкі, 90-ті роки, здається, є надмірними. Це рішення здається перспективним.
goteguru

У моєму випадку я ставлю OnFailure=в /lib/systemd/system/local-fs.targetзамість /etc/systemd(Ubuntu 16.04 на AWS)
ThiagoAlves

@ThiagoAlves ви не повинні цього робити, це буде перезаписано при оновленнях системи. Дотримуйтесь інструкцій у відповіді або запитайте роз'яснення :-).
sourcejedi

@sourcejedi Я спробував відповідь, але це не спрацювало для мене
ThiagoAlves

1
@ThiagoAlves Дякуємо за ваш відгук. Я зробив відповідь менш неоднозначною, тому ми можемо зрозуміти, чи це була проблема чи ні. Тобто, мені цікаво, чи ви обов'язково включили [Unit]раніше OnFailure=.
sourcejedi

0

Вимкніть автоматичне встановлення будь-якої файлової системи, яка не є істотною для операції завантаження, додавши noautoдо її /etc/fstabзапису опцію кріплення :

/dev/sdxy /u01 nfs defaults 0 0

до:

/dev/sdyx /u01 nfs noauto 0 0

а потім встановіть файлову систему після завантаження, використовуючи рядок у /etc/rc.local:

mount /u01

У цьому прикладі використовується NFS, але він також застосовний до LUN, імпортованих з файлового сервера.


1
Так, я знаю noauto, але якби я міняв fstab кожного разу, nofail був би набагато кращим вибором. Thx все одно.
goteguru

0

Спробуйте це, можливо?

systemctl mask emergency.service
systemctl mask emergency.target

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