Ralat Python OpenVPN 3: baiki alat itu, bukan Python sistem
Jejak balik menamakan penterjemah yang menjalankan frontend, bukan perkhidmatan yang memiliki terowong. Bandingkan keduanya sebelum mengubah apa-apa secara seluruh sistem.
Jejak balik muncul apabila arahan pengurusan VPN bermula, dan naluri pertama terus menuju pemasangan Python lain atau menghalaikan lalai sistem ke tempat lain. Naluri itu mencampurkan dua runtime yang tiada kaitan antara satu sama lain. Satu milik sistem pengendalian dan alat bawaannya; satu lagi milik mana-mana projek yang sedang anda bina. Menukar yang pertama untuk memenuhi yang kedua ialah cara desktop yang berfungsi kehilangan pengurus pakejnya.
Perbandingan yang berbaloi dibuat ialah antara komponen yang benar-benar gagal dan runtime yang anda berhak ubah. Kedua-duanya hampir tidak pernah menjadi objek yang sama.
Dua soalan Python yang kelihatan satu
Soalan pertama: penterjemah manakah yang menjalankan program yang mencetak jejak balik? Yang kedua: penterjemah manakah yang patut digunakan projek saya? Di terminal kedua-duanya kelihatan serupa kerana kedua-duanya dijawab dengan menaip python3, tetapi ia mempunyai pemilik, laluan peningkatan dan jejari kesan yang berbeza.
Alat sistem terikat pada penterjemah yang dibekalkan oleh distribusinya, bersama modul terkompil yang dibina terhadap ABI penterjemah itu. Projek terikat pada mana-mana persekitaran yang anda cipta untuknya. Menggerakkan lalai sistem mengubah yang pertama bagi setiap alat pada mesin sekali gus; mencipta persekitaran mengubah yang kedua bagi satu direktori.
Hanya satu daripada tindakan itu boleh dibatalkan dalam satu minit. Ia bukan yang pertama.
Komponen manakah yang menghasilkan ralat
Baca baris pertama jejak balik dan fail boleh laku yang menghasilkannya sebelum membaca apa-apa lagi. Frontend baris arahan, perkhidmatan berkeistimewaan dan pengikatan API ialah bahagian berasingan, dan hanya sebahagian daripadanya ialah Python.
command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pagerBaris pertama skrip menamakan penterjemah yang akan digunakannya, dan itulah penterjemah asal jejak balik. Pertanyaan pakej memberitahu siapa pemilik fail itu, yang menentukan siapa yang dibenarkan mengubahnya. Status perkhidmatan menjawab soalan yang sama sekali berbeza: sama ada backend berkeistimewaan yang benar-benar membuka sesi sedang berjalan.
Ralat import modul, penolakan pengaktifan D-Bus dan kelayakan yang ditolak ialah tiga peringkat berbeza. Ralat import berlaku sebelum sebarang sesi wujud, jadi apa jua jumlah konfigurasi VPN tidak akan membaikinya, dan perkhidmatan yang berfungsi juga tidak akan membaikinya. Mengelaskan mesej itu kepada salah satu daripada tiga peringkat tersebut ialah langkah pertama yang sebenar.
Apa yang persekitaran projek boleh dan tidak boleh baiki
Persekitaran projek menyelesaikan masalah projek: versi pustaka tepat yang diperlukan satu aplikasi, terasing daripada segala-galanya. Itu benar-benar berguna, dan itulah alat yang betul apabila program yang gagal ialah skrip milik anda.
uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'Arahan kedua menunjukkan salinan pengikatan mana yang dapat dilihat oleh penterjemah tertentu, dan itulah cara terpantas untuk membezakan pakej yang hilang daripada pakej yang terlindung. Jalankannya dengan penterjemah yang digunakan oleh skrip yang gagal, bukan dengan penterjemah lain yang kebetulan berfungsi.
Apa yang tidak dapat dilakukan persekitaran projek ialah membaiki frontend yang dibungkus oleh distribusi. Kebergantungan program itu dibina untuk penterjemah yang dipilih oleh pengurus pakej, dan menjalankannya di dalam persekitaran projek anda sama ada gagal atau menghasilkan campuran yang tiada siapa menyokongnya. Menyuntik laluan ke dalamnya dengan pemboleh ubah persekitaran ialah kesilapan yang sama dengan langkah tambahan: anda telah mengubah apa yang dimuatkan oleh alat itu tanpa mengubah apa yang diujinya. Pertukaran itu kelihatan seperti pembetulan hanya sehingga import seterusnya tiba.
Mengapa menghalaikan penterjemah sistem ialah perangkap
Menukar penterjemah lalai menarik kerana ia kelihatan membaiki jejak balik dengan satu arahan. Ia juga merosakkan andaian yang menjadi asas setiap alat Python berbungkus pada hos, dan kegagalan muncul kemudian di tempat yang tidak berkaitan.
Mekanisme pemilihan alternatif direka untuk bertukar antara pelaksanaan yang setara, bukan untuk memasang bahasa yang lebih baharu di bawah modul terkompil yang lebih lama. Sambungan terkompil dibina untuk ABI tertentu, jadi modul yang diimport semalam boleh gagal dimuatkan hari ini tanpa satu pakej pun dibuang.
Terdapat juga perangkap penamaan dalam nasihat yang ditemui orang. Arahan python tanpa versi tidak mempunyai satu makna sejagat merentas distribusi dan persekitaran, dan memperlakukannya sebagai sinonim tetap bagi versi utama tertentu menghasilkan pembetulan yang hanya berfungsi pada mesin tempat ia ditulis. Baca dasar sistem di hadapan anda, bukan dasar dalam catatan blog.
Ujian penerimaan yang berasingan
Dua ujian patut diletakkan di hujung, dan lulus satu tidak mengatakan apa-apa tentang yang lain. Yang pertama ialah arahan klien yang disokong berfungsi dengan penterjemah yang menjadi bungkusannya. Yang kedua ialah perkhidmatan berkeistimewaan mewujudkan sesi dan terowong membawa trafik.
openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0Kekalkan cara bebas untuk masuk ke mesin semasa anda bekerja, terutamanya jika VPN membawa satu-satunya akses pentadbiran anda. Perubahan pada penterjemah sistem ialah tepat jenis suntingan yang boleh merampas akses itu di tengah jalan.
Jika kegagalan itu ialah modul hilang bagi alat sistem, pembetulannya ialah operasi pakej melalui aliran kerja yang disokong. Jika kegagalan itu ialah konflik versi dalam projek anda sendiri, pembetulannya ialah persekitaran. Memilih antara kedua-duanya ialah keseluruhan keputusan, dan ia ditentukan oleh program mana yang mencetak jejak balik.