路由器04–OPKG

路由器04–OPKG1.简介https://oldwiki.archive.openwrt.org/doc/techref/opkgOpkg是一个基于ipkg的轻量级的软件包管理系统,主要用于嵌入式系统,目前应用opkg的有OpenWRT和OpenEmbedded。1Opkg的详细使用方法可以参考OpenWRT的WIKI页面,不再赘述,本文将重点解释opkg的工作原理。…

大家好,又见面了,我是你们的朋友全栈君。

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的默认值

路由器04--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.配置文件

路由器04--OPKG

默认的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 shadowsocks

# 安装软件,以安装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/

https://archive.openwrt.org/

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}'

http://openwrt-dist.kxrr.us/ 

以上源只是配置了基础的源,像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.

解决办法:opkg update

错误 Unknown package 'redsocks2'.

解决方法:软件源配置错误,请选择合适的源

opkg_conf_parse_file: /etc/opkg.conf:1: Ignoring invalid line: `t root /'

satisfy_dependencies_for: Cannot satisfy the following dependencies for redsocks2:
libc libc
opkg_install_cmd: Cannot install package redsocks2.

解决方法:libc需要手动安装

cd /tmp
# wget http://downloads.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base/libc_0.9.33.2-1_ramips_24kec.ipk

wget http://mirrors.ustc.edu.cn/openwrt/barrier_breaker/14.07/ramips/mt7620a/packages/base/libc_0.9.33.2-1_ramips_24kec.ipk

## 安装libc
opkg install libc_0.9.33.2-1_ramips_24kec.ipk

 

 

转载于:https://www.cnblogs.com/BlueFire-py/p/10846513.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144046.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • HTML如何实现页面跳转(html跳转到指定页面)

    1、html中使用meta中跳转,通过meta可以设置跳转时间和页面&lt;head&gt;&lt;!–只是刷新不跳转到其他页面–&gt;&lt;metahttp-equiv="refresh"content="5"&gt;&lt;!–定时转到其他页面–&gt;&lt;metahttp-equiv="refresh&quot

  • 记录一次maven JVM 调优

    记录一次maven JVM 调优记录一次mavenJVM调优前言记录一次无(摸)聊(鱼)的GC调优过程,本着学以致用、务实求真的精神,看了《深入理解Java虚拟机》中作者对自己的开发ideeclipse工具做了JVM调优,觉得很有意思。感觉这个确实是可以用自己的知识来提升开发效率,所以就有了这次的玄学调优之旅,文中如果有错误,希望能够指出,非常感谢。优化背景我本人目前有个工作上的项目,编译的时间大概需要30多秒,这次的目标就是从JVM的层面折腾、优化编译速度,那么就开始吧编译时间基准线优化前的编译时间,先

  • clion激活码获取【在线注册码/序列号/破解码】

    clion激活码获取【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • webpack-dev-server简记

    webpack-dev-server简记

  • func_get_args()在php71与php56的区别

    func_get_args()在php71与php56的区别

  • Spring Aop底层原理详解(利用spring后置处理器实现AOP)

    Spring Aop底层原理详解(利用spring后置处理器实现AOP)写在前面:对于一个java程序员来说,相信绝大多数都有这样的面试经历,面试官问:你知道什么是aop吗?谈谈你是怎么理解aop的?等等诸如此类关于aop的问题。当然对于一些小白可能会一脸懵逼;对于一些工作一两年的,可能知道,哦!aop就是面向切面变成,打印日志啊,什么什么的,要是有点学习深度的呢可能会说aop底层实现利用了jdk动态代理,cglib啊什么的。很多时候可能面试就到此打住了,当然,然后也…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号