بقیهش رو نگفتم. میخواستم توی یه ارسال دیگه بگم که قبلی خیلی طولانی نشه. (همینجوری طولانی هست)
۴- پیشنهاد نمیکنم که کرنل و ماژولهای اون رو توی فلش نصب کنید و بعد سعی کنید همین سیستم رو با کرنل کامپایل شده بوت کنید، چون احتمالا باید یه لینک از جایی که ماژولها هستند، به داخل دایرکتوری /lib/modules/ درست کنید، فایل fstab رو تغییر بدید تا فلش شما رو یه جا سوار کنه و initramfs رو هم درست تنظیم کنید تا:
۱- ماژولهای موردنیاز برای بوت رو داخل خودش داشته باشه
۲- توی مراحل اولیه بوت، فلش شما رو سوار کنه تا کرنل به ماژولهای خودش دسترسی داشته باشه تا اگه لازم شد، هر کدوم رو بارگذاری کنه.
به خاطر همین بهتره یه base system دبیان ایجاد کنید و کرنل کامپایل شده رو داخل اون قرار بدید.
اول یه پارتیشن فلش رو روی /mnt/ سوار کنید. اطلاعات روی پارتیشن رو انتقال بدید یه جای دیگه، تا پارتیشن خالی باشه.
بسته debootstrap رو نصب کنید تا بتونید باهاش، یه base system دبیان ایجاد کنید.
sudo apt install debootstrap
حالا با debootstrap کار رو شروع کنید.
sudo debootstrap bullseye /mnt
به جای bullseye میتونید اسم چیزی که قراره نصب بشه رو قرار بدید. برای مثال، میتونید sid یا bookworm رو جایگزین bullseye کنید تا به ترتیب، دبیان ناپایدار یا دبیان ۱۲ نصب بشه. (دبیان ۱۲ توی حالت آزمایشی هست.) میتونید هم اسمهای اوبونتو رو بذارید. focal برای اوبونتو 20.04 و بقیه اسمها برای بقیه نسخههای اوبونتو/دبیان/devuan
به جای /mnt/ میتونید مسیری که قرار بستهها نصب بشن رو قرار بدید.
به صورت اختیاری میتونید آینهای که بستهها از اون دریافت میشن رو تعیین کنید. در صورتی که آینهای رو مشخص نکنید، به طور پیشفرض از
http://deb.debian.org/debian استفاده میشه.
برای تعیین آینه، آدرس کامل به همراه پروتکل رو در انتهای دستور بنویسید. مثلا برای استفاده از آینه
https://debian.hostiran.ir/debian اینجوری از دستور استفاده کنید.
sudo debootstrap bullseye /mnt https://debian.hostiran.ir/debian
توی مثال بالا، https پروتکل ارتباطی هست. برای اینکه ببینید چه پروتکلهایی پشتیبانی میشه، صفحه man مربوط به sources.list رو ببینید.
معمولا فایلها توی روتِ وبسرور نیستند و باید دایرکتوری رو هم مشخص کنید، توی مثال بالا debian، توی اکثر آینهها همین دایرکتوری هست.
debian.hostiran.ir، آدرس آینه هست، میشه مستقیم از ip هم استفاده کرد. در صورتی که پروتکل، file باشه، آدرس میشه مسیر یه دایرکتوری مثل این:
/srv/nfs/localmirror
بالاتر گفتم، man مربوط به sources.list رو ببینید.
برای دیدن یه لیست از آینههای دبیان،
این صفحه از وبسایت دبیان رو ببینید.
من خودم از آینه
https://a.docker-registry.ir/debian استفاده میکنم. مربوط به ابرآروان هست، سریع بروز میشه و داخلی هم هست به خاطر همین سرعت خوبی داره. از https هم پشتیبانی میکنه. توی وبسایت دبیان نیست، از یه جای دیگه پیداش کردم، درست یادم نیست کجا.
بعد از اینکه base system رو با debootstrap نصب کردید، سورس کرنل رو کپی کنید توی دایرکتوری زیر
/mnt/usr/src
معمولا سورسها رو اونجا قرار میدن. اگه خواستید، میتونید جای دیگه هم بذارید ولی ترجیحا توی فلش باشه تا آخر کار مجبور نباشید آپشنهای make رو عوض کنید تا کرنل و ماژولهاش رو توی جای درست کپی کنه.
بعد از اینکه سورس کرنل رو توی جای درست گذاشتید، کامپایل رو آغاز کنید. کامپایل رو از طریق سیستم فعلی انجام بدید چون ابزارهای مورد نیاز رو نصب کردید. میتونید هم توی chroot انجام بدید ولی اینجوری لازمه بستههای موردنیاز برای کامپایل رو توی chroot هم نصب کنید.
برای کامپایل، اول وارد دایرکتوری /mnt/usr/src/ بشید (یا اگه سورس کرنل رو جای دیگه گذاشتید، وارد اونجا بشید) بعد مثل قبل کانفیگ کرنل رو ایجاد کنید و دستور make رو بزنید. میتونید با آپشن j- تعیین کنید که چند نخ (thread) برای اینکار استفاده بشه.
بهتره این عدد از تعداد هستههای پردازنده شما بیشتر نباشه و گرنه ممکنه load average شما برای مدت زیادی از تعداد نخهای پردازنده شما بیشتر بشه، رم پر بشه و سیستم کِرَش کنه.
(اگه وقت زیاد ندارید، از اینجا تا جایی که گفتم "الان که حسابی سرتون با چرت و پرتهای من درد گرفت، برگردیم سر موضوع اصلی
" رو رد کنید، زیاد به موضوع اصلی مرتبط نیستند اما خوندشون بد نیست)
اگه پردازنده از smt پشتیبانی میکنه و smt توی کرنل فعاله، میتونید عدد جلوی j- رو دو برابر کنید، برای اکثر پردازندههای اینتل و amd که اینطوره.
smt یه قابلیت هست که به پردازنده این امکان رو میده تا هر هسته، بتونه همزمان دوتا نخ رو اجرا کنه. برای اطلاعات بیشتر در این مورد،
اینجا رو ببینید. به طور ساده و غیر دقیق یعنی مثلا پردازنده شما ۴ تا هسته داره ولی با این قابلیت، انگار ۸ تا هسته داره، که هر هسته میتونه در هر لحظه، یه نخ رو اجرا کنه.
البته smt میتونه توی بعضی پردازندهها مشکل امنیتی درست کنه، عموما پردازندههای نسل ۶ و قبلتر اینتل (2016 و قبلتر) به این صورت که ممکنه نشت اطلاعات رخ بده.
این مشکل سختافزاری هست و با نرمافزار یا آپدیت microcode های پردازنده رفع نمیشه، دو راه برای حلش هست، یا از smt استفاده نشه یا اینکه پردازنده رو عوض کنید. (تعمییر پردازنده نه اقتصادیه نه چیزی که بشه به همین راحتی انجامش داد. فکر نکنم حتی خود اینتل هم این رو به همین راحتی انجام بده)
برای غیرفعال کردن استفاده از smt، میتونید پارامتر nosmt رو موقع بوت شدن به کرنل بدید. ممکنه توی تنظیمات uefi یا bios راهی برای غیرفعال کردن این باشه. برای کرنل در حال اجرا، میشه با نوشتن مقدار off یا forceoff (دومی رو با احتیاط استفاده کنید) توی فایل زیر، smt رو غیرفعال کرد. مشخصا این تغییر با راهاندازی مجدد از بین میره. راه اصلی رو بالاتر گفتم.
/sys/devices/system/cpu/smt/control
اینکه چجوری این نشت اطلاعات مشکل امنیتی حساب بشه، بستگی به برنامه و وضعیت سیستم داره، اما خیلی وقتا این مشکلی برای کامپیوترهای خانگی پیش نمیاره، بیشتر مربوط به سرورها میشه، غیرفعال کردن smt کامپیوتر شما رو کند میکنه (چون انگار نصف هستهها غیب شدن) پس بهتره حتی اگه این مشکل وجود داره، باز هم فعال بذاریدش.
برای اینکه ببینید این مشکل برای پردازنده شما هم هست یا نه، خروجی dmesg رو بررسی کنید. خودم همینجوری متوجه این موضوع شدم.
برای اطلاعات بیشتر،
اینجا رو ببینید.
توی عکسهای قبلی، دیدم که شما make رو همراه آپشن j12- اجرا کرده بودید. واقعا تعداد نخهای پردازنده شما اینقدره؟ اگه آره پس مشکلی نیست، در غیراینصورت ممکنه اتفاقی که بالاتر گفتم، پیش بیاد. (زیاد شدن load average )
دستور nproc میگه که شما چنتا نخ دارید. توی گنو/لینوکس، هر نخ، یه پردازنده به حساب میاد پس اگه چیزی تعداد پردازندههای شما رو ۸ گزارش کرد، در حالی که فقط یکی داشتید، تعجب نکنید.
الان که حسابی سرتون با چرت و پرتهای من درد گرفت، برگردیم سر موضوع اصلی
کانفیگ کرنل رو ایجاد کردید، حالا توی همین سیستم که هستید، make -j$(nproc) رو بزنید تا کرنل شروع به کامپایل بشه. بعد هم دستور زیر رو بزنید تا ماژولها کامپایل بشن
make -j$(nproc) modules
حواستون باشه توی دستور بالا، اشتباهی modules_install رو وارد نکنید، چون باعث میشه ماژولها علاوه بر کامپایل شدن، توی سیستم فعلی نصب بشن که ما نمیخواهیم، میخواهیم توی base system نصب بشن.
حالا که کامپایل خود کرنل و ماژولهای اون به اتمام رسید، وقت نصب کرنل هست. (این مرحله در اصل یه مشت ماژول به همراه خود کرنل رو کپی میکنه توی جای درست، بعدش هم یه depmod اجرا میکنه تا cache مربوط به ماژولها درست بشه. همین)
برای نصب، اول فایلسیستمهای مجازی رو سوار کنید. (فکر نکنم الان بهشون نیازی باشه ولی بودنشون مشکل درست نمیکنه)
for i in dev dev/pts sys proc; do
sudo mount -B /$i /mnt/$i
done
حلقه بالا کار رو راحتتر میکنه. معادل این هست که دستورات پایین رو اجرا کرد
sudo mount -B /dev /mnt/dev
sudo mount -B /dev/pts /mnt/dev/pts
sudo mount -B /sys /mnt/sys
sudo mount -B /proc /mnt/proc
همونطور که میبینید، دستورات خیلی شبیه هم، و تکراری هستند. به خاطر همین میشه با یه حلقه کار رو راحتتر کرد تا کمتر لازم باشه تایپ کنید.
الان با chroot، وارد base system بشید.
sudo chroot /mnt
توی base system برید داخل جایی که سورس کرنل رو ذخیره کرده بودید و دستورات make install و make modules_install رو بزنید تا به ترتیب کرنل و ماژولهاش توی جای درست کپی بشن.
الان شما با موفقیت base system رو همراه کرنل شخصیسازی شده خودتون نصب کردید، اما هنوز کار تموم نشده. لیست مخازن رو بروزرسانی کنید و بستههای locales و console-setup رو نصب کنید.
apt install locales console-setup
توی منویی که از شما سوال میپرسه، utf8 و EN رو انتخاب کنید.
الان منطقه زمانی و locales رو تنظیم کنید.
dpkg-reconfigure tzdata locales
tzdata رو قبلا دید پس میدونید چجوری هست. برای locales، ترجیحا یه چیزی انتخاب کنید که utf8 و انگلیسی باشه.
فایل fstab رو تنظیم کنید. یه همچین چیزی کافی هست تا روت سوار بشه. ولی برای استفاده طولانی بهتره که نوع فایلسیستم مشخص بشه، آپشنها بیشتر تنظیم بشن و بررسی fsck هم فعال بشه.
/dev/sdb1 / auto rw,defaults 0 0
اگه چیز خاصی مد نظر شما هست، توی fstab تنظیم کنید. حواستون باشه به جای sdb1، پارتیشن درست رو قرار بدید، فلش دیگهای رو هم موقع بوت به کامپیوتر وصل نکنید تا نام گذاری کرنل عوض نشه. اگه از uuid یا partuuid استفاده کنید بهتره.
ESP (همون پارتیشن EFI SYSTEM) رو توی fstab تعریف نکردیم، چون توی این شرایط، حتما لازمش نداریم. اگه میخواهید، خودتون تنظیمش کنید.
فایل mtab رو ایجاد کنید.
ln -s /proc/self/mounts /etc/mtab
امتحان کنید که دستور mount چی میگه،اگه خطا نداد، این مرحله رو درست انجام دادید.
با passwd یه رمز برای روت بذارید. (گذاشتن رمز برای روت مناسب نیست، ولی الان برای اهداف آزمایشی/آموزشی نباید مشکل درست کنه.)
اگه خواستید، یه hostname برای این سیستم بذارید. مثلا custom-kernel یا هرچیز دیگه. فقط فاصله نداشته و شامل کاراکترهای a-zA-Z0-9 و علامتهای - یا _ باشه. پیشفرض debian هست.
echo "custom-kernel" > /etc/hostname
فایل hosts رو هم تنظیم کنید.
echo "custom-kernel 127.0.1.1" >> /etc/hosts
بهجای custom-kernel مقدار hostname رو بذارید. توی شرکت یا جایی که کامپیوترهای زیادی هست، باید hostname و تنظیمات فایل hosts به دقت و با توجه به تنظیمات شبکه انجام بشه اما از اونجایی که توی خانه هستید و فکر نکنم تعداد زیادی کامپیوتر توی شبکه وجود داشته باشه، فعلا لازم نیست ملاحظه خاصی در نظر بگیرید. اگه تعداد کامپیوترها بیشتر از یکی هست، حواستون باشه hostname دو کامپیوتر یکی نباشه، همین کافیه.
گراب و یه initramfs system نصب کنید. بهتره برای initramfs system، از initramfs-tools که پیشفرض دبیان هست، استفاده کنید. dracut هم هست.
apt install grub-efi initramds-tools
بسته grub-efi، با توجه به معماری پردازنده فعلی، بسته گراب مرتبط رو نصب میکنه، در این حالت، grub-efi-amd64
اگه کامپیوتر توی حالت legacy بوت میشه، بسته grub-pc رو نصب کنید.
initramfs رو ایجاد کنید.
update-initramfs -c -k all
در صورتی که dracut رو نصب کردید، دستور dracut -f رو جایگزین بالایی کنید.
تنظیمات گراب رو بروزرسانی کنید.
update-grub
ولی گراب رو با grub-install، روی ESP نصب نکنید. همین الان، گراب روی ESP نصب شده، لازم نیست یه بار دیگه نصبش کنید.
از chroot خارج بشید.
exit
فایلسیستمهایی که قبلا سوار کردید رو unmount کنید
sudo umount -R /mnt
آپشن R- برای این هست که هر فایلسیستمی که زیر /mnt/ سوار شده هم unmount بشه. در اصل R- باعث میشه که عملیات unmount به طور بازگشتی انجام بشه، مثل ls -R یا grep -r یا بقیه دستورات که آپشنی برای انجام کارها به صورت بازگشتی دارند.
اگه R- رو مشخص نمیکردید، باید همه تین دستورات رو به ترتیب میزدید.
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt
همونطور که میبینید، میشه از یه حلقه هم استفاده کرد
از xargs و خیلی چیزهای دیگه هم میشه استفاده کرد، کلا راه زیاد دارید.
مطمئن بشید که بسته os-prober نصب هست.
apt list os-prober
اگه نبود نصبش کنید.
sudo apt install os-prober
الان تنظیمات گراب رو توی سیستم اصلی بروزرسانی کنید و ببینید توی خروجی، سیستمی که نصب کردید شناسایی میشه یا نه.
sudo update-grub
اگه شناسایی شده بود، کامپیوتر رو راهاندازی مجدد کنید و توی منوی گراب، سیستم نصب شده رو انتخاب کنید.
اگه فلش از استاندارد usb3 پشتیبانی نمیکنه، چیزهای زیادی روی فلش نصب نکنید، مخصوصا محیط گرافیکی چون عملکرد خیلی کندی میگیرید. اگه فلش usb3 هست، اون رو به یه درگاه usb3 یا بالاتر وصل کنید تا سرعت درست بگیرید، در غیر اینصورت سرعت usb2 یا حتی ممکنه usb1 بگیرید.