systemd میں OpenVPN کا بے ترتیب انتخاب: ExecStart کیوں ناکام ہوتا ہے
systemd کوئی شیل نہیں ہے، اس لیے ExecStart کے اندر ملی جلی نقل مر جاتی ہے۔ انتخاب کو ExecStartPre میں منتقل کریں، یا OpenVPN کو خود سرور چننے دیں۔
ایک ملک کے لیے چالیس .ovpn فائلیں فراہم کنندہ سے آتی ہیں، اور منصوبہ واضح لگتا ہے: کوئی ایک بے ترتیب نقل اس کی جگہ پر کریں، پھر سرنگ شروع کریں۔ ExecStart کے اندر پائپ لائن کے طور پر لکھنے پر وہ منصوبہ بوٹ کے وقت ایسے اسٹیٹس کوڈ کے ساتھ مر جاتا ہے جو کچھ نہیں سمجھاتا۔ یونٹ فائل کوئی اسکرپٹ نہیں ہے، اور اصلاح یہ ہے کہ یا تو واضح طور پر شیل لایا جائے یا فائلیں چننا بالکل بند کر دیا جائے۔
علامت: ایسا یونٹ جو شروع ہو کر فوراً مر جاتا ہے
اسٹیٹس دکھاتا ہے کہ سروس سیکنڈ کے ایک حصے میں ناکام ہوئی، اور جرنل کی سطر ایسے حکم کا نام لیتی ہے جو کسی بھی شیل کو کبھی نہیں ملا ہوگا۔ سرنگ کے بارے میں کچھ نظر نہیں آتا، کیونکہ سرنگ کبھی شروع ہی نہیں ہوئی۔
جرنل سے درست کمانڈ لائن پڑھنا اس کی تصدیق کا تیز ترین طریقہ ہے۔ systemd وہی دہراتا ہے جو اس نے چلایا، اور اسٹرنگ پائپ لائن کے حروف کو آپریٹر کے طور پر نہیں بلکہ لفظی دلائل کے طور پر دکھائے گی۔
ExecStart پائپ لائن کیوں نہیں چلا سکتا
systemd خود کمانڈ لائن کو تقسیم کرتا ہے، اپنے حوالہ اور متغیر کی تبدیلی کا اطلاق کرتا ہے، اور پھر نتیجہ براہ راست چلاتا ہے۔ پائپ، ری ڈائریکشن، شیل کی گلوب توسیع اور کمانڈ کی تبدیلی اس گرامر کا حصہ ہی نہیں ہیں۔ یہ ڈیزائن کا انتخاب ہے، کوتاہی نہیں: یونٹ اعلانیہ طور پر بتاتا ہے کہ کیا چلانا ہے، اور شیل کی منطق اس اسکرپٹ میں ہوتی ہے جسے یونٹ پکارتا ہے۔ دونوں اصلاحات اسی سے نکلتی ہیں، اور کسی میں بھی یونٹ کو زیادہ اختیارات دینے کی ضرورت نہیں۔
یہ گمراہ کن ایگزٹ کوڈ کی بھی وضاحت کرتا ہے۔ پہلے دلیل کو بائنری سمجھا جاتا ہے، اس لیے خراب بنی سطر آپ کی منطق کا کوئی حصہ چلنے سے پہلے ہی ناکام ہو جاتی ہے۔
انتخاب ExecStartPre میں کریں
براہ راست اصلاح ایک تیاری کا مرحلہ ہے جو واضح طور پر شیل کو بلاتا ہے، اور انتخاب اور آغاز کو ایک ہی یونٹ میں رکھتا ہے، تاکہ ایک میں ناکامی دوسرے کو اکیلا چلتا نہ چھوڑے۔
[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 کی جگہ لیتا ہے، اس لیے مشخص کنندہ کو واحد حوالہ علامات سے باہر رہنا چاہیے۔ xargs -r cp کو بغیر دلیل چلنے سے روکتا ہے جب گلوب کسی چیز سے نہیں ملتا۔ اور ناکام تیاری کا مرحلہ یونٹ کو روک دیتا ہے، اور یہی درست نتیجہ ہے: کل کی کنفیگریشن کے ساتھ شروع کرنا شروع نہ کرنے سے بدتر ہے۔ جو بے ترتیب انتخاب ہمیشہ ایک ہی فائل لیتا ہے وہ عام طور پر بدقسمتی نہیں ہے۔ جانچیں کہ آیا نقل کی گئی فائل پیکیج اپڈیٹ سے اوپر لکھی جا رہی ہے، یا گلوب صرف ایک پرانی اندراج سے مل رہا ہے۔
یا OpenVPN کو اینڈ پوائنٹ چننے دیں
OpenVPN پہلے ہی ایک پروفائل میں کئی اینڈ پوائنٹ رکھ سکتا ہے اور ان میں سے بے ترتیب چن سکتا ہے، جو شیل، نقل اور لکھنے کی اجازت کو بوٹ کے راستے سے مکمل طور پر ہٹا دیتا ہے۔
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
یہ شکل سرور کا انتخاب فراہم کنندہ کی لکھی فائل کے اندر رکھتی ہے، اس لیے فائلوں کے نام بدلنے والا گردش یونٹ کو نہیں توڑتا۔ یہ امیدواروں کی فہرست کو قابلِ تدقیق بھی بناتی ہے، جو کسی ڈائریکٹری پر گلوب کبھی نہیں ہوتا۔ جب پروفائل اینڈ پوائنٹ سے زیادہ چیزوں میں مختلف ہوں تو ملاپ اپنی جگہ رکھتا ہے: مختلف سرٹیفکیٹ، مختلف روٹنگ ہدایات، مختلف سائفر پالیسی۔ اس صورت میں انتخاب پوری کنفیگریشنز کے درمیان ہوتا ہے اور شیل کا مرحلہ اسے بیان کرنے کا ایماندار طریقہ ہے۔
استعمال شدہ انسٹانس اور فائل دوبارہ پڑھیں
اس کے مواد کو ڈیبگ کرنے سے پہلے تصدیق کریں کہ کون سا یونٹ واقعی چل رہا ہے۔ پیکیج شدہ میٹا سروس اور ٹیمپلیٹ بنیادی ڈھانچہ ہیں؛ آپ کی فائلوں سے مطابقت رکھنے والے یونٹ وہی انسٹانس ہیں جو انہی ناموں سے موسوم ہیں۔
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
جس انسٹانس کو کسی کو فعال کرنا یاد نہ ہو وہ عام طور پر پیکیج ڈائریکٹری میں بھٹکتی کنفیگریشن فائل تک لے جاتا ہے۔ ٹیمپلیٹ کے بجائے اسی نام والا انسٹانس بند کریں، ورنہ اگلی پیکیج اپ گریڈ اسے واپس لے آئے گی۔ تبدیلی کے بعد یونٹ شروع کریں اور جرنل کی بتائی ہوئی کمانڈ لائن پڑھیں، پھر وہ کنفیگریشن راستہ تصدیق کریں جو اس نے واقعی کھولا۔ وہ ایک جانچ کام کرنے والے بے ترتیب انتخاب کو گزشتہ ماہ کی فائل خاموشی سے دوبارہ استعمال کرنے والی سروس سے الگ کرتی ہے۔