systemd ni nini: jinsi inavyofanya kazi na jinsi ya kusimamia huduma kwenye Linux
systemd ni mfumo wa kuanzisha na meneja wa huduma wa Linux: kernel huuendesha kama mchakato wa kwanza (PID 1), kisha huanzisha huduma nyingine kwa mpangilio sahihi na kuzisimamia. Kila kitu systemd inachosimamia kinaelezwa kwa units — huduma, timers, pointi za kuunganisha — na hudhibitiwa kwa systemctl, wakati journalctl huonyesha kumbukumbu zake.
systemd ni mfumo wa kuanzisha na meneja wa huduma unaotumika katika distro nyingi za kisasa za Linux: Debian, Ubuntu, Fedora, RHEL na zinazotokana nazo. Baada ya kuwasha, kernel huendesha systemd kama mchakato wa kwanza wenye PID 1, na kisha systemd huanzisha mtandao, kuunganisha diski, kuendesha web server, hifadhidata, na huduma nyingine zote. Kwa jibu fupi la swali "systemd ni nini": ni "mpangaji" anayejua ni huduma zipi zinapaswa kufanya kazi, zianzishwe kwa mpangilio upi, na nini cha kufanya huduma ikianguka.
Kuthibitisha kuwa una systemd ni rahisi:
$ ps -p 1 -o comm=
systemd
Kwa nini systemd ilitengenezwa
Zamani Linux ilitumia SysV init: seti ya skripti za shell kwenye /etc/init.d/ zilizoendeshwa moja baada ya nyingine. Mfumo huu ulieleweka, lakini ulikuwa wa polepole na dhaifu. Kila skripti iliandika faili lake la PID, iliamua yenyewe jinsi ya kukagua kama mchakato uko hai, na kuanzisha upya huduma iliyoanguka kulihitaji kuongezwa kwa njia nyingine.
systemd inatatua matatizo haya kwa njia ya kati:
- Uanzishaji sambamba. Huduma huanzishwa pamoja ikiwa hakuna utegemezi kati yake, hivyo kuwasha ni haraka.
- Utegemezi na mpangilio. Maelezo ya huduma yanaeleza wazi inachohitaji (kwa mfano mtandao) na baada ya nini inapaswa kuanzishwa.
- Usimamizi. systemd inajua michakato yote ya huduma kupitia cgroups na inaweza kuianzisha upya inapoanguka.
- Jarida moja. Matokeo ya huduma zote hukusanywa na journald, na kusomwa kwa amri moja.
- Kiolesura kimoja. Kila huduma inasimamiwa kwa njia ile ile:
systemctl start|stop|restart|status.
Mbali na meneja wa huduma, mradi wa systemd una vipengele vingine: journald (kumbukumbu), logind (vikao vya watumiaji), timesyncd (kusawazisha muda), resolved (DNS), na networkd (mtandao). Si distro zote zinatumia vyote, lakini systemd kama PID 1 na journald karibu kila mahali zipo.
Units: vipengele vya systemd
Kila kitu systemd inachosimamia kinaelezwa na units. Unit ni faili la maandishi lenye muundo wa INI, na aina yake huamuliwa na kiendelezi chake.
| Aina | Kiendelezi | Inachoelezea |
|---|---|---|
| service | .service | huduma — mchakato wa daemon au kazi ya mara moja |
| timer | .timer | kuendesha unit nyingine kwa ratiba (mbadala wa cron) |
| socket | .socket | socket inayoanzisha huduma inapofikiwa |
| target | .target | kundi la units, yaani "hali ya mfumo" (kwa mfano multi-user.target) |
| mount | .mount | sehemu ya kuunganisha (mount point) |
| path | .path | kufuatilia faili au saraka |
Mahali ambapo faili za unit zinakaa
Faili za units zinahifadhiwa kwenye saraka kadhaa, na kila moja ina kipaumbele chake:
/usr/lib/systemd/system/(kwenye Debian na Ubuntu pia/lib/systemd/system/) — units zilizosakinishwa na vifurushi. Usizihariri moja kwa moja: sasisho la kifurushi litafuta mabadiliko yako./etc/systemd/system/— units na marekebisho ya msimamizi. Zina kipaumbele cha juu zaidi./run/systemd/system/— units za muda zilizoundwa wakati mfumo unafanya kazi.
Ili kuona maudhui ya unit pamoja na marekebisho yake yote, tumia systemctl cat nginx.service.
Targets badala ya runlevels
Runlevels za zamani zimebadilishwa na targets. multi-user.target ni hali ya kawaida ya seva bila michoro, graphical.target ni yenye kiolesura cha picha, na rescue.target ni hali ya urejeshaji ya mtumiaji mmoja. Target chaguo-msingi huonyeshwa kwa systemctl get-default, na hubadilishwa kwa systemctl set-default multi-user.target.
systemctl: kusimamia huduma
systemctl ndicho chombo kikuu cha kufanya kazi na systemd. Amri nyingi hubadilisha hali ya mfumo na zinahitaji sudo.
| Amri | Kazi yake |
|---|---|
systemctl status nginx | hali ya huduma, PID, kumbukumbu, mistari ya mwisho ya log |
systemctl start nginx | kuanzisha sasa |
systemctl stop nginx | kusimamisha |
systemctl restart nginx | kuanzisha upya (stop + start) |
systemctl reload nginx | kusoma upya usanidi bila kusimama (ikiwa huduma inaunga mkono) |
systemctl enable nginx | kuwasha kuanza kiotomatiki |
systemctl disable nginx | kuzima kuanza kiotomatiki |
systemctl enable --now nginx | kuwasha kuanza kiotomatiki na kuanzisha sasa |
systemctl is-active nginx | inaonyesha active/inactive — inafaa katika skripti |
systemctl list-units --type=service | huduma zilizopakiwa |
systemctl --failed | units zilizoshindwa |
systemctl daemon-reload | kusoma upya faili za unit baada ya kuhariri |
Jinsi ya kusoma systemctl status
$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-10-12 09:14:03 UTC; 2h 5min ago
Docs: man:nginx(8)
Main PID: 812 (nginx)
Tasks: 3 (limit: 2307)
Memory: 6.1M
CPU: 154ms
CGroup: /system.slice/nginx.service
├─812 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─813 "nginx: worker process"
└─814 "nginx: worker process"
Mstari wa Loaded unaonyesha unit ilitoka wapi na kama kuanza kiotomatiki kumewashwa (enabled). Mstari wa Active ni hali ya sasa: active (running), inactive (dead), au failed. Sehemu ya CGroup inaonyesha michakato yote ya huduma — ndivyo systemd inavyojua ni michakato ipi ni yake.
Tofauti kati ya enable na start
Hii ni mkanganyiko wa kawaida. start huanzisha huduma sasa hivi, lakini baada ya kuwasha upya haitainuka. enable huunda kiungo cha ishara kwenye saraka ya target (kwa mfano /etc/systemd/system/multi-user.target.wants/), hivyo huduma huinuka wakati wa kuwasha, lakini haianzi sasa. Mara nyingi unahitaji vyote viwili — tumia enable --now.
Kuna hali ya tatu, mask. systemctl mask service huunganisha unit na /dev/null, hivyo haiwezi kuanzishwa, si kwa mkono wala kama utegemezi. Ni muhimu wakati huduma inapaswa kuzimwa kabisa.
journalctl: kumbukumbu za huduma
Kila kitu ambacho huduma inaandika kwenye stdout na stderr kinanaswa na systemd-journald na kuhifadhiwa kwenye jarida la binary pamoja na metadata: jina la unit, PID, kipaumbele, na muda. Jarida linasomwa kwa journalctl.
journalctl -u nginx # kumbukumbu za huduma moja
journalctl -u nginx -f # kufuatilia kwa wakati halisi, kama tail -f
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -n 50 # mistari 50 ya mwisho
journalctl -b # tangu kuwasha kwa sasa
journalctl -b -1 # kuwasha kilichotangulia
journalctl -p err -b # makosa na yaliyo mazito zaidi tu
journalctl -k # ujumbe wa kernel
journalctl --disk-usage # nafasi ambayo jarida linatumia
Chaguo -p huchuja kwa kipaumbele cha syslog: emerg, alert, crit, err, warning, notice, info, debug. Kiwango kilichotajwa kinajumuisha pia kila kilicho kizito kuliko hicho.
Jarida baada ya kuwasha upya
Ikiwa saraka /var/log/journal haipo na /etc/systemd/journald.conf ina Storage=auto, jarida linahifadhiwa kwenye kumbukumbu tu (/run/log/journal) na hupotea wakati wa kuwasha upya. Ili kulifanya la kudumu, weka Storage=persistent au tengeneza saraka hiyo kisha uanzishe upya journald. Ukubwa unadhibitiwa na SystemMaxUse=, na data ya zamani husafishwa kwa journalctl --vacuum-time=2weeks au --vacuum-size=500M.
journald mara nyingi hufanya kazi pamoja na rsyslog: jarida hupeleka ujumbe kwa rsyslog, ambayo huandika faili za maandishi za kawaida kwenye /var/log/ na inaweza kutuma kumbukumbu kwa seva kuu.
Kuanza huduma yako kiotomatiki: mfano wa unit file
Tuseme una programu — skripti au binary — inayopaswa kubaki hai, kuinuka wakati wa kuwasha, na kuanzishwa upya ikianguka. Tengeneza faili /etc/systemd/system/myapp.service:
[Unit]
Description=My web application
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/myapp/env
ExecStart=/opt/myapp/bin/server --port 8080
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Hebu tuangalie sehemu zake:
- [Unit] — maelezo na utegemezi.
After=inaweka mpangilio tu,Wants=ni utegemezi laini (huivuta unit, lakini haishindwi ikiwa haikuinuka). Utegemezi mgumu niRequires=. - [Service] — jinsi ya kuendesha.
Type=simpleinamaanisha kwamba mchakato waExecStartndio huduma yenyewe na hauendi chinichini.User=huendesha kwa mtumiaji asiye na haki maalum.Restart=on-failurehuanzisha upya huduma ikimaliza kwa kosa, baada yaRestartSecsekunde. - [Install] — kile
enableinachofanya.WantedBy=multi-user.targetinamaanisha "endesha kwenye kuwasha kwa kawaida".
Kuiweka:
sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp
journalctl -u myapp -f
Makosa ya kawaida kwenye unit file
- Njia ya jamaa kwenye ExecStart. Njia ya programu lazima iwe kamili. systemd haitafuti amri kwenye
PATHya mtumiaji kama shell inavyofanya. - Kusahau daemon-reload. Baada ya kuhariri faili, systemd bado inatumia toleo la zamani na inaonya kuhusu hilo kwenye
status. - Daemon inaenda chinichini. Ikiwa programu inajigawa yenyewe (fork) lakini imeandikwa
Type=simple, systemd inadhani huduma imekwisha. Endesha programu kwenye hali ya mbele (foreground), au tumiaType=forkingpamoja naPIDFile=. - Vigezo vya mazingira kutoka profaili. Huduma haisomi
~/.bashrcwala/etc/profile. Vigezo huwekwa kwaEnvironment=auEnvironmentFile=.
Marekebisho bila kubadilisha unit ya kifurushi
Ili kubadilisha vigezo vya huduma kutoka kwenye kifurushi bila kugusa faili lake, tumia drop-in:
sudo systemctl edit nginx
Kihariri kitafunguka, na mabadiliko yatahifadhiwa kwenye /etc/systemd/system/nginx.service.d/override.conf. Kwa mfano unaweza kuongeza [Service] na Restart=always. Baada ya kufunga kihariri, systemd husoma upya usanidi yenyewe.
Timers za systemd badala ya cron
Timer ni unit inayoendesha huduma yenye jina lile lile kwa ratiba. Faida zake juu ya cron: kumbukumbu za kazi zinaingia kwenye jarida, kuna utegemezi, na kazi zilizokosekana zinaweza kufidiwa (Persistent=true). Mfano wa nakala rudufu ya kila siku:
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
Usemi wa OnCalendar unaweza kukaguliwa kwa systemd-analyze calendar "*-*-* 03:00:00", ambayo itaonyesha muda wa uendeshaji ujao.
Uchunguzi wa kuwasha
systemd inahifadhi muda wa kuanza kwa kila unit, kwa hiyo kuwasha polepole ni rahisi kuchambua:
systemd-analyze # jumla ya muda wa kuwasha
systemd-analyze blame # units zilizopangwa kwa muda wa kuanza
systemd-analyze critical-chain # mnyororo unaochelewesha kuwasha
systemd-analyze verify /etc/systemd/system/myapp.service # kukagua unit file
Muhtasari
systemd ni PID 1 na meneja wa huduma katika Linux ya kisasa. Inaelezea kila kitu kwa units, inadhibitiwa kwa systemctl, inakusanya kumbukumbu kwenye jarida linalosomwa kwa journalctl, na inaweza kuendesha kazi kwa timers badala ya cron. Ili kuitumia kwa ujasiri, tosha kujua status, enable --now, journalctl -u, na kuandika unit file rahisi yenye Restart=on-failure. systemd, journald na uandishi wa kumbukumbu vinafundishwa kwa vitendo katika kozi ya Linux.
Maswali ya mara kwa mara
Nitajuaje kama mfumo wangu unatumia systemd?
Endesha ps -p 1 -o comm= — ikiwa jibu ni systemd, mfumo unafanya kazi na systemd. Saraka /run/systemd/system pia ipo tu wakati mfumo umewashwa na systemd.
Tofauti kati ya systemctl restart na reload ni nini?
restart husimamisha kisha kuanzisha upya huduma kabisa, hivyo miunganisho hukatika. reload huomba huduma isome upya usanidi wake bila kusimama, lakini inafanya kazi tu ikiwa unit ina ExecReload.
Je, huduma za systemd zinaweza kuendeshwa bila sudo na mtumiaji wa kawaida?
Ndiyo, systemd ina mfano wa mtumiaji: units huwekwa kwenye ~/.config/systemd/user/ na husimamiwa kwa systemctl --user. Ili zifanye kazi bila kikao kinachotumika, washa loginctl enable-linger kwa mtumiaji huyo.
Kwa nini huduma iko kwenye hali ya failed, na nitaiweka upya vipi?
Tafuta sababu kwenye journalctl -u jina -b na kwenye mstari wa Active wa status. Baada ya kurekebisha, anzisha huduma tena; alama ya failed huondolewa kwa systemctl reset-failed.
Kumbukumbu za systemd zimehifadhiwa wapi kwenye diski?
Kwa uhifadhi wa kudumu — kwenye /var/log/journal/ katika muundo wa binary; vinginevyo kwenye /run/log/journal/ kwenye kumbukumbu. Zisome kwa journalctl, si kwa zana za maandishi.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.
- systemd: как на самом деле запускаются сервисы в современном Linux
- Журналы и мониторинг: journald, rsyslog и sysstat