根文件系统构建

1.什么叫做根文件系统?
根文件系统一般也叫做 rootfs,Linux 中的根文件系统更像是一个文件夹或者叫做目录(在我看来就是一个文件夹,只
不过是特殊的文件夹),在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的文件,这些文件是 Linux 运行所必须的,比如库、常用的软件和命令、设备文件、配置文件等等。
根文件系统首先是内核启动时所 mount(挂载)的第一个文件系统,内核代码映像文件保存在
根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和
服务等加载到内存中去运行。

2.根文件系统的目录名字为"/"

cd /  //进入根目录

3.BusyBox构建根文件系统
BusyBox 就是一个大的工具箱,这个工具箱里面集成了 Linux 的许多工具和命令。一般下载 BusyBox 的源码,
然后配置 BusyBox,选择自己想要的功能,最后编译即可。
BusyBox 可以在其官网下载到,官网地址为:https://busybox.net/,

一般我们在 Linux 驱动开发的时候都是通过 nfs 挂载根文件系统的,当产品最终上市开卖
的时候才会将根文件系统烧写到 EMMC 或者 NAND 中。设置的 nfs 服务
器目录中创建一个名为 rootfs 的子目录(名字大家可以随意起,为了方便就用了 rootfs),比如我
的电脑中“/home/zuozhongkai/linux/nfs”就是我设置的 NFS 服务器目录,使用如下命令创建名
为 rootfs 的子目录:

mkdir rootfs

解压:

tar -vxjf busybox-1.29.0.tar.bz2

3.向根文件系统添加lib库
Linux 中的应用程序一般都是需要动态库的,当然你也可以编译成静态的,但是静态的可
执行文件会很大。如果编译为动态的话就需要动态库,所以我们需要向根文件系统中添加动态
库。在 rootfs 中创建一个名为“lib”的文件夹,命令如下:

mkdir lib

lib 文件夹创建好了,库文件从哪里来呢?lib 库文件从交叉编译器中获取,前面我们搭建
交叉编译环境的时候将交叉编译器存放到了“/usr/local/arm/”目录中。
进入如下路径对应的目录:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib

此目录下有很多的so(是通配符)和.a 文件,这些就是库文件,将此目录下所有的so*和.a
文件都拷贝到 rootfs/lib 目录中,拷贝命令如下:

cp *so* *.a /home/zuozhongkai/linux/nfs/rootfs/lib/ -d

-d表示拷贝符号连接

4.向roots的“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

至此,根文件系统的库文件就全部添加好了,可以使用“du”命令来查看一下 rootfs/lib 和
rootfs/usr/lib 这两个目录的大小,命令如下:

cd rootfs  //进入根文件系统目录
du ./lib ./usr/lib -sh  //查看lib和/usr/lib这两个目录的大小

5.根文件系统初步测试
测试方法使用NFS挂载,uboot 里面的 bootargs 环境变量会设置“root”的值,所以我们将 root 的值改为 NFS 挂载即可。
在 Linux 内核源码里面有相应的文档讲解如何设置,文档为 Documentation/filesystems/nfs/
nfsroot.txt,格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

:服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP
地址,比如我的 Ubuntu 主机 IP 地址为 192.168.1.250。
:根文件系统的存放路径,比如我的就是/home/zuozhongkai/linux/nfs/rootfs。
:NFS 的其他可选选项,一般不设置。
:客户端 IP 地址,也就是我们开发板的 IP 地址,Linux 内核启动以后就会使用
此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,并且没有被其他的设
备使用,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能
ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为
192.168.1.251。
:服务器 IP 地址,前面已经说了。
:网关地址,我的就是 192.168.1.1。
:子网掩码,我的就是 255.255.255.0。
:客户机的名字,一般不设置,此值可以空着。
:设备名,也就是网卡名,一般是 eth0,eth1….,正点原子的 I.MX6U-ALPHA 开
发板的 ENET2 为 eth0,ENET1 为 eth1。如果你的电脑只有一个网卡,那么基本只能是 eth0。
这里我们使用 ENET2,所以网卡名就是 eth0。
:自动配置,一般不使用,所以设置为 off。
:DNS0 服务器 IP 地址,不使用。
:DNS1 服务器 IP 地址,不使用。
根据上面的格式 bootargs 环境变量的 root 值如下:

root=/dev/nfs nfsroot=192.168.1.250:/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw
ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off

“proto=tcp”表示使用 TCP 协议,“rw”表示 nfs 挂载的根文件系统为可读可写。启动开发
板,进入 uboot 命令行模式,然后重新设置 bootargs 环境变量,命令如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.250:
/home/zuozhongkai/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:
255.255.255.0::eth0:off' //设置 bootargs
saveenv //保存环境变量

设置好以后使用“boot”命令启动 Linux 内核。

6.开机自启动
进入根文件系统的时候会运行/etc/init.d/rcS这个shell脚本,因此我们可以在这个脚本里添加自启动相关内容。

7.外网连接测试
输入命令:

ping www.baidu.com

出现“bad address”提示,说明地址解析失败,并没有解析出去其所对应的IP地址。我们需要配置域名解析服务器的IP地址,一般域名解析地址可以设置为所处网络的网关地址,比如192.168.1.1,也可以设置为114.114.114.114,这个是运营商的域名解析服务器地址。
在 rootfs 中新建文件/etc/resolv.conf,然后在里面输入如下内容:

1 nameserver 114.114.114.114
2 nameserver 192.168.1.1

设置很简单,nameserver 表示这是个域名服务器,设置了两个域名服务器地址:
114.114.114.114 和 192.168.1.1,大家也可以改为其他的域名服务器试试。如果使用“udhcpc”命
令自动获取 IP 地址,“udhcpc”命令会修改 nameserver 的值,一般是将其设置为对应的网关地
址。修改好以后保存退出,重启开发板!

你可能感兴趣的:(Linux内核,根文件系统构建)