1. 完善根文件系统
在用 BusyBox 构建根文件系统一文中介绍了根文件系统的制作,rootfs制作完成后测试时,提示无法运行“/etc/init.d/rcS”这个文件,说明rootfs仍然不够完善,下面将介绍如何完善根文件系统。
1.1 创建 /etc/init.d/rcS 文件
rcS 是个 shell脚本,Linux内核启动后需要启动一些服务,rcS就是规定启动哪些文件的脚本文件。 在 rootfs中创建 /etc/init.d/rcS文件,命令如下:
mkdir -p etc/init.d/
cd etc/init.d/
touch rcS
然后在rcS文件中输入如下内容:
1 #!/bin/sh
2
3 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
5 export PATH LD_LIBRARY_PATH
6
7 mount -a
8 mkdir /dev/pts
9 mount -t devpts devpts /dev/pts
10
11 echo /sbin/mdev > /proc/sys/kernel/hotplug
12 mdev -s
创建好rcS文件后,赋予其可执行权限:
chmod 777 rcS
1.2 创建 /etc/fstab 文件
fstab文件是在 Linux开机以后自动配置哪些需要自动挂载的分区,格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
在 rootfs根文件系统中创建 /etc/fstab文件:
cd etc/
touch fstab
fstab文件内容如下:
#
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
1.3 创建/etc/inittab文件
inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。 init 程序会读取/etc/inittab这个文件,inittab 由若干条指令组成。 每条指令的结构都是一样的,由以“ : ”分隔的 4 个段组成,格式如下:
:::
参考 busybox的 examples/inittab文件,在 rootfs根文件系统中创建 /etc/inittab文件:
cd etc
touch inittab
inittab文件内容如下:
1 #etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::restart:/sbin/init
5 ::ctrlaltdel:/sbin/reboot
6 ::shutdown:/bin/umount -a -r
7 ::shutdown:/sbin/swapoff -a
/etc/inittab 文件创建好以后重启开发板即可,至此! 根文件系统要创建的文件就已经全部完成了。 接下来就要对根文件系统进行其他的测试,比如我们自己编写的软件运行是否正常、是否支持软件开机自启动、中文支持是否正常以及能不能链接等
2. 根文件系统其他功能测试
根文件系统已经完善了,接下来继续测试根文件系统是否好用
2.1 软件运行测试
编写一个简单的c语言程序运行一下,验证库文件是否能用
在ubuntu的 rootfs中创建一个hello.c
#include
int main(void){
while(1){
printf("hello world!\\r\\n"); //打印
sleep(2); //休眠2秒
}
}
使用交叉编译链来编译程序
arm-linux-gnueabihf-gcc hello.c -o hello
编译后会生成名为hello的可执行文件,可以使用“file”命令查看文件类型以及编码格式,见下图
可见 hello是个32位的 LSB可执行文件,ARM架构的,并且是动态链接的
重启开发板,在开发板上运行hello文件,程序每隔2秒打印一次,运行正常,说明根文件系统中的动态库没有问题,“ctrl+c”可中止程序
程序运行起来后,会占用交互窗口,可在运行时加上“&”,即:./hello&,让其进入后台运行
程序在后台运行时,交互串口仍是有打印的,只是这时可以敲回车键来输入命令了,与程序的输出互不影响,唯一的影响是程序的输出会打断我们的输入,但可以不理会打断,继续输入仍可执行命令的
后台运行的程序,可通过 ps命令查看进程id,然后使用 kill -9 pid(进程ID)命令来关闭后台运行的程序。 如下图,输入ps命令,可见 hello程序的进程ID为92,输入kill -9 92(不用理会被打断)后回车,就可看到hello进程被关闭了
2.2 中文字符测试
在Ubuntu中的 rootfs目录下新建一个“中文测试”文件夹,并新建一个“测试文档.txt”,里面输入任意中文,下载到开发板后,在开发板命令行模式中,使用cat命令查看中文是否显示正确
2.3 开机自启动测试
一般做好产品以后都是需要开机自动启动相应的软件,实现开机自启动的原理也很简单,linux在启动时,有一个默认的开机启动脚本(/etc/init.d/rcS这个shell文件),修改这个脚本,添加自启动相关内容即可
########## /etc/init.d/rcS 文件代码 ##########
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
runlevel=S
umask 022
export PATH LD_LIBRARY_PATH runlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
#开机自启动,先进入hello所在文件夹再执行
cd /drivers
./hello &
cd /
自启动代码添加完成以后,重启开发板,可以看到hello这个软件已经开机时自动运行了:
2.4 外网连接测试
这里的外网是相对于局域网这个内外而言的,即测试板子是否能访问百度、QQ这样的网站,先使用ping指令来测试一下:
在网络连接正常的情况下,无法ping通这些网址,是因为缺少域名解析服务,需要配置域名解析服务器的IP地址。 一般域名可以设置为所处网络的网关地址,比如我的局域网的网关是192.168.10.1,也可以设置为运营商的域名解析服务器地址:114.114.114.114
在rootfs中新建文件/etc/resolv.conf,然后在里面输入如下内容:
nameserver 114.114.114.114
nameserver 192.168.10.1
修改保存退出,再次ping一下百度网站,可以看出 ping成功了!
至此! 根文件系统就彻底的制作完成。 uboot、kernel、rootfs这三个共同构成了一个完整的 Linux系统,这个系统是一个可以正常运行的系统,可以在这个系统上进行 Linux驱动开发。
全部0条评论
快来发表一下你的评论吧 !