systemd இல் OpenVPN சீரற்ற தேர்வு: ExecStart ஏன் தோல்வியடைகிறது
systemd ஒரு shell அல்ல, எனவே ExecStart உள்ளே கலக்கப்பட்ட நகல் இறந்துவிடும். தேர்வை ExecStartPre க்கு நகர்த்துங்கள், அல்லது OpenVPN தானே சேவையகத்தைத் தேர்ந்தெடுக்கட்டும்.
ஒரு நாட்டிற்கான நாற்பது .ovpn கோப்புகள் ஒரு வழங்குநரிடமிருந்து வருகின்றன, மேலும் திட்டம் தெளிவாகத் தெரிகிறது: சீரற்ற ஒன்றை அதன் இடத்திற்கு நகலெடுத்து, பின்னர் சுரங்கப்பாதையைத் தொடங்குங்கள். ExecStart உள்ளே குழாயாக எழுதும்போது, அந்தத் திட்டம் துவக்கத்தில் எதையும் விளக்காத நிலைக் குறியீட்டுடன் இறந்துவிடும். யூனிட் கோப்பு ஒரு ஸ்கிரிப்ட் அல்ல, மேலும் சரிசெய்தல் என்பது shell ஐ வெளிப்படையாகக் கொண்டுவருவது அல்லது கோப்புகளைத் தேர்ந்தெடுப்பதை முற்றிலும் நிறுத்துவது.
அறிகுறி: தொடங்கி உடனே இறக்கும் யூனிட்
சேவை ஒரு வினாடியின் ஒரு பகுதியில் தோல்வியடைந்ததை நிலை காட்டுகிறது, ஜர்னல் வரி எந்த shell உம் ஒருபோதும் பெறாத கட்டளையைப் பெயரிடுகிறது. சுரங்கப்பாதையைப் பற்றி எதுவும் தெரியவில்லை, ஏனெனில் சுரங்கப்பாதை ஒருபோதும் தொடங்கவில்லை.
ஜர்னலில் இருந்து சரியான கட்டளை வரியைப் படிப்பது இதை உறுதிப்படுத்த வேகமான வழி. systemd தான் இயக்கியதை மீண்டும் கூறுகிறது, மேலும் சரம் குழாய் எழுத்துகளை இயக்கிகளாக அல்ல, நேரடி அளவுருக்களாகக் காட்டும்.
ExecStart ஒரு குழாயை ஏன் இயக்க முடியாது
systemd தானே கட்டளை வரியைப் பிரிக்கிறது, தனது சொந்த மேற்கோள் மற்றும் மாறி மாற்றீட்டைப் பயன்படுத்துகிறது, பின்னர் முடிவை நேரடியாக இயக்குகிறது. குழாய்கள், திருப்பிவிடல், shell இன் குளோப் விரிவாக்கம் மற்றும் கட்டளை மாற்றீடு இந்த இலக்கணத்தின் பகுதியே அல்ல. இது வடிவமைப்புத் தேர்வு, விட்டுவிடுதல் அல்ல: யூனிட் என்ன இயக்க வேண்டும் என்பதை அறிவிப்பாகக் கூறுகிறது, shell இன் தர்க்கம் யூனிட் அழைக்கும் ஸ்கிரிப்ட்டைச் சேர்ந்தது. இரண்டு சரிசெய்தல்களும் இதிலிருந்தே வருகின்றன, எதுவும் யூனிட்டிற்கு கூடுதல் சிறப்புரிமைகளை வழங்கத் தேவையில்லை.
இது தவறாக வழிநடத்தும் வெளியேறும் குறியீட்டையும் விளக்குகிறது. முதல் அளவுரு பைனரியாகக் கருதப்படுகிறது, எனவே தவறான வரி உங்கள் தர்க்கத்தின் எந்தப் பகுதியும் இயங்குவதற்கு முன்பே தோல்வியடைகிறது.
தேர்வை ExecStartPre இல் செய்யுங்கள்
நேரடிச் சரிசெய்தல் என்பது shell ஐ வெளிப்படையாக அழைக்கும் தயாரிப்பு படி, இது தேர்வையும் தொடக்கத்தையும் ஒரே யூனிட்டில் வைத்திருக்கிறது, எனவே ஒன்றில் ஏற்படும் தோல்வி மற்றொன்றைத் தனியாக இயங்க விடாது.
[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
உண்மையான இயந்திரத்துடனான தொடர்பை இது தாங்குமா என்பதை மூன்று விவரங்கள் தீர்மானிக்கின்றன. பெயரிடுதல் முதல் பொறி: systemd யூனிட்டைப் பகுப்பாய்வு செய்யும்போதே, bash இயங்குவதற்கு மிக முன்னதாக %i ஐ மாற்றுகிறது, எனவே குறிப்பீட்டாளர் ஒற்றை மேற்கோள்களுக்கு வெளியே இருக்க வேண்டும். குளோப் எதனுடனும் பொருந்தாதபோது cp அளவுரு இல்லாமல் இயங்குவதை xargs -r தடுக்கிறது. தோல்வியடைந்த தயாரிப்பு படி யூனிட்டை நிறுத்துகிறது, அதுவே சரியான விளைவு: நேற்றைய கட்டமைப்புடன் தொடங்குவது தொடங்காததை விட மோசம். எப்போதும் அதே கோப்பை எடுக்கும் சீரற்ற தேர்வு பொதுவாக துரதிர்ஷ்டம் அல்ல. நகலெடுக்கப்பட்ட கோப்பு தொகுப்பு புதுப்பிப்பால் மேலெழுதப்படுகிறதா, அல்லது குளோப் ஒரே பழைய உள்ளீட்டுடன் மட்டும் பொருந்துகிறதா என்பதைச் சரிபார்க்கவும்.
அல்லது OpenVPN முனைப்புள்ளியைத் தேர்ந்தெடுக்கட்டும்
OpenVPN ஏற்கனவே ஒரு சுயவிவரத்தில் பல முனைப்புள்ளிகளை வைத்திருக்க முடியும், அவற்றில் சீரற்ற முறையில் தேர்ந்தெடுக்க முடியும், இது shell, நகல் மற்றும் எழுதும் அணுகலை துவக்கப் பாதையிலிருந்து முழுவதுமாக நீக்குகிறது.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
இந்த வடிவம் சேவையகத் தேர்வை வழங்குநர் எழுதிய கோப்பிற்குள்ளேயே வைத்திருக்கிறது, எனவே கோப்புகளை மறுபெயரிடும் சுழற்சி யூனிட்டை உடைக்காது. இது வேட்பாளர் பட்டியலை தணிக்கை செய்யக்கூடியதாகவும் ஆக்குகிறது, இது ஒரு கோப்பகத்தின் மீதான குளோப்பிற்கு ஒருபோதும் இல்லை. சுயவிவரங்கள் ஒரு முனைப்புள்ளியை விட அதிகமாக வேறுபடும்போது கலக்கல் இன்னும் இடத்தைப் பெறுகிறது: வெவ்வேறு சான்றிதழ்கள், வெவ்வேறு வழிமாற்றல் கட்டளைகள், வெவ்வேறு சைஃபர் கொள்கை. அந்த நிலையில் தேர்வு முழு கட்டமைப்புகளுக்கு இடையே இருக்கும், shell படியே அதை வெளிப்படுத்தும் நேர்மையான வழி.
பயன்படுத்தப்பட்ட நிகழ்வு மற்றும் கோப்பை மீண்டும் படியுங்கள்
அதன் உள்ளடக்கத்தைப் பிழைதிருத்துவதற்கு முன் எந்த யூனிட் உண்மையில் இயங்குகிறது என்பதை உறுதிப்படுத்துங்கள். தொகுக்கப்பட்ட மெட்டா சேவையும் டெம்ப்ளேட்டும் உள்கட்டமைப்பு; உங்கள் கோப்புகளுடன் பொருந்தும் யூனிட்களே அவற்றின் பெயரால் அழைக்கப்படும் நிகழ்வுகள்.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
யாரும் இயக்கியதாக நினைவில் இல்லாத நிகழ்வு பொதுவாக தொகுப்பு கோப்பகத்தில் தொலைந்த கட்டமைப்பு கோப்பிற்கு இட்டுச் செல்கிறது. டெம்ப்ளேட்டிற்குப் பதிலாக அந்தப் பெயரிடப்பட்ட நிகழ்வை அணையுங்கள், இல்லையெனில் அடுத்த தொகுப்பு மேம்படுத்தல் அதைத் திரும்பக் கொண்டுவரும். மாற்றத்திற்குப் பிறகு யூனிட்டைத் தொடங்கி, ஜர்னல் தெரிவிக்கும் கட்டளை வரியைப் படித்து, பின்னர் அது உண்மையில் திறந்த கட்டமைப்புப் பாதையை உறுதிப்படுத்துங்கள். அந்த ஒரு சரிபார்ப்பே வேலை செய்யும் சீரற்ற தேர்வை கடந்த மாதக் கோப்பை அமைதியாக மீண்டும் பயன்படுத்தும் சேவையிலிருந்து பிரிக்கிறது.