Помилка Python в OpenVPN 3: ремонтуйте інструмент, а не системний Python
Трасування називає інтерпретатор, який запустив фронтенд, а не службу, якій належить тунель. Порівняйте їх, перш ніж щось перенаправляти в масштабі системи.
Трасування з'являється, коли запускається команда керування VPN, і перший порив веде до встановлення іншого Python або до перенаправлення системного типового значення кудись інше. Цей порив змішує два середовища виконання, які не мають нічого спільного одне з одним. Одне належить операційній системі та її спакованим інструментам; інше належить будь-якому проєкту, який ви створюєте. Замінити перше, щоб задовольнити друге, — це те, як робочий робочий стіл втрачає свій менеджер пакетів.
Порівняння, яке варто зробити, — між компонентом, який справді відмовив, і середовищем виконання, яке ви маєте право змінювати. Вони майже ніколи не є одним і тим самим об'єктом.
Два питання про Python, які виглядають як одне
Перше питання: який інтерпретатор запустив програму, що надрукувала трасування? Друге: який інтерпретатор має використовувати мій проєкт? У терміналі вони виглядають однаково, бо на обидва відповідають, набираючи python3, а власники, шляхи оновлення та радіус ураження в них різні.
Системний інструмент прив'язаний до інтерпретатора, з яким його постачив дистрибутив, разом зі скомпільованими модулями, зібраними під ABI цього інтерпретатора. Проєкт прив'язаний до будь-якого середовища, яке ви створите для нього. Переміщення системного типового значення змінює перше для кожного інструмента на машині одразу; створення середовища змінює друге для одного каталогу.
Скасувати за хвилину можна лише одну з цих дій. Це не перша.
Який компонент породив помилку
Перш ніж читати будь-що інше, прочитайте перший рядок трасування та виконуваний файл, який його породив. Фронтенд командного рядка, привілейована служба та прив'язки API — окремі частини, і Python з них лише деякі.
command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pagerПерший рядок скрипта називає інтерпретатор, який він використовуватиме, і саме від цього інтерпретатора прийшло трасування. Запит до пакета каже, кому належить файл, а це визначає, кому дозволено його змінювати. Стан служби відповідає на зовсім інше питання: чи працює привілейований бекенд, який справді встановлює сесії.
Помилка імпорту модуля, відмова в активації D-Bus і відхилені облікові дані — три різні стадії. Помилка імпорту трапляється до того, як існує хоч якась сесія, тож жодне налаштування VPN її не виправить, і робоча служба теж її не виправить. Віднести повідомлення до однієї з цих трьох стадій — і є справжній перший крок.
Що середовище проєкту може і чого не може виправити
Середовище проєкту розв'язує задачу проєкту: точні версії бібліотек, потрібні одній програмі, ізольовані від усього іншого. Це справді корисно, і це правильний інструмент, коли збійна програма — ваш власний скрипт.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'Друга команда показує, яку копію прив'язок бачить даний інтерпретатор, і це найшвидший спосіб відрізнити відсутній пакет від перекритого. Запускайте її тим інтерпретатором, який використовує збійний скрипт, а не іншим, який випадково працює.
Чого середовище проєкту не може — це відремонтувати фронтенд, спакований дистрибутивом. Залежності цієї програми зібрані під інтерпретатор, який вибрав менеджер пакетів, і її запуск у середовищі вашого проєкту або зазнає невдачі, або дає суміш, яку ніхто не підтримує. Вставляти в неї шляхи через змінну середовища — та сама помилка із зайвими кроками: ви змінили те, що завантажує інструмент, не змінивши те, проти чого його перевіряли. Цей обмін виглядає виправленням рівно до наступного імпорту.
Чому перенаправлення системного інтерпретатора — пастка
Змінювати типовий інтерпретатор привабливо, бо здається, що одна команда виправляє трасування. Це ще й ламає припущення, на якому побудований кожен спакований Python-інструмент на хості, а збої з'являються пізніше і в не пов'язаних місцях.
Механізми вибору альтернатив створювалися для перемикання між рівнозначними реалізаціями, а не для встановлення новішої мови під старішими скомпільованими модулями. Скомпільовані розширення збираються під конкретний ABI, тож модуль, який імпортувався вчора, сьогодні може не завантажитися без жодного вилученого пакета.
У порадах, які знаходять люди, є й пастка з назвою. Команда python без версії не має єдиного універсального значення в різних дистрибутивах і середовищах, а ставлення до неї як до фіксованого синоніма конкретної основної версії дає виправлення, що працюють лише на машині, де їх написали. Читайте політику системи перед вами, а не ту, що в статті блогу.
Окремі приймальні перевірки
Наприкінці доречні дві перевірки, і проходження однієї нічого не каже про іншу. Перша — підтримувана клієнтська команда працює з інтерпретатором, під який її спаковано. Друга — привілейована служба встановлює сесію, а тунель несе трафік.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0Поки працюєте, тримайте незалежний шлях на машину, особливо якщо VPN несе ваш єдиний адміністративний доступ. Зміна системного інтерпретатора — саме та правка, яка може відібрати цей доступ на півдорозі.
Якщо збій — відсутній модуль для системного інструмента, виправлення це операція з пакетом через підтримуваний робочий процес. Якщо збій — конфлікт версій у вашому власному проєкті, виправлення це середовище. Вибір між цими двома і є все рішення, і його визначає те, яка програма надрукувала трасування.