Buildroot - ตอนที่ 2 การสร้างการกำหนดค่าบอร์ดของคุณ การใช้แผนผังภายนอก, การซ้อนทับ rootfs, สคริปต์หลังการสร้าง

ในส่วนนี้ ฉันจะดูตัวเลือกการปรับแต่งบางอย่างที่ฉันต้องการ นี่ไม่ใช่รายการที่สมบูรณ์ของสิ่งที่ buildroot นำเสนอ แต่ค่อนข้างใช้งานได้และไม่ต้องการการแทรกแซงในไฟล์ของ buildroot เอง

การใช้กลไกภายนอกเพื่อการปรับแต่ง

ในบทความก่อนหน้า เราดูตัวอย่างง่ายๆ ในการเพิ่มการกำหนดค่าของคุณเองโดยการเพิ่ม defconfig ของบอร์ดและไฟล์ที่จำเป็นลงในไดเร็กทอรี Buildroot โดยตรง

แต่วิธีนี้ไม่สะดวกนักโดยเฉพาะเมื่ออัปเดต buildroot มีกลไกในการแก้ปัญหานี้ ต้นไม้ภายนอก. สาระสำคัญของมันคือ คุณสามารถจัดเก็บบอร์ด การกำหนดค่า แพ็คเกจ และไดเร็กทอรีอื่น ๆ ไว้ในไดเร็กทอรีแยกต่างหาก (เช่น ฉันใช้ไดเร็กทอรี patch เพื่อนำแพตช์ไปใช้กับแพ็คเกจ รายละเอียดเพิ่มเติมในส่วนแยกต่างหาก) และตัว buildroot เองจะเพิ่มลงในไดเร็กทอรี patch ไดเรกทอรีของมัน

หมายเหตุ: คุณสามารถซ้อนแผนผังภายนอกหลายรายการพร้อมกันได้ มีตัวอย่างอยู่ในคู่มือ buildroot

มาสร้างไดเร็กทอรี my_tree ถัดจากไดเร็กทอรี buildroot และถ่ายโอนการกำหนดค่าของเราไปที่นั่น ผลลัพธ์ควรเป็นโครงสร้างไฟล์ต่อไปนี้:

[alexey@alexey-pc my_tree]$ tree
.
├── board
│   └── my_x86_board
│       ├── bef_cr_fs_img.sh
│       ├── linux.config
│       ├── rootfs_overlay
│       └── users.txt
├── Config.in
├── configs
│   └── my_x86_board_defconfig
├── external.desc
├── external.mk
├── package
└── patches

6 directories, 7 files

อย่างที่คุณเห็น โดยทั่วไปโครงสร้างจะทำซ้ำโครงสร้างของ buildroot

ไดเรกทอรี คณะกรรมการ มีไฟล์เฉพาะสำหรับแต่ละบอร์ดในกรณีของเรา:

  • bef_cr_fs_img.sh เป็นสคริปต์ที่จะดำเนินการหลังจากสร้างระบบไฟล์เป้าหมาย แต่ก่อนที่จะบรรจุลงในรูปภาพ เราจะใช้มันในอนาคต
  • linux.config - การกำหนดค่าเคอร์เนล
  • rootfs_overlay - ไดเร็กทอรีที่จะซ้อนทับบนระบบไฟล์เป้าหมาย
  • users.txt - ไฟล์ที่อธิบายผู้ใช้ที่จะสร้าง

ไดเรกทอรี configs มี defconfig ของบอร์ดของเรา เรามีเพียงหนึ่งเดียว

แพ็คเกจ - แคตตาล็อกพร้อมแพ็คเกจของเรา ในตอนแรก buildroot จะมีคำอธิบายและกฎสำหรับการสร้างแพ็กเกจในจำนวนที่จำกัด หลังจากนั้นเราจะเพิ่มตัวจัดการหน้าต่าง icewm และตัวจัดการล็อกอินแบบกราฟิก Slim ที่นี่
แพทช์ — ช่วยให้คุณจัดเก็บแพตช์ของคุณสำหรับแพ็คเกจต่างๆ ได้อย่างสะดวก รายละเอียดเพิ่มเติมในส่วนแยกต่างหากด้านล่าง
ตอนนี้เราต้องเพิ่มไฟล์คำอธิบายสำหรับแผนผังภายนอกของเรา มี 3 ไฟล์ที่รับผิดชอบสิ่งนี้: external.desc, Config.in, external.mk

ภายนอก.คำอธิบาย มีคำอธิบายตามจริง:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: My simple external-tree for article

บรรทัดแรกคือชื่อเรื่อง ในอนาคต buildroot ให้สร้างตัวแปร $(BR2_EXTERNAL_MY_TREE_PATH)ซึ่งควรใช้เมื่อกำหนดค่าแอสเซมบลี ตัวอย่างเช่น เส้นทางไปยังไฟล์ผู้ใช้สามารถตั้งค่าได้ดังนี้:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

บรรทัดที่สองเป็นคำอธิบายสั้นๆ ที่มนุษย์สามารถอ่านได้

Config.in, ภายนอก.mk — ไฟล์เพื่ออธิบายแพ็คเกจที่เพิ่ม หากคุณไม่ได้เพิ่มแพ็คเกจของคุณเอง ไฟล์เหล่านี้สามารถเว้นว่างไว้ได้ สำหรับตอนนี้นั่นคือสิ่งที่เราจะทำ
ตอนนี้เรามีแผนผังภายนอกพร้อมแล้ว ซึ่งมี defconfig ของบอร์ดและไฟล์ที่ต้องการ ไปที่ไดเร็กทอรี buildroot และระบุให้ใช้แผนผังภายนอก:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

ในคำสั่งแรกเราใช้อาร์กิวเมนต์ BR2_EXTERNAL=../my_tree/ระบุการใช้แผนผังภายนอก คุณสามารถระบุแผนผังภายนอกหลายรายการเพื่อใช้พร้อมกันได้ ในกรณีนี้ คุณเพียงแค่ต้องทำสิ่งนี้เพียงครั้งเดียว หลังจากนั้นไฟล์ output/.br-external.mk จะถูกสร้างขึ้น เก็บข้อมูลเกี่ยวกับทรีภายนอกที่ใช้:

[alexey@alexey-pc buildroot]$ cat output/.br-external.mk 
#
# Automatically generated file; DO NOT EDIT.
#

BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_NAMES = 
BR2_EXTERNAL_DIRS = 
BR2_EXTERNAL_MKS = 

BR2_EXTERNAL_NAMES += my_tree
BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk
export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
export BR2_EXTERNAL_my_tree_DESC = My simple external-tree for article

สำคัญ! เส้นทางในไฟล์นี้จะเป็นแบบสัมบูรณ์!

รายการตัวเลือกภายนอกปรากฏในเมนู:

Buildroot - ตอนที่ 2 การสร้างการกำหนดค่าบอร์ดของคุณ การใช้แผนผังภายนอก, การซ้อนทับ rootfs, สคริปต์หลังการสร้าง

เมนูย่อยนี้จะมีแพ็คเกจของเราจากแผนผังภายนอกของเรา ส่วนนี้ว่างเปล่าในขณะนี้

ตอนนี้มันสำคัญกว่าสำหรับเราที่จะต้องเขียนเส้นทางที่จำเป็นใหม่เพื่อใช้แผนผังภายนอก

โปรดทราบว่าในส่วนตัวเลือกการสร้าง → ตำแหน่งที่จะบันทึกการกำหนดค่า buildroot จะมีเส้นทางที่แน่นอนไปยัง defconfig ที่บันทึกไว้ มันถูกสร้างขึ้นในขณะที่ระบุการใช้ extgernal_tree

เราจะแก้ไขเส้นทางในส่วนการกำหนดค่าระบบด้วย สำหรับตารางที่มีผู้ใช้ที่สร้างขึ้น:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

ในส่วน Kernel ให้เปลี่ยนเส้นทางไปยังการกำหนดค่าเคอร์เนล:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config

ตอนนี้ไฟล์ของเราจากแผนผังภายนอกจะถูกนำมาใช้ระหว่างการประกอบ เมื่อย้ายไปยังไดเร็กทอรีอื่นหรืออัปเดต buildroot เราจะประสบปัญหาน้อยที่สุด

การเพิ่มการซ้อนทับรูต fs:

กลไกนี้ทำให้คุณสามารถเพิ่ม/แทนที่ไฟล์ในระบบไฟล์เป้าหมายได้อย่างง่ายดาย
หากไฟล์อยู่ใน root fs overlay แต่ไม่อยู่ในเป้าหมาย ไฟล์นั้นจะถูกเพิ่ม
หากไฟล์อยู่ใน root fs overlay และอยู่ในเป้าหมาย ไฟล์นั้นจะถูกแทนที่
ขั้นแรก เรามากำหนดเส้นทางไปยัง root fs overlay dir ซึ่งทำได้ในส่วนการกำหนดค่าระบบ → ไดเร็กทอรีการซ้อนทับระบบไฟล์รูท:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

ตอนนี้เรามาสร้างสองไฟล์กัน

[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts 
127.0.0.1   localhost
127.0.1.1   my_small_linux
8.8.8.8     google-public-dns-a.google.com.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt 
This is new file from overlay

ไฟล์แรก (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) จะแทนที่ไฟล์ /etc/hosts บนระบบที่เสร็จสมบูรณ์ ไฟล์ที่สอง (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt) จะถูกเพิ่ม

เรารวบรวมและตรวจสอบ:

Buildroot - ตอนที่ 2 การสร้างการกำหนดค่าบอร์ดของคุณ การใช้แผนผังภายนอก, การซ้อนทับ rootfs, สคริปต์หลังการสร้าง

การดำเนินการสคริปต์การปรับแต่งในขั้นตอนต่างๆ ของการประกอบระบบ

บ่อยครั้งที่คุณต้องดำเนินการบางอย่างภายในระบบไฟล์เป้าหมายก่อนจึงจะบรรจุลงในอิมเมจได้

ซึ่งสามารถทำได้ในส่วนการกำหนดค่าระบบ:

Buildroot - ตอนที่ 2 การสร้างการกำหนดค่าบอร์ดของคุณ การใช้แผนผังภายนอก, การซ้อนทับ rootfs, สคริปต์หลังการสร้าง

สคริปต์สองตัวแรกจะถูกดำเนินการหลังจากระบบไฟล์เป้าหมายถูกสร้างขึ้น แต่ก่อนที่จะถูกรวมเป็นอิมเมจ ข้อแตกต่างก็คือสคริปต์ fakeroot จะดำเนินการในบริบทของ fakeroot ซึ่งจำลองการทำงานในฐานะผู้ใช้รูท

สคริปต์สุดท้ายจะถูกดำเนินการหลังจากสร้างอิมเมจระบบแล้ว คุณสามารถดำเนินการเพิ่มเติมได้ เช่น คัดลอกไฟล์ที่จำเป็นไปยังเซิร์ฟเวอร์ NFS หรือสร้างอิมเมจของเฟิร์มแวร์อุปกรณ์ของคุณ

ตามตัวอย่าง ฉันจะสร้างสคริปต์ที่จะเขียนเวอร์ชันและวันที่สร้างเป็น /etc/
ก่อนอื่น ฉันจะระบุเส้นทางไปยังไฟล์นี้ในแผนผังภายนอกของฉัน:

Buildroot - ตอนที่ 2 การสร้างการกำหนดค่าบอร์ดของคุณ การใช้แผนผังภายนอก, การซ้อนทับ rootfs, สคริปต์หลังการสร้าง

และตอนนี้สคริปต์เอง:

[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh 
#!/bin/sh
echo "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-release

หลังจากประกอบแล้ว คุณจะเห็นไฟล์นี้ในระบบ

ในทางปฏิบัติ สคริปต์อาจมีขนาดใหญ่ได้ ดังนั้นในโครงการจริงฉันจึงใช้เส้นทางขั้นสูงกว่านี้:

  1. ฉันสร้างไดเร็กทอรี (my_tree/board_my_x86_board/inside_fakeroot_scripts) ซึ่งมีสคริปต์ที่จะดำเนินการพร้อมหมายเลขซีเรียล ตัวอย่างเช่น 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. ฉันเขียนสคริปต์ (my_tree/board_my_x86_board/run_inside_fakeroot.sh) ที่ผ่านไดเร็กทอรีนี้และรันสคริปต์ที่อยู่ในนั้นตามลำดับ
  3. ระบุสคริปต์นี้ในการตั้งค่าบอร์ดในการกำหนดค่าระบบ -> สคริปต์ที่กำหนดเองเพื่อทำงานภายในสภาพแวดล้อม fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

ที่มา: will.com

เพิ่มความคิดเห็น