文章

i.MX6ULL 编译busybox

busybox 是一个多用途的软件包,它提供了各种Unix工具的紧凑实现。其小巧和高效的特点使其适用于资源受限的系统,常用于嵌入式系统。

源码下载

我的系统是ubuntu 22.04,开发板用的是正点原子IMX6ULL阿尔法板,busybox官网源码下载地址是:https://www.busybox.net/downloads/

我这里下载的版本是:

将下载好的源码解压到ubuntu系统中:

tar -vxjf busybox-1.29.2.tar.bz2

源码准备

修改顶层makefile文件

找到makefile文件中以下两个位置并修改:

ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-

中文支持(可跳过)

打开busybox-1.29.2/libbb/printable_string.c文件进行以下修改:

打开busybox-1.29.2/libbb//unicode.c文件进行以下修改:

busybox图形化配置

输入以下命令进行配置:

make menuconfig

取消选中:

Location: -> Settings -> Build static binary (no shared libs) //动态bian编译
Location: -> Linux Module Utilities -> Simplified modutils

选中:

Location: -> Settings -> vi-style line editing commands
Location: -> Linux System Utilities -> mdev (16 kb) //确保下面的全部选中,默认都是选中
Location: -> Settings -> Support Unicode -> Check $LC_ALL,$LC_CTYPE and $LANG environment variables //中文编码

配置结束。

编译打包

编译并指定编译目录:

make install CONFIG_PREFIX=/你的路径/rootfs

编译完成后,rootfs目录中有bin、sbin 、usr文件夹和一个linuxrc文件,手动再建立一些其他基础文件夹lib、dev、proc、mnt、sys、tmp 和 root

mkdir lib
mkdir dev
mkdir proc
mkdir mnt
mkdir sys
mkdir tmp
mkdir root

拷贝一些必要文件,在 编译器路径/arm-linux-gnueabihf/libc/lib 路径下执行以下命令拷贝文件:

cp so *.a /你的路径/rootfs/lib/ -d

编译器路径/arm-linux-gnueabihf/lib 路径下执行以下命令拷贝文件:

cp so *.a /你的路径/rootfs/lib/ -d

在rootfs的usr目录下创建目录lib,在编译器路径/arm-linux-gnueabihf/libc/usr/lib 路径下执行以下命令拷贝文件:

cp so *.a /你的路径/rootfs/lib/ -d

根文件系统就弄好了,将rootfs打包:

tar -vcjf rootfs.tar.bz2 *

结果:

烧写

打开mfgtools工具的文件夹,替换\Profiles\Linux\OS Firmware\files 目录下的相关文件文件,根据自己的板子选中相关文件,我这里准备好的文件如下:

rootfs_nogpu.tar.bz2   //上面打包好的根文件系统
u-boot-dtb.imx  //uboot
zImage  //linux
imx6ull-14x14-evk-emmc.dtb  //设备树

将上面的4个文件全部粘贴替换到\Profiles\Linux\OS Firmware\files 目录下,打开软件:

开发板设置拨码开关为usb启动,上电开机,点击下载,下载完成如下图:

开发板设置拨码开关为emmc启动,上电开机,打开串口软件,手动重启以下开发板,就可以看到系统启动成功:

进入系统后运行ls命令:

文件系统基本成功!

优化

创建/etc/init.d/rcS 文件:

 #!/bin/sh
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH  # PATH 环境变量保存着可执行文件可能存在的目录
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib  # LD_LIBRARY_PATH 环境变量保存着库文件所在的目录
export PATH LD_LIBRARY_PATH  # 使用 export 来导出上面这些环境变量,相当于声明一些“全局变量”。

mount -a  # 使用 mount 命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定,所以要创建/etc/fstab 文件
mkdir /dev/pts # 创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug  # 使用 mdev 来管理热插拔设备,通过这两行,Linux 内核就可以在/dev 目录下自动创建设备节点。
mdev -s

创建/etc/fstab 文件:

#<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

# <file system>:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
# <mount point>:挂载点。
# <type>:文件系统类型,比如 ext2、ext3、proc、romfs、tmpfs 等等。
# <options>:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使
# 用 defaults,也就是默认选项,defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。
# <dump>:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。
# <pass>:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,
# 其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。

创建/etc/inittab 文件:

 #etc/inittab
::sysinit:/etc/init.d/rcS  # 系统启动以后运行/etc/init.d/rcS 这个脚本文件
console::askfirst:-/bin/sh  # 将 console 作为控制台终端,也就是 ttymxc0。
::restart:/sbin/init  # 重启的话运行/sbin/ini
::ctrlaltdel:/sbin/reboot  # 按下 ctrl+alt+del 组合键的话就运行/sbin/reboot,看来 ctrl+alt+del 组合键用于重启系统
::shutdown:/bin/umount -a -r  # 关机的时候执行/bin/umount,也就是卸载各个文件系统。
::shutdown:/sbin/swapoff -a  # 关机的时候执行/sbin/swapoff,也就是关闭交换分区

重新打包完成!

License:  CC BY 4.0