Tarkibga o'tish

systemd unitlari va targetlari

init va systemd maqolasida systemd nega SysV init o'rnini egallagani ko'rsatildi: parallel ishga tushirish va deklarativ bog'liqliklar. Ikkalasi ham bitta tushunchaga tayanadi — unit. systemd boshqaradigan hamma narsa, xoh u xizmat, xoh mount nuqtasi, xoh timer bo'lsin, bitta umumiy modelga mos keladigan unit sifatida ifodalanadi. Bu maqola unit turlarini, ularning konfiguratsiya fayllari tuzilishini va runlevel’lar o'rnini egallagan target mexanizmini ko'rib chiqadi. Keyingi ikki maqola — Xizmatlarni boshqarish va O'z systemd xizmatini yaratish to'g'ridan-to'g'ri shu poydevor ustiga quriladi.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • unit nima ekanini tushuntirish va systemd qo'llab-quvvatlaydigan asosiy unit turlarini nomlash;
  • unit fayllarini topish va ularning mumkin bo'lgan joylashuvlari o'rtasidagi ustuvorlik tartibini tushunish;
  • unit faylidagi [Unit], [Service] va [Install] bo'limlari nima uchun ekanini tushuntirish;
  • Wants=, Requires=, After= va Before= ni bir-biridan farqlash;
  • target nima ekanini, u runlevel’larga qanday mos kelishini va sukut bo'yicha target’ni qanday o'zgartirishni tushuntirish.

Unit nima

Unit — systemd boshqaradigan har qanday resursning konfiguratsiya fayli bilan tasvirlangan, nomlangan ko'rinishi. Fayl kengaytmasi uning turini bildiradi:

Kengaytma Unit turi Vazifasi
.service Service Bitta jarayon yoki daemon’ni boshqaradi (masalan, nginx.service)
.socket Socket Tarmoq yoki Unix socket’ini tinglaydi, socket orqali faollashtirish uchun ishlatiladi
.target Target Boshqa unit’larni sinxronlash nuqtasi sifatida guruhlaydi (runlevel’lar o'rnini bosadi)
.mount Mount Fayl tizimini mount qiladi
.timer Timer Boshqa unit’ni jadval bo'yicha ishga tushiradi (cron’ga muqobil)
.path Path Boshqa unit’ni ishga tushirish uchun fayl tizimidagi o'zgarishlarni kuzatadi
.device Device Kernel aniqlagan uskunani ifodalaydi
.swap Swap Swap maydonini boshqaradi

Bu kursda eng ko'p ishlatiladigan ikki tur — .service va .target; .timer esa boshqa modulda, systemd timer: cron’ga muqobil maqolasida alohida ko'rib chiqiladi.

Barcha unit’larni ro'yxatlash:

systemctl list-units --type=service --state=running
UNIT             LOAD   ACTIVE SUB     DESCRIPTION
cron.service     loaded active running Regular background program processing daemon
ssh.service      loaded active running OpenBSD Secure Shell server
systemd-journald.service loaded active running Journal Service
  • LOAD — unit fayli muvaffaqiyatli o'qilganmi-yo'qmi;
  • ACTIVE — umumiy holat (active, inactive, failed);
  • SUB — batafsilroq holat (masalan, running, exited, dead).

Unit fayllari qayerda turadi

Unit fayllari uchta asosiy joyda turishi mumkin va ular o'rtasida aniq ustuvorlik tartibi bor:

Katalog Vazifasi Ustuvorlik
/etc/systemd/system/ Administrator qo'lda yaratgan yoki qayta belgilagan unit’lar Eng yuqori
/run/systemd/system/ Boot paytida yaratiladigan vaqtinchalik unit’lar O'rta
/lib/systemd/system/ (yoki /usr/lib/systemd/system/) Paketlar o'rnatgan sukut bo'yicha unit’lar Eng past

Bu ustuvorlik tuzilishi Paketlarni boshqarish asoslari maqolasida ko'rilgan konfiguratsiya fayllari ustuvorligini takrorlaydi: paket yangilanganda uning /lib/systemd/system/ dagi fayli qayta yoziladi, lekin administratorning /etc/systemd/system/ dagi qayta belgilashi saqlanib qoladi.

systemctl cat ssh.service

Bu buyruq muayyan unit uchun haqiqatan qo'llanayotgan to'liq mazmunni — barcha ustuvorlik darajalari bo'yicha birlashtirilgan holda — ko'rsatadi. Shu sababli nimani tahrirlash kerakligini aniqlashning find/grep bilan qidirishdan ishonchliroq usuli, chunki qidiruv noto'g'ri, past ustuvorlikdagi faylni topib berishi mumkin.

Unit’ni nusxalamasdan qayta belgilash: drop-in’lar

Bitta qatorni o'zgartirish uchun paket unit’ini butunlay /etc/systemd/system/ ga nusxalash texnik xizmat ko'rsatishda tuzoqqa aylanadi — paket navbatdagi safar yangilanganda nusxa upstream tuzatishlarini kuzatishni to'xtatadi. Buning uchun mo'ljallangan mexanizm — drop-in: <unit>.service.d/ katalogidagi kichik .conf bo'lagi bo'lib, systemd uni ishlab chiqaruvchi unit’i ustiga birlashtiradi.

sudo systemctl edit ssh.service

Bu /etc/systemd/system/ssh.service.d/override.conf ni muharrirda ochadi; faqat shu yerda o'rnatilgan direktivalar o'zgaradi, qolgan hammasi paket faylidan kelishda davom etadi. Buning o'rniga to'liq nusxani tahrirlash uchun (unit’ni haqiqatan butunlay almashtirmoqchi bo'lsangiz) systemctl edit --full dan, qayta belgilashni butunlay bekor qilish uchun esa systemctl revert ssh.service dan foydalaning. systemctl edit siz uchun daemon-reload ni o'zi bajaradi; qo'lda yaratilgan drop-in fayl esa baribir qo'lda daemon-reload ni talab qiladi. Shundan keyin systemctl cat ishlab chiqaruvchi unit’ini va undan keyin har bir drop-in’ni aynan qo'llanish tartibida ko'rsatadi.

Warning

Drop-in’dagi ko'p direktivalar ishlab chiqaruvchi unit’iga qo'shiladi, lekin ayrimlari ro'yxat hisoblanadi — eng muhimi ExecStart=. Xizmat ishga tushiradigan buyruqni o'zgartirish uchun qayta belgilash avval bo'sh ExecStart= qatori bilan eski qiymatni tozalashi, so'ng yangisini o'rnatishi kerak. Aks holda systemd ikkita ExecStart= buyrug'i e’lon qilingani uchun unit’ni rad etadi.

Unit faylining tuzilishi

Unit fayllari INI’ga o'xshash formatda bo'limlarga ajratilgan matn fayllari. Odatiy .service fayli:

nginx.service (abridged example)
[Unit]
Description=A high performance web server and reverse proxy server
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -s reload
Restart=on-failure

[Install]
WantedBy=multi-user.target

Uchta bo'lim har doim bir xil ma’noni bildiradi:

  • [Unit] — unit’ning umumiy tavsifi va uning boshqa unit’larga bog'liqliklari. Har bir unit turida mavjud.
  • [Service] (yoki .socket, .mount va hokazolar uchun mos bo'lim) — unit turiga xos sozlamalar: qaysi buyruqni ishga tushirish, qayta ishga tushirish siyosati va hokazo. .service unit’lari uchun ishlatiladi va O'z systemd xizmatini yaratish maqolasida chuqur ko'rib chiqiladi.
  • [Install] — unit systemctl enable bilan yoqilganda qaysi target’ga biriktirilishini belgilaydi.

Bog'liqlik direktivalari: Wants=, Requires=, After=, Before=

Bu to'rtta direktiva ikkita mustaqil o'lchovni ifodalaydi — talab kuchi va tartib:

Direktiva O'lchov Ma’nosi
Wants= Talab systemd nomlangan unit’ni ishga tushirishga urinadi, lekin u muvaffaqiyatsiz bo'lsa ham joriy unit ishlashda davom etadi
Requires= Talab Nomlangan unit ishdan chiqsa, joriy unit ham to'xtatiladi — qattiq bog'liqlik
After= Tartib Joriy unit nomlangan unit’dan keyin ishga tushadi
Before= Tartib Joriy unit nomlangan unit’dan oldin ishga tushadi

Warning

After=/Before= faqat tartibga ta’sir qiladi, ular bog'liqlik yaratmaydi. Agar unit boshqasidan keyin ishga tushishi kerak bo'lsa-yu, unga Wants=/Requires= bilan bog'lanmagan bo'lsa, ikkinchi unit umuman ishga tushmasligi mumkin — birinchisi baribir ishga tushmaydigan narsani shunchaki "kutmaydi". Amalda ikkalasi odatda birga ishlatiladi: Wants=network-online.target va After=network-online.target.

Masalan, tarmoqqa bog'liq xizmat odatda shunday yoziladi:

[Unit]
Wants=network-online.target
After=network-online.target

Bu "iloji bo'lsa, tarmoq tayyor bo'lishini kut (tartib), lekin tarmoq hech qachon ko'tarilmasa ham baribir ishga tushishga urin (yumshoq bog'liqlik)" degani.

Targetlar: runlevel’lar o'rnini egallagan mexanizm

Target — muayyan tizim holatini ifodalovchi sinxronlash nuqtasini belgilash uchun boshqa unit’larni guruhlaydigan maxsus unit turi. U hech qachon jarayonni to'g'ridan-to'g'ri ishga tushirmaydi — faqat "bu target’ga yetish uchun quyidagi unit’lar faol bo'lishi kerak" degan ma’noni ifodalaydi.

Eng muhim targetlar va ularning taxminiy runlevel ekvivalentlari:

Target Taxminiy runlevel Ma’nosi
poweroff.target 0 Tizimni o'chirish
rescue.target 1 Minimal, bitta foydalanuvchili tiklash rejimi
multi-user.target 3 To'liq ko'p foydalanuvchili, tarmoqli, grafik interfeyssiz rejim — server uchun odatiy holat
graphical.target 5 multi-user.target va grafik interfeys
reboot.target 6 Tizimni qayta yuklash
systemctl list-units --type=target
UNIT                   LOAD   ACTIVE SUB    DESCRIPTION
basic.target           loaded active active Basic System
cryptsetup.target      loaded active active Local Encrypted Volumes
multi-user.target      loaded active active Multi-User System
network.target         loaded active active Network
sysinit.target         loaded active active System Initialization

Joriy va sukut bo'yicha target’ni ko'rish

systemctl get-default
multi-user.target

Bu tizim keyingi safar boot qilganda qaysi target’ga yetishga harakat qilishini ko'rsatadi.

Sukut bo'yicha target’ni o'zgartirish

sudo systemctl set-default multi-user.target

Bu buyruq /etc/systemd/system/default.target symlink’ini nomlangan target’ga yo'naltiradi — o'zgarish keyingi boot’dan boshlab kuchga kiradi.

Target’ni joriy sessiyada darhol almashtirish

sudo systemctl isolate multi-user.target

isolate nomlangan target talab qilmaydigan har bir unit’ni to'xtatadi va faqat shu target’ni hamda uning bog'liqliklarini faollashtiradi — bu qayta yuklashsiz, darhol kuchga kiradi.

Danger

Grafik sessiya ishlayotgan mashinada systemctl isolate multi-user.target o'sha grafik sessiyani darhol yopadi. SSH orqali masofadan boshqariladigan serverda isolate ni ehtiyotsizlik bilan ishlatish — masalan, rescue.target ga o'tish — joriy SSH sessiyasini ham uzib qo'yishi mumkin, chunki bu target ostida sshd ishlamasligi mumkin. Bunday amalni avval o'chirib tashlasa bo'ladigan sinov VM’ida sinab ko'ring.

Keng tarqalgan xatolar

Wants= va Requires= ni adashtirish

Aslida ixtiyoriy bo'lgan bog'liqlik uchun Requires= ishlatish, uncha bog'liq bo'lmagan unit ishga tushmay qolganda butun asosiy xizmatning ham u bilan birga to'xtashiga olib keladi — kutilmagan "domino effekti" yuzaga keladi.

systemctl cat o'rniga unit faylini qo'lda qidirish

Bir xil nomli unit bir nechta katalogda (/etc/systemd/system/, /lib/systemd/system/) mavjud bo'lishi mumkin. find yoki grep birinchi topib bergan faylni tahrirlash noto'g'ri, past ustuvorlikdagi faylni tahrirlab, hech qanday natija ko'rmaslikka olib kelishi mumkin. systemctl cat har doim haqiqatan amal qilayotgan, birlashtirilgan konfiguratsiyani ko'rsatadi.

Production serverda isolate ni oldindan sinamasdan ishlatish

Yuqorida ko'rsatilganidek, noto'g'ri target’ga isolate qilish masofaviy kirishni (SSH) uzib qo'yishi mumkin. Bunday amal har doim avval sinov muhitida tekshirilishi kerak.

Mashqlar

  1. systemctl list-units --type=target dan beshta turli target’ni tanlang va har birining vazifasini o'z so'zlaringiz bilan tasvirlab bering.
  2. systemctl cat ssh.service (yoki tizimingizda mavjud boshqa xizmat) chiqishini o'qing va [Unit], [Service] hamda [Install] ostidagi har bir qatorni tushuntiring.
  3. O'chirib tashlasa bo'ladigan sinov VM’ida systemctl isolate rescue.target ni sinab ko'ring, so'ng systemctl isolate multi-user.target bilan qayting — SSH sessiyasiga qanday ta’sir qilishini kuzating (avval jismoniy yoki konsol orqali kirish imkoningiz borligiga ishonch hosil qiling).
  4. O'zingiz tanlagan xizmat uchun Wants=, Requires=, After=, Before= dan qaysi birini ishlatishingizni hal qiling va tanlovingizni asoslang.

Mashqni bajardim deyish uchun: berilgan ikki unit uchun ular o'rtasidagi bog'liqlik talabmi, tartib cheklovimi yoki ikkalasimi — buni tushuntira olishingiz kerak.

Xulosa

systemd boshqaradigan hamma narsa — xizmat, mount, socket yoki boshqa narsa — nomlangan unit sifatida ifodalanadi va uning fayli /etc/systemd/system/ (eng yuqori ustuvorlik) yoki /lib/systemd/system/ da turadi. Wants=/Requires= bog'liqlik kuchini, After=/Before= esa ishga tushish tartibini belgilaydi — bular ikki mustaqil o'lchov. Target — boshqa unit’larni guruhlaydigan va eski runlevel tushunchasini almashtirgan maxsus unit; systemctl get-default/set-default uni doimiy o'zgartiradi, systemctl isolate esa darhol almashtiradi. Keyingi maqola — Xizmatlarni boshqarish shu asosda .service unit’larini boshqarish uchun kundalik buyruqlarni ko'rsatadi.

Manbalar