ในส่วนนี้ ฉันจะดูตัวเลือกการปรับแต่งบางอย่างที่ฉันต้องการ นี่ไม่ใช่รายการที่สมบูรณ์ของสิ่งที่ buildroot นำเสนอ แต่ค่อนข้างใช้งานได้และไม่ต้องการการแทรกแซงในไฟล์ของ 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 จะมีเส้นทางที่แน่นอนไปยัง 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) จะถูกเพิ่ม
เรารวบรวมและตรวจสอบ:
การดำเนินการสคริปต์การปรับแต่งในขั้นตอนต่างๆ ของการประกอบระบบ
บ่อยครั้งที่คุณต้องดำเนินการบางอย่างภายในระบบไฟล์เป้าหมายก่อนจึงจะบรรจุลงในอิมเมจได้
ซึ่งสามารถทำได้ในส่วนการกำหนดค่าระบบ:
สคริปต์สองตัวแรกจะถูกดำเนินการหลังจากระบบไฟล์เป้าหมายถูกสร้างขึ้น แต่ก่อนที่จะถูกรวมเป็นอิมเมจ ข้อแตกต่างก็คือสคริปต์ fakeroot จะดำเนินการในบริบทของ fakeroot ซึ่งจำลองการทำงานในฐานะผู้ใช้รูท
สคริปต์สุดท้ายจะถูกดำเนินการหลังจากสร้างอิมเมจระบบแล้ว คุณสามารถดำเนินการเพิ่มเติมได้ เช่น คัดลอกไฟล์ที่จำเป็นไปยังเซิร์ฟเวอร์ NFS หรือสร้างอิมเมจของเฟิร์มแวร์อุปกรณ์ของคุณ
ตามตัวอย่าง ฉันจะสร้างสคริปต์ที่จะเขียนเวอร์ชันและวันที่สร้างเป็น /etc/
ก่อนอื่น ฉันจะระบุเส้นทางไปยังไฟล์นี้ในแผนผังภายนอกของฉัน:
และตอนนี้สคริปต์เอง:
[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
หลังจากประกอบแล้ว คุณจะเห็นไฟล์นี้ในระบบ
ในทางปฏิบัติ สคริปต์อาจมีขนาดใหญ่ได้ ดังนั้นในโครงการจริงฉันจึงใช้เส้นทางขั้นสูงกว่านี้:
- ฉันสร้างไดเร็กทอรี (my_tree/board_my_x86_board/inside_fakeroot_scripts) ซึ่งมีสคริปต์ที่จะดำเนินการพร้อมหมายเลขซีเรียล ตัวอย่างเช่น 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
- ฉันเขียนสคริปต์ (my_tree/board_my_x86_board/run_inside_fakeroot.sh) ที่ผ่านไดเร็กทอรีนี้และรันสคริปต์ที่อยู่ในนั้นตามลำดับ
- ระบุสคริปต์นี้ในการตั้งค่าบอร์ดในการกำหนดค่าระบบ -> สคริปต์ที่กำหนดเองเพื่อทำงานภายในสภาพแวดล้อม fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)
ที่มา: will.com