Tarkibga o'tish

Lab: systemd xizmatini qurish, buzish va tuzatish

O'z systemd xizmatini yaratish va systemd troubleshooting maqolalarining har biri bu lab materialining yarmini ko'rib chiqdi: unit yozish va ishlamayotgan unit’ni diagnostika qilish. Bu lab ikkalasini ataylab ketma-ket bajaradi: ishlaydigan xizmat quradi, keyin uni uch xil real usulda buzadi va har birini faqat standart systemctl/journalctl vositalari bilan diagnostika qiladi va tuzatadi. LFCS uslubidagi "bu xizmat ishga tushmayapti, tuzating" vazifasi aynan shu ko'nikmani tekshiradi.

Maqsad va yakuniy natija

Bu lab oxirida sizda to'g'ri ishga tushadigan, qayta yuklanishdan keyin ham ishlaydigan maxsus systemd xizmati (greeter.service) bo'ladi. U uch marta ataylab buziladi va har safar standart systemd diagnostika ketma-ketligi yordamida aniqlanib, tuzatiladi. Har bir tuzatish ortidagi mulohaza taxmin qilinmasdan, tushuntiriladi.

Topologiya va boshlang'ich holat

PID 1 sifatida systemd ishlaydigan bitta lab VM yoki container (bu har qanday hozirgi Ubuntu Server LTS yoki RHEL oilasi o'rnatmasiga to'g'ri keladi, lekin ko'pchilik minimal Docker container’lariga to'g'ri kelmaydi — bu labga haqiqiy VM yoki systemd yoqilgan container kerak).

Talablar

Xavfsizlik va snapshot haqida eslatma

/etc/systemd/system/ ostidagi maxsus unit fayl ExecStart ko'rsatgan har qanday narsani u belgilagan User= imtiyozlari bilan ishga tushiradi. Agar xizmatga haqiqatan root kerak bo'lmasa, User= ni har doim imtiyozsiz akkauntga o'rnating va ishonchsiz manbadan unit faylni avval ExecStart ni o'qimasdan hech qachon nusxalamang.

1-qadam: ishlaydigan xizmatni qurish

sudo useradd -r -s /usr/sbin/nologin greeter-svc
sudo mkdir -p /opt/greeter
cat <<'EOF' | sudo tee /opt/greeter/greeter.sh
#!/bin/bash
while true; do
    echo "$(date '+%Y-%m-%d %H:%M:%S') - greeter service is alive"
    sleep 10
done
EOF
sudo chmod +x /opt/greeter/greeter.sh
sudo chown -R greeter-svc:greeter-svc /opt/greeter
# /etc/systemd/system/greeter.service
[Unit]
Description=Greeter demo service
After=network.target

[Service]
Type=simple
User=greeter-svc
ExecStart=/opt/greeter/greeter.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now greeter.service

Tekshirish:

systemctl status greeter.service
journalctl -u greeter.service -n 5
● greeter.service - Greeter demo service
     Loaded: loaded (/etc/systemd/system/greeter.service; enabled)
     Active: active (running)
...
Jul 29 10:00:10 host greeter.sh[4821]: 2026-07-29 10:00:10 - greeter service is alive

2-qadam: buzish — 1-holat: noto'g'ri bajariladigan fayl yo'li

sudo sed -i 's#/opt/greeter/greeter.sh#/opt/greeter/greeter-typo.sh#' /etc/systemd/system/greeter.service
sudo systemctl daemon-reload
sudo systemctl restart greeter.service

systemd troubleshooting maqolasidagi jarayonga amal qilib diagnostika qilish:

systemctl status greeter.service
● greeter.service - Greeter demo service
     Active: failed (Result: exit-code)
   Main PID: 4903 (code=exited, status=203/EXEC)

203/EXEC aynan systemd ExecStart da nomlangan binary’ni hatto bajara olmaganini anglatadi. Bu skriptning o'z mantiqi haqida biror narsa taxmin qilishdan oldin yo'lning o'zini tekshirish kerakligining kuchli, aniq belgisi.

systemd sizning dasturingiz kodi hatto ishga tushishidan oldin sodir bo'lgan muvaffaqiyatsizlik uchun xabar qiladigan status=NNN/NAME kodlari — kichik, qat’iy va yodlab olishga arziydigan to'plam. Ularni tanib olish bitta ham log qatorini o'qimasdan, unit’ning aynan qaysi qismi noto'g'ri ekanini aytib beradi:

status= Ma’nosi Qayerga qarash kerak
203/EXEC ExecStart binary’sini bajarib bo'lmadi — noto'g'ri yo'l yoki bajariladigan emas ExecStart= yo'li (2-qadam) va uning ruxsat biti (3-qadam)
200/CHDIR WorkingDirectory= mavjud emas yoki unga kirib bo'lmaydi WorkingDirectory= qatori
217/USER User= akkaunti mavjud emas User= qatori — aynan 1-mashq keltirib chiqaradigan muvaffaqiyatsizlik
226/NAMESPACE Sandbox direktivasini (masalan, ProtectHome, ReadOnlyPaths) sozlab bo'lmadi [Service] dagi hardening direktivalari
/NAME siz har qanday ≥ 1 qiymat Dasturingiz ishga tushdi va o'zi noldan farqli kod bilan tugadi Ilovaning o'z log'lari — bu unit’dagi emas, koddagi xato

Intervyuda aytish kerak bo'lgan asosiy farq: NNN/NAME kodi systemd jarayonni sozlay yoki ishga tushira olmaganini anglatadi, demak xato unit faylda. /NAME siz oddiy raqamli exit kod esa jarayon yaxshi ishga tushganini va keyin o'zi muvaffaqiyatsiz tugaganini anglatadi, demak xato dasturda.

journalctl -u greeter.service -n 10 --no-pager
greeter.service: Failed to locate executable /opt/greeter/greeter-typo.sh: No such file or directory

Tuzatish va tekshirish:

sudo sed -i 's#/opt/greeter/greeter-typo.sh#/opt/greeter/greeter.sh#' /etc/systemd/system/greeter.service
sudo systemctl daemon-reload
sudo systemctl restart greeter.service
systemctl is-active greeter.service
active

3-qadam: buzish — 2-holat: execute ruxsati yo'q

sudo chmod -x /opt/greeter/greeter.sh
sudo systemctl restart greeter.service

Diagnostika qilish:

journalctl -u greeter.service -n 10 --no-pager
greeter.service: Failed to execute /opt/greeter/greeter.sh: Permission denied

2-qadamdagi 203/EXEC "not found" holatidan farq qiladigan bu xabar yo'q faylga emas, aynan ruxsatlar muammosiga ishora qiladi. Troubleshooting jarayoni maqolasi aynan shu mulohaza ko'nikmasiga urg'u beradi: gipoteza tuzishdan oldin aniq xato matnini o'qing, chunki "Permission denied" va "No such file or directory" butunlay boshqa-boshqa tuzatishlarga ishora qiladi.

Tuzatish va tekshirish:

sudo chmod +x /opt/greeter/greeter.sh
sudo systemctl restart greeter.service
systemctl is-active greeter.service

4-qadam: buzish — 3-holat: yuklanishga umuman yo'l qo'ymaydigan unit fayldagi xato

sudo sed -i 's/\[Service\]/[Service/' /etc/systemd/system/greeter.service
sudo systemctl daemon-reload

Diagnostika qilish:

sudo systemctl restart greeter.service
Failed to restart greeter.service: Unit greeter.service not found.
sudo systemctl status greeter.service
Unit greeter.service could not be found.

Noto'g'ri tuzilgan unit fayl systemd’ning uni umuman tahlil qila olmasligiga sabab bo'lishi mumkin. Bunday holatda systemctl unit’ni "failed" deb emas, shunchaki mavjud emas deb ko'rsatadi. Fayl diskda aniq turgani uchun bu xabarni birinchi marta ko'rganda chalkash tuyuladi.

sudo systemd-analyze verify greeter.service
Failed to load unit file /etc/systemd/system/greeter.service: [Service section starting at line 6 is not properly closed

systemd-analyze verify unit faylning sintaksisini uni ishga tushirishga urinishdan mustaqil ravishda tekshiradi va aynan shu turdagi nosozlik uchun bevosita vosita. Fayl diskda aniq ko'rinib turgan bo'lsa-yu, systemctl unit’ni "not found" deb ko'rsatsa, darhol shunga murojaat qilishga arziydi.

Tuzatish va tekshirish:

sudo sed -i 's/\[Service/[Service]/' /etc/systemd/system/greeter.service
sudo systemd-analyze verify greeter.service
sudo systemctl daemon-reload
sudo systemctl restart greeter.service
systemctl is-active greeter.service

Troubleshooting bo'yicha maslahatlar

  • Unit faylni tahrirlagandan keyin systemctl daemon-reload o'tkazib yuborilgan. systemd unit ta’riflarini xotirada keshlaydi. Diskdagi faylga kiritilgan tahrir daemon-reload uni qayta o'qimaguncha hech qanday ta’sir qilmaydi — "tuzatdim, lekin hali ham buzilgan" holatining haqiqatan keng tarqalgan manbai.
  • journalctl -u <service> umuman hech narsa ko'rsatmaydi. Unit nomi systemctl list-units da ko'ringanidek, .service qo'shimchasi bilan birga aniq yozilganini tasdiqlang va journalctl --since nosozlikni chiqarib tashlaydigan oraliq bilan cheklanmaganini tekshiring.
  • Xizmat siklda qayta ishga tushib turadi. Unit fayldagi Restart= va RestartSec= ni tekshiring. Kechikishsiz qayta-qayta ishdan chiqib, qayta ishga tushadigan xizmat journal’ni to'ldirib yuborishi va asl sababni diagnostika qilishni qiyinlashtirishi mumkin. Agar shunday bo'layotgan bo'lsa, systemctl status har bir tekshiruvda o'sib boradigan Main PID ni ko'rsatadi.

Orqaga qaytarish va tozalash

sudo systemctl disable --now greeter.service
sudo rm -f /etc/systemd/system/greeter.service
sudo systemctl daemon-reload
sudo rm -rf /opt/greeter
sudo userdel greeter-svc

Yakuniy baholash mezoni

Quyidagilarning hammasi bajarilsa, bu lab yakunlangan hisoblanadi:

  • greeter.service ishga tushadi, enabled holatda va journalctl -u greeter.service orqali ko'rinadigan log qatorlarini hosil qiladi;
  • ataylab kiritilgan uchta nosozlikning har biri uchun siz — bu labni qayta o'qimasdan — sababni aniqlagan aniq journalctl yoki systemd-analyze verify xabarini ayta olasiz;
  • siz failed deb ko'rsatilgan unit (2 va 3-qadamlar) va not found deb ko'rsatilgan unit (4-qadam) o'rtasidagi farqni va systemd nega ikkalasini ajratishini tushuntira olasiz.

Mashqlar

  1. O'zingiz o'ylab topgan to'rtinchi nosozlikni kiriting — masalan, User= ni mavjud bo'lmagan akkauntga o'rnatish — va gipotezangiz to'g'ri bo'lganini tekshirishdan oldin uni xuddi shu jarayon bilan diagnostika qiling.
  2. Restart=on-failure va RestartSec=5 ni qo'shing, keyin 2-qadamdagi buzilgan yo'lni qayta kiriting. systemd xizmatni qayta ishga tushirishga qayta-qayta urinib, muvaffaqiyatsizlikka uchraganda qanday ishlashini journalctl -u greeter.service -f da kuzating.
  3. network.target tartiblash aslida nimani kafolatlashini tekshirish uchun systemctl list-dependencies greeter.service dan foydalaning va After=network.target bu xizmat ishga tushgan paytda tarmoq ishlaydigan IP manzil bilan to'liq sozlangan bo'lishini nega kafolatlamasligini bir jumlada tushuntiring.

Xulosa

Bu labdagi har bir nosozlikni bir xil uchta vosita bilan, bir xil tartibda diagnostika qilish mumkin edi: tezkor umumiy ko'rinish uchun systemctl status, aniq xato xabari uchun journalctl -u <service> va hatto yuklanmaydigan unit fayl uchun systemd-analyze verify. Loglarni tahlil qilish labi bevosita shu yerdan davom etadi va bitta alohida unit o'rniga bir-biriga bog'liq bir nechta xizmat bo'yicha journalctl chiqishini o'qishni chuqurroq ko'rib chiqadi.

Manbalar