VPN қызметі EXEC кезеңінде сәтсіз аяқталады: unit, бинарлық файл және sudoers салыстырыңыз
EXEC қадамындағы сәтсіздік systemd бинарлық файлды іске қоса алмағанын білдіреді. Бірдеңені өзгертудің алдында unit жолын, орнатылған жолды және sudoers рұқсатын салыстырыңыз.
Кеше туннель жұмыс істеп тұрды, ал бүгін таңертең unit өлі, журналда Failed at step EXEC spawning /usr/local/bin/vpnclient бар. Тіркелгі деректері, маршруттар және аккаунт бұл сөйлемге ешқашан кірмейді. systemd ExecStart-ты жолға айналдырды, ядродан оны орындауды сұрады, ал ядро бас тартты, көбінесе бұл жолда ештеңе жоқ немесе файл орындалатын емес болғандықтан. Талданған команда керісін дәлелдегенге дейін ақауды файл және argv мәселесі ретінде қарастырыңыз.
Неліктен EXEC аутентификация басталмай тұрып сәтсіз болады
systemd ExecStart-ты shell арқылы іске қоспайды. Ол fork жасайды, жолдан аргумент векторын құрады және бірінші элементке execve шақырады. Егер бұл шақыру сәтсіз болса, қызмет ешқашан VPN клиентінің өз кодына жетпейді, сондықтан профильді өңдеу немесе тіркелгі деректерін тексеру көмектеспейді.
Күй коды бұл топты қарапайым құлаулардан бөледі. status=203/EXEC-пен шыққан unit ешқашан процесс бастамаған; басталып, кейін status=1 -пен шыққан unit аутентификацияда, DNS-те немесе маршруттауда сәтсіз болуы мүмкін. Клиент журналын оқымас бұрын кодты оқыңыз, өйткені бірінші жағдайда клиент журналы бос болады.
Журналдағы жол — systemd пайдаланған жол, сіз өзгерткен жол міндетті емес. Drop-in файлдары мен генератор шығысы жеткізушінің файлын басуы мүмкін, ал ескірген daemon-reload ескі жолды жадыда қалдырады. Сондықтан бірінші диагностика — өзгерткеніңізді есте сақтаған файлды ашу емес, systemd-ден команданы не деп санайтынын сұрау.
Бинарлық файлдың жолы жазылатын үш орын
Дистрибутив пакетінен, жеткізуші скриптінен және шығарылым tarball-ынан орнатылған VPN клиенті үш түрлі префикске түсуі мүмкін. unit, артықшылық ережесі және орнатушы осы префикстердің бір-бірін жазып қойған, ал үшеуінің екеуі сәйкес келмегенде ақау пайда болады.
| 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/ |
Нақты сәйкессіздік былай көрінеді: жеткізуші скрипті /usr/local/bin ішіне орнатады, tarball /opt астында ашылған, ал unit әлі де алдыңғы пакеттің ескі /usr/bin жолын атайды. Ол файлдардың тек біреуі ғана бар, және бұл сирек ExecStart-тағы файл болады.
Кез келген файлды өзгертудің алдында қай жолдың канондық екенін шешіңіз. Егер бинарлық файл дистрибутив пакетіне тиесілі болса, пакет жолы канондық және unit оған еруі керек. Егер ол жеткізуші скриптіне тиесілі болса, сол ереже жеткізуші префиксіне де қолданылады. Бинарлық файлды префикстер арасында көшіру келесі жаңартуда ажырайтын екі көшірме жасайды.
Тырнақшадағы команда файл атауына айналғанда
Екінші ақау режимі сол журнал жолының артында жасырылады. Біреу мұны unit-ке жазып, клиент жүктелу кезінде қосылады деп күтеді:
ExecStart=/usr/bin/"vpnclient connect office"systemd мәнді сөздерге бөледі, сондықтан бірінші сөз /usr/bin/vpnclient connect office болады, ал тырнақшалар топтау синтаксисі ретінде алынып тасталады. Содан кейін ядро атында бос орындар бар файлды іздейді, ал ондай файл жоқ. Бинарлық файл орнатылған болса да, қате жоқ бинарлық файлдікіндей.
Қолдау көрсетілетін нысан — нақты орындалатын файл, одан кейін жеке аргументтер, мысалы ExecStart=/usr/bin/vpnclient connect office. Егер жұмыс ағыны шынымен құбыр немесе тізбек қажет етсе, оны скриптке салып, скриптті шақырыңыз, өйткені ExecStart-та && жоқ, құбырлар жоқ және glob кеңейтуі жоқ.
Файлдық жүйені емес, unit-ті түзетіңіз
Азғыратын жөндеу — күтілетін жолдан нақты бинарлық файлға символдық сілтеме. Ол пакет жаңартылып, сілтеме жойылған файлды көрсетпейінше, немесе SELinux белгісі мақсатқа сәйкес келмейінше жұмыс істейді. unit-ті drop-in арқылы өңдеген дұрыс, сонда жеткізушінің файлы тиіспеген күйде қалады және жаңартулар болжамды болады.
Артықшылық ережесі сол жолға және сол қосалқы командаларға сәйкес болуы керек. /usr/local/bin/vpnclient үшін sudoers жазбасы /usr/bin/vpnclient-ке рұқсат бермейді, ал кез келген аргументке рұқсат беретін жазба кез келген жергілікті процеске туннельді қайта конфигурациялауға немесе тоқтатуға мүмкіндік береді. unit-ке қажет екі етістікті беріңіз және қызметті тоқтату интерфейсті бұрын жабатын болса, бөлшектеуді оның сыртында ұстаңыз.
Міне, салыстыру осында өзін ақтайды: unit, пакеттер дерекқоры және sudoers барлығы бір жолды атауы керек. Солай болғанда EXEC қатесі қайта жүктеусіз және бинарлық файлдың үшінші жердегі көшірмесіз жоғалады.
Қайта жүктеуден бұрын талданған команданы дәлелдеңіз
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 шешуші шығыс, өйткені ол systemd нақты талдаған argv-ны, кез келген drop-in-мен бірге басып шығарады. systemd-analyze verify қайта жүктеуден бұрын жоқ немесе орындалмайтын жолды ұстайды, ал қайта жүктеуден кейінгі status командасы процестің қазір бар-жоғын айтады.
Егер unit басталып, кейін сәтсіз болса, сіз EXEC тобынан шығып, клиенттің өз қате өңдеуіне кірдіңіз. Журналдан клиенттің хабарламасын іздеңіз, тағы бір execve сәтсіздігін емес. unit diff-ін және sudoers diff-ін өзгеріс жазбасында бірге ұстаңыз, келесі жаңарту бөлінген жолды үнсіз қайта кіргізбеуі үшін.