VPN-þjónustan mistekst á EXEC: berið saman unit, binary og sudoers
Mistök á EXEC-skrefinu þýða að systemd gat ekki ræst binary. Berið saman slóð unitsins, uppsettu slóðina og sudoers-heimildina áður en þið breytið nokkru.
Í gær virkaði gangurinn, og í morgun er unitið dautt með Failed at step EXEC spawning /usr/local/bin/vpnclient í journalinu. Auðkennin, slóðirnar og reikningurinn koma aldrei inn í þá setningu. systemd leysti ExecStart í slóð, bað kjarnann að keyra hana, og kjarninn neitaði, oftast því ekkert er til á þeirri slóð eða skráin er ekki keyranleg. Meðhöndlið bilunina sem skráar- og argv-vandamál þar til skipunin sem var þáttuð sannar hið gagnstæða.
Hvers vegna EXEC mistekst áður en auðkenning hefst
systemd keyrir ExecStart ekki í gegnum skel. Það gerir fork, byggir rökvigur úr línunni og kallar execve á fyrsta stakið. Ef það kall mistekst nær þjónustan aldrei í eigin kóða VPN-biðlarans, svo engin prófílbjögun eða athugun auðkennna getur hjálpað.
Stöðukóðinn aðgreinir þessa fjölskyldu frá venjulegum hrunum. Unit sem fer út með status=203/EXEC hóf aldrei ferli; unit sem ræsist og fer svo út með status=1 hefur ef til vill mistekist við auðkenningu, DNS eða leiðsögu. Lestu kóðann áður en þú lest biðlaraloggið, því í fyrra tilvikinu verður biðlaraloggið autt.
Slóðin í journalinu er sú sem systemd notaði, ekki endilega sú sem þú breytti. Drop-in skrár og úttak rafalarans geta hnekkt skrá birgjans, og úrelt daemon-reload skilur gömlu línuna eftir í minni. Þess vegna er fyrsta greiningin að spyrja systemd hvað það telji skipunina, frekar en að opna skrána sem þú manst eftir að hafa breytt.
Þrír staðir þar sem slóð binariesins er skrifuð
VPN-biðlari sem er settur upp úr dreifingarpakka, skrifta birgjans og tarball útgáfu getur lent í þremur mismunandi forskeytum. Unitið, forréttindareglan og uppsetningin skráðu hvert sitt af þessum forskeytum, og bilunin kemur fram þegar tvö af þremur stemma ekki.
| 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/ |
Áþreifanlegt misræmi lítur svona út: skrifta birgjans setur upp í /usr/local/bin, tarballið var afþjappað undir /opt, og unitið nefnir enn gömlu slóðina /usr/bin úr fyrra pakka. Aðeins ein þessara skráa er til, og sjaldan er það skráin í ExecStart.
Ákveðið hvaða slóð er kanonísk áður en þið breytið hvorri skránni. Ef dreifingarpakkinn á binaryið er slóð pakkans kanonísk og unitið á að fylgja henni. Ef skrifta birgjans á það gildir sama regla fyrir forskeyti birgjans. Að afrita binary milli forskeyta býr til tvö eintök sem rekast í sundur við næstu uppfærslu.
Þegar skipun í gæsalöppum verður skráarheiti
Önnur bilunargerð felur sig bak við sömu journallínu. Einhver skrifar þetta í unitið og væntir þess að biðlarinn tengist við ræsingu:
ExecStart=/usr/bin/"vpnclient connect office"systemd skiptir gildinu í orð, svo fyrsta orðið verður /usr/bin/vpnclient connect office, en gæsalappirnar eru fjarlægðar sem hópunarsetning. Síðan leitar kjarninn að skrá sem hefur bil í heitinu, og slík er ekki til. Villan er eins og hjá binary sem vantar, þótt binaryið sé uppsett.
Studda formið er raunveruleg keyranleg skrá sem fylgt er af aðskildum rökum, til dæmis ExecStart=/usr/bin/vpnclient connect office. Ef vinnuflæðið þarf virkilega pípu eða keðju, setjið það í skriftu og kallið á skriftuna, því ExecStart hefur enga &&, engar pípur og enga glob-stækkun.
Lagið unitið, ekki skráarkerfið
Freistandi viðgerð er táknræn tenging frá væntri slóð yfir í raunverulega binaryið. Hún virkar þar til pakkinn uppfærist og tengingin bendir á fjarlægða skrá, eða þar til SELinux-merki passar ekki lengur við markið. Kýsið að breyta unitinu í gegnum drop-in svo skrá birgjans haldist ósnortin og uppfærslur haldist fyrirsjáanlegar.
Forréttindareglan verður að passa við sömu slóð og sömu undirskipanir. sudoers-færsla fyrir /usr/local/bin/vpnclient heimilar ekki /usr/bin/vpnclient, og færsla sem leyfir hvaða rök sem er gerir hvaða staðbundna ferli sem er kleift að endurstilla eða stöðva ganginn. Gefið tvö sögnin sem unitið þarf og haldið niðurrekstri utan við hana ef stöðvun þjónustunnar lokar nú þegar viðmótinu.
Hér borgar samanburðurinn sig: unitið, pakkagagnagrunnurinn og sudoers ættu öll að nefna eina slóð. Þegar þau gera það hverfur EXEC-villan án endurræsingar og án eintaks af binaryinu á þriðjum stað.
Sannið þáttuðu skipunina fyrir endurræsingu
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 er afgerandi úttakið því það prentar argv sem systemd þáttaði í raun, þar með talið hvert drop-in. systemd-analyze verify grípur slóð sem vantar eða er ekki keyranleg áður en þið endurræsið, og status-skipunin eftir endurræsinguna segir hvort ferlið er nú til.
Ef unitið ræsist og mistekst svo hafið þið yfirgefið EXEC-fjölskylduna og farið inn í eigin villumeðferð biðlarans. Leitið í journalinu að skilaboðum biðlarans, ekki enn einni execve-bilun. Haldið diffi unitsins og diffi sudoers saman í breytingaskránni svo næsta uppfærsla endurinnleiði ekki klofnu slóðina í hljóði.