因为工作需要,我一个安卓程序开发,做了很多关于openwrt相关的内容,也不说喜不喜欢吧,反正应该对得起自己的工资。废话不多说,进入主题吧!

前面我写了一篇在Windows10上搭建Ubuntu子系统的博文,虽然自己看都觉得写的不是很好,还是应该能用,也希望假借多写博客,提高自己的写作水平吧!接下来,本篇博客将就使用win10上的Ubuntu搭建openwrt环境进行开发,当然如果你使用的是虚拟机,也可以借鉴借鉴,还没那么多麻烦,只可惜我的笔记本电脑性能有限,使用虚拟机卡的不行。

搭建Windows10子系统

这个就不多说了,请看我的另一篇博客:

教你如何在Win10上利用子系统运行Ubuntu & 处理代码

子系统位置

安装的Ubuntu的位置就在系统的软件appdata目录里面,如果没改的话就在C盘了,例如我的就在下面的目录,可以创建一个快捷方式便于访问。

C:\Users\user\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
访问本地文件

可以在Ubuntu的 /mnt/ 文件夹下访问 Windows 的文件目录,使用 gcc 什么的都是没问题的。也可以使用一个符号链接,把需要使用的目录放到 ~ 目录下:

#可以看到像C盘、D盘之类的
ls /mnt/	
#使用软链接做快捷方式
ln -s 源文件 目标文件

下载openwrt安装包

如果不需要什么特别的东西的话,直接从GitHub上下载源码吧!

我使用的是联发科的一款芯片(MT7628 + MT7612e),用的是特别版的SDK。这个SDK好久没更新了,网上应该都能找到(就是20160324那个),如果说和原版有什么不同的话,应该就是加了点芯片的驱动,具体我也就就没深究了。

安装依赖库

编译openwrt源码需要用到很多库,在Ubuntu上输入

sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler

我这也是从网上复制的,如果却什么库,后面看报错再补。

有的说要安装openjdk-8-jdk这个包会,并且会安装失败,这种情况在15版本以下的Ubuntu中会出现,有需要的话看看这个博客吧!

编译固件

接下来就是重头戏了,也是比较复杂的部分,很多博客强烈建议使用非root用户编译,还说别用git,我是发现用Ubuntu没什么问题,安装好给的就不是root账户(输入行前是$符就是非root,如果是#就是root账户了)。所以我们不需要管这些,直接编译的去就好。

如果你看了我之前的博客,应该注意在设置用户名和密码的时候不能关闭窗口,如果关了那后面就是root用户登录了,这样就会出问题,可以手动添加用户和设置默认登录账户或者重置、重装子系统解决。

首先更新脚本

在编译之前先更新下脚本吧,意思应该是让编译过程知道去哪里下载需要的文件。从这步开始都需要将终端路径定位到openwrt的根目录下。在openwrt目录下执行下列命令:

./scripts/feeds update -a && ./scripts/feeds install -a
打开menu菜单

更新完脚本后,就是编译固件了,输入make menuconfig命令(可以先预下载,看下面代码),让它自动下载需要的文件,这个需要等待很长时间,而且可能因为网络问题,很多东西下不下来。解决的办法就是从别人下好的dl文件夹下面,把内容都复制过来,要是别人都没有的话,还可以通过谷歌(百度不好用)搜这个包,一般都能从网上下,丢到dl文件夹里面就好。可能会出现各种问题,后面另起一章。

make menuconfig
#如果需要的话,还可以编译内核模块
make kernel_menuconfig
#清空编译,最好别试,除非有问题
make clean

make download -j4 V=s#预下载编译所需的软件包,j后面是线程数,按自己的改吧

#检查文件完整性,避免错误,提高编译成功率
find dl -size -1024c -exec ls -l {} \;#列出小于1k的文件
find dl -size -1024c -exec rm -f {} \;#删除小于1k的文件

东西下载好了后,会打开一个用于选择参数的图形界面,就可以配置需要的各种功能模块了。

编译刷机固件

选择好menu里面需要的库后,输入make V=s就可以编译固件了,这个也需要很长时间,也会出一些问题,后面解答。下面是一些编译的命令,当然也可以去看 官方说明 ,详细点

make V=s	#输出详细的debug信息
make V=99	#功能同上
make -j n	#使用n个CPU内核编译,可以和V=s一起使用

#只编译某个模块
make package/xxx/clean		//清除模块,有时候编译抽风需要清一下
make package/xxx/compile	//编译模块
make package/xxx/install

出现问题

文件目录大小写不敏感
#运行下面代码是出问题
./scripts/feeds update -a

#提示如下
Build dependency: OpenWrt can only be built on a case-sensitive filesystem

这个是因为Windows对大小写不支持的原因,而 Linux 子系统里面区分大小写,直接运行在 Windows 目录下面的代码会出问题。

网上说使用 fsutil.exe file setCaseSensitiveInfo enable 可以设置大小写敏感,但是已经存在的文件不会生效,可能要从其他盘符复制过去,我试了好像不太好用,可能没用对。

我还是通过直接复制openwrt源码到Ubuntu里面去,问题完事。不过中间也犯了几个错误:

错误一:直接复制到 / 目录,编译出问题
错误二:复制到 home 目录,编译继续出错

最后还是复制到了 ~ 目录,即 /home/user/ 目录下,编译就没问题了。其实直接复制到 tmp 目录也是可以的。

使用PERL脚本版本问题
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at /home/li/OS/IBSS/IBSS-openwrt.git/staging_dir/host/bin/automake line 4160.

这个问题我也不太清楚,但是使用子系统编译必出这个问题。查阅资料说是因为新版的perl不再支持左大括号的使用,是staging_dir/host/bin/automake的4160行报错,解决办法也很简单:

vim staging_dir/host/bin/automake +4160

把这行的大括号全部删除就行,具体为什么别问我,我也不会。

缺失版本号

如果用了别人的dl文件夹下的文件,编译时候会出现如下这种错误:

cat: openwrt-sdk/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/base-files/ipkg-ramips_24kec/base-files/etc/sdk.version

问题是因为少复制了版本号,大致是以下几个位置:

./target/linux/ramips/base-files/etc/sdk.version
./staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/root-ramips/etc/sdk.version
./build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/base-files/ipkg-ramips_24kec/base-files/etc/sdk.version
./build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/root-ramips/etc/sdk.version

使用 vim 在这几个位置新建名为 sdk.version 的文件,内容填入 V1.0.0 就好,保存后编译就行了。实际上我试过,这几个目录里面应该是有一个生效的,如果缺了重要的那个,保存好一编译其他几个就丢了,所以把四个文件都添上吧!

下载文件不完整
make[3]: Entering directory `/home/admin/openwrt/lede/package/lean/openwrt-fullconenat'
touch /home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.prepared_c3d2744078ea94ecfd6014d7d4b9070a_6664517399ebbbc92a37c5bb081b5c53_check. /home/admin/openwrt/lede/include/shell.sh; xzcat /home/admin/openwrt/lede/dl/fullconenat-2018-12-15-d4daedd0.tar.xz | tar -C /home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.. -xf -
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

因为网络问题,文件可能会下载出错,如果文件出错了,用到这个文件就make不过去,在dl文件夹下把这文件删了就行。也可以用上面检查文件完整性代码,是网上别人写的,意思是小于1k的文件基本不完整,删掉就好。

缺失依赖库

如果按上面安装依赖库安装的话,应该是问题不大,如果提示像下面语句,那就是缺失依赖库了,装上就好(如果不知道安装哪个包,直接谷歌搜缺的库吧)。

Build dependency: Please install the openssl library (with development headers)
未连接互联网
make -r world: build failed. Please re-run make with -j1 V=s to see what's going on

openwrt编译过程需要下载文件,需要连接互联网,当然如果dl里面都有,脚本没更新应该就不用了。

使用root账户出错
Build dependency: Please do not compile as root.

按上面流程的话,应该没这个问题。如果遇到了,那就先改变文件的权限 ,使用 su 命令切换用户,再编译。

如果实在看不习惯openwrt这种操作的话,也可以暴力修改,方法如下:

vi include/prereq-build.mk
#直接把下面这行注释了
[ "$$(shell whoami)" != "root" ]

保存后再次运行make menuconfig,就自由自在了。

文件权限问题
"\home\user\openwrt-sdk\package\argserver": Permission denied

如果从Windows系统更改了文件,并且保存了,编译的时候就会出现编译的权限问题,可以更改文件权限

chmod -R 777 package\argserver #更改目录权限,并迭代
更多问题解决

还有其他问题的话,可以参考这篇 博客,我这是没出这么多问题的!

举例举例

我这有一个MT7628 + MT7612e的板子,厂商就不说了,现在就用这个说说menu的配置吧!

在图形界面里面通过按空格勾选内容,* 号就表示选通过中,按左右键可以在底部命令滑动,按enter键确定底部的命令,按 / 符号可以进行搜索,标题英文说的挺好,看看吧!

设定目标芯片

在make menuconfig后,在第一页设置好前三栏,选择对于的芯片平台。

设定目标芯片

勾选驱动

在 MTK Properties-> Drivers 里面将 kmod-mt7628 和 kmod-mt76x2e 添加上。

勾选对应驱动

需要注意的是,对后面有箭头的项目还能点进去设置参数,kmod-mt7628进去就是下面内容:

kmod-mt7628

其实这几张图片都是从别人那拿的,有兴趣可以看看这个博客。下面是上面两个栏的配置,可以参考一下,具体内容按自己需要吧!

基本参数

模式设置

刷机

在上面配置好menu后使用make V=s生成固件就可以刷机了,固件的位置在下面这个目录

openwrt-sdk\bin\ramips\openwrt-ramips-mt7628-mt7628-squashfs-sysupgrade.bin

可以通过串口或者从网页就可以完成刷机了,应该很简单,不多说了。

安装程序

openwrt也可以像安卓手机一样,通过一个ipk文件安装程序,可以在menu里面把sftp打开:

Network -> SSH -> openssh-sftp-server. OpenSSH SFTP server

编译固件刷上,就能够使用 SecureFX / WinSCP 这样的软件复制东西到板卡里面去,一般复制到 /tmp/ 目录下,使用命令可以进行软件安装:

opkg install xxx.ipk

opkg update #更新可以获取的软件包列表
opkg upgrade #对已经安装的软件包升级
opkg list #获取软件列表
opkg install #安装指定的软件包
opkg remove #卸载已经安装的指定的软件包

需要注意的是,放在 /tmp/ 目录下的东西路由器重启后会删除,其他就没什么了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐