شروع گنو/لینوکس روی برد ARM از ابتدا (با استفاده از Kali و iMX.6 به عنوان مثال)

TL؛ دکتر: من در حال ساخت یک تصویر کالی لینوکس برای کامپیوتر ARM، در برنامه هستم debootstrap, linux и u-boot.

شروع گنو/لینوکس روی برد ARM از ابتدا (با استفاده از Kali و iMX.6 به عنوان مثال)

اگر برخی از تک‌پرداخت‌کننده‌های نه چندان محبوب را خریداری کرده‌اید، ممکن است با نبود تصویری از کیت توزیع مورد علاقه‌تان برای آن مواجه شوید. تقریباً همین اتفاق افتاد Flipper One برنامه ریزی شده است. به سادگی هیچ لینوکس کالی برای IMX6 وجود ندارد (من در حال آشپزی هستم)، بنابراین باید خودم آن را مونتاژ کنم.

فرآیند دانلود بسیار ساده است:

  1. سخت افزار مقداردهی اولیه شده است.
  2. از قسمتی از دستگاه ذخیره سازی (کارت SD/eMMC/و غیره) بوت لودر خوانده و اجرا می شود.
  3. لودر به دنبال هسته سیستم عامل می گردد و آن را در قسمتی از حافظه بارگذاری می کند و آن را اجرا می کند.
  4. هسته بقیه سیستم عامل را بارگذاری می کند.

برای وظیفه من، این سطح از جزئیات کافی است، می توانید جزئیات را بخوانید در مقاله دیگری. "برخی" مناطق ذکر شده در بالا از تابلویی به تابلو دیگر متفاوت است، که برخی از مشکلات نصب را ایجاد می کند. بارگیری سیستم عامل های ARM سرور تلاش برای استانداردسازی با استفاده از UEFI، اما تا زمانی که برای همه در دسترس نباشد، باید همه چیز را جداگانه جمع آوری کنید.

ساخت فایل سیستم ریشه

ابتدا باید بخش ها را آماده کنید. Das U-Boot از سیستم های فایل مختلف پشتیبانی می کند، من FAT32 را برای آن انتخاب کردم /boot و ext3 برای root، این نشانه گذاری تصویر استاندارد برای Kali تحت ARM است. من از GNU Parted استفاده خواهم کرد، اما شما می توانید همان را بیشتر آشنا کنید fdisk. شما نیز نیاز خواهید داشت dosfstools и e2fsprogs برای ایجاد یک فایل سیستم: apt install parted dosfstools e2fsprogs.

پارتیشن بندی کارت SD:

  1. کارت SD را با استفاده از پارتیشن بندی MBR علامت گذاری کنید: parted -s /dev/mmcblk0 mklabel msdos
  2. ایجاد یک بخش برای /boot برای 128 مگابایت: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. اولین مگابایت از دست رفته باید برای خود نشانه گذاری و برای بوت لودر باقی بماند.
  3. یک root FS برای بقیه ظرفیت ایجاد کنید: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. اگر به طور ناگهانی فایل های پارتیشن را ایجاد یا تغییر نداده اید، باید «partprobe» را اجرا کنید، سپس جدول پارتیشن دوباره خوانده می شود.
  5. یک فایل سیستم پارتیشن بوت با برچسب ایجاد کنید BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. یک فایل سیستم ریشه با یک برچسب ایجاد کنید ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

عالی، حالا می توانید آن را پر کنید. این علاوه بر این نیاز خواهد داشت debootstrap، ابزاری برای ایجاد root FS در سیستم عامل های شبیه Debian: apt install debootstrap.

ما FS را جمع آوری می کنیم:

  1. پارتیشن را سوار کنید /mnt/ (از یک نقطه اتصال راحت تر برای خود استفاده کنید): mount /dev/mmcblk0p2 /mnt
  2. در واقع ما فایل سیستم را پر می کنیم: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. پارامتر --include مشخص می کند که به علاوه برخی از بسته ها را نصب کند، من یک شبیه ساز QEMU ساخته شده استاتیک را مشخص کردم. به شما اجازه می دهد تا اجرا کنید chroot به محیط ARM. معنی گزینه های دیگر را می توان در آن یافت man debootstrap. فراموش نکنید که هر برد ARM از معماری پشتیبانی نمی کند armhf.
  3. به دلیل تفاوت در معماری debootstrap در دو مرحله انجام می شود که مرحله دوم به شرح زیر انجام می شود: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. حالا باید بچرخید: chroot /mnt /bin/bash
  5. پر می کنیم /etc/hosts и /etc/hostname FS را هدف قرار دهید. همان محتوای موجود در رایانه محلی خود را پر کنید، به یاد داشته باشید که فقط نام میزبان را جایگزین کنید.
  6. شما می توانید هر چیز دیگری را سفارشی کنید. مخصوصا نصب میکنم locales (کلیدهای مخزن)، پیکربندی مجدد مناطق و منطقه زمانی (dpkg-reconfigure locales tzdata). فراموش نکنید که رمز عبور را با دستور تنظیم کنید passwd.
  7. یک رمز عبور برای root تیم passwd.
  8. آماده سازی تصویر برای من با پر کردن کامل می شود /etc/fstab در داخل /mnt/.

من مطابق با برچسب های ایجاد شده قبلی آپلود می کنم، بنابراین محتوا به این صورت خواهد بود:

LABEL=ROOTFS / خطاهای خودکار=remount-ro 0 1
LABEL=BOOT / پیش‌فرض بوت خودکار 0 0

در نهایت، می توانید پارتیشن بوت را سوار کنید، ما به آن برای هسته نیاز داریم: «mount /dev/mmcblk0p1 /mnt/boot/»

ساخت لینوکس

برای ساختن هسته (و سپس بوت لودر) در تست دبیان، باید مجموعه استاندارد GCC، GNU Make و فایل‌های هدر کتابخانه گنو C را برای معماری هدف نصب کنید (من دارم armhf، و همچنین سربرگ های OpenSSL، ماشین حساب کنسول bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. از آنجایی که لودر پیش فرض به دنبال یک فایل می گردد zImage در سیستم فایل پارتیشن بوت، زمان شکستن درایو فلش است.

  1. کلون کردن هسته خیلی طولانی است، بنابراین من فقط دانلود می کنم: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. بسته بندی را باز کنید و به دایرکتوری منبع بروید: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. قبل از کامپایل پیکربندی کنید: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. پیکربندی در دایرکتوری است arch/arm/configs/. اگر وجود ندارد، می توانید سعی کنید یک فایل آماده را پیدا و دانلود کنید و نام فایل موجود در این فهرست را به پارامتر ارسال کنید. KBUILD_DEFCONFIG. در موارد شدید، بلافاصله به پاراگراف بعدی بروید.
  3. می توانید به صورت اختیاری تنظیمات را تغییر دهید: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. و تصویر را متقاطع کامپایل کنید: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. اکنون می توانید فایل هسته را کپی کنید: cp arch/arm/boot/zImage /mnt/boot/
  6. و فایل‌های DeviceTree (شرح سخت‌افزار موجود روی برد): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. و ماژول های مونتاژ شده را به صورت فایل های جداگانه نصب کنید: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

هسته آماده است. شما می توانید همه چیز را جدا کنید: umount /mnt/boot/ /mnt/

Das U Boot

از آنجایی که بوت لودر تعاملی است، خود برد، یک دستگاه ذخیره سازی و یک دستگاه اختیاری USB-to-UART برای آزمایش عملکرد آن کافی است. یعنی می توانید کرنل و سیستم عامل را به بعد موکول کنید.

اکثریت قریب به اتفاق تولید کنندگان استفاده از Das U-Boot را برای بوت اولیه پیشنهاد می کنند. پشتیبانی کامل معمولاً در فورک خودش ارائه می‌شود، اما فراموش نکنید که در بالادستی مشارکت کنید. در مورد من، هیئت مدیره در پشتیبانی می شود خط اصلیپس چنگال نادیده گرفتم.

ما خود بوت لودر را جمع آوری می کنیم:

  1. کلون شاخه پایدار مخزن: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. بیایید به خود دایرکتوری برویم: cd u-boot
  3. آماده سازی پیکربندی ساخت: make mx6ull_14x14_evk_defconfig. این فقط در صورتی کار می کند که پیکربندی در خود Das U-Boot باشد، در غیر این صورت باید پیکربندی سازنده را پیدا کنید و آن را در ریشه مخزن در فایل قرار دهید. .config، یا به روش دیگری که سازنده توصیه می کند مونتاژ شده است.
  4. ما خود تصویر بوت لودر را با یک کامپایلر متقابل جمع آوری می کنیم armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

در نتیجه ما فایل را دریافت می کنیم u-boot.imx، این یک تصویر آماده است که می توان آن را روی فلش USB نوشت. ما روی کارت SD می نویسیم و از 1024 بایت اول صرف نظر می کنیم. چرا هدف را انتخاب کردم u-boot.imx? چرا دقیقا 1024 بایت از دست رفته است؟ این چیزی است که آنها پیشنهاد می کنند در آن انجام شود مستندات. برای سایر تابلوها، فرآیند ساخت و سوزاندن تصویر ممکن است کمی متفاوت باشد.

انجام شد، می توانید دانلود کنید. بوت لودر باید نسخه خود، اطلاعاتی در مورد برد را گزارش کند و سعی کند تصویر هسته را در پارتیشن پیدا کند. اگر شکست بخورد، سعی می کند از طریق شبکه بوت شود. به طور کلی، خروجی کاملاً دقیق است، در صورت بروز مشکل می توانید خطا را پیدا کنید.

به جای یک نتیجه گیری

آیا می دانستید پیشانی دلفین استخوانی نیست؟ این به معنای واقعی کلمه یک چشم سوم است، یک لنز چربی برای پژواک!

شروع گنو/لینوکس روی برد ARM از ابتدا (با استفاده از Kali و iMX.6 به عنوان مثال)

شروع گنو/لینوکس روی برد ARM از ابتدا (با استفاده از Kali و iMX.6 به عنوان مثال)

منبع: www.habr.com