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
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'
saveenv
设置好以后使用“boot”命令启动 Linux 内核。
|