嵌入式Linux(二十三)根文件系统构建

1. 根文件系统

  rootfs是内核启动时所挂载的第一个文件系统,系统引导程序会在其挂载之后将一些初始化脚本和服务加载到内存中去运行。
一些常用目录:

  1. /bin:存放系统需要的可执行文件,如ls,mv等命令。
  2. /dev:设备文件。比如/dev/ttymxc0表示串口0这个设备。
  3. /etc:配置文件。
  4. /lib:库文件。
  5. /mnt:临时挂载目录。
  6. /proc:一般为空,linux启动后会将此作为proc文件挂载点。proc是虚拟文件系统,一般存储系统运行信息文件。
  7. /usr:Unix操作系统软件资源目录。
  8. /var:存放一些可改变的数据。
  9. /sbin:存放可执行文件,只有管理员才能用。
    10./sys:sysfs文件系统的挂载点,基于ram存储,向用户提供内核数据结构信息。
    11./opt:可选的文件,软件存放区。

2. BusyBox构建根文件系统

2.1 BusyBox修改

1)修改顶层Makefile,设置ARCH和CROSS_COMPILE。
2)修改libbb/printable_string.c和unicode.c,取消对中文显示的限制。
3)配置busybox。一般使用默认配置defconfig。然后进行图形化配置对DNS和中文的支持。
4)编译busybox。
嵌入式Linux(二十三)根文件系统构建_第1张图片
5)最后在rootfs文件夹下会有linuxrc文件,Linux内核init进程最后会查找用户态init进程,如果bootargs设置init=/linuxrc,就可以作为用户态init程序。

2.2 向根文件添加lib库

2.2.1 向rootfs的“/lib”目录添加库文件

  将/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib和…arm-linux-gnueabihf/lib拷贝到rootfs/lib。然后删除rootfs/lib下的ld-linux-armhf.so.3(复制过来是快捷方式,软连接),重新从usr下复制过来即可。

2.2.2 向rootfs的“usr/lib”目录添加库文件

  将/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib拷贝到rootfs/usr/lib。

2.3 测试根文件系统

使用NFS挂载测试rootfs,在uboot启动后输入以下命令:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.222.132:/home/finches/linux/nfs/rootfs,proto=tcp rw ip=192.168.222.51:192.168.222.132:192.168.222.1:255.255.255.0::eth0:off'
saveenv

启动内核,测试结果如下,进入了根文件系统。不过上面一行cant run说明还有文件缺失,根文件系统不够完善。
嵌入式Linux(二十三)根文件系统构建_第2张图片

2.4 完善根文件系统

  上面可以看到缺失rcS脚本,该脚本作用是规定内核启动之后需要启动哪些服务。
1)创建rcS脚本。

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH             /*PATH:保存可执行文件可能存在的目录*/
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib       /*保存库文件所在目录*/
export PATH LD_LIBRARY_PATH                          /*导出环境变量*/
	
mount -a                                             /*挂载所有文件系统(/etc/fstab指定)*/
mkdir /dev/pts                            
mount -t devpts devpts /dev/pts                      /*将devpts挂载到目录*/

echo /sbin/mdev > /proc/sys/kernel/hotplug           /*管理热插拔设备,内核可以在/dev下自动创建设备节点*/
mdev -s

2)rcS脚本中调用到了/etc/fstab文件,创建。
file system:要挂载的设备比如块设备/dev/sdb。
mount point:挂载点。
type:文件系统类型。
options:默认defaults。
dump:为1允许备份,一般为0.
pass:磁盘检查设置,为0不检查,根目录’/'设置为1,其它从2开始。
在这里插入图片描述
3)创建/etc/inittab
  init程序会读取该文件,该文件指令格式如下:

<id>:<runlevels>:<action>:<process>
/*
id:每个指令的标识符,对于busybox的init,id还用来指定启动进程的控制tty。
runlevels:咩用,空着。
action:指定process可能用到的动作。
process:具体的动作比如程序脚本或者命令。
*/

Busybox支持action如下:
嵌入式Linux(二十三)根文件系统构建_第3张图片
/etc/inittab如下:

#etc/inittab
::sysinit:/etc/init.d/rcS        /*系统启动后运行rcS*/
console::askfirst:-/bin/sh       /*将console作为控制台终端,ttymxc0*/
::restart:/sbin/init             /*重启运行/sbin/init*/
::ctrlaltdel:/sbin/reboot        /*按下ctrl+alt+del:运行/sbin/reboot*/
::shutdown:/bin/umount -a -r     /*关机的时候卸载各个文件系统*/
::shutdown:/sbin/swapoff -a      /*关机关闭交换分区*/

3 测试根文件系统

①软件运行测试:在rootfs/drivers中创建一个hello.c,交叉编译为hello可执行文件,运行正常说明成功。
 hello可执行文件运行时控制台无法使用,所以可以后台运行:

./hello &           /*&表示后台运行*/
ps                  /*查看进行PID*/
kill -9 PID         /*关闭对应PID的后台进程*/

②中文字符测试
在这里插入图片描述
③开机自启动测试:由于进入rootfs会运行rcS脚本,在里面添加自启动项即可。
嵌入式Linux(二十三)根文件系统构建_第4张图片
④连接外部网络测试:直接ping某个网址会导致bad adress提示,需要在rootfs/etc/resolc.conf中输入以下内容以配置域名解析服务器,一般为所处网络网关地址,也可以是114这个。还是ping不通百度,估计是要和路由直连。
在这里插入图片描述

你可能感兴趣的:(嵌入式,linux,unix,服务器)