根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。单独的 Linux 内核是没法正常工作的,必须要搭配根文件系统。
根文件系统的目录结构
根文件系统的目录结构可以参考ubuntu下的目录结构。
bin此目录下存放着系统需要的可执行文件,一般都是一些命令,比如 ls、mv 等命令。
dev 是 device 的缩写,所以此目录下的文件都是和设备有关的,此目录下的文件都是设备文件,比如各种串口,音频,SD卡等。
etc目录下存放着各种配置文件
lib 是 library 的简称,也就是库的意思,因此此目录下存放着 Linux 所必须的库文件。
mnt临时挂载目录,一般是空目录,可以在此目录下创建空的子目录,比如/mnt/sd、/mnt/usb,这样就可以将 SD 卡或者 U 盘挂载到/mnt/sd 或者/mnt/usb 目录中。
proc:Linux 系统启动以后会将此目录作为 proc 文件系统的挂载点,proc是个虚拟文件系统,没有实际的存储设备。proc 里面的文件都是临时存在的,一般用来存储系统运行信息文件。
var 此目录存放一些可以改变的数据。
sysfs 系统启动以后此目录作为 sysfs 文件系统的挂载点,sysfs 是一个类似于 proc 文件系统的特殊文件系统,sysfs 也是基于 ram 的文件系统,
opt 可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。
busbox构建文件系统
我们可以使用busybox去构建上述的文件系统。在 Linux 驱动开发的时候都是通过 nfs 挂载根文件系统的
-
下载busybox
网址: https://busybox.net/ -
修改 Makefile,添加编译器, 打开 busybox 的顶层 Makefile,添加 ARCH 和 CROSS_COMPILE的值
-
修改 busybox 源码,取消 busybox 对中文显示的限制,打开文件 busybox-1.29.0/libbb/printable_string.c,找到函数 printable_string
-
配置busybox
#默认配置选项
make defconfig
5.编译busybox
make
make install CONFIG_PREFIX=/home/zuozhongkai/linux/nfs/rootfs
6.向根文件系统添加 lib 库,添加动态库文件
Linux 中的应用程序一般都是需要动态库的,当然你也可以编译成静态的,但是静态的可执行文件会很大。
7.对根文件系统进行测试,使用NFS挂载
8.完善根文件系统
创建/etc/init.d/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
在 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
创建/etc/inittab 文件
inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。init 程序会读取/etc/inittab这个文件,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