মূল লেখায়

আর্চলিনাক্সের জন্য কাস্টম প্যাকেজ রিপজিটরি

$ sudo pacman -S firefox
$ sudo apt install libreoffice
$ sudo dnf install vlc

বিভিন্ন ডিস্ট্রোতে প্যাকেজ ম্যানেজার দিয়ে প্যাকেজ ইনস্টল করার পুরো ব্যাপারটাই অত্যন্ত সোজা। একটা সহজ কমান্ড দিয়ে একটা অফিশিয়াল রিপজিটরি থেকে রাজ্যের সব প্যাকেজ একজায়গায় পাওয়া যায়।

যেমন, আর্চের রিপজিটরির একটা মিরর হচ্ছে: http://mirror.xeonbd.com/archlinux/

কিন্তু অফিশিয়াল রিপজিটরিতে অনেক প্যাকেজ পাওয়া যায় না। সেক্ষেত্রে নিজস্ব একটা প্যাকেজ রিপজিটরি বানিয়ে নেয়া যায়, ফলে ডিফল্ট প্যাকেজ ম্যানেজার দিয়েই সরাসরি নিজস্ব কাস্টম প্যাকেজ ইনস্টল করে নেয়া যাবে; aur থেকে makepkg দিয়ে ইনস্টল করা, বা make দিয়ে বিল্ড করা, বা কোন র‌্যান্ডম আর্কাইভ ডাউনলোড করে install.sh জাতীয় স্ক্রিপ্ট চালিয়ে ম্যানুয়ালি ইনস্টল করা, ইত্যাদি হরেক রকম বিকল্প ব্যবস্থা লাগবে না।

অবশ্য এই প্যাকেজ রিপজিটরিগুলোর গঠন আর কনফিগারেশন দেখলে মনে হয়, প্যাকেজ ইনস্টল করা যত সোজা, রিপজিটরি তৈরি করা হয়ত ততটাই কঠিন। কিন্তু আসলে নিজস্ব প্যাকেজ রিপজিটরি তৈরি করে ফেলা মোটেই জটিল কোন কাজ না। মোটের ওপর, কেবল যথেষ্ট অনলাইন ওয়েবস্পেস থাকলেই বিভিন্ন নিজস্ব রিপজিটরি বানিয়ে হোস্ট করা ফেলা সম্ভব! 😮

যেমন, আর্চের জন্য একটা ফর্মাল রিপজিটরি বানিয়ে ফেলা যায় খুবই সহজ কয়েকটা ধাপেই:

  • প্যাকেজ তৈরি
  • জিপিজি সাইনিং
  • রিপজিটরি ডেটাবেজ তৈরি
  • (সবকিছু অনলাইনে রাখা)
  • প্যাকম্যানে রিপজিটরি যোগ করা
  • রিপজিটরি আপডেট

ডিরেক্টরি প্রস্তুতি

রিপজিটরির কাজ করার জন্য একটা ডিরেক্টরি বানাই:

$ mkdir repo-workarea
$ mkdir repo-workarea/repo repo-workarea/work

রিপজিটরির চূড়ান্ত ফাইলপত্র থাকবে repo-workarea/repo ডিরেক্টরিতে, আর repo-workarea/work হচ্ছে প্রস্তুতিমূলক কাজকর্মের জন্য অস্থায়ী লোকেশন।

প্যাকেজ তৈরি

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

উদাহরণ হিসাবে, firefox-nightly আর protonvpn-cli-ng, এই দুটো প্যাকেজ aur থেকে নিয়ে কাস্টম রেপোতে রাখবো ধরে নিলাম। শুরুতেই এদের ইনস্টলেবল প্যাকেজ তৈরি করতে হবে।

repo-workarea/work-এ গিয়ে প্যাকেজ দুটো aur থেকে ক্লোন করে বিল্ড করি:

$ cd repo-workarea/work
$ git clone https://aur.archlinux.org/firefox-nightly.git
$ cd godot
$ makepkg -frcs --noconfirm
$ mv *.pkg.tar.* ../
$ cd ..
$
$ git clone https://aur.archlinux.org/protonvpn-cli-ng.git
$ cd protonvpn-cli-ng
$ makepkg -frcs --noconfirm
$ mv *.pkg.tar.* ../
$ cd ..

এই কমান্ডগুলো একাধারে প্যাকেজগুলো বিল্ড করবে এবং *.pkg.tar.xz আর্কাইভগুলো1 নিজ নিজ সাবডিরেক্টরি থেকে repo-workarea/work-এ সরিয়ে নিয়ে আসবে।

জিপিজি কী তৈরি

প্যকেজ তো হল, এবার রিপজিটরি থেকে প্যাকেজ ডাউনলোডের ইন্টেগ্রিটি নিশ্চিত করা জন্য একটা জিপিজি কী দরকার, যা দিয়ে প্যাকেজ এবং রিপজিটরি ডেটাবেজ সাইন করা হবে। নিজস্ব জিপিজি কী তৈরি করা না থাকলে জিপিজি ওয়েব কী ডিরেক্টরির পোস্টের পিজিপি কী জেনারেশন ধাপটা অনুসরন করলেই হবে।

অথবা এই কমান্ড দিয়ে শর্টকাটে কী বানিয়ে নেয়া যায়।

$ gpg --gen-key

কমান্ডটার শেষে টার্মিনালে A52A51D08ECDD98D0D72559DD08C742600CAA880 এরকম একটা স্ট্রিং দেখা যাবে, এটা হচ্ছে এই কী এর ফিঙ্গারপ্রিন্ট। পুরো ফিঙ্গারপ্রিন্টের পরিবর্তে শর্ট ফর্মটা (শেষের আটটা ক্যারেক্টার) মাথায় রাখলেও কাজ হতে পারে: 00CA A880

রিপজিটরি তৈরি

প্যাকেজ আর্কাইভগুলো repo-workarea/repo ডিরেক্টরিতে সরিয়ে নিয়ে এলাম। এবং টার্মিনালে ওই ফোল্ডারটা ওপেন করি। লিস্ট করলে দুটোমাত্র ফাইল দেখা যাবে:

$ # repo-workarea/repo ডিরেক্টরিতে আছি
$ ls
firefox-nightly-76.0a1.20200406-1-x86_64.pkg.tar.xz
protonvpn-cli-ng-2.2.2-1-any.pkg.tar.xz

(ভার্সন নম্বর স্বভাবতই মেলার কথা না।)

এবার আগের ধাপে তৈরি হওয়া জিপিজি কী দিয়ে প্যাকেজগুলো সাইন করতে হবে1:

$ gpg_id="0x00CAA880"
$ for package in $(ls *.pkg.tar.xz); do
    gpg --detach-sign --no-armor -u $gpg_id $package
  done

এর ফলে প্যাকেজগুলোর পাশে একই ফাইলনেম-অলা .sig সিগনেচার ফাইল জেনারেট হবে।

$ ls
firefox-nightly-76.0a1.20200406-1-x86_64.pkg.tar.xz
firefox-nightly-76.0a1.20200406-1-x86_64.pkg.tar.xz.sig
protonvpn-cli-ng-2.2.2-1-any.pkg.tar.xz
protonvpn-cli-ng-2.2.2-1-any.pkg.tar.xz.sig

এখন রিপজিটরির ডেটাবেজ তৈরির পালা। এজন্য রিপজিটরির নাম বাছাই করতে হবে। ধরা যাক এই রিপজিটরির নাম হবে “bdeshi-space-demo-repo"। তাহলে এইভাবে প্যাকেজ আর্কাইভগুলোর তথ্য নিয়ে ডেটাবেজ তৈরি করা যাবে:

$ gpg_id="0x00CAA880"
$ repo_name="bdeshi-space-demo-repo"
$ repo-add -p -s -k $gpg_id ${repo_name}.db.tar.gz *.pkg.tar.xz

একই সাথে জিপিজি পাবলিক কী টাও ফাইলগুলির পাশে এক্সপোর্ট করি2:

$ gpg --export --armor $gpg_id > ${repo_name}.pubkey

ব্যাস, রিপজিটরি তৈরি হয়ে গেছে!

রিপজিটরি হোস্টিং

রিপজিটরি তো তৈরি হল, কিন্তু এই লোকাল ডিরেক্টরি থেকে প্যাকম্যান দিয়ে প্যাকেজ ইনস্টল করে খুব একটা লাভ হয় বলে মনে হচ্ছে না। তারচে পুরো ডিরেক্টরিটা অনলাইনে কোথাও আপলোড করলে, সেখান থেকে যেকোন আর্চলিনাক্স সিস্টেমে ওই প্যাকেজগুলি ইনস্টল করতে পারবো!

repo ফোল্ডারটায় ls দিয়ে নিচের মত লিস্টিং পাবো:

$ ls
bdeshi-space-demo-repo.db
bdeshi-space-demo-repo.db.sig
bdeshi-space-demo-repo.db.tar.gz
bdeshi-space-demo-repo.db.tar.gz.sig
bdeshi-space-demo-repo.files
bdeshi-space-demo-repo.files.sig
bdeshi-space-demo-repo.files.tar.gz
bdeshi-space-demo-repo.files.tar.gz.sig
bdeshi-space-demo-repo.pubkey
firefox-nightly-76.0a1.20200406-1-x86_64.pkg.tar.xz
firefox-nightly-76.0a1.20200406-1-x86_64.pkg.tar.xz.sig
protonvpn-cli-ng-2.2.2-1-any.pkg.tar.xz
protonvpn-cli-ng-2.2.2-1-any.pkg.tar.xz.sig

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

উদাহরণ হিসাবে পুরো রিপজিটরিটা এখানে আপলোড করে রাখলাম[^3]: https://github.com/bdeshi/bdeshi-space-demo-repo/tree/archlinux/archlinux

প্যাকম্যান রেজিস্ট্রেশন

রিপজিটরি তৈরি তো হল, এখন প্যাকম্যান যাতে এটা খুঁজে পায়, সে ব্যবস্থা করতে হবে। এজন্য দুটো তথ্য দরকার।

  • রিপজিটরিটার রুট ইউআরএল দরকার। গিটহাবে ওই ফাইলগুলো এই এড্রেসে পাওয়া যায়: https://raw.githubusercontent.com/bdeshi/bdeshi-space-demo-repo/archlinux/archlinux/ এটাই হচ্ছে রিপজিটরির সার্ভার রুট ইউআরএল।

  • আর রিপজিটরিটার নাম জানা দরকার। এই রিপজিটরির নাম বাছাই করেছিলাম “bdeshi-space-demo-repo”

এই দুটো তথ্য মাথায় রেখে /etc/pacman.conf ফাইলে নিচের মত একটা সেকশন যোগ করি:

[bdeshi-space-demo-repo]
Server = https://raw.githubusercontent.com/bdeshi/bdeshi-space-demo-repo/archlinux/archlinux/

আর মাত্র একটা কাজ বাকি আছে। যে জিপিজি কী দিয়ে রিপজিটরিটা সাইন করা হচ্ছে সেইটা প্যাকম্যানের কীরিংয়ে যোগ করতে হবে। যেহেতু বুদ্ধি করে পাবলিক কী টা রিপজিটরির সাথেই আপলোড করে ফেলেছি (bdeshi-space-demo-repo.pubkey), তাই এভাবে পাবলিক কী টা যোগ করতে পারবো:

$ sudo curl "https://raw.githubusercontent.com/bdeshi/bdeshi-space-demo-repo/archlinux/archlinux/bdeshi-space-demo-repo.pubkey" | sudo pacman-key -a -
$ sudo pacman-key --lsign-key 0x00CAA880

হয়ে গেল। এখন আমাদের এই রিপজিটরি প্যাকম্যানের ব্যবহারোপযোগী হয়ে গেছে।

$ sudo pacman -Syyu
$ pacman -S protonvpn-cli-ng

🎉

রিপজিটরি আপডেট

রিপজিটরির প্যাকেজ আপডেট বা নতুন প্যাকেজ যোগ করা কোন জটিল কাজ না। নতুন প্যাকেজ আর্কাইভগুলোর ওই ফোল্ডারে রেখে পুনরায় ঠিক আগের মতই gpg সাইনিং আর repo-add কমান্ডগুলো চালাতে হবে। পরে সবগুলো ফাইলশুদ্ধ আবার অনলাইনে আগের জায়গায় আপলোড করে দিলেই হল। আপডেটের সময় ডেটাবেজ ফাইলগুলোর .old ভার্সনও তৈরি হবে। সেগুলোও আপলোড করতে হবে।


পরিশিষ্ট

  • এখানে কেবল x86_64 আর্কিটেকচারের প্যাকেজ তৈরি করা হয়েছে। তাই আ্কিরেকচার অনুযায়ী প্যাকেজ ভাগ করিনি। pacman.conf$repo ভ্যারিয়েবলটা বর্তমান সিস্টেমের আর্কিটেকচার নির্দেশ করে। এইটা ব্যবহার করে একটাই সেকশন দিয়ে একাধিক আর্কিটেকচারের সাপোর্ট দেয়া যায়। $repo ভ্যারিয়েবলটা কিভাবে কাজ করে? pacman.conf এ অন্যান্য রিপজিটরির সার্ভার ইউআরএলে ঢুঁ মেরে দেখলেই বুঝে যাবার কথা।
  • জিপিজি সাইনিং প্রয়োজন না হলে, pacman.conf-এ Server = লাইনের পরে নতুন একটা লাইনে SigLevel = Optional লিখে দেয়া যায়। তবে সাইন করতে সমস্যা কী?
  • আর এটা বলাই বাহুল্য প্রায়, তবে জিপিজি সাইন করে পরে জিপিজি প্রাইভের কী টা যদি হারিয়ে যায় তাহলে কিন্তু সমস্যা।
  • এই পোস্টে “রিপজিটরি” শব্দটা ৩৬ বার ব্যবহার করেছি। 🙁


  1. ভবিষ্যতে আর্চের প্যাকেজ আর্কাইভগুলোর ডিফল্ট ফাইল এক্সটেশন হবে *.pkg.tar.zst। সেক্ষেত্রে কমান্ডগুলো সেভাবে পরিবর্তন করে নিতে হবে। ↩︎

  2. এটা রিপজিটরি তৈরির আবশ্যক ধাপ নয়। পাবলিক কী টা সহজে যাতে ইমপোর্ট করা হয়, সেজন্য রিপজিটরির সাথেই রাখা হচ্ছে। অন্য কোন ভাবে কী টা প্যাকম্যানে ইমপোর্ট করতে পারলেই চলে। ↩︎