根文件系统简介与BusyBox构建根文件系统
参考资料:
根文件系统简介:
根文件系统也成为rootfs,fatfs这类的文件系统属于Linux内核的一部分,属于软件代码
如果没根文件系统,内核会出现kernel panic。根文件系统就是一堆文件,比如软件、配置文件等,这些文件是linux运行所必须的,将他们组合在一起就构成了根文件系统
如ubuntu上/目录:
百度百科关于根文件系统的描述:
根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
百度百科上说内核代码镜像文件保存在根文件系统中,但是我们嵌入式 Linux 并没有将内核代码镜像保存在根文件系统中,而是保存到了其他地方。比如 NAND Flash 的指定存储地址、EMMC 专用分区中。根文件系统是 Linux 内核启动以后挂载(mount)的第一个文件系统,然后从根文件系统中读取初始化脚本,比如 rcS,inittab 等。根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的,必须要搭配根文件系统。如果不提供根文件系统,Linux 内核在启动的时候就会提示内核崩溃(Kernel panic)的提示
根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。比如我们常用的 ls、mv、ifconfig 等命令其实就是一个个小软件,只是这些软件没有图形界面,而且需要输入命令来运行。这些小软件就保存在根文件系统中
根文件系统目录和文件介绍:
/bin:可执行文件,常用的一些软件,如ls
/etc:跟配置相关的文件
/lib:库文件,系统软件运行,如gcc
/mnt:挂载目录
/proc:存在系统运行时的信息
/sys:sysfs 文件系统的挂载点
/dev:所以此目录下的文件都是和设备有关的,此目录下的文件都是设备文件
/var:一些可变数据
/usr:Unix Software Resource,unix操作系统软件资源目录
/opt:可选的文件、软件存放区
/sbin:用户存放一些可执行文件,但是此目录的文件或者命令只有管理员才能使用
/tmp:临时文件
根文件系统构建方式有:busybox、buildroot、yocto
BusyBox:
此处构建出来的根文件系统调试使用nfs挂载,也就是根文件系统放在ubuntu下,开发板启动以后通过nfs服务使用ubuntu下的根文件系统
1、修改Makefile,添加ARCH和CROSS_COMPILE
2、busybox支持中文字符,在libbb/printable_string.c文件中修改
libbb/unicode.c文件中修改:
3、配置busybox
使用make defconfg进行默认配置,如果生成.config就表示配置成功了
make menuconfig进行配置
4、编译busybox
配置好busybox以后就可以编译了,可以指定编译结果的存放目录,如下:
make install CONFIG_PREFIX=/home/lethe/linux/nfs/rootfs
busybox源码编译完成之后会生成bin linuxrc sbin usr四个目录
5、拷贝库文件
添加/lib库
将arm-linux-gnueabihf/libc/lib文件夹拷贝到rootfs/lib下
在拷贝时需要加-d,-d表示符号链接
再将arm-linux-gnueabihf/lib也拷贝到rootfs/lib下
添加/usr/lib
将arm-linux-gnueabihf/libc/usr/lib拷贝到rootfs/usr/lib下
可通过du ./lib ./usr/lib -sh查看lib和usr/lib目录的大小
6、创建其他根文件系统文件夹
dev proc mnt sys tmp root
7、nfs挂载根文件系统
- 要求linux内核网络驱动要工作正常
- 设置uboot的bootargs,也就是linux内核的命令行参数
rw如果没有设置在开发板中touch会出现read-only文件系统
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.31.230:/home/lethe/linux/nfs/rootfs,proto=tcp rw ip=192.168.31.62:192.168.31.230:192.168.1.1:255.255.255.0::eth0:off'
8、根文件系统完善
/etc/init.d/rcS文件
can't run '/etc/init.d/rcS': No such file or directory
/etc/init.d/rcS是一个shell脚本,Linux内核启动之后需要启动一些服务,rcS就是规定启动哪些文件的脚本文件,rcS内容如下:
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH // 可执行文件可能存在的目录,$PATH表示追加的 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib // 相关库的路径,表示加入/lib和/usr/lib两个路径 export PATH LD_LIBRARY_PATH // 将可执行文件和相关库的路径导出 mount -a // 自动挂载所有支持挂载的设备,这些系统文件由文件/etc/fstab来指定 mkdir /dev/pts // 将devpts挂载到/dev/pts中 mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug // 使用mdev实现热插拔,通过这两行,Linux 内核就可以在/dev 目录下自动创建设备节点 mdev -s
/etc/fstab文件
再次重启之后会提示:
can't read '/etc/fstab': No such file or directory
/etc/fstab在linux开机之后自动配置哪些需要自动挂载的分区,格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
file system:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
mount point:挂载点。
type:文件系统类型,比如 ext2、ext3、proc、romfs、tmpfs 等等。
options:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使用 defaults,也就是默认选项,defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。
dump:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。
pass:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。
fstab文件输入以下内容:
#<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文件
最终还需要创建一个/etc/inittab文件:
inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。init 进程会读取/etc/inittab这个文件,inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的 4 个段组成,格式如下:
<id>:<runlevels>:<action>:<process>
id:每个指令的标识符,不能重复。但是对于 busybox 的 init 来说,有着特殊意义。对于 busybox 而言用来指定启动进程的控制 tty,一般我们将串口或者 LCD 屏幕设置为控制 tty。
runlevels:对 busybox 来说此项完全没用,所以空着。
action:动作,用于指定可能用到的动作。
busybox 支持的动作如下:
process:具体的动作,比如程序、脚本或命令等。
创建一个/etc/inittab,在里面输入如下内容:
#etc/inittab ::sysinit:/etc/init.d/rcS // 系统运行之后运行/etc/init.d/rcS脚本文件 console::askfirst:-/bin/sh // 将console作为控制台终端 ::restart:/sbin/init // 重启会执行/sbin/init ::ctrlaltdel:/sbin/reboot // ctrl+alt+del组合键会运行/sbin/reboot ::shutdown:/bin/umount -a -r // 关机的时候执行/bin/umount ::shutdown:/sbin/swapoff -a // 关机的时候执行/sbin/poweroff,也就是关闭交换分区