Perangkat sistem batch OpenWrt

Sistem operasi OpenWrt biasanya digunakan sebagai firmware untuk router. Aplikasi tipikal adalah mengatur dan melupakan. Tetapi jika tiba-tiba ada sesuatu yang tidak cukup bagi Anda, maka Anda harus memahami kit distribusi.











OpenWrt menggunakan opkg sebagai manajer paketnya, atau lebih tepatnya forknya sendiri . Insinyur Debian akan menemukannya familiar dalam banyak hal: perintah serupa, repositori serupa dan format paket.



Saya ingin menambal LUCI (ini tidak akan ada di artikel), tetapi saya tidak menemukan pengenalan cepat yang memadai, saya harus mengumpulkan fragmen informasi secara mandiri dari dokumentasi, artikel, dan contoh yang tersebar, melihat kode dan hasil pekerjaan. Sebagai bonus, saya mengumpulkan paket primitif (tetapi tidak berguna dalam praktiknya) yang belum ada di repositori. Saya membagikan program pendidikan yang dikumpulkan di bawah ini.



Perangkat repositori



Ada file dalam sistem file OpenWrt /etc/opkg/distfeeds.conf



yang menentukan sistem (disediakan oleh OpenWrt dan pengembang opkg) daftar repositori. Repositori milik sendiri dan pihak ketiga dapat ditentukan di /etc/opkg/customfeeds.conf



. Formatnya satu baris, terdiri dari tiga kata:



  1. src



    atau src/gz



    , tergantung pada Packages



    apakah file akan diunduh atau Packages.gz



    . Dilihat dari kodenya, ada opsi lain untuk kata pertama, tetapi saya belum menemukan repositori yang ini akan relevan. Terlepas dari src



    namanya, ini adalah repositori untuk paket biner. Opkg tidak memiliki format repositori khusus untuk paket sumber yang mirip dengan yang digunakan di Debian / APT.
  2. Nama repositori atau "feed" dalam terminologi opkg / OpenWrt.
  3. URL yang berisi Packages



    / Packages.gz



    .


Ketika dijalankan , atau ditambahkan opkg update



ke URL , daftar paket dan tanda tangan disimpan , nama file sesuai dengan kata kedua dalam daftar repositori. Ada dua kesimpulan penting dari ini:/



Packages



Packages.gz



/tmp/opkg-lists







  1. Saat reboot, cache akan dihapus. Pada sistem tertanam seperti router, ini sangat masuk akal.
  2. Anda /etc/opkg/customfeeds.conf



    dapat mengganti feed sistem dengan milik Anda sendiri, memberinya nama yang sama. opkg akan bersumpah, tapi menelan override, menambahkan file yang diinginkan, bukan yang dimuat sebelumnya.


Pada saat yang sama, ini akan dimuat Packages.sig



, yang seharusnya berisi hash dari daftar paket yang telah dibuka . Daftar itu sendiri hanya mencantumkan paket-paket, ada beberapa nilai untuk setiap paket, nilai untuk paket yang berbeda dipisahkan oleh baris kosong. Berikut adalah bidang terpenting untuk setiap paket:



  • Package



    , nama paket;
  • Version



    , versi, jika ada beberapa paket dengan nama yang sama, Anda dapat memilih versi, yang terbaru akan diinstal secara default;
  • Depends



    , tergantung pada paket lain, manajer paket akan menginstal paket yang terdaftar jika tidak ada di sistem;
  • Filename



    , jalur ke file relatif terhadap URL dasar repositori, biasanya repositori itu datar dan semuanya berada di tempat yang sama dengan `Packages.gz`;
  • SHA256sum



    hash paket dideklarasikan oleh repositori.


Jika Anda menginginkan detail lebih lanjut, Anda cukup membaca salah satu dari daftar ini langsung di browser Anda .



Paket biner



Paket biner hampir identik dengan paket Debian. Perbedaannya adalah sebagai berikut:



  1. Ekstensi .ipk



    alih-alih .deb



    .
  2. `tar` gzip



    , . Debian ar



    , .tar.xz



    , .


Jika Anda mengubah ekstensi paket untuk OpenWrt menjadi .tar.gz



dan membukanya, Anda akan menemukan di dalam dua arsip dan satu file teks. File tersebut diberi nama debian-version



, berisi versi format file biner dan tidak terlalu menarik bagi kami, dalam sistem modern versi ini selalu sama dengan 2.0



.



Arsip data.tar.gz



berisi file yang dapat dieksekusi, file konfigurasi, dan segala sesuatu yang paketnya diinstal. Jika Anda mengekstraknya ke root sistem file, Anda akan mendapatkan semua file yang diharapkan di tempat yang tepat, di /usr/bin/



, /etc/



dan seterusnya.



Dan di sana control.tar.gz



ada file tambahan untuk manajer paket. Script ini yang harus dijalankan sebelum atau setelah instalasi dan penghapusan ( preinst



, postinst



, prerm



,postrm



), informasi tentang file yang merupakan file konfigurasi, dan informasi meta tentang paket, yang sebagian besar sama dengan yang terdapat di Packages



.



Sistem pembuatan paket



Sistem perakitan (alias SDK) dibuat dalam bentuk kerangka kerja. Kerangka kerja tidak menyiratkan bahwa Anda akan membangun paket secara terpisah, tugas utamanya adalah membangun seluruh repositori.



SDK x86_64



ada di git . Ada arsip (tautannya akan segera kedaluwarsa, tetapi tidak sulit untuk menemukan yang baru) yang akan menghemat waktu Anda dalam menyusun toolchain untuk perakitan. Di dalamnya, file tersebut memiliki minat khusus feeds.conf.default



. Formatnya sederhana, dipisahkan dengan spasi:



  1. Kata kunci src-git



    . Tidak hanya git yang didukung , tetapi sekarang tidak ada repositori di VCS lain.
  2. Nama umpan.
  3. URL repositori git tempat Anda dapat menentukan komit atau tag. Jika Anda tahu nama spesifikasi seperti itu, beri tahu saya.


Repositori dengan paket itu sendiri dirancang sesederhana mungkin: di root repositori terdapat kategori paket, di tingkat kedua ada direktori dengan nama paket, dan di dalamnya Makefile



, secara opsional, ada `Config.in` untuk opsi tambahan selama eksekusi make menuconfig



dan subdirektori patches



dengan konten yang sesuai. Hanya untuk paket paling sederhana Makefile



. Misalnya, Anda dapat melihat ke mirror dari repositori utama .



Uji build



Saya mencoba membuat GNU Hello untuk menguji cara kerja SDK. Ini adalah Hello World yang relatif mengerikan, ditulis dengan ketat sesuai dengan pedoman proyek GNU, dan satu-satunya tujuan adalah untuk menggambarkan pedoman tersebut. Saya tidak membuat repositori terpisah untuk itu, melainkan "menyelipkannya" ke dalam paket SDK dasar, dari mana saya mengkompilasinya.



Untuk pengoperasian SDK Dikelilingi oleh paket Debian yang diperlukan libncurses-dev



(untuk perakitan menu), build-essential



(GCC dan program standar lainnya, tergantung pada C), gawk



, unzip



, file



, rsync



dan python3



. Selain itu, untuk membuat repositori dari paket yang dikumpulkan, Anda memerlukan utilitas untuk menghasilkan kunci usign



. Itu tidak ada dalam repositori, jadi Anda perlu tambahan `cmake` untuk membangun. Alat ini dapat diganti dengan GPG dansignify-openbsd



tetapi direkomendasikan dan dikembangkan oleh proyek OpenWrt dan jauh lebih baik untuk digunakan.



Kompilasi dan instal usign



:



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





Alih-alih menyetel ( sudo make install



), Anda cukup mengingat di mana binar berada untuk menariknya lebih jauh dengan tangan Anda.



Sekarang penyiapan SDK dasar:



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





Izinkan saya mengingatkan Anda bahwa alih-alih mengkloning dari git, Anda dapat mengunduh dan membongkar arsip dengan toolchain yang telah dikompilasi sebelumnya. Jangan lupa download versi terbarunya!



Saat menjalankan, ./scripts/feeds update -a



kami mengkloning / memperbarui semua repositori dari feeds.conf (.default), memeriksa dependensi dan menyiapkan direktori staging_dir/host/bin



dengan file yang dapat dieksekusi (pada dasarnya ini adalah symlink ke utilitas sistem). Perintah berikut ./scripts/feeds install -a



,, mendorong symlink ke package/feeds



, dari mana mereka akan dibawa untuk kompilasi. Kedua perintah ini tidak diperlukan untuk membuat paket kustom saya.



Selanjutnya dieksekusimake menuconfig



... Anda dapat melewatinya, tetapi saat mengompilasi paket, itu masih akan menampilkan jendela yang sesuai. Di dalamnya, cukup mengubah target dan sub-target sehingga semuanya dikompilasi di bawah x86_64 dan keluar, setuju untuk menyimpan konfigurasi. Anda juga perlu mengumpulkan alat perakitan tambahan ( make tools/install



) dan toolchain ( make toolchain/install



). Jika Anda mendownload SDK dari arsip, make menuconfig



Anda tidak akan diperlihatkan opsi untuk memilih target, dan merakit toolkit dan toolchain tidak diperlukan - semuanya sudah ada.



Sekarang saya membuat direktori package/devel/hello



tempat saya menempatkan Makefile



konten berikut:



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))
      
      





Pada dasarnya semuanya harus jelas tanpa penjelasan. File kerangka kerja terhubung, parameter utama paket dijelaskan, @GNU



diganti dengan mirror proyek GNU (didefinisikan dalam kerangka kerja), dan jalur terdiri dari dua bagian: PKG_SOURCE_URL



yang menentukan URL dasar untuk semua versi dan diperluas dengan menggabungkan nama file dari PKG_SOURCE



dengan garis miring. Ini Package/hello/install



berisi instruksi untuk merakit biner menjadi arsip data.tar.gz



. Opsi build tambahan, jika diperlukan, tersedia di dokumentasi . Ngomong-ngomong, jangan lupa bahwa make sangat pilih-pilih tentang indentasi, saya memiliki tab tunggal, bukan spasi.



Telepon lagimake menuconfig



, periksa apakah paket halo ditandai di bagian yang ditunjukkan (Pengembangan dalam kasus saya) dan keluar dari penyimpanan konfigurasi. Akhirnya, kami merakit paket dalam tiga langkah; mengunduh, membongkar dan benar-benar mengkompilasi:



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





Hasilnya, saya menerima paket bin/packages/x86_64/base/hello_2.9-1_x86_64.ipk



. Anda dapat membangun repositori. Kami menghasilkan pasangan kunci ( usign -G -c 'openwrt test repo' -s key-build -p key-build.pub



, kunci pribadi harus dipanggil `kunci-build`), dan mengumpulkan repositori: make package/index



. Pada tahap ini, perakitan dapat bersumpah untuk tidak adanya usign



di direktori dengan alat bantu, saya memutuskan untuk masalah symlink: ln -s `which usign` staging_dir/host/bin/usign



. Sekarang di sebelah paket adalah set lengkap yang diperlukan untuk repositori.



Memeriksa repositori bersama dengan paketnya



Anda dapat memeriksa semuanya di router nyata (ingatlah untuk memilih target yang benar), tetapi saya menggunakan Docker. Dalam Dokerhabe memiliki OpenWRT gambar untuk x86_84, yang dapat dijalankan, icing di dalam direktori wadah dengan SDK: sudo docker run -it --name openwrt_test -v $PWD:/opt openwrtorg/rootfs



. Poke tombol enter hingga prompt Bash muncul.



Saya menyalin kunci dari direktori yang diteruskan ( cp /opt/key-build.pub /etc/opkg/keys/usign -F -p /opt/key-build.pub



nama kunci harus sesuai dengan pengenalnya), tambahkan repositori lokal saya ( echo src/gz local file:///opt/bin/packages/x86_64/base >> /etc/opkg/customfeeds.conf



), perbarui repositori ( opkg update



). Kesimpulannya dimulai dengan teks yang mendorong, semuanya ditandatangani dengan benar:



# 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.
      
      





Tetap hanya untuk menginstal dan memeriksa:



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!
      
      





Hore, selesai! Meskipun dokumentasinya tersebar di seluruh artikel, proses pembuatan paket cukup mudah.










All Articles