因为工作需要,我一个安卓程序开发,做了很多关于openwrt相关的内容,也不说喜不喜欢吧,反正应该对得起自己的工资。废话不多说,进入主题吧!
前面我写了一篇在Windows10上搭建Ubuntu子系统的博文,虽然自己看都觉得写的不是很好,还是应该能用,也希望假借多写博客,提高自己的写作水平吧!接下来,本篇博客将就使用win10上的Ubuntu搭建openwrt环境进行开发,当然如果你使用的是虚拟机,也可以借鉴借鉴,还没那么多麻烦,只可惜我的笔记本电脑性能有限,使用虚拟机卡的不行。
这个就不多说了,请看我的另一篇博客:
教你如何在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 源文件 目标文件
如果不需要什么特别的东西的话,直接从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
更新完脚本后,就是编译固件了,输入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 目录也是可以的。
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里面都有,脚本没更新应该就不用了。
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进去就是下面内容:
其实这几张图片都是从别人那拿的,有兴趣可以看看这个博客。下面是上面两个栏的配置,可以参考一下,具体内容按自己需要吧!
在上面配置好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/ 目录下的东西路由器重启后会删除,其他就没什么了。