学习编译busybox,并安装,然后添加“根文件系统”的库。有人说busybox构建根文件系统,只适合学习,不适合做项目。
1、了解ubuntu的根文件系统
根文件系统的目录名为“/”,就是一个斜杠。
1)、输入“cd /回车”,进入“根目录”
输入“ls回车”,就可以查看根目录下的文件和文件夹
2)、点击下图中的文件,就可以打开主文件夹,见下图:
3)、点击“其他位置”
4)、双击“计算机”图标,得到下图:
2、了解BusyBox工具箱
BusyBox工具箱集成了大量的linux命令和工具,像ls、mv、ifconfig等命令,它都会提供。我们下载BusyBox的源码,经过配置BusyBox,选择自己想要的功能,最后编译即可。
路径为:“程序源码\06、BusyBox源码\busybox-1.32.0.tar.bz2”
使用nfs挂载根文件系统
做好的根文件系统,放到ubuntu上,然后通过nfs服务来挂载。
3、创建rootfs目录用来存放我们的根文件系统
存放根文件系统的路径:“home/zgq/linux/nfs/rootfs”
打开第1个终端
输入“ls回车”
输入“cd linux/回车”,切换到“linux”目录
输入“ls回车”,列出“linux”目录下的文件和文件夹
输入“cd nfs/回车”,切换到“nfs”目录
输入“ls回车”,列出“nfs”目录下的文件和文件夹
输入“mkdir rootfs回车”,创建“rootfs”目录
输入“ls回车”,列出“nfs”目录下的文件和文件夹
4、创建busybox目录和获取busybox软件
使用“home/zgq/linux/busybox”用来存放busybox软件。
1)、打开第2个终端
输入“ls回车”
输入“cd linux/回车”,切换到“linux”目录
输入“ls回车”,列出“linux”目录下的文件和文件夹
输入“mkdir busybox回车”,创建“busybox”目录
输入“ls回车”,列出“linux”目录下的文件和文件夹
2)、使用FileZilla将BusyBox源码发送到“home/zgq/linux/busybox”。
见下图:
3)、输入“cd busybox/回车”,切换到“busybox”目录
输入“ls回车”,列出“busybox”目录下的文件和文件夹
输入“tar -vxjf busybox-1.32.0.tar.bz2回车”,解压文件
4)、输入“ls回车”,列出“busybox”目录下的文件和文件夹
输入“cd busybox-1.32.0/回车”,切换到“busybox-1.32.0”目录
输入“ls回车”,列出“busybox-1.32.0”目录下的文件和文件夹
5、修改“busybox-1.32.0”目录下的“Makefile”
1)、在第2个终端,输入“vi Makefile回车”
2)、输入“/CROSS_COMPILE ?=回车”,查找“CROSS_COMPILE ?=”,见下图:
3)、打开第3个终端,查找交叉编译器绝对路径
输入“ls回车”
输入“cd /usr/local/arm/回车”,切换到“/usr/local/arm/”目录
输入“ls回车”,列出“arm”目录下的文件和文件夹
输入“cd gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/回车”,切换到“gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabih”目录
输入“ls回车”,列出“gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabih”目录下的文件和文件夹
输入“cd bin/回车”
输入“pwd回车”
交叉编译器绝对路径:
/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
4)、回到打开的“Makefile”,在“CROSS_COMPILE ?=”添加内容如下:
/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-
见下图:
5)、输入“/ARCH ?=回车”,查找“ARCH ?=”,见下图:
6)、将“ARCH ?= $(SUBARCH)”屏蔽掉
添加“ARCH ?= arm”
见下图:
7)、按“ESC键”,输入“:wq”,保存退出,得到下图:
6、设置busybox支持中文字符
1)、在第2个终端,输入“vi libbb/printable_string.c回车”,修改“busybox-1.32.0/libbb/printable_string.c”
2)、输入“/printable_string2回车”,查找“printable_string2”,得到下图:
修改后,见下图:
3)、按“ESC键”,输入“:wq”,保存退出
4)、在第2个终端,输入“vi libbb/unicode.c回车”,修改“busybox-1.32.0/libbb/unicode.c”
5)、输入“/unicode_conv_to_printable2回车”,查找“unicode_conv_to_printable2”
修改后,见下图:
5)、按“ESC键”,输入“:wq”,保存退出
7、配置busybox
1)、在第2个终端,输入“make defconfig回车”,先执行“默认配置”来配置一下“busybox”工具;
设置“个性化配置”
2)、在第2个终端,输入“make menuconfig回车”,打开图形化配置界面
3)、移动“向下光标键”,找到“Settings”,按下“回车”
移动“向下光标键”,找到“Build static binary”
4)、按“N”,设置为“动态编译”
5)、移动“向下光标键”,找到“vi-style line editing commands”
6)、按“Y”,见下图:
7)、按两次“ESC键”,得到下图:
8)、移动“向下光标键”,找到“Linux Module Utilities”
9)、按“回车键”,移动“向下光标键”,找到“Simplified modutils”,得到下图:
10)、按“N”,不选中,见下图:
11)、按两次“ESC键”,移动“向下光标键”,找到“Linux System Utilities”
12)、按“回车键”,移动“向下光标键”,找到“mdev (17 kb)”,得到下图:
13)、按“Y”,把“mdev (17 kb)”下面的全部选中,见下图红框:
14)、按两次“ESC键”,移动“向下光标键”,找到“Settings”
15)、按“回车键”,移动向下光标键,找到“Support Unicode”,得到下图:
按“Y”,选中“Support Unicode”
移动“向下光标键”,找到“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”
按“Y”,选中,见下图:
16)、按两次“ESC键”,移动向下光标键,找到“Save Configuration to an Alternate File”,查看是否有保存选项,见下图:
17)、按“ESC键”,直到出现下图:
18)、按“Y”,保存配置
在第2个终端,输入“make menuconfig回车”
移动“向下光标键”,找到“Save Configuration to an Alternate File”
见下图:
19)、按“回车键”,得到下图:
20)、将“.config”修改为“./configs/stm32mp1_atk_defconfig”,见下图:
21)、移动“向下光标键”至“Ok”,按“O”保存。
22)、按“ESC键”,直到出现下图:
23)、按“Y”
注意:
如果我们想要用自己的配置文件,直接输入“make stm32mp1_atk_defconfig回车”
8、编译busybox
1)、在第2个终端,路径:“/home/zgq/linux/busybox/busybox-1.32.0/”
输入“make回车”
2)、在第2个终端,路径:“/home/zgq/linux/busybox/busybox-1.32.0/”
输入“make install CONFIG_PREFIX=/home/zgq/linux/nfs/rootfs回车”,将busybox安装到“rootfs”目录下
3)、查看busybox工具
在第1个终端,输入“cd rootfs回车”,切换到“rootfs”目录
输入“ls回车”,列出“rootfs”目录下的文件和文件夹
输入“cd bin回车”,切换到“bin”目录
输入“ls回车”,列出“bin”目录下的文件和文件夹
4)、在第1个终端,路径:“/home/zgq/linux/nfs/rootfs/bin/”
输入“cd ..回车”,列出“rootfs”目录下的文件和文件夹
输入“ls回车”,列出“rootfs”目录下的文件和文件夹
输入“cd sbin回车”,切换到“sbin”目录
输入“ls回车”,列出“sbin”目录下的文件和文件夹
5)、在第1个终端,路径:“/home/zgq/linux/nfs/rootfs/sbin/”
输入“cd ..回车”,列出“rootfs”目录下的文件和文件夹
输入“ls回车”,列出“rootfs”目录下的文件和文件夹
输入“cd sbin回车”,切换到“sbin”目录
输入“ls回车”,列出“sbin”目录下的文件和文件夹
输入“cd ..回车”,列出“rootfs”目录下的文件和文件夹
输入“ls回车”,列出“rootfs”目录下的文件和文件夹
10、创建lib目录
1)、在第1个终端,路径:“/home/zgq/linux/nfs/rootfs/”
输入“mkdir lib回车”,创建“lib”目录
输入“ls回车”,列出“rootfs”目录下的文件和文件夹
2)、打开第3个终端,查找交叉编译器lib库的绝对路径
输入“ls回车”
输入“cd /usr/local/arm/回车”,切换到“/usr/local/arm/”目录
输入“ls回车”,列出“arm”目录下的文件和文件夹
输入“cd gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/回车”,切换到“gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabih”目录
输入“ls回车”,列出“gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabih”目录下的文件和文件夹
输入“cd arm-none-linux-gnueabihf/回车”,切换到“arm-none-linux-gnueabihf”目录
输入“ls回车”,列出“arm-none-linux-gnueabihf”目录下的文件和文件夹
输入“cd libc/回车”,切换到“libc”目录
输入“ls回车”,列出“libc”目录下的文件和文件夹
输入“cd lib/回车”,切换到“lib”目录
输入“ls回车”,列出“lib”目录下的文件和文件夹
见下图:
此目录下有很多的“*so*”文件,这些就是库文件,将此目录下所有的“*so*”文件都拷贝到“/home/zgq/linux/nfs/rootfs/lib/”目录中。
注意:*是通配符
3)、打开第3个终端,输入“cp *so* /home/zgq/linux/nfs/rootfs/lib/ -d回车”
后面的“-d”表示拷贝符号链接,这里有个比较特殊的库文件:1d-linux-armhfso.3,此库文件也是个符号链接,相当于Windows下的快捷方式。会链接到库1d-2.30.so上;
4)、打开第3个终端,输入“ls ld-linux-armhf.so.3 -l回车”查看此文件详细信息
“ld-linux-armhf.so.3”后面有个“->”,表示其是个“软连接文件”,链接到文件“ld-2.30.so”。因为“ld-linux-armhf.so.3”是一个“快捷方式”,因此大小只有10B。
由于“ld-linux-armhf.so.3”不能作为符号链接,它在“根文件系统”中执行程序中无法执行。所以,我们需要 “ld-linux-armhf.so.3”完成逆袭,由“快捷方式”变为“本尊”。方法是重新复制 “ld-linux-armhf.so.3”,只是不复制软链接即可,先将“/home/zgq/linux/nfs/rootfs/lib/”中的“ld-linux-armhf.so.3”文件删除掉。
5)、打开第1个终端,输入“cd lib/回车”
输入“ls -l ld-linux-armhf.so.3回车”,查看“ld-linux-armhf.so.3”文件
输入“rm ld-linux-armhf.so.3回车”,删除“ld-linux-armhf.so.3”文件
6)、打开第3个终端,输入“cp ld-linux-armhf.so.3 /home/zgq/linux/nfs/rootfs/lib/回车”
7)、打开第1个终端,输入“ls -l ld-linux-armhf.so.3回车”,查看“ld-linux-armhf.so.3”文件
“ld-linux-armhf.so.3”文件占“1279392”个字节。
8)、打开第3个终端,输入“cd ../../回车”,退回两次,返回到“arm-none-linux-gnueabihf”目录
输入“ls回车”,列出“arm-none-linux-gnueabihf”目录下的文件和文件夹
输入“cd lib/回车”,退回两次,返回到“lib”目录
输入“ls回车”,列出“lib”目录下的文件和文件夹
“arm-none-linux-gnueabihf/lib”目录下也有很多的的“*so*”和“.a”库文件,我们将其也拷贝到“/home/zgq/linux/nfs/rootfs/lib/”目录中。
9)、打开第3个终端,输入“cp *so* *.a /home/zgq/linux/nfs/rootfs/lib/ -d回车”
10)、打开第1个终端,输入“ls回车”,查看“/home/zgq/linux/nfs/rootfs/lib/”文件
11)、打开第1个终端,输入“cd ..回车”,切换到“/home/zgq/linux/nfs/rootfs/”
输入“ls回车”,切换到“rootfs”目录下的文件和文件夹
输入“cd usr/回车”,切换到“usr”
输入“ls回车”,切换到“usr”目录下的文件和文件夹
输入“mkdir lib回车”,在“usr”目录下,创建“lib”
输入“ls回车”,切换到“usr”目录下的文件和文件夹
将“/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/lib”目录下的文件拷贝到“/home/zgq/linux/nfs/rootfs/usr/lib”目录中
12)、打开第3个终端,输入“cd ..回车”,返回到“arm-none-linux-gnueabihf”目录
输入“ls回车”,查看“arm-none-linux-gnueabihf”目录的文件和文件夹
输入“cd libc/回车”,切换到“libc”目录
输入“ls回车”,查看“libc”目录的文件和文件夹
输入“cd usr/回车”,切换到“usr”目录
输入“ls回车”,查看“usr”目录的文件和文件夹
输入“cd lib/回车”,切换到“lib”目录
输入“ls回车”,查看“lib”目录的文件和文件夹
将此目录下的“so”和“.a”库文件都拷贝到“/home/zgq/linux/nfs/rootfs/usr/lib/”目录中
13)、打开第3个终端,输入“cp *so* *.a /home/zgq/linux/nfs/rootfs/usr/lib/ -d回车”,执行拷贝
14)、打开第1个终端,输入“cd lib/回车”,切换到“/home/zgq/linux/nfs/rootfs/usr/lib/”目录
输入“ls回车”,查看“lib”目录的文件和文件夹
15)、打开第1个终端,使用“du”命令来査看一下 rootfs/lib 和rootfs/usr/lib这两个目录的大小
输入“cd ../../回车”,退回两次,返回到“rootfs”目录
输入“du ./lib ./usr/lib/ -sh回车”,查看 lib和 usr/lib这两个目录的大小
16)、打开第1个终端,在“根文件系统”中创建其他文件夹,如 dev、proc、mnt、sys、tmp、etc 和 root等
输入“mkdir dev proc mnt sys tmp etc root回车”
输入“ls回车”,查看“rootfs”目录的文件和文件夹
至此,“根文件系统”的库文件就全部添加好了;