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=vaBefore=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:
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.
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.
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:
[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,.mountva hokazolar uchun mos bo'lim) — unit turiga xos sozlamalar: qaysi buyruqni ishga tushirish, qayta ishga tushirish siyosati va hokazo..serviceunit’lari uchun ishlatiladi va O'z systemd xizmatini yaratish maqolasida chuqur ko'rib chiqiladi.[Install]— unitsystemctl enablebilan 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:
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 |
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
Bu tizim keyingi safar boot qilganda qaysi target’ga yetishga harakat qilishini ko'rsatadi.
Sukut bo'yicha target’ni o'zgartirish
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
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
systemctl list-units --type=targetdan beshta turli target’ni tanlang va har birining vazifasini o'z so'zlaringiz bilan tasvirlab bering.systemctl cat ssh.service(yoki tizimingizda mavjud boshqa xizmat) chiqishini o'qing va[Unit],[Service]hamda[Install]ostidagi har bir qatorni tushuntiring.- O'chirib tashlasa bo'ladigan sinov VM’ida
systemctl isolate rescue.targetni sinab ko'ring, so'ngsystemctl isolate multi-user.targetbilan qayting — SSH sessiyasiga qanday ta’sir qilishini kuzating (avval jismoniy yoki konsol orqali kirish imkoningiz borligiga ishonch hosil qiling). - 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.