
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:
src
atausrc/gz
, tergantung padaPackages
apakah file akan diunduh atauPackages.gz
. Dilihat dari kodenya, ada opsi lain untuk kata pertama, tetapi saya belum menemukan repositori yang ini akan relevan. Terlepas darisrc
namanya, ini adalah repositori untuk paket biner. Opkg tidak memiliki format repositori khusus untuk paket sumber yang mirip dengan yang digunakan di Debian / APT.- Nama repositori atau "feed" dalam terminologi opkg / OpenWrt.
- 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
- Saat reboot, cache akan dihapus. Pada sistem tertanam seperti router, ini sangat masuk akal.
- 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:
- Ekstensi
.ipk
alih-alih.deb
. - `tar`
gzip
, . Debianar
,.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:
- Kata kunci
src-git
. Tidak hanya git yang didukung , tetapi sekarang tidak ada repositori di VCS lain. - Nama umpan.
- 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 dan
signify-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 dieksekusi
make 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 lagi
make 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.
