自学内容网 自学内容网

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)!