status=200/CHDIR: systemd така и не стартира OpenVPN
Грешка CHDIR означава, че systemd не е успял да влезе в директория, а не че OpenVPN не е успял да прочете профил. Прочетете unit, преди да пипате конфигурацията на VPN.
Услугата се проваля, дневникът споменава spawn и директория, а първият инстинкт е да проверите конфигурацията на VPN. От този файл още нищо не е прочетено. systemd се провали, докато подготвяше процеса, преди изпълнимият файл да стартира, така че нито един парсер, нито един сертификат и нито един отдалечен хост не са били запитвани. Ченето на кода на състоянието като твърдение за systemd, а не за OpenVPN, е това, което превръща това в кратко разследване.
Прочетете кода на състоянието преди приложението
Числовият код след името на услугата назовава етапа, който се е провалил. Грешка в директория се отчита като състояние CHDIR, докато изпълним файл, който не е могъл да бъде стартиран, е напълно различен код. Двете изглеждат сходно в ред от обобщение и нямат нищо общо в причините си.
Това разграничение е важно, защото поправките са в различни файлове. Грешка CHDIR се отнася до път и до това как услугата го вижда. Грешка exec се отнася до бинарния файл, неговия интерпретатор или несвързан mount. Промяната на отдалечената точка на VPN, списъка с шифри или пътя до сертификата не може да реши нито една от двете.
Потвърдете, че грешката е при стартиране, а не след успешна работа. Ако услугата е работела вчера и сега се проваля на същия етап, нещо се е променило в директорията, правата ѝ или самия unit, и тази промяна е доказателството, което трябва да търсите.
Попитайте unit къде иска да бъде
Четете ефективния unit, а не файла, който смятате за инсталиран, защото drop-in файловете могат да заменят работната директория, без някога да редактирате главния unit. Изходът на show отговаря директно на въпроса:
systemctl cat [email protected]
systemctl show [email protected] -p WorkingDirectory -p RootDirectory -p User -p ProtectHome
journalctl -u [email protected] -b --no-pager | tail -30
За шаблона на upstream сървър работната директория е директорията с конфигурацията на сървъра и името на инстанцията избира профила вътре в нея. Затова инстанция с име branch очаква своя файл в същата директория, а профил, поставен другаде, изобщо не изпълнява изискването за работна директория.
Сравнете какво изисква unit с това, което съществува. Път, който някога е съществувал, символна връзка, която сега сочи другаде, или име на инстанция, което вече не съответства на директория, са обичайни промени, които пораждат точно тази грешка.
Проверете пътя така, както го вижда услугата
Вашият shell и услугата не споделят един и същ изглед на файловата система. Настроена коренова директория или root image променя значението на абсолютния път вътре в unit, а път, който очевидно съществува на хоста, може да липсва в това пространство от имена. Прочетете настройките на unit, преди да се доверите на ръчен тест.
Правата задълбочават проблема. Услугата работи като определен потребител и този потребител трябва да може да премине през всяка родителска директория, за да достигне целта, а не само да прочете самата цел. Директория, четена от root и непреходна за потребителя на услугата, поражда грешка, която изглежда като липсващ път.
namei -l /etc/openvpn/server
systemctl show [email protected] -p ProtectSystem -p ReadOnlyPaths
Настройките за укрепване също са част от тази картина. Unit, който скрива домашните директории или прави част от файловата система само за четене, прави точно това, за което е конфигуриран, и работната директория трябва да живее там, където sandbox все още я показва.
Поправете собственика, после очаквайте друга грешка
Поправете оформлението или unit чрез този, който притежава тази конфигурация. Преместването на профил в очакваната директория е законна поправка, когато оформлението е грешно, но не обяснява директория, в която не може да се влезе, затова не го третирайте като общия отговор.
Устоявайте на съблазънта да разширите правата върху дървото с конфигурация или да премахнете sandbox. И двете махат симптома, докато премахват защитите, поставени там нарочно, и следващата грешка ще бъде по-трудна за тълкуване.
Рестартирайте инстанцията и прочетете следващото събитие, вместо да предполагате успех. Вероятната следваща грешка е, че OpenVPN не може да отвори своя конфигурационен файл, което е напредък: влязохме в работната директория и парсерът вече работи. Оттам следвайте действителното съпоставяне на файловете на unit, вместо да се връщате към мрежово отстраняване на проблеми.
Справочникът за изпълнение на systemd определя как работната директория се тълкува заедно с кореновите директории и sandbox. Моделът за запомняне е прост: всеки код на състояние назовава различен етап и само собствените грешки на приложението описват приложението.