OPKG 介紹
來源 https://www.cnblogs.com/BlueFire-py/p/10846513.html
1.簡介
https://oldwiki.archive.openwrt.org/doc/techref/opkg
Opkg 是一個基於 ipkg 的輕量級的軟件包管理系統,主要用於嵌入式系統,目前應用opkg的有Open WRT 和 Open Embedded。
1Opkg的詳細使用方法可以參考OpenWRT的 WIKI頁面,不再贅述,本文將重點解釋opkg的工作原理。 OpenWRT Barrier Breaker 14.07 與 潘多拉不一樣的系統(尤其注意源) root@OpenWrt:~# cat /etc/openwrt_release DISTRIB_ID="OpenWrt" DISTRIB_RELEASE="14.07" DISTRIB_REVISION="r42625" DISTRIB_CODENAME="barrier_breaker" DISTRIB_TARGET="x86/generic" DISTRIB_DESCRIPTION="OpenWrt Barrier Breaker 14.07" DISTRIB_TAINTS="" root@OpenWrt:~# opkg --version opkg version 0.1.8 root@OpenWrt:~#
2.opkg的默認值
注:由於我是在 OpenWrt Barrier Breaker 14.07 上進行測試,所以在命令行上必須手動加上參數: -f /etc/opkg.conf DEST LIST 目的地列表
3.opkg 各文件作用
dest 指定的目錄,加到 Dest List 中,例如:
包安裝、刪除和升級的根目錄
dest root / dest ram /tmp 然后,連接這個路徑分別和以下幾個路徑連接: (1) 和 Info Directory 連接作為該 dest 的 Info Directory; (2) 和 Status File 連接作為該 dest 的 Status File; (3) 和 Lists Directory 連接作為該 dest 的 Lists Directory。 以 / 為例: //var/lib/opkg/info/ //var/lib/opkg/lists/ //var/lib/opkg/status 對比v0.1.8,這些目錄是放在了 /usr/lib/opkg 下面: root@OpenWrt:~# ls /usr/lib/opkg -l drwxr-xr-x 2 root root 8192 Oct 1 2014 info drwxr-xr-x 2 root root 4096 Oct 1 2014 lists -rw-r--r-- 1 root root 15932 Oct 1 2014 status root@OpenWrt:~# 其中,status 文件為所有軟件包的基本信息,包括名稱、版本、依賴、狀態、初始安裝日期等,以 libc 為例: Package: libc Version: 0.9.33.2-1 Depends: libgcc Status: install hold installed Essential: yes Architecture: x86 Installed-Time: 1412176159 Auto-Installed: yes Lists 文件夾下面是根據配置文件中的src/gz指定的URL下載下來的文件,例如: src/gz barrier_breaker_base http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/packages/base 在執行 update 后,會使用下面的URL下載一個文件: http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/packages/base/Packages.gz 文件下載后,將解壓的文件放到 Lists 目錄下面(索引文件),並把第二個字段(如上面的barrier_breaker_base)作為文件名,這個文件里面包含了該Package里面所有的軟件包的信息,舉一為例: Package: 6in4 Version: 17-1 Depends: libc, kmod-ipv6, kmod-sit Source: package/network/ipv6/6in4 Section: net Maintainer: Jo-Philipp Wich <xm@subsignal.org> Architecture: all Installed-Size: 1194 Filename: 6in4_17-1_all.ipk Size: 1832 MD5Sum: 6758bb49b2a828301bdac956481ec6c1 SHA256sum: 1ad5794959c8435c7ab4c261ab86d2974d65527f7b8ffa99eee370409993976c Description: Provides support for 6in4 tunnels in /etc/config/network. Refer to http://wiki.openwrt.org/doc/uci/network for configuration details. 查看 Lists 目錄下的內容(壓縮了一些空白符): root@OpenWrt:~# ls /var/lib/opkg/lists/ -l -rw-r--r-- 1 root root 485307 Jul 18 14:44 barrier_breaker_base -rw-r--r-- 1 root root 43348 Jul 18 14:44 barrier_breaker_luci -rw-r--r-- 1 root root 4634 Jul 18 14:44 barrier_breaker_management -rw-r--r-- 1 root root 715082 Jul 18 14:44 barrier_breaker_oldpackages -rw-r--r-- 1 root root 455216 Jul 18 14:44 barrier_breaker_packages -rw-r--r-- 1 root root 34987 Jul 18 14:44 barrier_breaker_routing -rw-r--r-- 1 root root 260681 Jul 18 14:44 barrier_breaker_telephony root@OpenWrt:~#
4.配置文件
默認的opkg.conf實際上包含三個目標地:
dest root / dest ram / tmp dest mnt / mnt
目標行的格式只是關鍵字dest,后跟此目標的名稱(可以是任何內容),后跟文件系統位置。這樣配置的任何目標都可以在opkg命令行中指定,如下所示:
opkg install somepackage -d destination_name
dest參數必須引用/etc/opkg.conf中定義的目的地之一,例如-d ram,以便將軟件包安裝到/tmp/。
默認情況下,opkg只允許包含體系結構all(=體系結構獨立)和已安裝目標體系結構的包。為了從一個外部但兼容的目標獲取包,可以使用arch選項在opkh .conf中覆蓋允許的體系結構列表:
arch all 100 arch brcm4716 200 arch brcm47xx 300
這個例子允許在brcm4716(一個特定的SoC)目標上安裝brcm47xx(=系列的SoCs)包。這個數字指定了一個優先級索引,opkg使用該索引來確定在多個體系結構中可用的包時選擇哪個包。優先級數值越大,執行級別越高,
5.命令
https://oldwiki.archive.openwrt.org/doc/techref/opkg
列出軟件包命令list和更新upgrade稍有不同,在開始執行命令之前的准備工作,會讀取lists 目錄下的文件,這個文件的格式前面提到了。將所有文件內的每個軟件包的信息都加載到內存中, 在讀取文件的過程中,opkg會分析每個軟件包的Architecture 字段,只有當該字段的值在 Arch List 中時,才會將該軟件包加到 hash table 里面(opkg_config->file_hash)。 下面的事情就比較簡單了,list 就是將 file_hash 里面所有的軟件包打印出來。
列出安裝的軟件包list-installed命令,並不會讀取 lists 目錄下的文件,而是讀取 Status List 包含的每個文件,系統已安裝的軟件包會放到這個文件里面,然后將Status包含installed的軟件包打印出來。
opkg status lua
files命令用於列出一個軟件包所包含的全部文件,這些文件包括可執行文件、配置文件等。對於已安裝過的軟件包,則打開 $lists_dir 下面的軟件包對應的 list 文件
例如軟件包 busybox,對應的list文件為/var/lib/opkg/info/busybox.list 這個文件包含了該軟件包所包含的文件,每行一個。
對於未安裝的軟件包,打印軟件包尚未安裝的錯誤信息:
Search 命令則用於查找某個文件屬於哪個軟件包,可以使用通配符(使用fnmatch函數來進行模式匹配)。對應的函數為 opkg_search_cmd(),這個過程也比較簡單:
獲取全部安裝的軟件包,依次查找每個軟件包所包含的文件,如果包含要查找的文件,那么就打印出該軟件包。
這個函數也有一些缺陷,如果一個軟件包所包含的文件,有多個可以匹配搜索的文件,那么結果該軟件包就會被打印多次。以搜索ls為例,在base-files中有以下7個文件包含ls字符串:
刪除 remove
(1) 檢查Essential 標記:如果該軟件包為Essential的,除非用戶強制刪除(使用–force-removal-of-essential-packages參數),否則opkg拒絕刪除該軟件;
(2) 檢查依賴:檢查系統中有哪些其他的軟件包依賴於要刪除的軟件包,如果有,那么打印出依賴於該軟件包的其他軟件包,然后結束刪除動作;
如果用戶希望強制刪除該軟件以及依賴於該軟件的所有其他軟件,可以使用–force-removal-of-dependent-packages參數,opkg將首先刪除依賴於該軟件的其他軟件;
清理 clean
清理就是刪除cache文件夾下面的文件。
# 打印幫助 opkg -h # 更新資源列表 opkg update # 列出已安裝的包 opkg list # 搜索包 opkg search tcpdump # 安裝軟件,以安裝curl和wget為例 opkg install curl # 安裝本地軟件包 opkg install /tmp/wget_1.16-1_ramips_24kec.ipk # 移除軟件 opkg remove wget
--force-depends Install/remove despite failed dependencies --force-maintainer Overwrite preexisting config files --force-reinstall Reinstall package(s) --force-overwrite Overwrite files from other package(s) --force-downgrade Allow opkg to downgrade packages --force-space Disable free space checks --force-checksum Ignore checksum mismatches --force-postinstall Run postinstall scripts even in offline mode --noaction No action – test only --download-only No action – download only --nodeps Do not follow dependencies --force-removal-of-dependent-packages Remove package and all dependencies --autoremove Remove packages that were installed automatically to satisfy dependencies -t --tmp-dir Specify tmp-dir.
6.opkg配置(源一定要選對應的,可以省很多事)
pandorabox默認opkg配置
dest root / dest ram /tmp lists_dir ext /var/opkg-lists option overlay_root /overlay src/gz r2_base http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/base src/gz r2_management http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/management src/gz r2_oldpackages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/oldpackages src/gz r2_packages http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/packages src/gz r2_routing http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/routing src/gz r2_telephony http://downloads.openwrt.org.cn/PandoraBox/ralink/packages/telephony
一個其他openwrt 版本的配置
修改安裝源:vi /etc/opkg.conf src/gz attitude_adjustment http://downloads.openwrt.org/snapshots/trunk/bcm53xx/packages/ dest root /data dest ram /tmp lists_dir ext /data/var/opkg-lists option overlay_root /data arch all 1 arch noarch 1 arch bcm53xx 10 最后一行加上二進制的兼容范圍,系統默認只接受bcm4079的格式。
opkg update
注意:opkg會把包安裝到/data目錄而不是“/”目錄。因為默認的root dest改了
目前我刷的openWrt是PandoraBox 14.09 r355,是基於openWrt Barrier Breaker的。使用的源地址是http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/
src/gz barrier_breaker_base http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base src/gz barrier_breaker_management http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/management src/gz barrier_breaker_oldpackages http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/oldpackages src/gz barrier_breaker_packages http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/packages src/gz barrier_breaker_routing http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/routing src/gz barrier_breaker_telephony http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/telephony dest root /data dest ram /tmp lists_dir ext /data/var/opkg-lists option overlay_root /data
保存后運行opkg update。發現源是可以鏈接上了,但是報出類似於如下錯誤
Package xxx version xxx has no valid architecture, ignoring.
源指定的architecture和路由上刷好的系統的不一致造成的。
在/etc/opkg.conf文件中加入對系統支持的architecture的設置,具體方法是添加如下幾行
arch all 100
arch <arch類型1> 200
arch <arch類型2> 300
官網的意思是告訴opkg,arch類型2的包可以兼容的裝在arch類型1的系統上。那么問題來了,現在的arch類型是什么呢?折騰了好久,我嘗試過查看系統的arch,利用命令查看架構
uname -a
cat /proc/cpuinfo
cat /etc/openwrt_release
注意最后的arch為:
arch all 100
arch ramips_24kec 200
arch ramips 300
arch mips 400
如何掛載U盤,安裝python https://blog.csdn.net/huyaoyu/article/details/42810383
7.ipk版本介紹:
http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_ar71xx.ipk 為ar71xx版 http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_arm.ipk 為arm版 http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_armv7.ipk 為armv7版 http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_ralink.ipk 為7620A(N)和7621潘多拉專用版 http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_ramips_24kec.ipk 為7620A(N)和7621 OPENWRT官版專用版 http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_x64.ipk 為X64版 http://code.taobao.org/svn/luci-app-adbyby/adbyby_2.7-7.0_x86.ipk 為X86版
8.關於ramips和mips
ramips 的 mtk7620是mipsel架構的。 mips是指令集,sel和seb是內存大小端模式.
mips是big-endian的mips架構, mipsel是little-endian的mips架構。 MT7620, 設計這個芯片的公司在被MTK收購前叫ralink, ramips是ralink生產的芯片系列在openwrt中的名稱,mips是具體的芯片架構,rampis為廠商名
9.可用的源
即使潘多拉是openwrt的一個版本,但是它的安裝源封閉,盡量不要用其他版本的
安裝哪個版本的鏡像就使用哪個版本的ipk(版本不通,肯定不能用啊)
https://archive.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/
http://mirrors.ustc.edu.cn/lede/releases/17.01.1/targets/ramips/mt7620/packages/
http://downloads.openwrt.org.cn/
http://downloads.openwrt.org.cn/PandoraBox/
https://downloads.pangubox.com/pandorabox/
10.更多源設置
打印架構,直接配置(潘多拉可以使用嗎?)
opkg print-architecture | awk'{print $ 2}'
以上源只是配置了基礎的源,像openwrt-dist這種源,由於某種神秘力量導致我們無法直接使用,需要使用反代,老高發現一個不錯的反代
src/gz openwrt_dist http://openwrt-dist.thankgfw.ml/releases/ramips/packages
src/gz openwrt_dist_luci http://openwrt-dist.thankgfw.ml/releases/luci/packages
把上面的代碼加到opkg配置文件的后面就行!
10.常見錯誤
satisfy_dependencies_for: Cannot satisfy the following dependencies for curl: * libc * libc * libc * * opkg_install_cmd: Cannot install package curl.
============== End
解決辦法:opkg update
解決方法:軟件源配置錯誤,請選擇合適的源
解決方法:libc需要手動安裝