Linux是一套免费使用和自由传播的操作系统,作为一套操作系统,Linux由内核和系统调用接口组成,除了有效地控制硬件资源外,同时提供系统调用接口给应用程序使用。但说到Linux其实有Linux内核(Kernel)和Linux发行版(distribution)两层含义:Linux内核是由Linus Torvalds在1991年主持开发,并至今一直负责版本维护;Linux发行版是指软件厂商将Linux内核及工具与可运行的软件集成,形成更完整的操作系统。目前大大小小应用于不同场合的Linux发行版已经超过400余种,如Redhat、Mandriva、Fedora、SuSe、Debian、Ubuntu等,不同Linux发行版包含的外围软件并不一样,发行版的镜像大小差别也不相同,以适用于不同的用户群体和功能定位。
Linux为应用于嵌入式设备上,按嵌入式产品的特殊应用要求进行高度裁剪形成了嵌入式linux,如openwrt等,本文主要介绍将linux发行版lede(Linux Embedded Development Environment)应用在嵌入式设备上的方法。
源码交叉编译注:lede是在openwrt 的开发者之间出现分歧后的一个分支,目前已经决定重新合并。
1、LEDE 17.01.4源码下载地址:https://github.com/lede-project/source/tree/v17.01.4
2、交叉编译环境为Ubuntu 16.04 LTS 32 位,安装编译所需依赖库。linux发行版是通过源列表来维护自己的软件仓库,sudo gedit /etc/apt/sources.list命令可查看源列表。源列表中记录一些网址信息,每一条网址指向源服务器上的软件。sudo apt-get update命令访问源列表里的每个网址,并读取软件列表,将其保存在本地电脑上。我们在新立得软件包管理器里看到的软件列表,都是通过update命令更新的。update后使用sudo apt-get upgrade命令把本地已安装的软件,与下载的软件列表中对应软件进行对比,如果发现已安装的软件版本太低,则提示更新软件。
$ sudo apt-get update
$ sudo apt-get install git g++ make libncurses5-dev subversion libssl-dev gawk libxml-parser-perl unzip wget python xz-utils vim openjdk-7-jdk
注:apt-get update命令可能出现如下错误
- 错误信息
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
E: Sub-process returned an error code
- 解决方法
sudo pkill -KILL appstreamcli
wget -P /tmp https://launchpad.net/ubuntu/+archive/primary/+files/appstream_0.9.4-1ubuntu1_amd64(i386).deb https://launchpad.net/ubuntu/+archive/primary/+files/libappstream3_0.9.4-1ubuntu1_amd64(i386).deb
sudo dpkg -i /tmp/appstream_0.9.4-1ubuntu1_amd64(i386).deb /tmp/libappstream3_0.9.4-1ubuntu1_amd64(i386).deb.1
注:apt-get install命令可能出现如下错误
-
错误信息:软件包openjdk-7-jdk 没有可安装候选
- 解决方法:手动添加仓库
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
3、feeds是lede/openwrt环境所依赖的软件包,如packages、luci、routing等。feeds.conf.default文件包含feeds包下载源信息,更新并安装feeds包后可在make menuconfig中进行相关软件包配置。
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a
注:./scripts/feeds update -a命令执行信息如下
Updating feed 'packages' from 'https://github.com/widora/packages.git;widora_dlna_patches' ...
Already up-to-date.
Create index file './feeds/packages.index'
Updating feed 'luci' from 'https://github.com/widora/luci.git;master' ...
Already up-to-date.
Create index file './feeds/luci.index'
.......
注:./scripts/feeds install命令执行信息如下
Installing all packages from feed packages.
Installing all packages from feed luci.
Installing all packages from feed routing.
Installing all packages from feed telephony.
Installing all packages from feed management.
4、lede配置界面中选择CPU型号(联发科MT7628)、文件系统(squashFS)、网络功能、脚本语言等,配置完成后保存退出,配置信息会与makefile文件建立关联将对应功能的软件包加入编译。
$ make menuconfig
5、 编译lede源文件,在编译的过程中要连外网用于下载软件包,也可先下载软件包存放至dl路径下减少编译时间。make V=s查看详细编译log。编译后在bin/ramips目录生成固件lede-ramips-mt7628-wrtnode2p-squashfs-sysupgrade.bin
$ make -j4
$ make V=s
6、在路径/media/yuanxiao/322857BE28578031/linux_comp/source-17.01.4/build_dir/target-mipsel_24kc_musl-1.1.16/linux-ramips_mt7628下包含了wrtnode2p-kernel.bin、 root.squashfs等文件,通过查看编译信息可知,最终是通过dd命令和cp命令等将wrtnode2p-kernel.bin和 root.squashfs合并成lede-ramips-mt7628-wrtnode2p-squashfs-sysupgrade.bin
固件烧写由于uboot支持TFTP协议,可在Ubuntu 上安装 TFTP服务器,当uboot启动后在串口调试终端上选择以TFTP协议方式烧写内核和文件系统。
1、安装TFTP服务器
sudo apt-get install tftp-hpa tftpd-hpa
2、修改tftpd-hpa配置文件,TFTP_DIRECTORY为固件存放路径
sudo gedit /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/yuanxiao/ftp123"
TFTP_ADDRESS="[::]:69"
TFTP_OPTIONS="-l -c -s"
3、创建tftp目录,将编译后bin文件存放在该路径下
mkdir /home/yuanxiao/ftp123
chmod 777 /home/yuanxiao/ftp123
4、启动tftp服务器
$sudo service tftpd-hpa restart
5、安装串口超级终端minicom与调试串口交互
$sudo apt-get install minicom
6、此处使用USB转串口设备,通过命令查看设备文件为ttyUSB0
7、在终端输入“minicom -s”对minicom设置,配置完成后执行命令”minicom”即进入串口超级终端界面
8、uboot启动后选择2号操作“Load system code then write to Flash via TFTP”,对设备IP地址、服务器IP地址、固件名称配置完成后进行烧写,烧写完成后进入内核启动阶段
总结对于嵌入式linux系统的开发,交叉编译和固件下载是第一步工作,而当内核加载完成后,会逐级运行/sbin/init、/etc/rc.d/rc.sysinit、/etc/rc.d/rc.local等各种程序和脚本文件来完成相应的初始化工作和服务的启动,当执行/bin/login程序进入登录状态后意味着linux系统启动完成,接下来进入到linux系统开发阶段。