Dün tünel çalışıyordu, bu sabah ise unit journal'da Failed at step EXEC spawning /usr/local/bin/vpnclient ile ölü. Kimlik bilgileri, rotalar ve hesap o cümleye hiç girmez. systemd ExecStart'ı bir yola çözdü, çekirdekten onu çalıştırmasını istedi ve çekirdek reddetti, çoğunlukla o yolda hiçbir şey olmadığı veya dosya çalıştırılabilir olmadığı için. Ayrıştırılmış komut aksini kanıtlayana kadar hatayı dosya ve argv sorunu olarak ele alın.

EXEC neden kimlik doğrulama başlamadan başarısız olur

systemd ExecStart'ı bir kabuk üzerinden çalıştırmaz. Fork yapar, satırdan bir argüman vektörü kurar ve ilk öğe üzerinde execve çağırır. Bu çağrı başarısız olursa hizmet hiçbir zaman VPN istemcisinin kendi koduna ulaşmaz, bu yüzden profil düzenleme veya kimlik bilgisi denetimi yardımcı olamaz.

Durum kodu bu aileyi sıradan çökmelerden ayırır. status=203/EXEC ile çıkan unit hiçbir zaman bir süreç başlatmamıştır; başlayıp sonra status=1 ile çıkan unit kimlik doğrulamada, DNS'te veya yönlendirmede başarısız olmuş olabilir. Kodu istemci günlüğünden önce okuyun, çünkü ilk durumda istemci günlüğü boş olacaktır.

Journal'daki yol systemd'nin kullandığı yoldur, mutlaka sizin düzenlediğiniz yol değildir. Drop-in dosyaları ve oluşturucu çıktısı satıcının dosyasını geçersiz kılabilir ve eski bir daemon-reload eski satırı bellekte bırakır. Bu yüzden ilk tanı, değiştirdiğinizi hatırladığınız dosyayı açmak yerine systemd'ye komutu ne sandığını sormaktır.

İkili dosyanın yolunun yazıldığı üç yer

Dağıtım paketinden, satıcı betiğinden ve sürüm tarball'ından kurulan bir VPN istemcisi üç farklı öneke düşebilir. Unit, ayrıcalık kuralı ve kurulum programı bu öneklerden birer tanesini kaydetmiştir ve hata üçten ikisi uyuşmadığında ortaya çıkar.

RecordCommon valueHow to read it
Unit or drop-in/usr/local/bin/vpnclientsystemctl cat vpnclient.service
Installed binary/usr/bin/vpnclientcommand -v vpnclient, then ls -l the result
Sudoers grant/opt/vpnclient/bin/vpnclientsudo grep -r vpnclient /etc/sudoers.d/

Somut bir uyuşmazlık şöyle görünür: satıcı betiği /usr/local/bin içine kurar, tarball /opt altında açılmıştır ve unit hâlâ önceki paketten kalan eski /usr/bin yolunu belirtir. Bu dosyalardan yalnızca biri vardır ve bu nadiren ExecStart'taki dosyadır.

Herhangi bir dosyayı değiştirmeden önce hangi yolun kanonik olduğuna karar verin. İkili dosya dağıtım paketine aitse kanonik yol paketin yoludur ve unit onu izlemelidir. Satıcı betiğine aitse aynı kural satıcının öneki için geçerlidir. İkili dosyayı önekler arasında kopyalamak, sonraki yükseltmede birbirinden ayrılacak iki kopya oluşturur.

Tırnak içindeki bir komut dosya adına dönüştüğünde

İkinci hata kipi aynı journal satırının arkasına saklanır. Birisi bunu unit'e yazar ve istemcinin açılış sırasında bağlanmasını bekler:

ExecStart=/usr/bin/"vpnclient connect office"

systemd değeri sözcüklere böler, bu yüzden ilk sözcük /usr/bin/vpnclient connect office olur ve tırnaklar gruplama sözdizimi olarak kaldırılır. Ardından çekirdek adında boşluk bulunan bir dosya arar ve böyle bir dosya yoktur. İkili dosya kurulu olsa bile hata eksik ikili dosyayla aynıdır.

Desteklenen biçim, ardından ayrı argümanlar gelen gerçek bir çalıştırılabilir dosyadır, örneğin ExecStart=/usr/bin/vpnclient connect office. İş akışı gerçekten bir boru hattına veya zincire ihtiyaç duyuyorsa bunu bir betiğe koyun ve betiği çağırın, çünkü ExecStart'ta && yoktur, boru yoktur ve glob genişletmesi yoktur.

Dosya sistemini değil, unit'i onarın

Cazip onarım, beklenen yoldan gerçek ikili dosyaya bir sembolik bağlantıdır. Paket güncellenip bağlantı kaldırılmış bir dosyayı gösterene kadar veya bir SELinux etiketi hedefle eşleşmeyene kadar çalışır. Unit'i drop-in aracılığıyla düzenlemeyi tercih edin; böylece satıcının dosyası dokunulmadan kalır ve yükseltmeler öngörülebilir olur.

Ayrıcalık kuralı aynı yola ve aynı alt komutlara uymalıdır. /usr/local/bin/vpnclient için sudoers girdisi /usr/bin/vpnclient yetkisini vermez ve her argümana izin veren bir girdi, herhangi bir yerel sürecin tüneli yeniden yapılandırmasına veya durdurmasına izin verir. Unit'in ihtiyaç duyduğu iki fiili verin ve hizmeti durdurmak arayüzü zaten kapatıyorsa sökme işlemini bunun dışında tutun.

Karşılaştırma burada karşılığını verir: unit, paket veritabanı ve sudoers aynı yolu belirtmelidir. Bunu yaptıklarında EXEC hatası yeniden başlatma olmadan ve ikili dosyanın üçüncü bir yerde kopyası olmadan kaybolur.

Yeniden başlatmadan önce ayrıştırılmış komutu kanıtlayın

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-pager

systemctl show belirleyici çıktıdır çünkü systemd'nin gerçekten ayrıştırdığı argv'yi, herhangi bir drop-in dahil yazdırır. systemd-analyze verify yeniden başlatmadan önce eksik veya çalıştırılamayan yolu yakalar ve yeniden başlatmadan sonraki status komutu sürecin artık var olup olmadığını söyler.

Unit başlayıp sonra başarısız olursa EXEC ailesinden çıkmış ve istemcinin kendi hata işlemesine girmişsinizdir. Journal'da istemcinin iletisini arayın, bir başka execve başarısızlığını değil. Unit diffini ve sudoers diffini değişiklik kaydında birlikte tutun, böylece sonraki yükseltme bölünmüş yolu sessizce geri getirmez.

İlgili makaleler