Мені подобається systemd
Я хотів би поговорити про нову систему ініціалізації systemd, чия хода невблаганно захоплює популярні linux дистрибутиви. Дане наступ багатьох людей лякає і не спроста останнім часом більшість срач в Інтернеті про лінукс системи зводиться до теми: бути чи не бути з systemd?
Дозвольте мені почати здалеку. Будучи молодим, освоював свою першу операційну систему зі світу open source - FreeBSD. Як новачок я не розумів як правильно робити свої стартові скрипти для несистемний софта. З системним софтом під FreeBSD щодо просто. Вам потрібен ssh? Вкажіть sshd_enable = "YES" у /etc/rc.conf і вам буде дано. А як запускати свої програмні вироби при старті системи? Мій молодий розум в ті часи не знайшов нічого кращого як створювати виконуваний стартовий скрипт в /usr/local/etc/rc.d/ типу так
#! / Bin / sh
case "$ 1" in
start)
/ Usr / local / bin / foobar
;;
stop)
kill -9 `cat / var / run / foobar.pid`
;;
*)
echo "Usage:` basename $ 0` "> 2
exit 64
;;
esac
exit 0
Якщо скрипт має біт наповнюваності і обробляє параметри start і stop, то в принципі це працювало. Якщо правильно писати скрипти, використовуючи rc.subr, то можна навіть вказати які служби повинні бути вже бути запущеними до вашого старту. Найголовніше що потрібно зрозуміти - вам потрібно буде написати shell код для старту вашої програми. Це ні добре, ні погано. Це факт і все.
А тепер systemd. Ви не пишіть простирадла будь-якого коду. Ви не чаклуєте з ім'ям файлу або з іменами симлінк на нього. Ви просто вказуєте що запустити і все.
[Unit]
Description = Some simple daemon
[Service]
Type = forking
ExecStart = / usr / sbin / my-simple-daemon -d
Згодом ваш стартовий unit зміниться і кількість рядків у ньому збільшиться. Але це будуть рядка, які пояснюють системі ініціалізації systemd ЩО потрібно зробити, а НЕ ЯК це робити. Відразу скажу, я не спец по systemd. Він відносно недавно увійшов в наше життя і моє знайомство з серйозного почалося після перемикання з upstart на systemd моєї робочої Убунту 15.04. Але не будучи фахівцем, хотілося б розповісти про свої думки з приводу систем ініціалізації.
Ось впровадив я з колегами систему віртуалізації на базі ProxmoxVE і програмним сховищем Ceph. Перевели ми свої фізичні сервера в новий віртуальний світ. З'явилася можливість легко зробити віртуальні сервера іншим відділам на моєму підприємстві під їх завдання і проекти. І ось перший такий віртуальний сервер поставив життєве питання. Пам'ятаючи минулий зоопарк з різних версій FreeBSD і дистрибутивів Linux, від якого я позбувся, перевівши всі системи на Ubuntu Server LTS, я залишив за собою всі root права всередині гостьової операційної системи. За допомогою механізму sudo дозволяю потрібні привілеї людині, який буде курирувати вже роботу сервісів всередині гостьової ОС. І ось людина ліпить в папці скрипт на Python 3, який сам собі веб-сервер і сам собі аля Zabbix якихось локальних ресурсів. Людина не замислюється, що в ідеалі для його самописного скрипта потрібно організувати автостарт на сервері. Пара моїх оновлень сервера і його перезавантаження наочно це показали.
Я вдячний systemd вже за те, що він позбавляє мене від програмування в питаннях автостарту. Як адміну мені подобається systemd тим, що він єдиний на сьогоднішній день хто допоможе вам зі складними демонами. Якщо в простому випадку демон функціонує як один процес, все дійсно дуже просто. Для зупинки демона в своєму скрипті ви будете писати щось типу kill $ (cat /var/run/daemon.pid). А якщо демон працює в складному сценарії, породжуючи з дозволених вами програм інші процеси? Коли ви вбиваєте основний процес, він може зупинити всі свої дочірні процеси, а може і не зупинити. Systemd за допомогою cgroup єдина зараз система ініціалізації, здатна зупинити демона незалежно від того, скільки разів він Форкал, і як би він не намагався втекти з-під вашого контролю за допомогою подвійного ФОРКОМ або форк-бомбардування. Після невдалого stop складного демона, ви швидше за все зробите йому kill і потім будете шукати в виведенні ps зомбі-процеси, намагаючись їх завершити. Швидше за все все закінчиться перезавантаженням всього сервера. А systemctl kill працює чисто і залізно.
Коротко хочеться підсумувати моя думка про systemd. Спасибі йому за легкість і простоту "втручання" в операційну систему. абсолютний контроль за демонами. А в майбутньому, підходячи до своїх і не своїх серверів, спасибі за одноообразіе в особі однієї системи ініціалізації - systemd.