#1 2011-12-15 16:21:05
ipkg套件的製作
如果您已經搞懂交叉編譯, 在路由器上與眾多程式周旋之際, 可能會發現一個問題: 如果日後我要重新安裝或升級, 移除程式, 難道要一個個砍, 一個個安裝嗎? 砍錯了, 導致其他程式不能執行, 怎麼辦?
嘿, 這問題就交由套件管理程式解決吧. 以微軟的術語來說, 就是控制台內的新增移除程式.
在嵌入式系統, 最常使用的套件來源是Optware, 使用輕量級的ipkg作為套件管理程式. 但ipkg似乎已停止維護, 所以OpenWrt改採另一套輕量級的opkg來管理套件.
當然, 其他NAS廠商也有各自的作法. 例如: 威聯通使用qpkg; 友訊, 華碩使用apkg, 但未公開. 本文的重點放在, 如何製作ipkg套件(.ipk), 其他套件管理程式的優劣, 請自行找資料.
因為我由opkg開始研究, 本來是ipkg與opkg二套共存於系統. 雖然Optware ddwrt的套件內容是mips32, 但進一步檢討後, 不能捨棄Optware. 所以藉ipkg的皮, 管理自己交叉編譯後的程式. 這樣系統就僅存一套ipkg套件管理程式, 清爽多了.
當然, 若您想直攻ipkg, NSLU2-Linux內有ipkg原始碼可供研究.
先來看看ipkg套件內容, 以wget舉例.
$ wget http://ipkg.nslu2-linux.org/feeds/optware/ddwrt/cross/stable/wget_1.12-2_mipsel.ipk
$ tar -xzf wget_1.12-2_mipsel.ipk
1. 解套件控制說明
$ tar -xzf control.tar.gz
$ cat control
Package: wget
Architecture: mipsel
Priority: optional
Section: net
Version: 1.12-2
Maintainer: NSLU2 Linux
Source: http://ftp.gnu.org/pub/gnu/wget/wget-1.12.tar.gz
Description: A network utility to retrieve files from the Web
Depends:
Conflicts: wget-ssl
套件敘述: control, 是套件組成必備元素, 由Package, Version, Architecture欄位組合成套件檔案名稱wget_1.12-2_mipsel.ipk
$ cat conffiles
/opt/etc/wgetrc
設定檔: conffiles, 用於套件升級時, 是否覆寫舊套件設定檔的偵測.
2. 解套件程式內容
$ tar -xzf data.tar.gz
$ tree opt/
opt/
├── bin
│ └── wget
├── etc
│ └── wgetrc
└── man
└── man1
└── wget.1
4 directories, 3 files
套件安裝後, 實際的安裝路徑, 以/opt為根目錄. (您現在應能理解我為何要將/opt/usr當作自編程式的根目錄了吧.)
再換一套, 看看別的東西. 以lighttpd舉例.
$ tar -xzf lighttpd_1.4.29-1_mipsel.ipk
$ tar -xzf control.tar.gz
套件控制部分, 有postinst, prerm二個script. 分別代表套件安裝後, 套件移除前要執行的相關指令.
這些簡單的解釋, 您應該能稍微理解ipkg的組織架構了. 參考Firmware Modification Kit作者寫的IPK Creation Kit.
開始建構ipkg的目錄架構. 假設我只要封裝自己編譯的wget執行檔, 則目錄架構為:
$ tree
.
├── CONTROL
│ └── control
└── opt
└── usr
└── bin
└── wget
編輯套件敘述:
$ nano CONTROL/control
Package: wget
Version: 1.13.4
Architecture: mipsel
Section: utility
Priority: optional
Source: ftp://ftp.twaren.net/Unix/GNU/gnu/wget/wget-1.13.4.tar.bz2
Maintainer: 套件維護者
Description: http://zh.wikipedia.org/wiki/Wget
套件封裝前, 先準備套件封裝工具, ipkg-build或opkg-build都可以.
$ wget http://ipkg.nslu2-linux.org/sources/ipkg-utils-1.7.tar.gz
$ tar -xzf ipkg-utils-1.7.tar.gz
或
$ wget http://svn.openmoko.org/trunk/src/host/opkg-utils/opkg-build
$ chmod u+x opkg-build
使用方法:
$ ./ipkg-build
Usage: ./ipkg-build [-c] [-C] [-o owner] [-g group] []
$ ./opkg-build
Usage: ./opkg-build [-c] [-C] [-O] [-o owner] [-g group] []
都是script, 查看內容可得知control相關欄位的設定值.
開始封裝:
$ ipkg-build -c -o root -g root Wget
產生的wget_1.13.4_mipsel.ipk就是了.
同樣上傳到路由器, 安裝測試:
# ipkg-opt install wget_1.13.4_mipsel.ipk
參考:
1. ipkg-輕量級套件管理系統
2. IPKG Howto
3. Construct ipkg packages (for developers)
最後修改: hippo (2011-12-15 16:40:16)
離線