ساخت توزیع لینوکس از جمله کارهاییه که معمولا وقتی کسی وارد دنیای لینوکس میشه دوست داره تجربهش کنه. چرا؟ چون فکر میکنه افراد قبلی که این کار رو کردند، آدمهای خفنی بودن (که تفکر غلطی هم نیست) و فکر میکنند اگر دست کم یک توزیع بسازن آدم خفنی میشن (که تفکر غلطیه).
حالا آیا واقعا آدم خفنی میشیم اگر یک توزیع بسازیم؟ خیر. اما به ما در جهت پیشرفت و خفن شدن کمک میکنه. میپرسید چطوری؟ در جریان ساخت توزیع لینوکس شما با زیر و بم این سیستمعامل آشنا میشید و میفهمید ابزارهای مختلف چطور کار میکنند. این روش، یکی از بهترین روشهای یادگیری لینوکس و حتی سیستمعامله.
فکر کنم پیشتر به قدر کافی در مورد این که چند راه برای ساخت توزیع داریم حرف زدم. در این پست منتها قصد اینه که یک دبیان یا اوبونتویی که از پیش روی سیستم خودمون (یا ماشین مجازی) نصب شده رو به یک ISO زنده تبدیل کنیم.
نصب و پیکربندی دبیان یا اوبونتو
در قدم اول، شما نیاز دارید که دبیان یا اوبونتو رو روی سیستم خودتون یا ماشین مجازی نصب کنید. توصیه شخصی من اینه که در دیسک یا پارتیشن جدایی نصب کنید. چرا؟ چون ما محدودیتهایی در ISO داریم. عموم ISO هایی که از توزیعهای مختلف لینوکس ساخته میشن، استانداردشون iso9660 عه که یک محدودیت ۴ گیگابایتی داره. پس باید حواسمون به این موضوع هم باشه.
بعد از نصب (نصب دبیان و اوبونتو خیلی سادهست : نکست نکست نکست …)، نیازه که این بستهها حتما نصب بشن:
~:$ sudo apt install git mtools xorriso squashfs-tools
این بستهها شامل یک سری ابزار دم دستی برای مدیریت فایلسیستم و … هستند. حجم زیادی هم ندارند. البته، git که معرف حضور هست برای چی استفاده میشه و خب ما قراره باهاش یه سری چیزا رو از گیتهاب/گیتلب دریافت کنیم.
همچنین، بعد از نصب بستههای بالا، مطمئن بشید که rsync هم در سیستم نصب شده. این بسته معمولا در توزیعهای لینوکسی نصبه، اما اگر نبود هم خطری نداره. میتونید نصبش کنید.
شخصیسازی
خب در بحث شخصی سازی ما سناریوهای مختلفی داریم. در حال حاضر، قصد ورود به بخشهایی مثل تغییر لوگو و … ندارم. اما مثلا شخصی سازی میزکار کجاست؟!
شما اگر دستور زیر رو اجرا کنید:
~:$ ls -a ~
یک سری فایل و فولدر میبینید که با نقطه شروع شدند. اینها اسمشون «نقطهپرونده» یا «داتفایل»ـه. معمولا پیکربندیها اینجان. این پیکربندیها، تنظیمات پوسته، میزکار و … رو شامل میشن.
خب، حالا که در مورد اینها میدونیم با خیال راحت شخصیسازیمون رو انجام میدیم. بعدش با این دستور، پیکربندیهامون رو آماده انتقال به کاربران دیگر میکنیم :
~:$ sudo cp -r ~/.config /etc/skel ~:$ sudo cp -r ~/.local /etc/skel ~:$ sudo cp ~/.bashrc /etc/skel ~:$ sudo cp ~/.profile /etc/skel ~:$
حواستون باشه که یک سری تنظیماتی مثل gnome-keyring در پوشه local هست که باید حذف کنید بعد انتقال.
حالا این skel چیه که انقدر مهمه؟ skel کوتاهشده skeleton عه. در واقع اسکلت کاربرا رو اینجا نگه میداریم. بعد از این که با useradd یا adduser یک کاربر جدید ایجاد کنیم، محتویات این پوشه رو برمیداره میبره میذاره در پوشه خانگی اون کاربر.
به عبارتی فرض کنید که یک سری الگو و نقشه از دکوراسیون خونه داریم، وقتی کسی از ما یه واحد میخره همون الگو رو میبریم در واحدش پیادهسازی میکنیم.
باقی شخصیسازیها هم بیشتر به نصب نرمافزار و … مربوط میشن. گرچه در مورد لوگو و … توضیح زیادی ندادم اما یک تقلبی به شما میرسونم. اگر از دبیان استفاده میکنید، دنبال desktop-base بگردید و اونجا خرابکاری کنید 😁 البته راههای تغییر ظاهر سیستمهای لینوکسی به اندازه راههای رسیدن به خداست، با کمی جست و جو و پرسشگری میتونید به نتیجههای بسیار خوبی برسید.
اسکریپت ساخت دیسک زنده
مدتها پیش در جریان ساخت کاپریس لینوکس (لینک) برای تهیه ایزوی نهایی، یک اسکریپتی نوشتم. این اسکریپت بعدها در ساخت سیستمعامل سانا (لینک) هم استفاده شد. در واقع، این اسکریپت تلاشی برای زنده کردن ابزارهایی مثل remastersys و relinux بود که در دوران قدیم (حوالی سال ۴۲) برای ساخت ایزوی زنده از یک سیستم لینوکسی استفاده میشد.
این اسکریپت رو به این شکل از گیتهاب دریافت میکنیم :
~:$ git clone https://github.com/Caprice-Linux/live_image custom_live
که به این شکل، پوشهای به اسم custom_live برای شما ساخته میشه که حاوی اسکریپت و متعلقاتش (مثل تنظیمات گراب و syslinux) میشه. الان، ما آمادهایم که دیسک زنده بسازیم!
ساخت دیسک زنده
حالا، ما مقدمات ساخت دیسک رو داریم و وقتشه که دیسک رو بسازیم. ابتدا، این دستورات رو اجرا میکنیم :
~:$ cd custom_live ~/custom_live:$ mkdir chroot
با دستور اول وارد پوشه custom_live میشیم و با دستور دوم یک فولدر خالی به اسم chroot ایجاد میکنیم. حالا وقتشه که از rsync عزیزمون استفاده کنیم برای انتقال سیستم نصب شده به این فولدر:
~/custom_live:$ rsync -av --one-file-system \ --exclude=/home/* \ --exclude=/root/* \ --exclude=/tmp/* \ --exclude=/sys/* \ --exclude=/dev/* \ --exclude=/proc/* \ --exclude=/var/mail/* \ --exclude=/var/spool/* \ --exclude=/var/tmp/* \ --exclude=/media/* \ --exclude=/etc/mtab \ --exclude=/etc/fstab \ --exclude=/etc/hosts \ --exclude=${pwd}/chroot / chroot
خب حالا وقتشه که با یک دستور جدید به اسم chroot آشنا شیم. این دستور، کارش ارسال یک سیگنال از پردازندهست که دایرکتوری ریشه رو به دایرکتوری مورد نظر ما تغییر بده. البته شرایط خاصی هم داره، مثلا این که سیستمعامل هر دو جا، یکی باشه. معماری یکی باشه و قص علی هذا.
با دستور chroot دایرکتوری root رو به chroot ای که ساختیم تغییر میدیم:
~/custom_live:$ sudo chroot chroot/
و حالا باید یک سری تغییراتی هم اینجا اعمال کنیم. این تغییرات شامل چیان؟ اول از همه دسترسی به اینترنت رو باید به قولی «یارو» کنیم. چطوری یارو کنیم؟ به این شکل :
# rm /etc/resolv.conf # echo "nameserver 4.2.2.4" > /etc/resolv.conf
بعد از این، لازمه که اسم میزبان رو تغییر بدیم :
# echo "custom" > /etc/hostname
بعدش هم دسترسی ریشه رو یارو کنیم:
# passwd
حالا لازمه یه سری بسته نصب کنیم. البته در حقیقت، چون ما از سیستم نصبشده استفاده کردیم، نیازی نیست تعداد زیادی بسته نصب کنیم و فقط یکیش کافیه :
# apt update # apt install live-boot
بسته live-boot ماژولهای مورد نیاز کرنل برای بوت شدن به صورت زنده رو هم بهش اضافه میکنه. در واقع به کرنل میگه که «من ازت میخوام به صورت زنده هم بتونی بوت بشی».
بعد از اضافه کردن این بسته، نوبتی هم باشه نوبت اینه که کَش apt رو پاک کنیم و یک کاربر به سیستم اضافه کنیم. به این شکل:
# apt clean # adduser live
بعد از این که کاربر رو اضافه کردیم، لازمه که لاگین اتوماتیک رو به lightdm و یا gdm (بسته به میزکار، توزیع مبدا و … ممکنه این قضیه فرق کنه) اضافه کنیم. از اونجا که این مطلب یه آموزش عمومیه، این قسمت رو بر عهده شما میذارم.
پس از این، لازمه دسترسی sudo هم به کاربر لایو بدیم :
# echo "live ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/live
تذکر مهم: این روش به شدت ناامنه و فقط برای دیسک زنده پاسخگوعه. اگر قراره دیسکتون قابل نصب باشه، حتما در تنظیمات نصاب لحاظ کنید که به صورت NOPASSWD کاربر رو نسازه. البته، نصابهای مطرح معمولا این موارد رو با سوال و جواب لحاظ میکنند.
خب، کافیه که الان با تایپ exit و فشردن کلید اینتر از محیط chroot خارج شیم. یه سری پیکربندی ریز مونده که باید انجام بدیم. این پیکربندیهای ریز در دبیان و اوبونتو متفاوتن ولی تفاوت اونقدری بزرگ نیست. در ادامه با هم میبینیم که چه تفاوتیه.
خب، همونطور که میدونید سیستمعامل برای بوت شدنش نیازمند کرنله. کرنل سیستمعامل و یک initial ram disk برای بوت شدن دیسک زنده نیازه. حالا اینا رو از کجا بیاریم؟ سادهست. از chroot مون میاریم.
در دبیان
خب در دبیان این قضیه راحته. به این شکل فایلا رو کپی میکنیم :
~/custom_live:$ cp chroot/boot/vmlinuz-* isotmp/live/vmlinuz ~/custom_live:$ cp chroot/boot/initrd.img-* isotmp/live/initrd.img
در اوبونتو :
در اوبونتو، اون initrd.img کمی اذیت میکنه. در واقع بخش اول عین دبیانه ولی بخش دوم اینطوریه :
~/custom_live:$ sudo cp chroot/boot/initrd.img-* isotmp/live/initrd.img ~/custom_live:$ sudo chown $USER:$USER isotmp/live/initrd.img
خب حالا مرحله آخر رسیده. مرحله آخر جاییه که میذاریم ISOمون پخته بشه …
ساخت ISO نهایی
خب لحظه موعود رسید. وقتشه که این همه کاری که کردیم رو ببریم در قالب یک ایزو. برای این کار فقط کافیه که اسکریپت build_image.sh رو به این شکل اجرا کنید:
~/custom_live:$ ./build_image.sh CustomLive.iso isotmp CUSTOMLIVE chroot
و بعد چند دقیقه ایزوی شما آمادهست. ایزویی که ساختید رو میتونید حالا با استفاده از qemu یا ویرچوالباکس و … تست کنید.
جمعبندی
همونطوری که دیدید، این کار گرچه از شما یه متخصص خفن نمیسازه، به شما یک دید بسیار بسیار خوب از کلیت قضیه ساخت توزیع میده. شاید باورتون نشه ولی خیلی از توزیعهای مطرح امروزی مثل مینت، المنتری و …؛ از همین جاها شروع کردند و این راه شروع خوبی برای یادگیری لینوکس و سیستمعامله.
امیدوارم مطلب، مطلب مفیدی بوده باشه. دوست دارم بدونم وقتی شما با استفاده از این مطلب توزیع خودتون رو میسازید، چه خلاقیتهایی به خرج میدید.