बिल्डरोट - भाग 2. अपने बोर्ड का विन्यास बनाना; बाहरी पेड़, रूट्स-ओवरले, पोस्ट-बिल्ड स्क्रिप्ट का अनुप्रयोग

इस खंड में, मैं कुछ अनुकूलन क्षमताओं पर विचार करता हूं जिनकी मुझे आवश्यकता थी। यह पूरी सूची नहीं है कि बिल्डरोट क्या पेशकश करता है, लेकिन वे काफी काम कर रहे हैं और खुद बिल्डरोट की फाइलों में हस्तक्षेप की आवश्यकता नहीं है।


अनुकूलन के लिए बाहरी तंत्र का उपयोग करना


पिछले लेख में, हमने बोर्ड के डिफॉन्फिग और बिल्ड फ़ाइलों को सीधे डायरेक्ट्री में जोड़कर आपके कॉन्फ़िगरेशन को जोड़ने का एक सरल उदाहरण माना।


लेकिन यह विधि बहुत सुविधाजनक नहीं है, खासकर जब बिल्डरोट को अपडेट करना। इस समस्या को हल करने के लिए, एक बाहरी पेड़ तंत्र है। इसका सार यह है कि आप एक अलग निर्देशिका में बोर्ड, कॉन्फ़िगरेशन, पैकेज और अन्य निर्देशिकाओं को संग्रहीत कर सकते हैं (उदाहरण के लिए, मैं पैच निर्देशिकाओं का उपयोग पैकेजों पर पैच लगाने के लिए करता हूं, एक अलग अनुभाग में) और बिल्डरोट उन्हें अपनी निर्देशिका में जोड़ देगा।


नोट: आप एक साथ कई बाहरी पेड़ लगा सकते हैं, बिल्डरोट मैनुअल में एक उदाहरण है


बनाएँ निर्देशिका के बगल में स्थित my_tree निर्देशिका बनाएं और हमारे कॉन्फ़िगरेशन को वहां स्थानांतरित करें। आउटपुट निम्न फ़ाइल संरचना होना चाहिए:


[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 

जैसा कि आप देख सकते हैं, सामान्य तौर पर, संरचना बिल्डरोट की संरचना का अनुसरण करती है।


बोर्ड निर्देशिका में हमारे मामले में प्रत्येक बोर्ड के लिए विशिष्ट फाइलें हैं:


  • bef_cr_fs_img.sh - एक स्क्रिप्ट जिसे लक्ष्य-फ़ाइल सिस्टम के निर्माण के बाद निष्पादित किया जाएगा, लेकिन छवियों में पैक करने से पहले। भविष्य में हम इसका उपयोग करेंगे
  • linux.config - कर्नेल कॉन्फ़िगरेशन
  • rootfs_overlay - टार्गेट फ़ाइल सिस्टम के शीर्ष पर ओवरले करने के लिए निर्देशिका
  • users.txt - निर्मित उपयोगकर्ताओं के विवरण के साथ फ़ाइल

कॉन्फिग डायरेक्टरी में हमारे बोर्ड के डिफॉन्फिग्स होते हैं। हमारे पास केवल एक है।


पैकेज - हमारे पैकेज के साथ एक कैटलॉग। प्रारंभ में, बिल्डरोट में सीमित संख्या में पैकेज बनाने के लिए विवरण और नियम होते हैं। बाद में हम यहां icewm विंडो मैनेजर और स्लिम लॉगॉन मैनेजर जोड़ेंगे।
पैच - आपको अलग-अलग पैकेज के लिए अपने पैच को आसानी से स्टोर करने की अनुमति देता है। नीचे एक अलग अनुभाग में अधिक जानकारी।
अब हमें अपने बाहरी-पेड़ की विवरण फ़ाइलों को जोड़ने की आवश्यकता है। 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 

पहली पंक्ति का नाम है। भविष्य में, बिल्डरोट वैरिएबल $ (BR2_EXTERNAL_MY_TREE_PATH) बनाते हैं , जिसका उपयोग विधानसभा को कॉन्फ़िगर करते समय किया जाना चाहिए। उदाहरण के लिए, उपयोगकर्ताओं के साथ फ़ाइल का पथ निम्न तरीके से सेट किया जा सकता है:


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

दूसरी पंक्ति एक संक्षिप्त, मानव-पठनीय विवरण है।


Config.in, external.mk - जोड़ा पैकेज के विवरण के लिए फाइलें। यदि आप अपने पैकेज नहीं जोड़ते हैं, तो ये फाइलें खाली रह सकती हैं। अब तक हम ऐसा करेंगे।
अब हमारे पास हमारे बाहरी पेड़ तैयार हैं, जिसमें हमारे बोर्ड के डिफॉन्फिग और इसके लिए आवश्यक फाइलें हैं। हम निर्माण निर्देशिका में जाएंगे, हम बाहरी पेड़ का उपयोग निर्दिष्ट करेंगे:


 [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 / , जो बाहरी पेड़ के उपयोग को दर्शाता है। आप उपयोग के लिए एक ही समय में कई बाहरी पेड़ों को निर्दिष्ट कर सकते हैं। यह एक बार ऐसा करने के लिए पर्याप्त है, जिसके बाद एक आउटपुट / .br-br.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 

महत्वपूर्ण! इस फ़ाइल में, पथ निरपेक्ष होंगे!


मेनू आइटम बाहरी विकल्प दिखाई दिए:



इस सबमेनू में हमारे बाहरी पेड़ से हमारे पैकेज शामिल होंगे। अब यह खंड खाली है।


अब हमारे लिए बाहरी पेड़ का उपयोग करने के लिए आवश्यक पथों को फिर से लिखना अधिक महत्वपूर्ण है।


ध्यान दें कि सेक्शन बिल्ड विकल्प → बिल्डरोट कॉन्फिग को सेव करने के लिए लोकेशन, सेव्ड डिफॉन्फिग के लिए एक अचूक रास्ता होगा। यह extgernal_tree के उपयोग को निर्दिष्ट करने के समय बनता है।


सिस्टम कॉन्फ़िगरेशन अनुभाग में भी, पथ को ठीक करें। उपयोगकर्ता द्वारा बनाई गई तालिका के लिए:


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

कर्नेल अनुभाग में, कर्नेल कॉन्फ़िगरेशन के लिए पथ बदलें:


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

अब, विधानसभा हमारी फ़ाइलों का उपयोग हमारे बाहरी-पेड़ से करेगी। किसी अन्य निर्देशिका में स्थानांतरित करते समय, बिल्डरोट को अपडेट करने पर, हमारे पास न्यूनतम समस्याएं होंगी।


जड़ एफएस ओवरले जोड़ना:


यह तंत्र लक्ष्य फ़ाइल सिस्टम में फ़ाइलों को जोड़ना / बदलना आसान बनाता है।
यदि फ़ाइल रूट एफएस ओवरले में है, लेकिन लक्ष्य में नहीं है, तो इसे जोड़ा जाएगा
यदि फ़ाइल रूट एफएस ओवरले में और लक्ष्य में है, तो इसे बदल दिया जाएगा।
सबसे पहले, रूट एफएस ओवरले डायर के रूट को सेट करें। यह सिस्टम कॉन्फ़िगरेशन में किया जाता है → रूट फाइल सिस्टम ओवरले निर्देशिका अनुभाग:


 $(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 / मेजबान) समाप्त सिस्टम पर / etc / मेजबान फ़ाइल को बदल देगी। एक दूसरी फ़ाइल (कैट my_tree / बोर्ड / my_x86_board / rootfs_overlay / new_file.txt) जोड़ी जाएगी।


हम इकट्ठा करते हैं और जांचते हैं:



सिस्टम असेंबली के विभिन्न चरणों में अनुकूलन स्क्रिप्ट का निष्पादन


छवियों में पैक होने से पहले अक्सर, आपको लक्ष्य फ़ाइल सिस्टम के अंदर कुछ क्रियाएं करने की आवश्यकता होती है।


यह सिस्टम कॉन्फ़िगरेशन अनुभाग में किया जा सकता है:



लक्ष्य फ़ाइल सिस्टम के निर्माण के बाद पहले दो लिपियों को निष्पादित किया जाता है, लेकिन इसे छवियों में पैक करने से पहले। अंतर यह है कि फ़ेकरूट स्क्रिप्ट को फ़ेकरूट के संदर्भ में निष्पादित किया जाता है, वे रूट उपयोगकर्ता से काम का अनुकरण करते हैं।


सिस्टम स्क्रिप्ट बनाने के बाद अंतिम स्क्रिप्ट निष्पादित की जाती है। आप इसमें अतिरिक्त कार्य कर सकते हैं, उदाहरण के लिए, आवश्यक फ़ाइलों को एक 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 

असेंबली के बाद, आप इस फाइल को सिस्टम में देख सकते हैं।


व्यवहार में, एक स्क्रिप्ट बड़ी बन सकती है। इसलिए, एक वास्तविक परियोजना में, मैं और अधिक उन्नत तरीके से गया:


  1. एक निर्देशिका (my_tree / board_my_x86_board / inner_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. यह स्क्रिप्ट सिस्टम कॉन्फ़िगरेशन में बोर्ड सेटिंग्स में इंगित करता है -> फ़ेकरूट वातावरण के अंदर चलाने के लिए कस्टम स्क्रिप्ट ($ (BR2_EXTERNAL_my_tree_PATH) /board/my_x86_board/run_nide_fakeroot.sh)

Source: https://habr.com/ru/post/hi449348/


All Articles