Linux——rootfs根文件系统构建
根文件系统也叫做rootfs
FATFS这类的文件系统属于Linux内核的一部分,属于软件代码,所以ROOTFS不等于FATFS。
Linux的根文件系统实际上是一个文件夹或者叫目录,这个目录下会有许多子目录,这些目录中存放许多Linux运行所必须的文件,比如库、常用的软件和命令、设备文件、配置文件等等
例如我们装一个Windows系统,C盘中回存放系统正常运行所需要的文件,这个C盘就相当于我们的根文件系统。
常用目录
/bin 目录
此目录下存放系统需要的可执行文件,一般都是一些命令,比如ls、mv等命令
/dev 目录
此目录的文件都是和设备有关的,例如/dev/ttymxc0就表示IMX6ULL的串口0
/etc 目录
此目录下存放着各种配置文件
/lib 目录
此目录下存放着 Linux 所必须的库文件。这些 库文件是共享库,命令和用户编写的应用程序要使用这些库文件
/mnt 目录
临时挂载目录,一般是空目录,可以在此目录下创建空的子目录
/proc 目录
此目录一般是空的,当 Linux 系统启动以后会将此目录作为 proc 文件系统的挂载点,proc 是个虚拟文件系统,没有实际的存储设备。proc 里面的文件都是临时存在的,一般用来存储系统运行信息文件。
/usr 目录
usr 不是 user 的缩写,而是 Unix Software Resource 的缩写,也就是 Unix 操作系统 软件资源目录
/var 目录
此目录存放一些可以改变的数据
/sbin 目录
此目录也是存放一些可执行文件,不过只有管理员才能使用
/sys 目录
此目录是系统启动后sysfs文件系统的挂载点,sysfs是一个类似proc文件系统的特殊文件系统
/opt目录
可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中
BusyBox构建根文件系统
构建根文件系统busybox,还有很多成熟的根文件系统构建方式,buildroot,yocto。
构建的根文件调试我们通过nfs网络挂载,也就是根文件系统存放到ubuntu下,开发板启动以后通过nfs服务使用ubuntu下的根文件系统。
将busybox压缩包通过ftp传输到ubuntu下
1、解压缩后修改Makefile添加交叉编译器
CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-g nueabihf/arm-linux-gnueabihf-
ARCH ?= arm
2、busybox支持中文字符
修改busybox源码,取消busybox对中文显示的限制,打开文件 busybox1.29.0/libbb/printable_string.c,找到函数 printable_string
屏蔽掉
修改
接着打开文件 busybox-1.29.0/libbb/unicode.c
修改
makemenuconfig进入图形配置界面
不选
选择动态编译(静态编译不需要库文件,但是编译出来的库会很大,并且DNS会出问题,无法解析域名,动态编译要求根文件系统中有库文件,但是编译出来的busybox会小很多)
选中
取消勾选
确保括号中全部选中
选中
保存退出
编译busybox
将编译结果放到指定路径
make install CONFIG_PREFIX=/home/zzs/linux/bfs/rootfs
向根文件系统添加lib库
Linux中的应用程序一般都是需要动态库的,所以我们需要先在根文件系统中添加动态库
拷贝库文件
库文件就是交叉编译器的库文件,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/zzs/linux/nfs/rootfs/lib/ -d
“-d”表示拷贝符号链接
现在有一个问题就是ld-linux-armhf.so.3不能作为符号链接,否则在根文件系统中执行程序无法执行,所有我们要将ld-linux-armhf.so.3由快捷方式变为本尊,方法是将ld-linux-armhf.so.3删掉,然后重新复制一份,不复制软链接
rm ld-linux-armhf.so.3
cp ld-linux-armhf.so.3 /home/zzs/linux/nfs/rootfs/lib/
拷贝完成之后再到rootfs/lib目录下查看ld-linux-armhf.so.3文件详情信息,此文件已经不是一个软链接,变成一个实实在在的库文件
-l 表示显示长目录,包括文件权限,上一次的编译时间,文件大小等信息
进入如下目录,将目录下所有的*so*和*.a库文件,我们将其也拷贝到rootfs/lib目录中,命令如下:
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a /home/zzs/linux/nfs/rootfs/lib/ -d
在rootfs的usr目录下创建lib文件夹
mkdir lib
拷贝下面目录下的so和.a库文件到rootfs/usr/lib目录下,命令如下:
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a /home/zzs/linux/nfs/rootfs/usr/lib/ -d
在根文件系统中创建其他文件夹,如 dev、proc、mnt、sys、tmp 和 root 等
根文件系统初步测试
uboot命令行中设置bootargs
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.130:/home/zzs/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.101:192.168.1.130:192.168.1.1:255.255.255.0::eth0:off'
saveenv //保存环境变量
设置完成之后用boot命令启动Linux内核
用ls命令可以看出进入了根文件系统
但可以明显看出还存在一些问题,提示有错误,是因为缺少一些文件导致的,下面我们继续来完善我们的根文件系统:
完善根文件系统
在rootfs中创建/etc/init.d/rcS文件,然后在里面输入以下内容:
编写完成保存之后给予它可执行权限
chmod 777 rcS
错误解决:
创建/etc/fstab文件
在rootfs的etc目录下创建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
重新启动Linux内核
创建/etc/initab文件
#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
根文件系统其他功能测试
软件运行测试
在ubuntu下编写一个简单的测试代码:
利用交叉编译器编译
arm-linux-gnueabihf-gcc hello.c -o hello
将编译结果拷贝到rootfs/drivers中
cp hello /home/zzs/linux/nfs/rootfs/drivers
开发板重新启动Linux内核,进入drivers目录,运行我们的hello程序
cd drivers
./hello
终止运行的方法:
1、按ctrl+c
2、后台执行程序加&,使用“kill -9 pid(进程ID)”终止运行
后台运行
./hello &
利用ps可以看PID
终止后台运行的hello
kill -9 77
开机自启动设置
进入根文件系统的时候会运行/etc/init.d/rcS这个shell脚本,因此我们可以在这个脚本里面添加自启动相关内容。
无法解析出域名IP问题
设置域名服务器地址
在根文件系统中创建/etc/resolv.conf文件,然后编写下面的内容:
域名解析成功
原文地址:https://blog.csdn.net/weixin_74209413/article/details/144383072
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!