با قسمت بیست و سوم از دوره ورود به دنیای امبدد لینوکس که دوره مقدماتی آموزش امبدد لینوکس می باشد همراه ما باشید.
در قسمت قبلی سری آموزشی امبددلینوکس با پیدا کردن کتابخانه مورد نظر آشنا شدیم، در این قسمت می خواهیم به ساختن initramfs بپردازیم پس با سیسوگ همراه باشید.
ساختن initramfs
ما الان یه فایل سیستم روت داریم که توش حداقلهایی که کرنل نیاز داره هست. حالا میخوایم باهاش یه initramfs درست کنیم که لینوکسمون کامل بشه و بتونیم ازش استفاده کنیم.
قبلش من یه برنامه ساده که یه متن سلام دنیا! رو پرینت میکنه کامپایل میکنم و میذارمش توی روتمون:
1 2 | cd ~/EmbeddedLinux/RPI3BP/sysapps/ vi hello.c |
1 2 3 4 5 6 7 8 | #include <stdio.h> #include <stdint.h> int main (void) { printf("Hello World!\r\n"); printf("I'm Aniroot ^_^\r\n"); return 0; } |
1 2 | source ../at00exports.sh $GCC hello.c -o ../rootfs/home/hello |
حالا بریم initramfs رو بسازیم:
1 2 3 4 | cd ~/EmbeddedLinux/RPI3BP/rootfs find . | cpio -H newc -ov --owner root:root > ../initramfs.cpio cd .. gzip initramfs.cpio |
پرتاب
میخوایم پرتابی داشته باشیم که باهاش بتونیم لاگین کنیم و برنامهای که نوشتیم رو اجرا کنیم. در خصوص این برد عزیز! و دوستداشتنی شما، قبلاً گفته بودم بهتر هست از بوتلودر خودش استفاده کنیم، الان میگم برای اجرای کامل مجبوریم از بوت لودر خودش به جای یوبوت استفاده کنیم وگرنه دردسر زیاد خواهیم داشت.
فایل config بوتلودر رو یادتون هست الان باید این خط رو بش اضافه کنیم:
1 | initramfs initramfs.cpio.gz followkernel |
فایل cmdline هم نیاز داره متنش عوض بشه و به کرنل بگیم که initramfs داریم و روت رو باید از روی اون لود کنه و برنامه init هم بش معرفی کنیم:
1 | root=/dev/root rootwait console=tty1 console=ttyS0,115200 console=ttyAMA0,115200 rdinit=/bin/sh |
بقیه فایلهایی که توی درایو بوت بودن رو کاری نداریم و فقط initramfs.cpio.gz رو کپی میکنیم توی این فولدر. حالا کارت حافظه رو میذاریم توی برد و روشن میکنیم:
آخرین پیغامها ایناست:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [ 6.623395] of_cfs_init [ 6.633175] of_cfs_init: OK [ 6.645060] uart-pl011 3f201000.serial: no DMA platform data [ 6.663008] mmc1: queuing unknown CIS tuple 0x80 (7 bytes) [ 6.673327] Freeing unused kernel memory: 3456K [ 6.695650] Run /bin/sh as init process /bin/sh: can't access tty; job control turned off / # [ 6.728731] mmc0: host does not support reading read-only switch, assuming write-enable [ 6.756611] mmc0: new high speed SDHC card at address 0001 [ 6.774098] usb 1-1.1: new high-speed USB device number 3 using dwc_otg [ 6.796693] mmcblk0: mmc0:0001 SD 3.72 GiB [ 6.813978] mmcblk0: p1 p2 [ 6.870718] mmc1: new high speed SDIO card at address 0001 [ 6.888739] usb 1-1.1: New USB device found, idVendor=0424, idProduct=2514, bcdDevice= b.b3 [ 6.917277] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 6.940490] hub 1-1.1:1.0: USB hub found [ 6.953961] hub 1-1.1:1.0: 3 ports detected [ 7.321168] dwc_otg_handle_wakeup_detected_intr lxstate = 2 [ 7.685588] usb 1-1.1.1: new high-speed USB device number 4 using dwc_otg [ 7.795340] usb 1-1.1.1: New USB device found, idVendor=0424, idProduct=7800, bcdDevice= 3.00 [ 7.823632] usb 1-1.1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 8.114050] lan78xx 1-1.1.1:1.0 (unnamed net_device) (uninitialized): No External EEPROM. Setting MAC Speed [ 8.158502] lan78xx 1-1.1.1:1.0 (unnamed net_device) (uninitialized): int urb period 64 |
یه اینتر میزنیم و دستور زیر رو تایپ میکنیم:
1 2 3 | ls bin etc lib proc sbin tmp var dev home linuxrc root sys usr |
تبریک میگم! به دنیای لینوکس خوش اومدین!
حالا دو تا شبه فایل سیستممون رو هم مونت میکنیم تا کار تموم بشه:
1 2 | mount -t proc proc /proc mount -t sysfs sysfs /sys |
این هم خروجی دستور ps
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | ps PID USER TIME COMMAND 1 0 0:02 /bin/sh 2 0 0:00 [kthreadd] 3 0 0:00 [rcu_gp] 4 0 0:00 [rcu_par_gp] 5 0 0:00 [kworker/0:0-mm_] 6 0 0:00 [kworker/0:0H] 7 0 0:00 [kworker/u8:0-ev] 8 0 0:00 [mm_percpu_wq] 9 0 0:00 [rcu_tasks_kthre] 10 0 0:00 [rcu_tasks_rude_] 11 0 0:00 [rcu_tasks_trace] 12 0 0:00 [ksoftirqd/0] 13 0 0:00 [rcu_preempt] 14 0 0:00 [migration/0] 15 0 0:00 [cpuhp/0] 16 0 0:00 [cpuhp/1] 17 0 0:00 [migration/1] 18 0 0:00 [ksoftirqd/1] 19 0 0:00 [kworker/1:0-rcu] 20 0 0:00 [kworker/1:0H-ev] 21 0 0:00 [cpuhp/2] 22 0 0:00 [migration/2] 23 0 0:00 [ksoftirqd/2] 24 0 0:00 [kworker/2:0-mm_] 25 0 0:00 [kworker/2:0H] 26 0 0:00 [cpuhp/3] 27 0 0:00 [migration/3] 28 0 0:00 [ksoftirqd/3] 29 0 0:00 [kworker/3:0-mm_] 30 0 0:00 [kworker/3:0H] 31 0 0:00 [kdevtmpfs] 32 0 0:00 [netns] 33 0 0:00 [kworker/2:1-mm_] 34 0 0:00 [kworker/1:1-eve] 35 0 0:00 [kworker/0:1-eve] 36 0 0:00 [kworker/3:1-mm_] 37 0 0:00 [kauditd] 38 0 0:03 [kworker/1:2-eve] 39 0 0:00 [khungtaskd] 40 0 0:00 [oom_reaper] 41 0 0:00 [writeback] 42 0 0:00 [kcompactd0] 60 0 0:00 [kblockd] 61 0 0:00 [blkcg_punt_bio] 62 0 0:00 [watchdogd] 63 0 0:00 [kworker/1:1H-kb] 64 0 0:00 [rpciod] 65 0 0:00 [kworker/u9:0] 66 0 0:00 [xprtiod] 67 0 0:00 [kswapd0] 68 0 0:00 [nfsiod] 69 0 0:00 [iscsi_eh] 70 0 0:00 [iscsi_destroy] 71 0 0:00 [dwc_otg] 72 0 0:00 [DWC Notificatio] 73 0 0:00 [vchiq-slot/0] 74 0 0:00 [vchiq-recy/0] 75 0 0:00 [vchiq-sync/0] 76 0 0:00 [zswap-shrink] 77 0 0:00 [kworker/u8:1] 78 0 0:00 [kworker/1:3-eve] 79 0 0:00 [kworker/1:4-eve] 80 0 0:00 [kworker/1:5-eve] 81 0 0:00 [kworker/1:6-eve] 82 0 0:00 [kworker/1:7-eve] 83 0 0:00 [kworker/1:8-rcu] 84 0 0:00 [mmc_complete] 86 0 0:00 [irq/184-usb-001] 90 0 0:00 ps |
و در نهایت اجرای برنامهی خودمون:
1 2 3 | /home/hello Hello World! I'm Aniroot ^_^ |
ما الان یک لینوکس حداقلی داریم که با اون، خیلی کارها میشه کرد و خیلی کارها رو نمیشه کرد و مبحث امبدد لینوکس ما همینجا تکمیل میشه و به پایان میرسه.
جالبه کل حجم لینوکس ما که ۶۴ بیتی هم هست به ۳۲ مگابایت نمیرسه و حتی میتونستیم با پیکربندی کرنل و بیزی باکس و تریکهای دیگهای مثل استفاده از بیلد استاتیک بیزی باکس، استفاده از کتابخونههای کم حجمتر و … حجمش رو خیلی کمتر کنیم طوری که کلش روی یه SPI فلش هشت مگاباتی جا بشه. یک زمانی کل لینوکس روی یک فلاپی جا میشده!
اگه بخوایم وارد جزییات بشیم و این لینوکس حداقلیمون رو مرحله به مرحله تکمیل کنیم همزمانبره و هم حوصلهبر و هم خیلی سخت هست.
توی فصل بعد با ابزاری آشنا میشیم که همهی کارهایی که تا الان انجام دادیم رو واسمون یک جا انجام بده.
ممنون که اموزش رو دارید همچنان ادامه میدید و کامل میکنید
من چندتا درس عقب تر هستم ولی دارم خودمو میرسونم
ممنونم از شما
سلام وقتتون بخیر
ممنون از همراهی شما
خیلی خیلی ممنونم بابت این آموزش مفصل و خوب. بی صبرانه منتظر قسمت بعدی هستیم.
سلام وقتتون بخیر
ممنون از همراهی شما
سلام و درود بر Rich_Dad عزیز
سپاس فراوان بابت مطالب کامل و مفید شما در حوزه امبدد لینوکس و امید موفقیت روزافزون
مهندس جان میخواستم باشما در تماس باشم.
سلام
از طریق سایتشون میتونید باهاشون ارتباط بگیرید
https://aniroot.com