การแนะนำ
ในบทความชุดนี้ ฉันต้องการดูระบบ buildroot distribution build และแบ่งปันประสบการณ์ของฉันในการปรับแต่งมัน จะได้รับประสบการณ์จริงในการสร้างระบบปฏิบัติการขนาดเล็กพร้อมอินเทอร์เฟซแบบกราฟิกและฟังก์ชันการทำงานขั้นต่ำ
ก่อนอื่น คุณไม่ควรสับสนระหว่างระบบการสร้างและการแจกจ่าย Buildroot สามารถสร้างระบบจากชุดแพ็คเกจที่เสนอให้ Buildroot สร้างขึ้นจาก makefiles จึงมีความสามารถในการปรับแต่งได้มากมาย แทนที่แพ็คเกจด้วยเวอร์ชันอื่น, เพิ่มแพ็คเกจของคุณเอง, เปลี่ยนกฎสำหรับการสร้างแพ็คเกจ, ปรับแต่งระบบไฟล์หลังจากติดตั้งแพ็คเกจทั้งหมดแล้ว? buildroot สามารถทำทั้งหมดนี้ได้
ในรัสเซียมีการใช้ buildroot แต่ในความคิดของฉันมีข้อมูลภาษารัสเซียเพียงเล็กน้อยสำหรับผู้เริ่มต้น
เป้าหมายของงานคือการรวบรวมชุดการแจกจ่ายพร้อมการดาวน์โหลดสด อินเทอร์เฟซ icewm และเบราว์เซอร์ แพลตฟอร์มเป้าหมายคือ virtualbox
ทำไมต้องสร้างการกระจายสินค้าของคุณเอง? มักจำเป็นต้องมีฟังก์ชันการทำงานที่จำกัดกับทรัพยากรที่จำกัด บ่อยครั้งในระบบอัตโนมัติที่คุณต้องสร้างเฟิร์มแวร์ การปรับเปลี่ยนการแจกจ่ายเพื่อวัตถุประสงค์ทั่วไปโดยการล้างบรรจุภัณฑ์ที่ไม่จำเป็นออกแล้วเปลี่ยนเป็นเฟิร์มแวร์นั้นต้องใช้แรงงานมากกว่าการสร้างการแจกจ่ายใหม่ การใช้ Gentoo ก็มีข้อจำกัดเช่นกัน
ระบบ Buildroot นั้นทรงพลังมาก แต่จะไม่ทำอะไรให้คุณเลย สามารถเปิดใช้งานและทำให้กระบวนการประกอบเป็นอัตโนมัติเท่านั้น
ระบบการสร้างทางเลือก (yocto, ระบบ open build และอื่นๆ) จะไม่ได้รับการพิจารณาหรือเปรียบเทียบ
จะหาได้ที่ไหนและจะเริ่มต้นอย่างไร
เว็บไซต์โครงการ -
Buildroot ดำเนินการ defconfigs สำหรับบอร์ดเป้าหมายของบิลด์ Defconfig เป็นไฟล์กำหนดค่าที่เก็บเฉพาะตัวเลือกที่ไม่มีค่าเริ่มต้น เขาคือผู้กำหนดว่าจะรวบรวมอะไรและอย่างไร ในกรณีนี้ คุณสามารถกำหนดค่าการกำหนดค่าของ busybox, linux-kernel, uglibc, u-boot และ barebox bootloaders แยกต่างหากได้ แต่การกำหนดค่าทั้งหมดจะเชื่อมโยงกับบอร์ดเป้าหมาย
หลังจากคลายไฟล์เก็บถาวรที่ดาวน์โหลดมาหรือการโคลนจาก git เราก็จะได้ buildroot ที่พร้อมใช้งาน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับโครงสร้างไดเร็กทอรีได้ในคู่มือ ฉันจะบอกคุณเกี่ยวกับสิ่งที่สำคัญที่สุด:
คณะกรรมการ — ไดเร็กทอรีพร้อมไฟล์เฉพาะสำหรับแต่ละบอร์ด สิ่งเหล่านี้อาจเป็นสคริปต์สำหรับการสร้างอิมเมจระบบ (iso, sdcart, cpio และอื่นๆ) ไดเร็กทอรีโอเวอร์เลย์, การกำหนดค่าเคอร์เนล ฯลฯ
configs — defconfig ที่แท้จริงของบอร์ด Defconfig คือการกำหนดค่าบอร์ดที่ไม่สมบูรณ์ จะจัดเก็บเฉพาะพารามิเตอร์ที่แตกต่างจากการตั้งค่าเริ่มต้น
dl — ไดเร็กทอรีพร้อมซอร์สโค้ด/ไฟล์ที่ดาวน์โหลดสำหรับการประกอบ
เอาท์พุต/เป้าหมาย — ระบบไฟล์ที่ประกอบขึ้นของระบบปฏิบัติการผลลัพธ์ จากนั้น อิมเมจจะถูกสร้างขึ้นเพื่อดาวน์โหลด/ติดตั้ง
เอาท์พุต/โฮสต์ - โฮสต์สาธารณูปโภคสำหรับการประกอบ
เอาท์พุต/บิลด์ - แพ็คเกจที่ประกอบแล้ว
แอสเซมบลีได้รับการกำหนดค่าผ่าน KConfig ระบบเดียวกันนี้ใช้ในการสร้างเคอร์เนล Linux รายการคำสั่งที่ใช้บ่อยที่สุด (ดำเนินการในไดเร็กทอรี buildroot):
- make menuconfig - เรียกการกำหนดค่า build คุณยังสามารถใช้อินเทอร์เฟซแบบกราฟิกได้ (สร้าง nconfig, สร้าง xconfig, สร้าง gconfig)
- ทำ linux-menuconfig - เรียกการกำหนดค่าเคอร์เนล
- make clean - ทำความสะอาดผลลัพธ์ของบิลด์ (ทุกอย่างที่เก็บไว้ในเอาต์พุต)
- รับทำ-สร้างระบบ สิ่งนี้ไม่ได้ประกอบกระบวนการที่ประกอบไว้แล้วกลับคืนมา
- ทำ defconfig_name - สลับการกำหนดค่าเป็น defconfig เฉพาะ
- make list-defconfigs - แสดงรายการ defconfigs
- สร้างซอร์ส - เพียงดาวน์โหลดไฟล์การติดตั้งโดยไม่ต้องสร้าง
- ให้ความช่วยเหลือ - รายการคำสั่งที่เป็นไปได้
หมายเหตุสำคัญและเคล็ดลับที่เป็นประโยชน์
Buildroot จะไม่สร้างแพ็คเกจที่สร้างขึ้นใหม่! ดังนั้น สถานการณ์อาจเกิดขึ้นเมื่อจำเป็นต้องประกอบใหม่ทั้งหมด
คุณสามารถสร้างแพ็คเกจแยกต่างหากใหม่ได้ด้วยคำสั่ง สร้างชื่อแพ็คเกจ-สร้างใหม่ ตัวอย่างเช่น คุณสามารถสร้างเคอร์เนล Linux ใหม่ได้:
make linux-rebuild
Buildroot เก็บสถานะของแพ็กเกจใดๆ โดยการสร้างไฟล์ .stamp ในไดเร็กทอรี output/build/$packagename:
ดังนั้น คุณสามารถสร้าง root-fs และอิมเมจใหม่ได้โดยไม่ต้องสร้างแพ็คเกจใหม่:
rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make
ตัวแปรที่มีประโยชน์
buildroot มีชุดของตัวแปรเพื่อให้กำหนดค่าได้ง่าย
- $TOPDIR - ไดเร็กทอรี buildroot
- $BASEDIR - ไดเรกทอรีผลลัพธ์
- $HOST_DIR, $STAGING_DIR, $TARGET_DIR - โฮสต์ fs, staging fs, ไดเร็กทอรีการสร้าง fs เป้าหมาย
- $BUILD_DIR - ไดเร็กทอรีพร้อมแพ็กเกจที่คลายแพ็กและสร้างแล้ว
การแสดง
buildroot มีฟีเจอร์แสดงภาพ คุณสามารถสร้างไดอะแกรมการพึ่งพา กราฟเวลาบิลด์ และกราฟขนาดแพ็คเกจในระบบสุดท้าย ผลลัพธ์จะอยู่ในรูปแบบไฟล์ pdf (คุณสามารถเลือกได้จาก svn,png) ในไดเร็กทอรีเอาต์พุต/กราฟ
ตัวอย่างคำสั่งการแสดงภาพ:
make graph-depends
สร้างแผนผังการพึ่งพาmake <pkg>-graph-depends
สร้างแผนผังการพึ่งพาสำหรับแพ็คเกจเฉพาะBR2_GRAPH_OUT=png make graph-build
เวลาสร้างพล็อตด้วยเอาต์พุต PNGmake graph-size
ขนาดแพ็กเก็ตพล็อต
สคริปต์ที่มีประโยชน์
มีไดเร็กทอรีย่อยอยู่ในไดเร็กทอรี buildroot utils พร้อมสคริปต์ที่มีประโยชน์ เช่น มีสคริปต์ตรวจสอบความถูกต้องของคำอธิบายแพ็คเกจ สิ่งนี้อาจมีประโยชน์เมื่อเพิ่มแพ็คเกจของคุณเอง (ฉันจะทำในภายหลัง) ไฟล์ utils/readme.txt มีคำอธิบายของสคริปต์เหล่านี้
มาสร้างการกระจายหุ้นกันเถอะ
สิ่งสำคัญคือต้องจำไว้ว่าการดำเนินการทั้งหมดดำเนินการในนามของผู้ใช้ทั่วไป ไม่ใช่รูท
คำสั่งทั้งหมดดำเนินการใน buildroot แพ็คเกจ buildroot มีชุดการกำหนดค่าสำหรับบอร์ดทั่วไปและการจำลองเสมือนอยู่แล้ว
ลองดูรายการการกำหนดค่า:
สลับไปที่การกำหนดค่า qemu_x86_64_defconfig
make qemu_x86_64_defconfig
และเราเริ่มการชุมนุม
make
การสร้างเสร็จสมบูรณ์แล้ว ดูผลลัพธ์:
Buildroot ได้รวบรวมอิมเมจที่คุณสามารถเรียกใช้ใน Qemu และตรวจสอบว่ารูปภาพเหล่านั้นใช้งานได้
qemu-system-x86_64 -kernel output/images/bzImage -hda output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S
ผลลัพธ์คือระบบที่ทำงานใน qemu:
การสร้างการกำหนดค่าบอร์ดของคุณเอง
การเพิ่มไฟล์บอร์ด
ลองดูรายการการกำหนดค่า:
ในรายการเราเห็น pc_x86_64_efi_defconfig เราจะสร้างบอร์ดของเราเองโดยคัดลอกมาจากการกำหนดค่า:
cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig
มาสร้างไดเร็กทอรีบอร์ดทันทีเพื่อจัดเก็บสคริปต์ rootfs-overlay และไฟล์ที่จำเป็นอื่นๆ ของเรา:
mkdir board/my_x86_board
สลับไปที่ defconfig นี้:
make my_x86_board_defconfig
ดังนั้น ตอนนี้การกำหนดค่าบิลด์ (เก็บไว้ใน .config ในรูทของไดเร็กทอรี buildroot) จะสอดคล้องกับเครื่องเป้าหมายการบูต x86-64 รุ่นเก่า (bios)
มาคัดลอกการกำหนดค่า linux-kernel (มีประโยชน์ในภายหลัง):
cp board/pc/linux.config board/my_x86_board/
การตั้งค่าพารามิเตอร์บิลด์ผ่าน KConfig
มาเริ่มการตั้งค่ากันดีกว่า:
make menuconfig
หน้าต่าง KConfig จะเปิดขึ้น เป็นไปได้ที่จะกำหนดค่าด้วยอินเทอร์เฟซแบบกราฟิก (สร้าง nconfig, สร้าง xconfig, สร้าง gconfig):
เราเข้าสู่ส่วนแรก ตัวเลือกเป้าหมาย ที่นี่คุณสามารถเลือกสถาปัตยกรรมเป้าหมายที่จะทำการสร้างได้
ตัวเลือกการสร้าง - มีการตั้งค่าการสร้างต่างๆ ที่นี่ คุณสามารถระบุไดเร็กทอรีด้วยซอร์สโค้ด จำนวนเธรดสำหรับบิลด์ มิเรอร์สำหรับการดาวน์โหลดซอร์สโค้ด และการตั้งค่าอื่นๆ ปล่อยให้การตั้งค่าเป็นค่าเริ่มต้น
Toolchain – เครื่องมือสร้างได้รับการกำหนดค่าที่นี่ อ่านเพิ่มเติมเกี่ยวกับเขา
ประเภท Toolchain – ประเภทของ Toolchain ที่ใช้ นี่อาจเป็น toolchain ที่สร้างไว้ใน buildroot หรือภายนอก (คุณสามารถระบุไดเร็กทอรีด้วยไดเร็กทอรีที่สร้างไว้แล้วหรือ URL สำหรับการดาวน์โหลด) มีตัวเลือกเพิ่มเติมสำหรับสถาปัตยกรรมที่แตกต่างกัน ตัวอย่างเช่น สำหรับ arm คุณสามารถเลือกเวอร์ชัน Linaro ของ toolchain ภายนอกได้
ไลบรารี C – การเลือกไลบรารี C การทำงานของทั้งระบบขึ้นอยู่กับสิ่งนี้ โดยทั่วไปแล้ว จะใช้ glibc ซึ่งรองรับฟังก์ชันการทำงานที่เป็นไปได้ทั้งหมด แต่อาจมีขนาดใหญ่เกินไปสำหรับระบบฝังตัว ดังนั้นจึงมักเลือก uglibc หรือ musl เราจะเลือก glibc (จะต้องใช้ในภายหลังเพื่อใช้ systemd)
ซีรีส์ Kernel Headers และ Kernel Headers แบบกำหนดเอง – ต้องตรงกับเวอร์ชันของเคอร์เนลที่จะอยู่ในระบบที่ประกอบ สำหรับส่วนหัวของเคอร์เนล คุณยังสามารถระบุเส้นทางไปยังที่เก็บ tarball หรือ git ได้อีกด้วย
GCC COMPILER VERSIONS – เลือกเวอร์ชันคอมไพเลอร์ที่จะใช้สำหรับการสร้าง
เปิดใช้งานการสนับสนุน C++ – เลือกเพื่อสร้างด้วยการสนับสนุนไลบรารี C++ ในระบบ สิ่งนี้จะเป็นประโยชน์ต่อเราในอนาคต
ตัวเลือก gcc เพิ่มเติม - คุณสามารถตั้งค่าตัวเลือกคอมไพเลอร์เพิ่มเติมได้ เราไม่ต้องการมันในตอนนี้
การกำหนดค่าระบบช่วยให้คุณสามารถตั้งค่าพารามิเตอร์ในอนาคตของระบบที่สร้างขึ้น:
ประเด็นส่วนใหญ่ชัดเจนจากชื่อเรื่อง ให้ความสนใจกับประเด็นต่อไปนี้:
เส้นทางไปยังตารางผู้ใช้ - ตารางที่มีผู้ใช้ที่จะสร้าง (
ไฟล์ตัวอย่าง. ผู้ใช้ ผู้ใช้จะถูกสร้างขึ้นด้วยผู้ดูแลระบบรหัสผ่าน, gid/uid อัตโนมัติ, /bin/sh เชลล์, ผู้ใช้กลุ่มเริ่มต้น, รูทสมาชิกกลุ่ม, ผู้ใช้ความคิดเห็น Foo
[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt
user -1 user -1 =admin /home/user /bin/sh root Foo user
ไดเร็กทอรีโอเวอร์เลย์ระบบไฟล์รูท - ไดเร็กทอรีวางซ้อนที่ด้านบนของ target-fs ที่ประกอบแล้ว เพิ่มไฟล์ใหม่และแทนที่ไฟล์ที่มีอยู่
สคริปต์แบบกำหนดเองเพื่อรันก่อนสร้างอิมเมจระบบไฟล์ - สคริปต์จะดำเนินการทันทีก่อนที่จะพับระบบไฟล์เป็นอิมเมจ ปล่อยให้สคริปต์ว่างเปล่าไว้ก่อน
ไปที่ส่วนเคอร์เนลกัน
การตั้งค่าเคอร์เนลได้รับการตั้งค่าไว้ที่นี่ เคอร์เนลนั้นได้รับการกำหนดค่าผ่าน make linux-menuconfig
คุณสามารถตั้งค่าเวอร์ชันเคอร์เนลได้หลายวิธี: เลือกจากเวอร์ชันที่มีให้ ป้อนเวอร์ชันด้วยตนเอง ระบุพื้นที่เก็บข้อมูลหรือ tarball สำเร็จรูป
การกำหนดค่าเคอร์เนล — เส้นทางไปยังการกำหนดค่าเคอร์เนล คุณสามารถเลือกการกำหนดค่าเริ่มต้นสำหรับสถาปัตยกรรมที่เลือกหรือ defocnfig จาก Linux แหล่งที่มาของ Linux มีชุด defconfig สำหรับระบบเป้าหมายที่แตกต่างกัน คุณสามารถค้นหาสิ่งที่คุณต้องการ
ส่วนแพ็คเกจเป้าหมายอนุญาตให้คุณเลือกแพ็คเกจที่จะติดตั้งบนระบบที่กำลังสร้าง ปล่อยให้มันไม่เปลี่ยนแปลงในตอนนี้ เราจะเพิ่มแพ็คเกจของเราลงในรายการนี้ในภายหลัง
อิมเมจระบบไฟล์ - รายการอิมเมจระบบไฟล์ที่จะถูกรวบรวม เพิ่มภาพ iso
Bootloaders - การเลือก bootloaders ที่จะรวบรวม เรามาเลือกไอโซลินิกกันดีกว่า
การกำหนดค่า Systemd
Systemd กำลังกลายเป็นหนึ่งในเสาหลักของ Linux พร้อมด้วยเคอร์เนลและ glibc ดังนั้นฉันจึงย้ายการตั้งค่าไปยังรายการอื่น
กำหนดค่าผ่าน make menuconfig จากนั้นเลือกแพ็คเกจเป้าหมาย → เครื่องมือระบบ → systemd ที่นี่คุณสามารถระบุบริการ systemd ที่จะติดตั้งและเริ่มต้นเมื่อระบบเริ่มทำงาน
กำลังบันทึกการกำหนดค่าระบบ
เราบันทึกการกำหนดค่านี้ผ่าน KConfig
จากนั้นบันทึก defconfig ของเรา:
make savedefconfig
การกำหนดค่าเคอร์เนล Linux
การกำหนดค่าเคอร์เนล Linux ถูกเรียกใช้ด้วยคำสั่งต่อไปนี้:
make linux-menuconfig
มาเพิ่มการรองรับการ์ดแสดงผล Virtualbox
มาเพิ่มการรองรับการรวม Virtualbox Guest กัน
บันทึกและออก. ที่สำคัญ: การกำหนดค่าจะถูกบันทึกไว้ใน output/build/linux-$version/config แต่ไม่ใช่ใน board/my_x86_board/linux.config
ดังนั้น คุณจะต้องคัดลอกการกำหนดค่าไปยังตำแหน่งที่จัดเก็บข้อมูลด้วยตนเอง:
cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config
หลังจากนั้นเราจะประกอบระบบทั้งหมดอีกครั้งโดยสมบูรณ์ buildroot ไม่ได้สร้างสิ่งที่สร้างไว้แล้วขึ้นมาใหม่ คุณต้องระบุแพ็คเกจสำหรับการสร้างใหม่ด้วยตนเอง เพื่อไม่ให้เสียเวลาและความเครียด การสร้างระบบขนาดเล็กขึ้นมาใหม่ทั้งหมดจะง่ายกว่า):
make clean;make
เมื่อสร้างเสร็จแล้ว ให้เปิด VirtualBox (ทดสอบบนเวอร์ชัน 5.2 และ 6.0) โดยบูตจากซีดี พารามิเตอร์ระบบ:
วิ่งจาก iso ที่ประกอบ:
รายการวัสดุที่ใช้
- คู่มือ Buildroot
ที่มา: will.com