设置编译器的路径,找到gcc编译器的路径
/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
输入编译器arm-linux-gnueabihf所在的绝对路径,保存并且退出MakeFile文件。
注释掉31-32行代码。
接着将45行 if(c<’ ‘||c>=0x7f)改为if(c<’ ')
打开libbb/unicode.c,修改如下:
1022行
1031行
确保Build static binary 这一项不能被选中,选中如下的选项。
返回上一层,继续寻找
按键盘上的n,取消选择。
返回上一层,继续选择
确保mdev和下面的紧挨着的5项全部选中。
返回上一层:
接下来编译busybox,需要将编译后的文件放在Busybox文件夹中。
紧接着,向根文件系统中添加lib库了。
在Ubuntu中的rootfs中新建lib文件夹。
进入gcc编译器的libc/lib中
将此目录下的所有so和.a拷贝到rootfs/lib中
拷贝完成so* *.a文件之后并且查看文件目录内容。
输入命令 rm ld-linux-armhf.so.3删除文件–符号链接文件。
接下里将gcc库下的文件拷贝到rootfs中。
接下来 继续从之前的文件夹拷贝文件到lib文件夹。拷贝完成之后,多了许多的文件。
在rootfs/usr中创建lib文件夹
输入命令
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
进入到libc/usr/lib文件夹中。
拷贝完成之后,查看文件夹下的记录。
这时根文件系统的库文件就全部添加好了,可以使用“du”命令来查看一下这个两个目录的大小,进入到rootfs文件夹下输入 du ./lib ./usr/lib -sh
还需要根文件系统中创建其他文件夹,dev,proc,mnt,sys,tmp,root。
紧接着,只要将根文件系统通过网络nfs挂载到开发板上,即可运行根文件系统了。
创建/etc/init.d/rcS文件
rcS是一个shell脚本,Linux内核启动之后需要启动一些服务,而rcS就是规定启动哪些文件的脚本。在rootfs中创建etc/init.d/rcS文件,然后在rcS中输入以下内容:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
创建完成之后,需要给文件权限,保证文件可以执行。
接下来就是创建/etc/fstab文件,进入etc目录下新建fstab文件。
fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区。
文件输入如下内容:
#<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
接下来就是创建/etc/inittab文件,进入etc目录下新建inittab文件。
文件输入内容如下:
#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
以上就是整个根文件系统的创建流程了。
进入到rootfs文件夹中新建一个drivers文件夹,存放编写的软件,在此文件夹下创建新的hello.c
输入测试代码
因为代码要在开发板上运行测试,因此使用交叉编译命令,编译完成之后,查看文件目录。
在etc目录下,新建resolv.conf文件,输入如下的内容。
上面是域名服务地址,下面是网关的地址。
至此,根文件系统彻底制作完成啦,为了防止根文件系统损坏,可以讲rootfs文件夹打包备份。
一定要在rootfs文件夹内打包,不能再文件夹外部打包,因为tar打包默认不会打包隐藏文件的,直接在文件夹外打包的根文件系统在后期烧写进入单片机的时候会导致内核崩溃,无法正常进入。
sudo tar -vcjf rootfs.tar.bz2 rootfs
在文件夹外部打包
在文件夹内部打包
sudo tar -vcjf rootfs.tat.bz2 *