实验环境:物理机Ubuntu20.04/Windows 10 21H2
1. 制作并安装最小linux文件系统
1.1 编译uboot
将如下三个文件夹拷贝至Ubuntu同一级目录下:
拷贝完成后,如图所示:
使用如下命令解压uboot源码:
tar -vxf iTop4412_uboot_20180320.tar.gz
解压完成后如图所示:
可以通过使用iTop4412_uboot源码文件夹内的”build_uboot.sh”脚本来编译uboot源码,编译时有如下几个参数需要根据板子型号进行设定:
硬件分类 | 脚本执行参数 |
核心板SCP,1G内存 | SCP_1GDDR |
核心板SCP,2G内存 | SCP_2GDDR |
核心板POP,1G内存 | POP_1GDDR |
核心板POP,2G内存 | POP_2GDDR |
笔者使用的开发板是核心板SCP且为1G内存,因此编译的时候使用的参数为”SCP_1GDDR”,进入到iToop4412_uboot目录下,使用如下命令完成uboot的编译:
./build_uboot.sh SCP_1GDDR
编译完成后如图所示
编译生成的u-boot-iTop-4412.bin文件就在iTop4412_uboot目录下,如图所示:
1.2 编译linux内核
先将iTop4412_Kernel_3.0_20191007.tar.gz内核源码拷贝至Ubuntu中,如图所示
然后使用如下的命令进行解压缩:
tar -vxf iTop4412_Kernel_3.0_20191007.tar.gz
解压完成后如图所示:
然后进入到”iTop4412_Kernel_3.0”目录下,进行编译内核的配置。
假如需要为最小linux系统编译内核,那么需要选择config_for_linux*的配置文件,如果是为安卓编译内核,则选择config_for_android*即可其他系统也类似,其中elite表示精英版,super表示全能版。
以编译最小linux系统所需的内核为例,由于笔者使用的是SCG1G的精英版,因此需要使用如下命令来配置.config文件:
cp config_for_linux_scp_elite .config
完成后,使用如下命令即可编译内核:
make zImage
实测Ubuntu20.04 LTS系统在编译时会遇到版本问题而产生的错误,如图
解决方法:根据error出错目录,找到timeconst.pl文件,进入找到defined(@array)这句,根据括号内提示,忽略defined,将:
if (!defined(@val)) {
改为:
if (!(@val)) {
详细过程如下,在iTop4412_Kernel_3.0内核目录中,使用如下命令对timeconst.pl文件进行编辑:
vim /kernel/timeconst.pl
然后跳转到出错的行数,这里为373,在vim中使用如下命令即可跳转:
373gg
跳转完成后如图所示:
修改后如图所示:
然后保存退出,重新编译,编译完成后如图所示:
生成的zImage文件在./arch/arm/boot目录下,如图所示
1.3 下载并配置Busybox
可以通过使用Busybox开源工具箱来完成对最小linux文件系统的制作,Busybox是一个集成了一百多个最常用linux命令和工具的软件,包含常用的shell命令,其官网为:
打开官网,如图所示,目前最新版为1.35.0
下载完后,复制到Ubuntu,如图所示:
使用如下命令进行解压:
tar -vxf busybox-1.35.0.tar.bz2
解压完成后如图所示
进入到解压生成的busybox-1.35.0目录,然后使用如下命令
make menuconfig
可以对linux文件系统进行配置,实测Ubuntu20.04 LTS会弹出如下错误:
这是因为Ubuntu系统缺少一个套件ncurses devel,使用如下命令进行安装即可:
apt install libncurses5-dev
完成后,再次使用make menuconfig就能进入buybox的菜单配置界面了,如图所示
随后,进入Settings目录,往下翻,找到”---Build Options”下的”Cross compiler prefix”,来为其配置交叉编译器。
这里以前面安装的”arm-none-linux-gnueabi-”交叉编译器为例,回车进入”Cross compiler prefix”后,在编辑框输入”arm-none-linux-gnueabi-”,然后选择”OK”确定,如图所示:
接下来为Busybox配置文件系统安装目录,默认为当前文件夹的”_install”目录,如图所示:
这里在busybox-1.35.0目录外建立一个filesystem目录,用于busybox安装文件系统,这样需要将”./_install”修改为”../filesystem”,如图所示:
然后选择”Ok”并保存退出,如图所示,选择”Yes”。
1.4 完善最小linux文件系统
如图所示,在busybox-1.35.0的同级目录建立filesystem目录。
然后,在filesystem中完善最小linux系统所需要的文件,具体如下:
在filesystem中使用如下命令建立一系列文件夹:
mkdir dev etc lib mnt proc sys tmp var
完成后如图所示
然后,进入新创建的etc目录,使用如下命令建立init.d和rc.d文件夹
mkdir init.d rc.d
完成后如图所示:
再进入到新创建的rc.d文件夹,使用如下命令创建init.d文件夹
mkdir init.d
完成后如图所示:
然后再返回到filesystem目录下,进入var目录,使用如下命令在其中建立其他系统需要的文件夹:
mkdir lib lock log run tmp
完成后如图所示:
以下操作需要用到一些迅为提供的初始化文件,如图所示,解压后避免在windows中打开。
进入创建的etc目录,将eth0-setting passwd profile三个文件拷贝进去,并使用如下命令将这些文件的权限改为755:
chmod 755 eth0-setting passwd profile
完成后如图所示:
进入etc目录下的init.d目录,将ifconfig-eth0和rcS两个文件拷贝进去,并使用如下命令将这些文件的权限改为755:
chmod 755 ifconfig-eth0 rcS
完成后如图所示:
进入到etc/rc.d/init.d目录下,将netd文件拷贝进去,使用如下命令将文件的权限改为755:
chmod 755 netd
完成后如图所示:
返回到system目录下,进入lib文件夹下,使用如下命令将编译器的库文件拷贝进去:
cp /usr/local/arm/arm-2009q3/arm-none-linux-guneabi/libc/lib/* ./
完成后如图所示:
这样最小linux系统的文件系统就已经完善了。
1.5 编译最小linux文件系统
进入busybox-1.35.0目录下,依次使用如下命令,来完成最小linux系统的编译与安装:
make
make install
实测使用make命令后,Ubuntu20.04 LTS系统会出现如下错误:
使用如下命令编辑ipaddress.c这个文件:
vim networking/libiproute/ipaddress.c
然后跳转到345行,如图所示:
为IFA_F_DADFAILED添加条件编译,程序修改为:
保存退出后,重新编译,发现有新的报错,这些错误主要是交叉工具链与源码版本不匹配导致的,在busybox的配置中去掉那些未定义的模块即可。
这里有两个,分别是nsenter和sync,在busybox的make menuconfig中输入”/”可以对模块进行搜索,以获取其位置,然后去掉选中状态即可。
以下是搜索nsenter的结果,可以获取其位置为Linux System Utilities
找到并选中后,键盘输入“n”即可去掉选中状态,输入“y”则为选中状态。
继续查找sync
其在Coreutils菜单下,同样进行去除选中操作:
最后保存退出,重新使用make编译。
编译通过了,最后使用如下命令,完成对busybox的安装:
make install
成功后结果如图所示:
1.6 打包最小linux文件系统
在执行上述busybox编译与安装的命令后,使用make_ext4fs打包工具,将linux_tools.tgz压缩文件拷贝至”/”目录下。
然后使用如下命令解压:
tar -vxf linux_tools
完成后如图所示:
之后,进入到前面的filesystem同级目录,使用如下命令来对最小linux文件系统进行打包:
make_ext4fs -s -l 314572800 -a root -L linux system.img filesystem
其中最后一个参数filesystem表示文件系统模板所在目录,即前面完善的linux文件系统,倒数第二个参数system.img表示打包后生成的文件名为system.img。
实测该命令在Ubuntu 20.04 LTS系统下会报错,提示加载共享库libc++.so.6时出错
只需要使用如下命令安装lib32c-dev和lib32stdc++6这两个库即可:
apt install lib32c-dev
apt install lib32stdc++6
安装完成后,再次使用打包命令,就打包生成了系统镜像文件system.img,如图所示:
1.7 烧写最小linux文件系统
在HyperTerminal(或minicom)中u-boot模式下使用(如果只需要更新内核,则可以不擦除分区),擦除分区,并进入fastboot模式
(一条一条命令执行)
fdisk -c 0
fatformat mmc 0:1
ext3format mmc 0:2
ext3format mmc 0:3
ext3format mmc 0:4
fast boot
cmd.exe下使用,通过otg线将所需镜像烧入开发板
一般情况下不重新烧写uboot(最小linux、android和QT共用一个uboot,第一项为烧写uboot)
fastboot.exe flash bootloader u-boot-iTOP-4412.bin
fastboot.exe flash kernel zImage
fastboot.exe flash ramdisk ramdisk-uboot.img
fastboot.exe flash system system.img
fastboot -w
fastboot reboot
烧写完成后,在开发板加载完内核后,使用如下命令可以查看busybox的版本:
ls -j
如图所示,表示busybox打包的系统能正常运行: