جهاز نظام دفعة OpenWrt

يشيع استخدام نظام التشغيل OpenWrt كبرنامج ثابت لأجهزة التوجيه. التطبيق النموذجي هو الضبط والنسيان. ولكن إذا لم يكن هناك شيء ما يكفيك فجأة ، فسيتعين عليك فهم مجموعة أدوات التوزيع.











يستخدم OpenWrt opkg كمدير للحزم ، أو بالأحرى fork الخاص به . سيجد مهندسو دبيان ذلك مألوفًا من نواحٍ عديدة: أوامر متشابهة ، ومستودع مماثل وتنسيق حزمة.



كنت أرغب في تصحيح LUCI (لن يكون هذا في المقالة) ، لكنني لم أجد مقدمة سريعة كافية ، كان علي أن أجمع بشكل مستقل أجزاء من المعلومات من الوثائق والمقالات والأمثلة المتناثرة ، والنظر في الكود ونتائج العمل. على سبيل المكافأة ، جمعت حزمة بدائية (ولكنها غير مجدية من الناحية العملية) ليست موجودة في المستودع بعد. أشارك البرنامج التعليمي الذي تم جمعه أدناه.



جهاز المستودع



يوجد ملف في نظام ملفات OpenWrt /etc/opkg/distfeeds.conf



يحدد قائمة المستودعات للنظام (التي يوفرها مطورو OpenWrt و opkg). يمكن تحديد المستودعات الخاصة والطرف الثالث في /etc/opkg/customfeeds.conf



. التنسيق من سطر واحد ، ويتكون من ثلاث كلمات:



  1. src



    أو src/gz



    يعتمد ذلك على Packages



    ما إذا كان سيتم تنزيل الملف أم Packages.gz



    . إذا حكمنا من خلال الكود ، هناك خيارات أخرى للكلمة الأولى ، لكنني لم أجد أي مستودعات ذات صلة بهذا. على الرغم من src



    الاسم ، يعد هذا مستودعًا للحزم الثنائية. لا يحتوي Opkg على تنسيق مستودع خاص لحزم المصدر مماثلة لتلك المستخدمة في Debian / APT.
  2. اسم المستودع أو "feed" في مصطلحات opkg / OpenWrt.
  3. عنوان URL الذي يحتوي على Packages



    / Packages.gz



    .


عند التنفيذ أو الإضافة opkg update



إلى عنوان URL ، يتم حفظ قائمة الحزم والتوقيعات ، تتم تسمية الملف وفقًا للكلمة الثانية في قائمة المستودعات. هناك نوعان من الاستنتاجات الهامة من هذا:/



Packages



Packages.gz



/tmp/opkg-lists







  1. عند إعادة التشغيل ، سيتم مسح ذاكرة التخزين المؤقت. في الأنظمة المضمنة مثل أجهزة التوجيه ، يكون هذا منطقيًا تمامًا.
  2. يمكنك /etc/opkg/customfeeds.conf



    تجاوز تغذية النظام بموجزاتك الخاصة ، ومنحهم نفس الاسم. سوف يقسم opkg ، لكن يبتلع التجاوز ، مضيفًا الملف المطلوب بدلاً من الملف الذي تم تحميله مسبقًا.


في نفس الوقت سيتم تحميله Packages.sig



، والذي يجب أن يحتوي على تجزئة قائمة الحزم التي تم فك حزمها. القائمة نفسها تسرد الحزم ببساطة ، وهناك عدة قيم لكل حزمة ، وقيم الحزم المختلفة مفصولة بسطر فارغ. فيما يلي أهم الحقول لكل حزمة:



  • Package



    ، اسم الحزمة ؛
  • Version



    ، الإصدار ، إذا كان هناك العديد من الحزم التي تحمل نفس الاسم ، فيمكنك تحديد الإصدار ، وسيتم تثبيت الأحدث افتراضيًا ؛
  • Depends



    اعتمادًا على الحزم الأخرى ، سيقوم مدير الحزم بتثبيت الحزم المدرجة إذا لم تكن موجودة في النظام ؛
  • Filename



    ، يكون المسار إلى الملف مرتبطًا بعنوان URL الأساسي للمستودع ، وعادةً ما يكون المستودع مسطحًا وكل شيء في نفس مكان "Packages.gz" ؛
  • SHA256sum



    تم الإعلان عن تجزئة الحزمة بواسطة المستودع.


إذا كنت تريد المزيد من التفاصيل ، فيمكنك ببساطة قراءة إحدى هذه القوائم مباشرة في متصفحك .



الحزم الثنائية



الحزم الثنائية متطابقة تقريبًا مع حزم دبيان. الفرق كالتالي:



  1. التمديد .ipk



    بدلاً من .deb



    .
  2. `tar` gzip



    , . Debian ar



    , .tar.xz



    , .


إذا قمت بتغيير امتداد الحزمة لـ OpenWrt إلى .tar.gz



وفك ضغطها ، فستجد داخل أرشيفين وملف نصي واحد. تم تسمية الملف debian-version



، وهو يحتوي على نسخة من تنسيق الملف الثنائي وليس مثيرًا للاهتمام بالنسبة لنا ، في الأنظمة الحديثة هذا الإصدار دائمًا ما يساوي 2.0



. يحتوي



الأرشيف data.tar.gz



على ملفات قابلة للتنفيذ وملفات تكوين وكل شيء تم تثبيت الحزمة من أجله. إذا قمت بفك ضغطه إلى جذر FS ، فستحصل على جميع الملفات المتوقعة في الأماكن الصحيحة ، في /usr/bin/



، /etc/



وما إلى ذلك.



وهناك control.tar.gz



ملفات مساعدة لمدير الحزم. هذا البرنامج النصي الذي يجب تنفيذه قبل أو بعد التثبيت والإزالة ( preinst



، postinst



، prerm



،postrm



) ، ومعلومات حول الملفات التي تم تكوينها ، والمعلومات الوصفية حول الحزمة ، والتي تشبه إلى حد كبير تلك الموجودة في Packages



.



نظام بناء الحزمة



يتكون نظام التجميع (المعروف أيضًا باسم SDK) في شكل إطار عمل. إطار العمل لا يعني أنك ستقوم ببناء الحزم بشكل منفصل ، مهمته الأساسية هي بناء مستودعات كاملة.



SDK x86_64



في git . يوجد أرشيف (سيصبح الرابط قديمًا قريبًا ، ولكن ليس من الصعب العثور على واحد جديد) سيوفر لك الوقت في تجميع سلسلة الأدوات للتجميع. في الداخل ، الملف ذو أهمية خاصة feeds.conf.default



. التنسيق بسيط ، مفصول بمسافة:



  1. الكلمة الرئيسية src-git



    . لا يتم دعم git فقط ، ولكن لا توجد الآن مستودعات في VCS الأخرى.
  2. أطعمنى.
  3. عنوان URL لمستودع git حيث يمكنك تحديد تنفيذ أو علامة. إذا كنت تعرف اسم هذه المواصفات ، من فضلك قل لي.


يكون المستودع الذي يحتوي على الحزم نفسه بسيطًا قدر الإمكان: يوجد في جذر المستودع فئة حزمة ، وفي المستوى الثاني يوجد دليل باسم الحزمة ، وداخله Makefile



، اختياريًا ، "Config.in" للحصول على خيارات إضافية أثناء التنفيذ ودليل make menuconfig



فرعي patches



بالمحتوى المقابل. لأبسط حزمة فقط Makefile



. على سبيل المثال ، يمكنك النظر في مرآة المستودع الرئيسي .



اختبار البناء



حاولت إنشاء GNU Hello لاختبار كيفية عمل SDK. هذا مرحبًا عالميًا وحشيًا نسبيًا ، تمت كتابته وفقًا لإرشادات مشروع جنو ، والغرض الوحيد منه هو توضيح تلك الإرشادات. لم أنشئ مستودعًا منفصلاً له ، ولكن بدلاً من ذلك "أدخلته" في حزم SDK الأساسية ، حيث قمت بتجميعه.



لتشغيل SDK المُحاط بحزم دبيان المطلوبة libncurses-dev



(لتجميع القائمة) ، build-essential



(من GCC والبرامج القياسية الأخرى ، اعتمادًا على C) gawk



، unzip



و file



، rsync



و python3



. أيضًا ، لإنشاء مستودع من الحزم المجمّعة ، ستحتاج إلى أداة مساعدة لتوليد المفاتيح usign



. إنه ليس في المستودع ، لذلك ستحتاج أيضًا إلى "cmake" للبناء. يمكن استبدال هذه الأداة بكل من GPG وsignify-openbsd



لكنه موصى به وطور بواسطة مشروع OpenWrt وهو أجمل بكثير في الاستخدام.



نقوم بتجميع وتثبيت usign



:



git clone https://git.openwrt.org/project/usign.git
cd usign
cmake .
make
sudo make install 
      
      





بدلاً من الضبط ( sudo make install



) ، يمكنك ببساطة تذكر مكان الصندوق من أجل سحبه بيديك.



الآن إعداد SDK الأساسي:



git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
      
      





دعني أذكرك أنه بدلاً من الاستنساخ من git ، يمكنك تنزيل الأرشيف وتفريغه باستخدام سلسلة الأدوات المترجمة مسبقًا. لا تنس فقط تنزيل أحدث إصدار!



عند التنفيذ ، ./scripts/feeds update -a



نقوم باستنساخ / تحديث جميع المستودعات من feeds.conf (. الافتراضي) ، والتحقق من التبعيات وإعداد دليل staging_dir/host/bin



بالملفات القابلة للتنفيذ (هذه بشكل أساسي روابط رمزية لأدوات النظام المساعدة). يقوم الأمر التالي ./scripts/feeds install -a



بدفع الروابط الرمزية إلى package/feeds



حيث سيتم نقلها للتجميع. هذين الأمرين غير مطلوبين لبناء الحزمة المخصصة الخاصة بي.



يتم تنفيذ التاليmake menuconfig



... يمكنك تخطيها ، ولكن عند تجميع الحزمة ، ستظل تعرض النافذة المناسبة. في ذلك ، يكفي تغيير الهدف والهدف الفرعي بحيث يتم تجميع كل شيء تحت x86_64 والخروج ، والموافقة على حفظ التكوين. ستحتاج أيضًا إلى جمع أدوات التجميع المساعدة ( make tools/install



) و toolchain ( make toolchain/install



). إذا قمت بتنزيل SDK من الأرشيف ، make menuconfig



فلن تظهر لك خيارات لاختيار هدف ، ولا يلزم تجميع مجموعة الأدوات وسلسلة الأدوات - كل شيء موجود بالفعل.



الآن أقوم بإنشاء دليل package/devel/hello



أضع فيه Makefile



المحتوى التالي:



Makefile
include $(TOPDIR)/rules.mk

PKG_NAME:=hello
PKG_VERSION:=2.9
PKG_RELEASE:=1
PKG_LICENSE:=GPL-3.0-or-later

PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=@GNU/hello/
PKG_HASH:=ecbb7a2214196c57ff9340aa71458e1559abd38f6d8d169666846935df191ea7

include $(INCLUDE_DIR)/package.mk

define Package/hello
        SECTION:=devel
        CATEGORY:=Development
        TITLE:=GNU Hello
        URL:=https://www.gnu.org/software/hello/
endef

define Package/hello/description
        The GNU Hello program produces a familiar, friendly greeting. Yes,
        this is another implementation of the classic program that prints
        “Hello, world!” when you run it. However, unlike the minimal version
        often seen, GNU Hello processes its argument list to modify its
        behavior, supports greetings in many languages, and so on. The primary
        purpose of GNU Hello is to demonstrate how to write other programs that
        do these things; it serves as a model for GNU coding standards and GNU
        maintainer practices.
endef

define Package/hello/install
        $(INSTALL_DIR) $(1)/usr/bin
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/hello $(1)/usr/bin/
endef

$(eval $(call BuildPackage,hello))
      
      





في الأساس ، يجب أن يكون كل شيء واضحًا دون تفسير. ملفات إطار العمل متصلة ، ويتم وصف المعلمات الرئيسية للحزمة ، @GNU



واستبدالها بمرايا مشروع جنو (المحدد في إطار العمل) ، ويتكون المسار من جزأين: PKG_SOURCE_URL



يحدد عنوان URL الأساسي لجميع الإصدارات ويتم توسيعه عن طريق ربط اسم الملف PKG_SOURCE



بشرطة مائلة. أنه Package/hello/install



يحتوي على تعليمات لتجميع الثنائيات في أرشيف data.tar.gz



. تتوفر خيارات بناء إضافية ، إذا لزم الأمر ، في الوثائق . بالمناسبة ، لا تنس أن جعل المسافة البادئة أمر صعب الإرضاء ، فلدي علامات تبويب مفردة بدلاً من المسافات البادئة.



اتصل مرة اخرىmake menuconfig



، تحقق من أن حزمة hello محددة في القسم المشار إليه (التطوير في حالتي) واخرج من حفظ ملف config. أخيرًا ، نقوم بتجميع الحزمة في ثلاث خطوات ؛ التنزيل والتفريغ والتجميع الفعلي:



make package/hello/download
make package/hello/prepare
make package/hello/compile
      
      





نتيجة لذلك ، تلقيت حزمة bin/packages/x86_64/base/hello_2.9-1_x86_64.ipk



. يمكنك بناء مستودع. ونحن إنشاء زوج مفتاح ( usign -G -c 'openwrt test repo' -s key-build -p key-build.pub



، يجب أن يسمى المفتاح الخاص `مفتاح build`)، وجمع مستودع: make package/index



. في هذه المرحلة، يمكن للجمعية أن أقسم لغياب usign



في الدليل مع الأدوات المساعدة، وقررت أن مشكلة الرمزي: ln -s `which usign` staging_dir/host/bin/usign



. الآن بجانب الحزمة المجموعة الكاملة المطلوبة للمستودع.



التحقق من المستودع مع الحزمة



يمكنك اختبار كل شيء على جهاز توجيه حقيقي (تذكر فقط اختيار الهدف الصحيح) ، لكنني استخدمت Docker. في Dokerhabe ديك صورة OpenWrt لx86_84، والتي يمكن تشغيلها، الجليد داخل الدليل حاوية مع SDK: sudo docker run -it --name openwrt_test -v $PWD:/opt openwrtorg/rootfs



. اضغط على زر الإدخال حتى تظهر مطالبة Bash.



أنا أنسخ المفتاح من الدليل المعاد توجيهه ( cp /opt/key-build.pub /etc/opkg/keys/usign -F -p /opt/key-build.pub



يجب أن يتطابق اسم المفتاح بالضرورة مع المعرف) ، أضف مستودعي المحلي ( echo src/gz local file:///opt/bin/packages/x86_64/base >> /etc/opkg/customfeeds.conf



) ، قم بتحديث المستودع ( opkg update



). تبدأ الخاتمة بنص تشجيعي ، يتم توقيع كل شيء بشكل صحيح:



# opkg update
Downloading file:///opt/bin/packages/x86_64/base/Packages.gz
Updated list of available packages in /var/opkg-lists/local
Downloading file:///opt/bin/packages/x86_64/base/Packages.sig
Signature check passed.
      
      





يبقى فقط التثبيت والتحقق:



root@34af2f6e849b:/# opkg install hello
Installing hello (2.9-1) to root...
Downloading file:///opt/bin/packages/x86_64/base/hello_2.9-1_x86_64.ipk
Configuring hello.
root@34af2f6e849b:/# hello
Hello, world!
      
      





يا هلا ، انتهى الأمر! على الرغم من التوثيق المنتشر في جميع أنحاء المقالات ، فإن عملية بناء الحزمة واضحة إلى حد ما.










All Articles