Huduma ya VPN inashindwa kwenye EXEC: linganisha unit, binary na sudoers
Kushindwa katika hatua ya EXEC kunamaanisha systemd haikuweza kuanzisha faili ya binary. Linganisha njia ya unit, njia iliyosakinishwa na ruhusa ya sudoers kabla ya kubadilisha chochote.
Jana handaki lilifanya kazi, na asubuhi ya leo unit imekufa huku journal ikiwa na Failed at step EXEC spawning /usr/local/bin/vpnclient. Vitambulisho, njia na akaunti hiviingii kamwe katika sentensi hiyo. systemd ilitatua ExecStart kuwa njia, ikaomba kernel iitekeleze, na kernel ilikataa, mara nyingi kwa sababu hakuna kitu kwenye njia hiyo au faili haiwezi kutekelezwa. Chukulia hitilafu kama tatizo la faili na argv hadi amri iliyochanganuliwa ithibitishe kinyume.
Kwa nini EXEC inashindwa kabla uthibitishaji haujaanza
systemd haiendeshi ExecStart kupitia shell. Inafanya fork, inajenga vekta ya hoja kutoka kwenye mstari na inaita execve kwenye kipengele cha kwanza. Ikiwa wito huo unashindwa, huduma haifikii kamwe msimbo wa mteja wa VPN yenyewe, kwa hiyo uhariri wa wasifu au ukaguzi wa vitambulisho hauwezi kusaidia.
Msimbo wa hali hutenganisha familia hii na ajali za kawaida. Unit inayotoka na status=203/EXEC haikuanzisha kamwe mchakato; unit inayoanza kisha kutoka na status=1 inaweza kuwa ilishindwa kwenye uthibitishaji, DNS au uelekezaji. Soma msimbo kabla ya logi ya mteja, kwa sababu katika kesi ya kwanza logi ya mteja itakuwa tupu.
Njia iliyo kwenye journal ni ile ambayo systemd ilitumia, sio lazima ile uliyoihariri. Faili za drop-in na matokeo ya jenereta zinaweza kupindua faili ya msambazaji, na daemon-reload ya zamani huacha mstari wa zamani kwenye kumbukumbu. Ndio sababu uchunguzi wa kwanza ni kumuuliza systemd inachukulia amri gani, badala ya kufungua faili unayokumbuka kuibadilisha.
Sehemu tatu ambapo njia ya binary imeandikwa
Mteja wa VPN aliyesakinishwa kutoka kifurushi cha usambazaji, script ya msambazaji na tarball ya toleo anaweza kuishia katika viambishi vitatu tofauti. Unit, kanuni ya upendeleo na kisakinishi kila kimoja kiliandika kimoja cha viambishi hivyo, na hitilafu inaonekana wakati viwili kati ya vitatu haviendani.
| Record | Common value | How to read it |
|---|---|---|
| Unit or drop-in | /usr/local/bin/vpnclient | systemctl cat vpnclient.service |
| Installed binary | /usr/bin/vpnclient | command -v vpnclient, then ls -l the result |
| Sudoers grant | /opt/vpnclient/bin/vpnclient | sudo grep -r vpnclient /etc/sudoers.d/ |
Kutokuelewana halisi kunaonekana hivi: script ya msambazaji inasakinisha kwenye /usr/local/bin, tarball ilifunguliwa chini ya /opt, na unit bado inataja njia ya zamani /usr/bin kutoka kifurushi kilichopita. Ni moja tu ya faili hizo iliyopo, na mara chache ni ile iliyo kwenye ExecStart.
Amua ni njia gani ni kanuni kabla ya kubadilisha moja ya faili. Ikiwa kifurushi cha usambazaji kinamiliki binary, njia ya kifurushi ni kanuni na unit inapaswa kuifuata. Ikiwa script ya msambazaji inamiliki, kanuni hiyo hiyo inatumika kwa kiambishi cha msambazaji. Kunakili binary kati ya viambishi hutengeneza nakala mbili ambazo hutengana kwenye sasisho lijalo.
Wakati amri iliyo kwenye alama za nukuu inakuwa jina la faili
Hali ya pili ya kushindwa imejificha nyuma ya mstari huo wa journal. Mtu anaandika hii kwenye unit na anatarajia mteja ataunganisha wakati wa kuwasha:
ExecStart=/usr/bin/"vpnclient connect office"systemd inagawanya thamani katika maneno, kwa hiyo neno la kwanza linakuwa /usr/bin/vpnclient connect office, na alama za nukuu huondolewa kama sintaksia ya kupanga vikundi. Kisha kernel inatafuta faili ambalo jina lake lina nafasi, na hakuna. Hitilafu ni sawa na binary iliyokosekana ingawa binary imesakinishwa.
Fomu inayotumika ni faili halisi inayotekelezeka ikifuatiwa na hoja tofauti, kwa mfano ExecStart=/usr/bin/vpnclient connect office. Ikiwa mtiririko wa kazi unahitaji bomba au mnyororo, weka kwenye script na uite script, kwa sababu ExecStart haina &&, haina mabomba na haina upanuzi wa glob.
Rekebisha unit, sio mfumo wa faili
Suluhisho la kuvutia ni kiungo cha mfano kutoka njia inayotarajiwa hadi binary halisi. Hufanya kazi hadi kifurushi kisasishwe na kiungo kielekeze kwenye faili iliyoondolewa, au hadi lebo ya SELinux isiendane tena na lengo. Afadhali uhariri unit kupitia drop-in, ili faili ya msambazaji ibaki bila kuguswa na sasisho zibaki za kutabirika.
Kanuni ya upendeleo lazima iendane na njia hiyo hiyo na amri ndogo zilezile. Ingizo la sudoers kwa /usr/local/bin/vpnclient haliidhinishi /usr/bin/vpnclient, na ingizo linaloruhusu hoja yoyote humruhusu mchakato wowote wa ndani kusanidi upya au kusimamisha handaki. Toa vitenzi viwili ambavyo unit inahitaji na weka uvunjaji nje yake ikiwa kusimamisha huduma tayari kunafunga kiolesura.
Hapa ndipo ulinganisho unalipa: unit, hifadhidata ya vifurushi na sudoers zinapaswa kutaja njia moja. Zikifanya hivyo, hitilafu ya EXEC inatoweka bila kuwasha upya na bila nakala ya binary mahali pa tatu.
Thibitisha amri iliyochanganuliwa kabla ya kuwasha upya
sudo systemctl daemon-reload
sudo systemctl cat vpnclient.service
systemctl show -p ExecStart vpnclient.service
systemd-analyze verify /etc/systemd/system/vpnclient.service
sudo systemctl restart vpnclient.service
systemctl status vpnclient.service --no-pagersystemctl show ni matokeo ya uamuzi kwa sababu inachapisha argv ambayo systemd iliichanganua kweli, ikiwa ni pamoja na drop-in yoyote. systemd-analyze verify hunasa njia iliyokosekana au isiyotekelezeka kabla ya kuwasha upya, na amri ya status baada ya kuwasha upya inakuambia kama mchakato upo sasa.
Ikiwa unit inaanza kisha inashindwa, umeacha familia ya EXEC na umeingia katika ushughulikiaji wa makosa wa mteja mwenyewe. Tafuta kwenye journal ujumbe wa mteja, sio kushindwa kwingine kwa execve. Weka diff ya unit na diff ya sudoers pamoja kwenye rekodi ya mabadiliko, ili sasisho lijalo lisilete tena kwa utulivu njia iliyogawanyika.