根文件系统简介
根文件系统也叫做rootfs。
rootfs分为三部分:“根”“文件”“系统”。根文件系统就是一堆的文件、比如软件、配置文件等,这些文件是Linux运行所必需的,将它们组合在一起就构成了根文件系统。
根文件系统是一个“文件夹”,此文件夹有许多个文件,这些文件是Linux运行所必需的,但是无法放到内核里面去。比如命令、库、配置文件等等。所以这些软件需要我们自己构建。
/就是Linux根文件系统。
- 编译 BusyBox 构建根文件系统
- 修改 Makefile,添加编译器
修改ARCH和CROSS_COMPILE(适用绝对路径)打开 busybox 的顶层 Makefile,添加 ARCH 和 CROSS_COMPILE的值:
CROSS_COMPILE ?=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
......
ARCH ?= arm
(2)busybox 中文字符支持
打开文件 busybox- 1.29.0/libbb/printable_string.c,找到函数 printable_string;接着打开文件 busybox-1.29.0/libbb/unicode.c,进行修改程序,禁止字符大于 0X7F 的时候设置为‘?’。
(3)配置 busybox
使用make defconfig进行默认配置
接着使用make menuconfig进行图形化配置我们可以进一步选择自己想要的功能。
Location:
-> Settings
-> Build static binary (no shared libs)
进行动态编译,静态编译不要选择,否则DNS无法进行域名解析。
Location:
-> Settings
-> vi-style line editing commands//选择
Location:
-> Linux Module Utilities
-> Simplified modutils
默认会选中“Simplified modutils”,这里我们要取消勾选!
继续配置如下路径配置项:
Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的
最后就是使能 busybox 的 unicode 编码以支持中文,配置路径如下:
Location:
-> Settings
-> Support Unicode //选中
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中
busybox 的配置就到此结束了,大家也可以根据自己的实际需求选择配置其他的选项,不过对于初学者笔者不建议再做其他的修改,可能会出现编译出错的情况发生。
使用make; make install CONFIG_PREFIX=/home/.../linux/nfs/rootfs命令将busybox的编译结果存放到/home/.../linux/nfs/rootfs目录下,其中CONFIG_PREFIX的作用是将编译结果存放到指定目录下。
2.向根文件系统添加 lib 库
(1)向 rootfs 的“/lib”目录添加库文件
在rootfs目录下创建lib库,lib 库文件从交叉编译器中获取,进入到/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib目录下,将此目录下所有的*so*和.a文件都拷贝到 rootfs/lib 目录中。
拷贝命令如下:
cp *so* *.a /home/...linux/nfs/rootfs/lib/ -d
继续进入如下目录中:
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib 此目录下也有很多的的*so*和.a 库文件,我们将其也拷贝到 rootfs/lib 目录中。
命令如下:
cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/lib/ -d
这样就完成了lib库的拷贝。
(2)向 rootfs 的“usr/lib”目录添加库文件
在 rootfs 的 usr 目录下创建一个名为 lib 的目录,将如下目录中的库文件拷贝到 rootfs/usr/lib 目录下:
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/ usr/lib
将此目录下的 so 和.a 库文件都拷贝到 rootfs/usr/lib 目录中
命令如下:
cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/usr/lib/ -d
至此,根文件系统的库文件就全部添加好
3.创建其他文件夹
在根文件系统中创建其他文件夹,如 dev、proc、mnt、sys、tmp 和 root 等。
4.完善根文件系统
(1)创建/etc/init.d/rcS 文件
rcS 是个 shell 脚本,Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件的脚本文件。
#!/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
创建好文件/etc/init.d/rcS 以后一定要给其可执行权限!
(2)创建/etc/fstab 文件
在 rootfs 中创建/etc/fstab 文件,fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区。
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
(3)创建/etc/inittab 文件
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
至此,根文件系统创建成功。
5.根文件系统其他功能测试
(1)软件运行测试
使用交叉编译器编译一段程序,运行在ARM开发板上,使用命令:arm-linux-gnueabihf-gcc hello.c -o hello完成编译,通过命令:./hello进行运行,观察是否运行出结果。
(2)中文字符测试
要先设置 SecureCRT 的编码格式,将其设置为UTF-8 编码。在根文件系统下创建具有中文字符的目录、文档,使用cat命令查看内容显示是否正常。
(3)开机自启动测试
当开机进入根文件系统的时候会运行/etc/init.d/rcS这个shell 脚本,在这个脚本里添加自启动内容,重新启动开发板观察是否运行添加的自启动内容。
(4)外网连接测试
使用ping www.baidu.com命令来ping一下百度网址,发现不能ping通。之所以出现这个错误提示是因为 www.baidu.com 的地址解析失败了,并没有解析出其对应的 IP 地址。我们需要配置域名解析服务器的 IP 地址。
在 rootfs 中新建文件/etc/resolv.conf,并输入如下内容:
nameserver 114.114.114.114
nameserver 192.168.1.1