下篇文章,使用BusyBox建立了基础的嵌入式Linux系统的根文件系统,基本的功能可以正常运行,但在个基础功能上,还要许多地方须要建立。
1建立根文件系统
下篇说道,Linux系统运行上去后,可以正常的执行"ls"等基础命令,但仔细观察系统运行后的复印信息,有一条提示:
说是难以运行“/etc/init.d/rcS”这个文件,由于根文件系统(rootfs)里没有这个文件。这个rcS是哪些呢?它似乎是一个shell脚本,在Linux内核启动之后,须要启动一些服务,而rcS就是规定启动什么文件的脚本文件。
1.1创建/etc/init.d/rcS文件
在rootfs中创建/etc/init.d/rcS文件(前两级目录不存在,要先创建文件夹,再创建文件),之后在rcS中输入如下所示内容:
<pre data-lang="shell@shell@Shell" codecontent="#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s" class=" language-shell">
各行涵义如下:
创建好/etc/init.d/rcS后还定要给其可执行权限(chmod777)。
1.2创建/etc/fstab文件
里面说道,rcS在挂载所用的文件系统时,这种文件系统由文件/etc/fstab来指定,所以还要创建/etc/fstab文件。
在rootfs中创建/etc/fstab文件,fstab在Linux开机之后手动配置什么须要手动挂载的分区,格式如下:
根据上述格式,在fstab文件中输入如下内容(第1行是注释):
fstab文件创建完成之后,启动开发板,可以看出,启动成功,且没有提示rcS:
注:以上两个文件,可以直接在ubuntu的nfs文件中添加,也可以先通过板子的并口联接到nfs后,在并口窗口操作。我是在ubuntu中操作,之后再联接板子启动。
1.3创建/etc/inittab文件
系统启动早已没有错误提示了,但我们要仍要创建另一个文件/etc/inittab,这个文件用于busyboxd的初始化,init程序会读取/etc/inittab这个文件。
inittab由若干条指令组成,每条指令的结构都是以“:”分隔的4个段组成,格式如下:
参考busyboxd的examples/inittab文件,来创建一个/etc/inittab,输入如下内容:
注:我在ubuntu上编辑测文件时,console行出现了蓝色背景块,但其实也没哪些影响
/etc/inittab文件创建好之后就可以重启开发板即可,至此,根文件系统要创建的文件就早已全部完成了。
总结一下刚刚创建的目录和文件,如右图
2根文件系统其他功能测试
根文件系统早已建立了,接出来就来继续测试根文件系统是否好用。
2.1软件运行测试
先来编撰一个简单的c语言程序运行一下,验证库文件是否能用。
先在ubuntu的rootfs中(可以先创建一个单独的test文件夹拿来测试)创建一个hello.c:
之后使用交叉编译链来编译程序:
arm-linux-gnueabihf-gcchello.c-ohello
编译后会生成名为hello的可执行文件,可以使用“file”命令查看文件类型以及编码格式:
hello是个32位的LSB可执行文件linux内存管理,ARM构架的,而且是动态链接的。
在ubunt中编译完后,重启开发板,在开发板的并口中(并口软件),运行hello文件:
程序每隔2秒复印一次,运行正常,说明我根文件系统中的动态库没有问题。按下“ctrl+c”组合键即可终止该程序。
该程序运行上去,会占用交互窗口,可以让hello步入后台运行,方式是在运行软件的时侯加上“&”,即:./hello&。
注意:程序在后台运行时,交互并口仍是有复印的,只是这时我们可以敲回车键来输入命令了,与程序的输出互不影响,惟一的影响是程序的输出会打断我们的输入,但可以不理会打断,继续输入命令仍是可以执行命令的。
在后台运行的程序,可以使用ps命令来查看各个进程的id深度linux,之后使用kill-9pid(进程ID)命令来关掉掉当前运行的程序。
如右图linux查看文件系统,输入ps命令,可以看见hello程序的进程为101,此时先敲回车键,弹出井号提示符,之后输入kill-9101,再回车,就可以看见hello进程被杀掉了。
2.2开机自启动测试
玩过单片机的都晓得,单片机的程序烧写进去后,上电就手动开始运行了。那linux系统,写了一个程序,可以像单片机那样开机就运行吗,其实是可以的!
实现开机自启动的原理也很简单,linux在启动时linux查看文件系统,有一个默认的开机启动脚本(/etc/init.d/rcS这个shell文件),因而更改这个脚本,添加自启动相关内容即可:
自启动代码添加完成之后,重启开发板,可以看见hello这个软件早已开机时手动运行了:
2.3内网联接测试
这儿的内网是相对于局域网这个内外而言的,即测试板子是否能访问百度、QQ这样的网站,先使用ping指令来测试一下:
在网路联接正常的情况下,难以ping通这种网址,是由于缺乏域名解析服务,须要配置域名解析服务器的IP地址。
通常域名可以设置为所处网路的网段地址,例如我的局域网的网段是192.168.5.1。
也可以设置为营运商的域名解析服务器地址:114.114.114.114。
在rootfs中新建文件/etc/resolv.conf,之后在上面输入如下内容:
更改保存退出,再度ping一下QQ网站,可以看出pingQQ成功了!
3结语
至此!根文件系统的建立工作也完成了。
再来看一下本篇对文件都有什么更改:
linux移植三大鳄:uboot、kernel、rootfs已移植完毕,接出来可以将这三部份整体打包一下,便捷系统的通用烧录,上篇见~