OPKG 软件包管理
opkg 工具 (一个 ipkg 变种) 是一个用来从本地软件仓库或互联网软件仓库上下载并安装 OpenWrt 软件包的轻量型软件包管理器。 GNU/Linux 用户可能会对 apt-get,欧博abgaptitude,pacman,yum 等比较熟悉,也会看出其相似之处。它与 NSLU2 上同样用于嵌入式设备的 Optware 也有相似之处。OPKG 没有仅仅将软件安装到一个单独的路径(如:/opt),而是根文件系统上的一个完整的包管理器。它也包含了增加内核模块与驱动的可能性。OPKG 有时被称为 Entware ,但这主要是针对为嵌入式设备准备的 Entware 仓库。 opkg 试图在软件包仓库内来解决依赖关系。如果失败了,它将会报告一个错误并停止安装该软件包。 如果丢失第三方包的依赖关系,源码包依然可用的话,为了忽略依赖关系的错误可以使用 --force-depends 选项。 请注意: 如果你在使用一个 snapshot 、trunk 或 bleeding edge 版本,在仓库中的软件包适用内核版本比你的 Flash 上的内核更高,opkg install <pkg> 可能会失败。这种情况下,欧博官网会报错『Cannot satisfy the following dependencies for...』。参见 调用
opkg 必须有一个子命令参数: 用法: opkg [选项...] 子命令 [参数] 其中的子命令可以是: 可以使用 glob 模式. 软件包管理
update 更新可用软件包列表 阅读有关 正则表达式 信息命令
list [pkg|globp]
列出可用软件包 描述信息 (Description) 可能包含换行,so using merely grep is inapt since grep is line-based.
注1: size 是 gzip 压缩后的 tar 包尺寸。安装阶段,软件包会被展开解压缩,欧博JFFS2 会再次将之压缩。
短选项 长选项 描述
要安装软件包,执行下列命令。注意重启设备会使可用软件包列表丢失,欧博娱乐所以在试图安装软件包之前务必更新列表。 opkg update opkg install <package> 搜索
opkg list 仅会显示 包名 — 版本 — 描述 opkg info 会显示全部可用信息 你可以直接使用 glob 模式,或者写个小的 Shell 脚本来使用正则表达式或进一步的进程信息。使用管道(|)以及 grep 、awk 或 sed 指令来过滤输出: opkg list | grep pattern opkg list | awk '/pattern/ {print $0} opkg info kmod-ipt-* | awk '/length/ {print $0}' opkg list-installed | awk '{print $1}' | sed ':M;N;$!bM;s#\n# #g' var=“packagename1 packagename2 packagename2”; for i in $var; do opkg info $i; done; opkg depends dropbear 并不会起作用。 配置 调整仓库
唯一的配置文件是 /etc/opkg.conf ,它可能看起来是这样: src/gz snapshots dest root / dest ram /tmp lists_dir ext /var/opkg-lists option overlay_root /overlay 本地仓库
你可以配置 opkg 从本地获取软件包: src/gz local file:///path/to/packagesDirectoryBarrier_breaker 使用多个仓库,每个参考需要个唯一的标识符。逻辑上使用仓库原始的名称。如: ... src/gz base file:///path/to/packages/directory/packages/base src/gz luci file:///path/to/packages/directory/packages/luci src/gz packages file:///path/to/packages/directory/packages/packages src/gz oldpackages file:///path/to/packages/directory/packages/oldpackages ... etc ... 实例r=44685 search="" replace="file:///mnt/sdcard/shared/users/www/r$r" sed -i -e "s!$search!$replace!" /etc/opkg.conf 共享给第二个路由器: ln -s /mnt/sdcard/shared/users/www /www/pendrive在第二个路由器上: r=44685 search="downloads.openwrt.org/snapshots/trunk/ar71xx/generic" replace="192.168.1.1/pendrive/r$r" sed -i -e "s!$search!$replace!" /etc/opkg.conf 修改处理器架构
缺省情况下,opkg 仅操作标记架构为 all(即架构无关)或与目标平台相同的软件包。要从外引入兼容目标平台的软件包,可以在 opkg.conf 中使用 arch 选项追加可用的架构。 arch all 100 arch brcm4716 200 arch brcm47xx 300上面的例子将允许将 brcm47xx(即 soc 系列)软件包安装到 brcm4716(某特定的 SoC)平台。行尾的数字向 opkg 指定了优先级索引,以便在有多个可用包时选择最合适的那个。 代理支持
要透过代理使用 opkg,在 /etc/opkg.conf 中添加: option http_proxy :8080/ option ftp_proxy ftp://proxy.example.org:2121/使用以下设置来进行代理服务器的认证: option proxy_username xxxx option proxy_password xxxx有时,因为 busybox 中 wget 的限制,代理服务器的认证可能失败。这时,可以尝试在代理服务器的 URL 中传入用户名和密码: option http_proxy :password@proxy.example.org:8080/ option ftp_proxy :password@proxy.example.org:2121/ 安装目标 Extroot
使用 extroot_configuration 就足够了,无需进一步配置。 挂载点
opkg 有个不为那些 apt 系工具使用者熟悉的有用特性,它可以为任一软件包指定安装目的位置。 许多软件包不可重新定位,且可能无法干净地安装到非根目录下!像 LuCI 就会找不到它的模块,且若不手动修复就不能工作!使用 Extroot 吧!别指望这个办法能『拆箱即用』,大多软件包需要额外的符号链接或 hack 才能在改变的路径下正常工作! 事实上,默认的 opkg.conf 包含三个目的位置: dest root / dest ram /tmp dest mnt /mnt目的位置行的格式很简单,关键字 dest 跟着目的位置名称(可以随便起),然后就是文件系统位置。任一如上配置好的目的位置都可以在 opkg 命令行中使用,如: opkg install somepackage -d destination_namedest 参数必须为 /etc/opkg.conf 中定义的目的位置名。如:-d ram 会将软件包安装到 /tmp/ 下。 若要在非根的目的位置安装内核模块,你可能要先读下<red>这个</red>。 详细说明
首先 mount 到外部文件系统,操作帮助见 。然后编辑 /etc/opkg.conf : 若你向外部文件系统安装软件包,而该文件系统的 /etc/init.d 及(若启用)/etc/rc.d 下已有启动脚本,你需要设置个符号链接到 /etc/init.d 。如: ln -s /usb/etc/init.d/openvpn /etc/init.d/openvpn 跟随软件包安装的库也会被安装到外部文件系统。这使得程序不会在引导时启动。你需要在每个启动脚本中手动设置 LD_LIBRARY_PATH : export LD_LIBRARY_PATH=/lib:/usr/lib:/tmp/lib:/tmp/usr/lib:/usb/lib:/usb/usr/lib 其它说明
挂载外部分区,见 修改 /etc/opkg.conf ,为预期的挂载点加入个新的目的位置或: 修改目的位置的根目录,指向你的 USB 磁盘。 将 /usr/lib/opkg 目录的内容复制到你的挂载点。比如 USB 磁盘。 map directories where it is likely that they'll receive lots of files to your usb drive, for example with mount --bind during startup. /etc/rc.local could be one place where to map the directories. example: mount --bind /mnt/usb/root /root mount --bind /mnt/usb/usr/local /usr/local mount --bind /mnt/usb/home /home 库
对于包含库的软件包,若安装到了外部磁盘,需要配置才能找到。 安装 ldconfig 并在 /etc/ld.so.conf 中列出附加库路径会解决这个问题。在新库安装后,必须执行过 ldconfig 。它可以被安装到外部磁盘。在启动时执行一次它也许是个好主意。也许是在 中。 内核模块
安装到非标准位置的内核模块有可能不会自动加载,这时就需要手动插入内核。例如,在把 libdevmapper 安装到 /mnt 下面后,插入此模块: insmod /mnt/lib/modules/2.6.36.4/dm-mod.ko你可以把守护进程和『内核』服务安装到内部 Flash 中,把可选的软件包安装到外部挂载点。启动过程中,若外部磁盘被挂载,外部目录的可执行文件(<挂载点>/[bin,sbin,usr/bin,usr/sbin])会被加进 PATH 变量。路由器通过这种方式继续提供相关服务,即使外部存储已经离线。 软件包若安装到外部驱动器中,可能引发下列问题: file after saving the script, and making it executable (chmod +x /path/of/script/file), executing once “hash -r” may or may not be needed. netcat nfsd lvm2 More information on installing and using ldconfig can be found in . Example Creating Links to Files from the Root File System to Make Programs Work
Some programs need additional config files to run, and you will have to create soft links between the root filesystem and the external storage one (e.g. USB). As an example, to successfully run Midnight Commander after installing it on a USB stick, you must run: ln -s $USB/usr/share/terminfo/ /usb/share/ ln -s $USB/etc/mc /etc/mc Troubleshooting 磁盘空间耗尽
若 opkg 耗尽了存储空间,它通常会报告个 Could not obtain administrative lock 错误,表示没有干净地恢复孤悬的文件锁。可以调用 rm /usr/lib/opkg/lock 命令来删除这个文件锁。 除此之外,opkg 可能不会删除之前安装的文件。 将 URL 替换为相应的包: (cd /; \ wget -qO- | \ tar -Oxz ./data.tar.gz | tar -tz | xargs rm)然而,上述代码并没有可靠地删除那些伴随软件包安装进去的依赖软件包。它也遗留下了那些空目录。这个脚本尝试修正这些问题: #!/bin/sh #takes one argument/parameter: the name of the package which didn't install correctly and should be removed along with its dependencies #do opkg update first #example: ./opkgremovepartlyinstalledpackage.sh pulseaudio-daemon #get list of all packages that would be installed along with package x opkg update PACKAGES=`opkg --force-space --noaction install $1 | grep "http:" | cut -f 2 -d ' ' | sed 's/.$//'` for i in $PACKAGES do LIST=`wget -qO- $i | tar -Oxz ./data.tar.gz | tar -tz | sort -r | sed 's/^./\/overlay/'` for f in $LIST do if [ -f $f ] then echo "Removing file $f" rm -f $f fi if [ -d $f ] then echo "Try to remove directory $f (will only work on empty directories)" rmdir $f fi done done echo "You may need to reboot for the free space to become visible"将之保存在你的 OpenWrt 设备上,命名为 opkgclean.sh ,设置为可执行 chmod +x ./opkgclean.sh ,然后你可以这样执行它 ./opkgclean.sh <package-name> 。 其它
要使 opkg 的输出有颜色,可以用 . 命令
To find installed pkgs of a specific install target (ex. USB) (DRAWBACK!!! if any update availlable, it will update the package, just be warned!!!): for pkg in `opkg list-installed | sed -e “s/^([0-9A-Za-z\-]+) - .*$/\1/p” -n`; do opkg install $pkg; done | grep -i installed\ in\ <TARGET> 备注
Since Trunk r23173 respectively Backfire r23206 the kernel and kmod packages are flagged as hold. The opkg upgrade command won't attempt to update them anymore. This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.OKMore information about cookies (责任编辑:) |