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
- root yoki sudo huquqi;
- Xizmatlarni boshqarish va journalctl maqolalaridagi
systemctlvajournalctlbilan asosiy tanishlik.
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
Tekshirish:
● 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:
● 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.
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
3-qadam: buzish — 2-holat: execute ruxsati yo'q
Diagnostika qilish:
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:
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.
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-reloado'tkazib yuborilgan. systemd unit ta’riflarini xotirada keshlaydi. Diskdagi faylga kiritilgan tahrirdaemon-reloaduni 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 nomisystemctl list-unitsda ko'ringanidek,.serviceqo'shimchasi bilan birga aniq yozilganini tasdiqlang vajournalctl --sincenosozlikni chiqarib tashlaydigan oraliq bilan cheklanmaganini tekshiring.- Xizmat siklda qayta ishga tushib turadi. Unit fayldagi
Restart=vaRestartSec=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 statushar bir tekshiruvda o'sib boradiganMain PIDni 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.serviceishga tushadi,enabledholatda vajournalctl -u greeter.serviceorqali ko'rinadigan log qatorlarini hosil qiladi;- ataylab kiritilgan uchta nosozlikning har biri uchun siz — bu labni qayta o'qimasdan — sababni aniqlagan aniq
journalctlyokisystemd-analyze verifyxabarini ayta olasiz; - siz
faileddeb ko'rsatilgan unit (2 va 3-qadamlar) vanot founddeb ko'rsatilgan unit (4-qadam) o'rtasidagi farqni va systemd nega ikkalasini ajratishini tushuntira olasiz.
Mashqlar
- 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. Restart=on-failurevaRestartSec=5ni qo'shing, keyin 2-qadamdagi buzilgan yo'lni qayta kiriting. systemd xizmatni qayta ishga tushirishga qayta-qayta urinib, muvaffaqiyatsizlikka uchraganda qanday ishlashinijournalctl -u greeter.service -fda kuzating.network.targettartiblash aslida nimani kafolatlashini tekshirish uchunsystemctl list-dependencies greeter.servicedan foydalaning vaAfter=network.targetbu 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.