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ин өзгөртүү жазуусунда чогуу кармаңыз, кийинки жаңыртуу бөлүнгөн жолду үнсүз кайтарып келбеши үчүн.