在 make menuconfig 进行裁减 OpenWrt 时,为了让系统更精小一点,我们会把部分功能以“模块”的方式编译,即不编入内核,只是在后期用户可以进行安装与卸载。
包安装示例
如下关于Lua的配置项:
其中 json4lua, lua-cjson, lua-copas, lua-coxpcall 是没有编入原生系统的。
在 make 完成之后。
在 bin/ar71xx/packages/ 路径下全是 ipk 安装包。其中上面对应的安装包就在 bin/ar71xx/packages/packages/ 目录下。
#--开发机--
$ ls lua*
lua-cjson_2.1.0-1_ar71xx.ipk lua-rs232_1.0.3-1_ar71xx.ipk
lua-copas_2.0.0-1_ar71xx.ipk luasocket_3.0-rc1-20130909-3_ar71xx.ipk
lua-coxpcall_1.15.0-1_ar71xx.ipk luasql-mysql_2.3.0-1_ar71xx.ipk
luaposix_v33.2.1-4_ar71xx.ipk luasql-sqlite3_2.3.0-1_ar71xx.ipk
怎么安装到 OpenWrt上呢?
首先,用 scp 将 ipk 包发送到 OpenWrt 系统上。本人的 OpenWrt 的 IP 为 192.168.1.2,以 luasql 为例
#--开发机--
$ scp luasql-mysql_2.3.0-1_ar71xx.ipk [email protected]:
[email protected]'s password: <输入密码>
luasql-mysql_2.3.0-1_ar71xx.ipk 100% 6441 6.3KB/s 00:00
SSH登入 OpenWrt,查看文件。luasql-mysql_2.3.0-1_ar71xx.ipk 已在 /root/ 目录下了。
#--OpenWrt---
$ opkg install luasql-mysql_2.3.0-1_ar71xx.ipk
Installing luasql-mysql (2.3.0-1) to root...
Collected errors:
* satisfy_dependencies_for: Cannot satisfy the following dependencies for luasql-mysql:
* libmysqlclient *
* opkg_install_cmd: Cannot install package luasql-mysql.
Oops,出师不力(不用惊慌,这也是常常遇到的事儿)~缺 libmysqlclient 库。
那就看看 libmysqlclient 库的 ipk 包有没有。如果 bin/ar71xx/packages 路径下没有,则是 make menuconfig 时没有加进来。这时,修改配置,再make一下就会有了。
在 bin/ar71xx/packages/ 路径下 find 一下。
#--开发机---
$ find -name "libmysqlclient*"
./packages/libmysqlclient_5.1.73-1_ar71xx.ipk
有!那就不用再make一遍了。
同样,用 scp 将 libmysqlclient_5.1.73-1_ar71xx.ipk 文件传送到 OpenWrt。
#--开发机---
$ scp libmysqlclient_5.1.73-1_ar71xx.ipk [email protected]:
再在 OpenWrt 的 SSH 里安装刚发送过来的 ipk 包。
#--OpenWrt---
$ opkg install libmysqlclient_5.1.73-1_ar71xx.ipk
Installing libmysqlclient (5.1.73-1) to root...
Collected errors:
* satisfy_dependencies_for: Cannot satisfy the following dependencies for libmysqlclient:
* uclibcxx *
* opkg_install_cmd: Cannot install package libmysqlclient.
Oops~Again,libmysqlclient还依赖于uclibcxx库。安装 uclibcxx 库。
#--开发机---
$ scp base/uclibcxx_0.2.4-1_ar71xx.ipk [email protected]:
#--OpenWrt---
$ opkg install uclibcxx_0.2.4-1_ar71xx.ipk
Installing uclibcxx (0.2.4-1) to root...
Configuring uclibcxx.
uclibcxx库OK了
再来安装 libmysqlclient 库
#--OpenWrt---
$ opkg install libmysqlclient_5.1.73-1_ar71xx.ipk
Installing libmysqlclient (5.1.73-1) to root...
Configuring libmysqlclient.
libmysqlclient库OK了。
最后安装 luasql 库
#--OpenWrt---
$ opkg install luasql-mysql_2.3.0-1_ar71xx.ipk
Installing luasql-mysql (2.3.0-1) to root...
Configuring luasql-mysql.
就这样,luasql 库安装完成了。
在 OpenWrt 系统的 /usr/lib/lua/ 目录下多出一个 luasql 目录,在该目录下有一个 mysql.so 文件。
启动 Lua 试试看:
#--OpenWrt---
$ lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio (double int32)
> require 'luasql.mysql'
成功。
opkg 的使用
opkg 有点类似地 ubuntu 中的 dpkg 包管理工具。常见的用法是:安装、卸载软件包。
usage: opkg [options...] sub-command [arguments...]
where sub-command is one of:
Package Manipulation:
update Update list of available packages
upgrade <pkgs> Upgrade packages
install <pkgs> Install package(s)
configure <pkgs> Configure unpacked package(s)
remove <pkgs|regexp> Remove package(s)
flag <flag> <pkgs> Flag package(s)
<flag>=hold|noprune|user|ok|installed|unpacked (one per invocation)
Informational Commands:
list List available packages
list-installed List installed packages
list-upgradable List installed and upgradable packages
list-changed-conffiles List user modified configuration files
files <pkg> List files belonging to <pkg>
search <file|regexp> List package providing <file>
find <regexp> List packages whose name or description matches <regexp>
info [pkg|regexp] Display all info for <pkg>
status [pkg|regexp] Display all status for <pkg>
download <pkg> Download <pkg> to current directory
compare-versions <v1> <op> <v2>
compare versions using <= < > >= = << >>
print-architecture List installable package architectures
depends [-A] [pkgname|pat]+
whatdepends [-A] [pkgname|pat]+
whatdependsrec [-A] [pkgname|pat]+
whatrecommends[-A] [pkgname|pat]+
whatsuggests[-A] [pkgname|pat]+
whatprovides [-A] [pkgname|pat]+
whatconflicts [-A] [pkgname|pat]+
whatreplaces [-A] [pkgname|pat]+
Options:
-A Query all packages not just those installed
-V[<level>] Set verbosity level to <level>.
--verbosity[=<level>] Verbosity levels:
0 errors only
1 normal messages (default)
2 informative messages
3 debug
4 debug level 2
-f <conf_file> Use <conf_file> as the opkg configuration file
--conf <conf_file>
--cache <directory> Use a package cache
-d <dest_name> Use <dest_name> as the the root directory for
--dest <dest_name> package installation, removal, upgrading.
<dest_name> should be a defined dest name from
the configuration file, (but can also be a
directory name in a pinch).
-o <dir> Use <dir> as the root directory for
--offline-root <dir> offline installation of packages.
--add-arch <arch>:<prio> Register architecture with given priority
--add-dest <name>:<path> Register destination with given path
Force Options:
--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-postinstall Run postinstall scripts even in offline mode
--force-remove Remove package even if prerm script fails
--force-checksum Don't fail on checksum mismatches
--noaction No action -- test only
--download-only No action -- download only
--nodeps Do not follow dependencies
--nocase Perform case insensitive pattern matching
--force-removal-of-dependent-packages
Remove package and all dependencies
--autoremove Remove packages that were installed
automatically to satisfy dependencies
-t Specify tmp-dir.
--tmp-dir Specify tmp-dir.
regexp could be something like 'pkgname*' '*file*' or similar
e.g. opkg info 'libstd*' or opkg search '*libop*' or opkg remove 'libncur*'