使用BusyBox搭建最小文件系统

搭建一个在iTop4412上运行的最小文件系统

Posted by Jerry Chen on July 20, 2019

准备工作

需要准备的工具

工具 描述 使用方法 Web
busybox-1.29.3.tar.bz2 UNIX实用程序集合 开始 下载
install-devel-packages.sh 基本1:Ubuntu12.04库文件安装脚本 使用 浏览
update_gcc.txt 基本2:gcc降级命令 使用 浏览
arm-2009q3.tar.bz2 基本3:交叉编译器 安装 使用 下载
make 基本4:make3.8.1执行Makefile的工具 使用 自带
mkfs_2tools.tgz 2个打包工具,mkimage、make_ext4fs 安装 使用 下载

最小系统需要准备的文件

以下文件打包下载:最小系统需要的文件

脚本 存放目录 设置权限 Web
profile /etc/ 755 浏览
passwd /etc/ 755 浏览
eth0-setting /etc/ 755 浏览
rcS /etc/init.d/ 755 浏览
ifconfig-eth0 /etc/init.d/ 755 浏览
netd /etc/rc.d/init.d/ 755 浏览

烧写系统需要准备的文件

系统文件的烧写参见这篇文章:如何烧写到iTop4412

以下Web文件是一套适配好的最小linux系统,适合2G内存SCP的iTop4412:

烧写时,system.img文件使用我们自己生成的,其他用下载的。

文件 类型 注释 Web
u-boot-iTOP-4412.bin bootloader uboot 下载
zImage kernel 内核,包括驱动 下载
ramdisk-uboot.img ramdisk 虚拟内存盘,放文件系统init相关脚本 下载
system.img system 文件系统,大小限制这里放最小linux 下载

开始

创建根文件系统该有的目录

  1. 首先创建工作目录mkdir rootfs,也就是最小系统的根目录。

  2. 在rootfs目录下创建该有的空目录:

    • 创建一级目录

      1
      
      mkdir dev etc lib mnt proc sys tmp var
      

      bin/sbin/usr目录是由BusyBox创建再拷贝过来,所以这里先不创建;

    • 创建二级及以下目录

      1
      2
      
      mkdir -p etc/init.d etc/rc.d etc/rc.d/init.d
      mkdir -p var/lib var/lock var/log var/run var/tmp
      

完成后在rootfs目录下使用tree看下文件夹结构,其中还需要bin/sbin/usr/目录:

使用BusyBox构建bin、sbin、usr目录以及linuxrc文件

进行此步前确保交叉编译器安装ok,如未安装,点这里安装

  1. 获取BusyBox源码

    我选择的版本是busybox-1.29.3,点这里下载,或者官网下载

  2. 拷贝到Ubuntu中并解压

    1
    
    tar -vxf busybox-1.29.3.tar.bz2
    
  3. 进入解压目录,使用make menuconfig修改编译配置,或者直接修改Makefile文件

    make menuconfig界面如下:

    • 配置编译器:进入界面“Settings”→“Build Optiions”→“Cross Compiler prefix”将 其配置为arm-none-linux-gnueabi-

      (或者Makefile修改 CROSS_COMPILE 变量值为arm-none-linux-gnueabi-

    • (可选)配置导出目录:进入界面“Settings”→“Installation Options”→“Destination path”发现默认是./_install。编译完成后,执行make install进行导出。

      因为我们的目的是拷贝生成的目标到其他文件夹,因此这里就用默认的即可。

    退出并保存,然后再执行make menuconfig使用/搜索ARCH,发现值为arm就ok了(存在根据编译器名称自动变更ARCH值的机制),否则需要手动修改Makefile中的ARCH为ARCH ?= arm

    紧接着进行其他配置,如静态编译等,按照下面清单进行更改:

  4. 执行命令make,编译BusyBox

    第一次执行会发现有6个警告、2个找不到定义的错误,错误如下:

    忽略警告。2个错误的解决:直接屏蔽这两个模块(NSENTER和SYNC)。故执行make menuconfig取消这两个模块的编译,建议/找到模块路径进行屏蔽,结果如下:

    进入路径屏蔽后保存退出,再次执行make,发现编译通过。

  5. 执行命令make install进行导出文件

    执行后即可发现_install/文件夹下面会生成4个文件夹/文件,这些全都是我们需要的

完善最小Linux系统的文件

进行此步前,确保所需文件已经准备ok,见这里

  1. 【程序文件】进入BusyBox导出目录,将bin/sbin/usr/目录以及linuxrc文件拷贝到最小Linux根目录

    1
    
    cp -ra bin/ sbin/ usr/ linuxrc ~/rootfs/
    

    其中的~/rootfs是我们创建好的最小linux根目录。

  2. 【配置文件】进入最小linux根目录,按照下列步骤拷贝文件

    • 进入etc/目录

      将eth0-setting、passwd、profile三个文件拷贝进去,将文件的权限改为755

    • 进入etc/init.d目录

      将ifconfig-eth0、rcS两个文件拷贝进去,将文件的权限改为755

    • 进入etc/rc.d/init.d目录

      将netd文件拷贝进去,将文件的权限改为755

    完成后,etc目录的结构如下:

  3. 【库文件】进入lib/目录,将编译器的库文件拷贝进去

    1
    
    cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./
    

打包最小Linux系统

进入最小linux根目录的上级目录,执行:

这里填写的Size是300M,建议略小于System分区大小。了解分区命令

1
make_ext4fs -s -l 300M -a root -L linux system.img rootfs

烧录最小Linux系统

烧录详细方法参见这篇文章:如何烧写到iTop4412

打包步骤中设置Size为300M,烧录前分区时分给Systtem分区≥300M即可,一般就执行缺省分区,默认值在uboot/common/cmd_mmc_fdisk.c的SYSTEM_PART_SIZE宏中定义,目前默认值是1024M。其他按照烧录教程中进行即可。

烧录完成后,效果如图: