目录
前言
通过视频教程学习Busybox构建根文件系统
一、编译Busybox构建根文件系统
在nfs服务器目录下创建rootfs文件夹:
传输并解压缩BusyBox源码压缩文件
1、修改Makefile,添加编译器
添加默认ARCH和CROSS_COMPILE的值如下图所示:
2、取消BusyBox对中文的限制
BusyBox默认对中文进行了限制,我们需要修改文件取消对中文的限制。打开busybox-
1.29.0/libbb/printable_string.c,找到函数 printable_string修改后如下图:
接着打开文件 busybox-1.29.0/libbb/unicode.c,修改内容如下图所示
3、配置BusyBox
通过图形化界面配置自己想要的功能:make menuconfig打开图形化界面菜单
①选项“Build static binary (no shared libs)”用来决定是静态编译 busybox 还是动态编译,静
态编译的话就不需要库文件,但是编译出来的库会很大。动态编译的话要求根文件系统中有库
文件,但是编译出来的 busybox 会小很多。这里我们不能采用静态编译!因为采用静态编译的
话 DNS 会出问题。
配置路径如下:
Location:
-> Settings
-> Build static binary (no shared libs) 不选中
继续配置如下路径配置项:
Location:
-> Settings
-> vi-style line editing commands 选中
继续配置如下路径配置项:
Location:
-> Linux Module Utilities
-> Simplified modutils 不选中
继续配置如下路径配置项:
Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的
最后就是使能 busybox 的 unicode 编码以支持中文,配置路径如下:
Location:
-> settings
-> support unicode 选中
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables 选中
4、编译BusyBox
使用命令 make install CONFIG_PREFIX=/home/zyc/linux/nfs/rootfs/,CONFIG_PREFIX=指定编译目录,编译到nfs服务器目录里。
5、拷贝库文件
由于BusyBox配置选的动态编译,需要添加相应的库文件。首先在rootfs目录下创建lib文件夹
利用命令将库文件拷贝到rootfs下的库中cp *so* *.a /home/zyc/linux/nfs/rootfs/lib/ -d
删除lib/目录下的ld-linux-armhf.so.3文件,并重新拷贝不加参数-d到rootfs/lib/目录下如图所示:
利用命令将库文件拷贝到rootfs下的库中cp *so* *.a /home/zyc/linux/nfs/rootfs/lib/ -d
再在rootfs/usr/目录下创建lib文件夹
利用命令将库文件拷贝到rootfs下的库中cp *so* *.a /home/zyc/linux/nfs/rootfs/usr/lib -d
6、 创建其他文件夹
二、根文件系统测试
为了方便测试,采用网络挂载根文件系统。
①linux内核网络驱动正常
②设置uboot的bootargs。也就是linux内核命令行参数
在uboot中设置参数
root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>
<server-ip>:服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP
地址,比如我的 Ubuntu 主机 IP 地址为 192.168.1.250。
<root-dir>: 根文件系统的存放路径,比如我的就是/home/zuozhongkai/linux/nfs/rootfs。
<nfs-options>: NFS 的其他可选选项,一般不设置。
<client-ip>: 客户端 IP 地址,也就是我们开发板的 IP 地址, Linux 内核启动以后就会使用
此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,并且没有被其他的设
备使用,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能
ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为
192.168.1.251。
<server-ip>: 服务器 IP 地址,前面已经说了。
<gw-ip>: 网关地址,我的就是 192.168.1.1。
<netmask>:子网掩码,我的就是 255.255.255.0。
<hostname>:客户机的名字,一般不设置,此值可以空着。
<device>: 设备名,也就是网卡名,一般是 eth0, eth1….,正点原子的 I.MX6U-ALPHA 开
发板的 ENET2 为 eth0, ENET1 为 eth1。如果你的电脑只有一个网卡,那么基本只能是 eth0。
这里我们使用 ENET2,所以网卡名就是 eth0。
<autoconf>: 自动配置,一般不使用,所以设置为 off。
<dns0-ip>: DNS0 服务器 IP 地址,不使用。
<dns1-ip>: DNS1 服务器 IP 地址,不使用。
根据上面的格式 bootargs 环境变量的 root 值如下:
bootargs=console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.10.100:/home/zyc/linux/nfs/rootfs ip=192.168.10.101:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off,v3
最后成功挂载根文件系统,如图
三、完善根文件系统
①创建rcS脚本
rcS 是规定启动哪些文件的脚本文件。在 rootfs 中创建/etc/init.d/rcS 文件,然后在 rcS 中输入如下所示内容:
1 #!/bin/sh
2 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
3 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
4 export PATH LD_LIBRARY_PATH
5 mount -a
6 mkdir /dev/pts
7 mount -t devpts devpts /dev/pts
8 echo /sbin/mdev > /proc/sys/kernel/hotplug
9 mdev -s
②/etc/fstab 文件
在 rootfs 中创建/etc/fstab 文件, fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区,格式如下:
1 #<file system> <mount point> <type> <options> <dump> <pass>
2 proc /proc proc defaults 0 0
3 tmpfs /tmp tmpfs defaults 0 0
4 sysfs /sys sysfs defaults 0 0
③ 创建/etc/inittab 文件
创建一个/etc/inittab,在里面输入如下内容:
1 #etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::restart:/sbin/init
5 ::ctrlaltdel:/sbin/reboot
6 ::shutdown:/bin/umount -a -r
7 ::shutdown:/sbin/swapoff -a
至此根文件系统构建完毕
总结
一步一步来