Misingi

systemd ni nini: jinsi inavyofanya kazi na jinsi ya kusimamia huduma kwenye Linux

Imesasishwa: · Skillaria.Top

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.

AinaKiendeleziInachoelezea
service.servicehuduma — mchakato wa daemon au kazi ya mara moja
timer.timerkuendesha unit nyingine kwa ratiba (mbadala wa cron)
socket.socketsocket inayoanzisha huduma inapofikiwa
target.targetkundi la units, yaani "hali ya mfumo" (kwa mfano multi-user.target)
mount.mountsehemu ya kuunganisha (mount point)
path.pathkufuatilia 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.

AmriKazi yake
systemctl status nginxhali ya huduma, PID, kumbukumbu, mistari ya mwisho ya log
systemctl start nginxkuanzisha sasa
systemctl stop nginxkusimamisha
systemctl restart nginxkuanzisha upya (stop + start)
systemctl reload nginxkusoma upya usanidi bila kusimama (ikiwa huduma inaunga mkono)
systemctl enable nginxkuwasha kuanza kiotomatiki
systemctl disable nginxkuzima kuanza kiotomatiki
systemctl enable --now nginxkuwasha kuanza kiotomatiki na kuanzisha sasa
systemctl is-active nginxinaonyesha active/inactive — inafaa katika skripti
systemctl list-units --type=servicehuduma zilizopakiwa
systemctl --failedunits zilizoshindwa
systemctl daemon-reloadkusoma 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 ni Requires=.
  • [Service] — jinsi ya kuendesha. Type=simple inamaanisha kwamba mchakato wa ExecStart ndio huduma yenyewe na hauendi chinichini. User= huendesha kwa mtumiaji asiye na haki maalum. Restart=on-failure huanzisha upya huduma ikimaliza kwa kosa, baada ya RestartSec sekunde.
  • [Install] — kile enable inachofanya. WantedBy=multi-user.target inamaanisha "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 PATH ya 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 tumia Type=forking pamoja na PIDFile=.
  • Vigezo vya mazingira kutoka profaili. Huduma haisomi ~/.bashrc wala /etc/profile. Vigezo huwekwa kwa Environment= au EnvironmentFile=.

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.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Linux: с нуля до уверенного администрирования”.

Nenda kwenye kozi