apt purge বলছে প্যাকেজ নেই, তবু প্রতিটি স্টার্টে টানেল আবার উঠে আসে। জার্নাল বাড়তেই থাকে, রুট ফিরে আসে, আর মেশিন এমনভাবে চলে যেন কিছুই মুছিনি। ভেন্ডরের ইনস্টলার এমন ফাইল লেখে যা প্যাকেজ ম্যানেজার কখনও নথিভুক্ত করেনি, তাই প্যাকেজ সরানো আর পণ্য সরানো আলাদা কাজ. নিচের রানবুক দুটি রেকর্ড আলাদা করে এবং সরানোর কাজটি সচেতনভাবে শেষ করে।

দুটি ইনস্টলার, দুটি আলাদা রেকর্ড

Debian প্যাকেজ একটি ফাইল তালিকা রাখে, আর purge ঠিক সেই তালিকায় থাকা জিনিস এবং প্যাকেজ কনফিগারেশন মুছে। শেল ইনস্টলার বা .run বান্ডল এমন তালিকা রাখে না; এটি যেখানে খুশি লিখে, সাধারণত /opt, /usr/local আর /etc/systemd/system-এ। এই পাথগুলোর কোনওটি কোনও প্যাকেজের ফাইল তালিকায় থাকে না, তাই dpkg এদের জানে না, রিপোর্টও করে না। ফলে একই ফাইলসিস্টেমে দুজন ইনস্টলেশন মালিক থাকে আর তাঁদের মধ্যে কেবল একজন হিসাব রাখে।

মুছার আগে নির্দিষ্ট পাথটি dpkg-কে জিজ্ঞেস করুন। যে পাথ এটি অস্বীকার করে সেটি আপনার মুছার জন্য, আর একই উত্তর বলে দেয় পরের আপগ্রেড এটি ফিরিয়ে আনবে কি না।

dpkg -S /etc/systemd/system/acmevpn.service
systemctl list-unit-files | grep -i acmevpn

unit ও তার wants লিঙ্ক আলাদা ফাইল

চালু করা ইনস্টল করার থেকে আলাদা কাজ। unit তার [Install] বিভাগে টার্গেট সম্পর্ক ঘোষণা করে, আর systemctl enable সেই ঘোষণাগুলোকে প্রতিটি টার্গেটের .wants/ ডিরেক্টরিতে সিমলিঙ্কে পরিণত করে। এখন দুটি পাথ আছে: unit ফাইল আর যে লিঙ্ক এটিকে বুট টার্গেটে টেনে আনে। কেবল ফাইল মুছলে লিঙ্ক কিছুই নির্দেশ করে না, ফলে বুটে অভিযোগ ওঠে; কেবল লিঙ্ক মুছলে unit নাম ধরে চালু করা যায়। দুটোই যেতে হবে।

ক্রমানুসারে এগুলো সরান আর পরে রিলোড করুন, যাতে systemd পুরোনো সংজ্ঞা মেমরিতে ধরে না রাখে।

systemctl disable --now acmevpn.service
systemctl show -p FragmentPath -p ExecStart acmevpn.service
sudo rm /etc/systemd/system/acmevpn.service
sudo rm /etc/systemd/system/multi-user.target.wants/acmevpn.service
systemctl daemon-reload

অবস্থান ধরে নেওয়ার বদলে FragmentPath পড়ুন, কারণ ভেন্ডর /etc-এর বদলে /usr/lib/systemd/system বা /lib/systemd/system-এ লিখে থাকতে পারে। আপনি যে কপিটি আশা করেছিলেন সেটি মুছলে কার্যকর কপিটি চলতেই থাকে, আর পরের রিলোড পর্যন্ত মেরামত সফল মনে হয়। রিলোড শেষ হলে আবার unit ফাইলগুলো তালিকাভুক্ত করুন এবং নামটি আর দেখা যাচ্ছে না নিশ্চিত করুন।

যে বাইনারি এই ব্যবস্থা টিকিয়ে রাখে তা খুঁজুন

সক্রিয় unit প্যাকেজ ডেটাবেস যা-ই ভাবুক, ডেমন চালু করতেই থাকে। সেই প্রসেস টানেল আবার তুলতে পারে, রুট আবার যোগ করতে পারে, বা kill-switch নিয়ম ফিরিয়ে আনতে পারে, আর আপনি লেআউট না দেখা পর্যন্ত আচরণ অলৌকিক মনে হয়। ExecStart পাথ অনুসরণ করুন এবং বাইনারিটি এখনও আছে কি না দেখুন, কারণ /opt-এর নিচে পড়ে থাকা একটি এক্সিকিউটেবলই এই ব্যবস্থার সব প্রয়োজন। unit মুছলে নির্ধারিত স্টার্ট বন্ধ হয়; প্রোগ্রাম মুছে যায় না।

স্টেট ডিরেক্টরিগুলোও একই যত্নে দেখুন। অ্যাকাউন্ট টোকেন, তৈরি প্রোফাইল আর ক্যাশ করা সার্ভার তালিকা /var/lib-এর নিচে বা হোম ডিরেক্টরিতে থাকে, আর এগুলো ফেলনা ক্যাশ নয়, ক্রেডেনশিয়াল। সার্ভিস বন্ধ করার পর সচেতনভাবে এগুলো সরান এবং কী নিলেন তা টুকে রাখুন।

sudo ls -l /opt/acmevpn /usr/local/bin/acmevpn
sudo find /var/lib -maxdepth 2 -iname "*acme*"
systemctl is-enabled acmevpn.service

বুটের এক মালিক বাছুন এবং পরীক্ষা করুন

তিনটি প্রার্থী বুটের দাবি করতে পারে, আর তিনটিই ইনস্টল করলে দ্বিগুণ সুরক্ষা নয়, বরং প্রতিযোগিতা তৈরি হয়। ডেস্কটপ অটোস্টার্ট ফাইল কেউ সাইন-ইন করার পরেই চলে, systemd unit আগে চলে কিন্তু হেডলেসে কাজ করা ক্লায়েন্ট দরকার, আর cron @reboot এন্ট্রি এমন সময়সূচিতে চলে যা নেটওয়ার্ক ক্লায়েন্টের জন্য ভুল হতে পারে। ভেন্ডরের CLI অতিরিক্ত সার্ভার আর্গুমেন্ট চাইতে পারে, কারণ বুটে আগের সেশন নেই যা পুনরায় শুরু করা যায়। ক্লায়েন্ট যেভাবে প্রমাণীকরণ করে তার সঙ্গে মেলে এমন প্রার্থী বাছুন, বাকিগুলো বাদ দিন।

মেশিন রিবুট করে তিনটি স্বাধীন তথ্য দেখে পরীক্ষা করুন: unit-এর অবস্থা, প্রসেস তালিকা, আর যাচাইযোগ্য কিছুতে নতুন সংযোগ। কী-রিং বা ইন্টারঅ্যাকটিভ লগইন দরকার এমন ক্লায়েন্ট সঠিক unit ফাইল থাকলেও বুটে ব্যর্থ হয়, আর জার্নাল তা বলে যদি কেবল সার্ভিস স্ট্যাটাস না পড়ে জার্নাল পড়েন।

হয় ক্লায়েন্টকে প্রম্পট ছাড়া কাজ করা ক্রেডেনশিয়াল দিন, নয়তো সাইন-ইনে চালু করুন। দুটোই যুক্তিসঙ্গত, আর দুটো মিলিয়ে দিলেই এক টানেলের দুই মালিক হয়ে যায় যারা এর জন্য লড়ে।

পরের purge কী আশা করবে তা লিখে রাখুন

যেকোনও ম্যানুয়াল সরানোর পর দুটি তথ্য টুকে রাখুন: কোন ইনস্টলার এই ব্যবস্থা তৈরি করেছে, আর এখন কোন মালিক এটি চালু করে। সেই টীকা পরের purge-কে বিস্ময় থেকে চেকলিস্টের এক বিন্দুতে বদলে দেয়, আর কাজটি করা ব্যক্তির চেয়ে বেশিদিন থাকে।

এটি ব্যক্তিগত ডিরেক্টরিতে নয়, সার্ভিস কনফিগারেশনের পাশে রাখুন এবং তারিখ দিন, কারণ ভেন্ডর আপডেট আপনার মুছা unit ফিরিয়ে আনতে পারে। কয়েক মাস পরপর systemctl list-unit-files সেই টোকার সঙ্গে মিলিয়ে দেখলে মেরামত এখনও সস্তা থাকতেই পুনরুদ্ধার ধরা পড়ে।

সম্পর্কিত নিবন্ধ