UBUNTU环境下编译的openwrt

时间:2021-05-26 19:41:58
UBUNTU环境下编译的openwrt
请执行这个命令以安装编译依赖包:sudo apt-get update
然后再输这个: sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev
sudo apt-get install asciidoc bash bc binutils bzip2 fastjar flex git-core g++ build-essential util-linux gawk libgtk2.0-dev intltool jikespg zlib1g-dev genisoimage libncurses5-dev libssl-dev patch perl-modules python2.7-dev rsync ruby sdcc unzip wget gettext xsltproc libboost1.55-dev libboost1.55-tools-dev libxml-parser-perl libusb-dev bin86 bcc bzr ecj sharutils openjdk-7-jdk zip gcc-multilib quilt


可能make menuconfig的时候提示缺少git和GAWK的,提示如Checking 'git'... failed.可以这样解决sudo apt-get install gawk
与sudo apt-get install git然后是下载源码
(开发版本,不稳定,不建议下载,但在这个版本中有MW4530R配置项。还是下载个使用)
(目前稳定版本,建议,但是这个版本配置项中少了好多支持。)
TRUNK版的是
svn checkout svn://svn.openwrt.org/openwrt/trunk
cd trunk
./scripts/feeds update -a
./scripts/feeds install -a


DREAMBOX版的是
svn co svn://svn.openwrt.org.cn/dreambox/backfire openwrt-dreambox
cd openwrt-dreambox
./scripts/feeds update -a
./scripts/feeds install -a


然后就是make menuconfig
选好配置后就可以开始make了


openwrt_rtnas_v2版的是
cd openwrt_rtnas_v2/openwrt/
然后就是./build.sh
在编译之前要更新扩展软件包,即执行以下几个命令:
  ./scripts/feeds uninstall -a
  ./scripts/feeds update -a
  ./scripts/feeds install -a
1. 编译linux的内核模块ecryptfs
yangyang@yangyang-ThinkPad-Edge:~/openwrt_rtnas_v2/openwrt$ make kernel_menuconfig 
make[1]: Entering directory `/home/yangyang/openwrt_rtnas_v2/openwrt/target/linux'
make[2]: Entering directory `/home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/kirkwood'
rm -f /home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8/.configured
/home/yangyang/openwrt_rtnas_v2/openwrt/scripts/kconfig.pl  + /home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/generic/config-3.3 /home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/kirkwood/config-3.3 > /home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8/.config
export MAKEFLAGS= ;make -C /home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8 -C /home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8 HOSTCFLAGS="-O2 -I/home/yangyang/openwrt_rtnas_v2/openwrt/staging_dir/host/include -Wall -Wmissing-prototypes -Wstrict-prototypes" CROSS_COMPILE="arm-openwrt-linux-uclibcgnueabi-" ARCH="arm" KBUILD_HAVE_NLS=no CONFIG_SHELL="/bin/bash" V='' CC="arm-openwrt-linux-uclibcgnueabi-gcc" menuconfig
make[3]: Entering directory `/home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8'
scripts/kconfig/mconf Kconfig




Your configuration changes were NOT saved.


make[3]: Leaving directory `/home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8'
/home/yangyang/openwrt_rtnas_v2/openwrt/scripts/kconfig.pl '>'  /home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/generic/config-3.3 /home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8/.config > /home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/kirkwood/config-3.3
make[2]: Leaving directory `/home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/kirkwood'
make[1]: Leaving directory `/home/yangyang/openwrt_rtnas_v2/openwrt/target/linux'
从以上可以得出/home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/generic/config-3.3 /home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/kirkwood/config-3.3 > /home/yangyang/openwrt_rtnas_v2/openwrt/build_dir/linux-kirkwood/linux-3.3.8/.config
linux-3.3.8的内核配置.config,是由openwrt/target/linux/generic/config-3.3与openwrt/target/linux/kirkwood/config-3.3合起来生成的。
然后根据linux-kirkwood/linux-3.3.8/fs/ecryptfs里面的配置文件kconfig中的ecryptfs依赖关系,更改/home/yangyang/openwrt_rtnas_v2/openwrt/target/linux/generic/config-3.3,以及CONFIG_ECRYPT_FS=y。
最后就是在openwrt/package/kernel/modules/fs.mk里面添加
define KernelPackage/fs-ecryptfs
  SUBMENU:=$(FS_MENU)
  TITLE:=ECRYPTFS4 filesystem support
  KCONFIG:=\
CONFIG_ECRYPT_FS \
CONFIG_EXPERIMENTAL=y \
CONFIG_ENCRYPTED_KEYS=y \
CONFIG_CRYPTO=y \
CONFIG_ENCRYPTED_KEYS=y 
  FILES:=$(LINUX_DIR)/fs/ecryptfs/ecryptfs.ko
  AUTOLOAD:=$(call AutoLoad,30,ecryptfs)
endef


define KernelPackage/fs-ecryptfs/description
  Kernel module for EcryptFS support
endef


$(eval $(call KernelPackage,fs-ecryptfs))


就能够确保ecryptfs能够在make menuconfig
Kernel moudles  --->
  Filesystems  --->
    < > kmod-fs-ecryptfs............................. ECRYPTFS filesystem support (NEW)
先在< > kmod-fs-ecryptfs............................. ECRYPTFS filesystem support (NEW)选择Y或者M后,
才能够确保ecryptfs能够在make kernel_menuconfig
File systems  --->
  Miscellaneous filesystems  --->
    <M> eCrypt filesystem layer support (EXPERIMENTAL)
中显示出来。
make menuconfig后,选择如下:
Kernel moudles  --->
  Cryptographic API modules  --->  
<M> kmod-crypto-aes.............................. AES cipher CryptoA│ │   
<M> kmod-crypto-cbc................... Cipher Block Chaining CryptoA│ │  
<M> kmod-crypto-core.................................. Core CryptoAP│ │   
<M> kmod-crypto-ecb..................... Electronic CodeBook CryptoA│ │  
<M> kmod-crypto-hash.................................. CryptoAPI has│ 
<M> kmod-crypto-manager.......................... CryptoAPI algorith│ │   
<M> kmod-crypto-md5.............................. MD5 digest CryptoA│ │  
  Filesystems  --->
    <M> kmod-fs-ecryptfs............................. ECRYPTFS filesystem support (NEW)
  
然后,make kernel_menuconfig后在linux内核里面的选择如下:
KERNEL BUILD OPTIONS


Code maturity level options  --->
  [*] Prompt for development and/or incomplete code/drivers


Security options  --->
  <M> Enable access key retention support


Cryptographic options  --->
  <M>   CBC support
  <M>   ECB support
  <M>   MD5 digest algorithm
  <M>   AES cipher algorithms


File systems  --->
  Miscellaneous filesystems  --->
    <M> eCrypt filesystem layer support (EXPERIMENTAL)


注意:由于ecryptfs是linux的内核模块,所以ecryptfs的编译比较特别,必须在make menuconfig以及make kernel_menuconfig里面都选了之后才能够编译出ecryptfs的ipk软件包,且两边的选择都应该一样,编译才不会出现问题。


2. 编译ecryptfs的用户工具ecryptfs-utils


Linux scp 命令,从本地复制到远程
scp -r /home/yangyang/openwrt_rtnas_v2/openwrt/bin/kirkwood/packages root@192.168.1.254:/


在ubuntu系统中安装PuTTY SSH Client,直接在软件中心搜索就可以安装了,在这里主要是利用PuTTY SSH Client远程访问openwrt服务器。
打开后输入openwrt服务器的ip地址就可以进入到openwrt服务器的终端了。
清理某个编译的软件包:make package/xxx/{clean,compile,install} V=s 
当前目录下查找文件名为nss.h的文件:find . -name nss.h
在当前目录下循环查找文件中有nss.h字段:grep nss.h . -r


四个关键性的目录:
• tools
• toolchain
• package
• target
tools和toolchain通常是用作固化内核,编译和c库的工具,编译的结果会产生三个新的目录,build_dir/host ,这是一个临时用来建立target工具;
build/toolchain-<arch>*这是用来建立特殊结构的toolchain;
staging_dir/toolchain-<arch>*toolchain安装的目录;
有四个关键的顶层目录:
tools 
toolchain 
package 
target 
tools和toolchain包含了一些通用命令,用来生成固件、编译器、和C库。生成结果会储存在以下三个目录下:build dir/host是一个临时目录,用来储存不依赖于目标平台的工具,build dir/toolchain-<arch>*用来储存依赖于指定平台的编译链,staging dir/toolchain-<arch>*是编译链的最终安装位置。通常你不需要改动编译链目录下的任何东西,unless you intend to add a new version of one of the components above.
build dir/host 
build dir/toolchain-<arch>* 
package——包。在OpenWrt固件中,几乎所有东西都是.ipk,这样就可以很方便的安装和卸载。注意:这些包不是在主分支中维护的,但是可以使用package feeds系统通过subversion来获取他们。
$ ./scripts/feeds update
这些包能够扩展基本系统的功能,只需要将他们链接进入主干。之后,这些包将会显示在配置菜单中。对于kamikaze,你可以使用这样的命令:
$ ./scripts/feeds search nmap
Search results in feed 'packages':
nmap Network exploration and/or security auditing utility
$ ./scripts/feeds install nmap
如果想包含所有的包,可以使用如下命令:
$ make package/symlinks
目标系统指嵌入式设备,针对不同的平台有不同的特性。针对这些特性,"target/linux"目录下按照平台<arch>进行目录划分, 里面包括了针对标准内核的补丁,特殊配置等。There's also the "target/image" directory which describes how to package a firmware for a specific platform.
target and package两部分都需要"build dir/<arch>"作为编译的临时目录。另外,编译链,目标平台,包要下载的东西都放在dl目录下。


编译固件
万事具备,只欠东风,通过下面简单的make命令来编译:make
在多核电脑中编译,具有多核CPU处理器的电脑进行编译,使用下述参数可令编译过程加速。 常规用法为 <您cpu处理器的数目 + 1> – 例如使用3进程来编译 (即双核CPU), 命令及参数如下:
make -j 3
后台编译
If you intend to use your system while building, you can have the build process only use idle I/O and CPU capacity like this (dualcore CPU):
ionice -c 3 nice -n 20 make -j 2
编译简单的基本的软件包
When developing or packaging software for OpenWrt, it is convenient to be able to build only the package in question (e.g. with package cups):
make package/cups/compile V=99
For a package in the feeds it looks like this:make package/feeds/packages/ndyndns/compile V=99
编译错误
如果因某种不知道的原因而编译失败,下面有种简单的方法来得知编译到底错在哪里了:
make V=99 2>&1 |tee build.log |grep -i error
The above saves a full verbose copy of the build output (with stdout piped to stderr) in build.log and only shows errors on the screen.
make 命令简单说明
  make V=99
  V=99表示输出详细的debug信息
  make world
  表示编译所有
  make j=2 V=99
  如是多核CPU,加j=2 选项理论上能加快编译速度
  make -j 2 V=99可加快编译速度(不推荐使用)
  只清除某个模块
  make package/qos/clean
  只编译某个模块
  make package/qos/clean
  make package/qos/compile
  make package/qos/install
  make V=99 | tee compile_v1.0.0.log
  混合 tee 命令将编译信息放到compile_v1.0.0.log文件中方便查看。




问题:What is "fatal error: sodium.h: No such file or directory"?
When you try to compile KadNode, then you need to have libsodium installed. Otherwise, see Build&Installation below.


问题:configure: error: Your intltool is too old.  You need intltool 0.41.0 or later.
解决:打开终端 -输入su-切换成root 用户-数人以下命令
在网站http://download.chinaunix.net/download/0013000/12284.shtml下载最新的版本
下载解压后cd到里面,然后
./configure
make && make install


问题:fatal error: openssl/sha.h: No such file or directory 解决方案 
出现这个或者fatal error: openssl/名单.h: No such file or directory。都是没有安装libssl-dev~
libssl-dev包含libraries, header files and manpages,他是openssl的一部分,而openssl对ssl进行了实现~
解决方案:使用sudo apt-get install libssl-dev来安装libssl-dev即可


在写openwrt程序的Makefile时如果忘记加上依赖关系,编译时就会报这样的错:
Package example is missing dependencies for the following libraries:
libpthread.so.0
librt.so.0
libuuid.so.1
解决方法是在定义程序包的时候加上依赖关系:
define Package/example
 SECTION:=utils
 CATEGORY:=Utilities
 DEPENDS:=+libuuid +librt +libpthread
 TITLE:=example -- prints example 1 to 99
endef
问题:Package libpam is missing dependencies for the following libraries:
libdb-4.7.so
解决方案:修改与pakage里同级的makefile的内容,主要是添加DEPENDS与拷贝动态链接库到安装目录。即在./package/feeds/packages/libpam/Makefile中的DEPENDS:=+libdb-4.7。搜索相关文档,在csdn的一篇博文中有提到,在3L博主也给出了范例。 链接:http://blog.csdn.net/gubenpeiyuan/article/details/8437640提到修改 DEPENDS:= 以及define Package/xxxxxx/install 增加将相关的库文件复制到相关目录下。不过我自己只是增加了 DEPENDS:= 部分。后面的cp我之前没仔细看,不过编译也通过了。


问题:configure: error: Cannot find pam_misc
解决办法:在编写的openwrt软件包的Makefile里面加上:
define Build/Configure
$(call Build/Configure/Default, \
  --disable-pam           \
)
endef
网站http://blog.csdn.net/teddy99999/article/details/41725937里面也有相应的解决办法,但是我没有试过。


我想编写hook函数然后制作成ipk装载到内核中,可是我编译的时候发现提示我skbuff.h头文件未知,然后我就把3.10.5中的skbuff.h拷贝过去了,可是问题出现了,skbuff.h中也引用了其他头文件,我一个一个拷贝过去发现太多了,没拷贝一个就会关联很多,编译是在这里面的include的下面找头文件吧!lidong@ubuntu:~/openwrt/trunk/bin/ar71xx/OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.6-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2:。。。。。我在想内核子系统肯定会用到skb的呀,怎么连skbuff.h头文件都没有呢,大家有知道原因的么?


问题:fatal error: nss.h: No such file or directory  
解决方案:对问题的分析,我认为问题原因应该是openwrt中缺少相应的头文件,而openwrt编译时一般是在openwrt/staging_dir/target-arm_v5te_uClibc-0.9.33.2_eabi/usr/include、openwrt/staging_dir/target-arm_v5te_uClibc-0.9.33.2_eabi/include 、openwrt/staging_dir/toolchain-arm_v5te_gcc-4.6-linaro_uClibc-0.9.33.2_eabi/usr/include和openwrt/staging_dir/toolchain-arm_v5te_gcc-4.6-linaro_uClibc-0.9.33.2_eabi/include这四个目录中查找,那么只要把缺少的头文件cp到这四个目录中的任意一个目录下应该就能解决问题。
于是我通过把相关的头文件都cp到/openwrt/staging_dir/target-arm_v5te_uClibc-0.9.33.2_eabi/include目录解决了此问题。
首先利用apt-file search nss.h命令找到nss.h属于哪一个软件包,提示yangyang@yangyang-Lenovo-G50-70m:~$ apt-file search nss.h
doc-linux-ja-html: /usr/share/doc/HOWTO/ja-html/LDAP-Implementation-HOWTO/pamnss.html
gnucash-docs: /usr/share/doc/gnucash-docs/gnucash-help-en/chapter_busnss.html
libapache2-mod-nss: /usr/share/doc/libapache2-mod-nss/mod_nss.html
libc6-dev: /usr/include/nss.h
libc6-dev-arm64-cross: /usr/aarch64-linux-gnu/include/nss.h
libc6-dev-armel-cross: /usr/arm-linux-gnueabi/include/nss.h
libc6-dev-armhf-cross: /usr/arm-linux-gnueabihf/include/nss.h
libc6-dev-powerpc-cross: /usr/powerpc-linux-gnu/include/nss.h
libc6-dev-ppc64el-cross: /usr/powerpc64le-linux-gnu/include/nss.h
libnss3-dev: /usr/include/nss/nss.h
libp11-kit-dev: /usr/share/gtk-doc/html/p11-kit/trust-nss.html
libpathfinder-dev: /usr/include/pathfinder-1/libpathfinder-nss.h
ofono-dev: /usr/include/ofono/gnss.h
pike7.8-reference: /usr/share/doc/pike7.8-doc/html/reference/ex/predef_3A_3A/Parser/XML/NSTree/NSNode/get_defined_nss.html
systemtap-doc: /usr/share/doc/systemtap-doc/tapsets/API-stap-cache-add-nss.html
thunderbird-dev: /usr/include/thunderbird/nss/nss.h
yangyang@yangyang-Lenovo-G50-70m:~$
然后sudo cp -rf /usr/include/nss/* /home/yangyang/openwrt_rtnas_v2/openwrt/staging_dir/target-arm_v5te_uClibc-0.9.33.2_eabi/include
编译后又出现了提示fatal error: prtypes.h: No such file or directory
同样利用apt-file search prtypes.h命令找到prtypes.h属于哪一个软件包,提示
yangyang@yangyang-Lenovo-G50-70m:~$ apt-file search prtypes.h
codeblocks-dev: /usr/include/codeblocks/prtypes.h
libnspr4-dev: /usr/include/nspr/prtypes.h
thunderbird-dev: /usr/include/thunderbird/nspr/prtypes.h
最后sudo cp -rf /usr/include/nspr/* /home/yangyang/openwrt_rtnas_v2/openwrt/staging_dir/target-arm_v5te_uClibc-0.9.33.2_eabi/include
clean一下后再make就编译通过了






ubuntu下单独编译ecryptfs-utils,应使用sudo -i到root用户下使用% ./configure --prefix=/usr && make && make install进行编译, 使用命令./configure时出现,
问题:eCryptfs userspace tools require Keyutils version 1.0 or higher.
You might find the package at:http://people.redhat.com/~dhowells/keyutils/
解决方案:先到http://people.redhat.com/~dhowells/keyutils/下载keyutils最新版本,然后make;make install


问题:"eCryptfs userspace tools require Keyutils version 1.0 or higher.
You might find the package at:
http://people.redhat.com/~dhowells/keyutils/
解决方案:到http://people.redhat.com/~dhowells/keyutils/里面下载新版本的keyutils,然后make,make install


问题:configure: error: Cannot find pam
解决方案:sudo apt-get install libpam0g-dev


问题:fatal error: Python.h: No such file or directory
解决方案:sudo apt-get install python-dev