• 12 编译2022年最新的BusyBox rootfs源码,并用QEMU模拟器运行


    编译2022年最新的BusyBox rootfs 1.35.0源码,并用QEMU模拟器运行

    作者将狼才鲸
    创建日期2022-11-26

    • 前提:编译U-Boot和Linux kernel源码时,源码版本、PC主机Linux系统版本、交叉编译器版本都有影响,最好按照网上教程中相同的版本来尝试,要不然经常会遇到编译时遇到了问题,但又搜不到解决方法的尴尬局面。

    • 必须在Linux系统中编译(如Ubuntu),不能在MSYS2中编译。

    1)直接编译Linux源码并运行

    2、Busybox生成文件系统需要的系统应用程序和制作根文件系统
    • MSYS2中的QEMU不能引导文件系统(未尝试去查找解决该问题),在Linux下运行QEMU能正常引导。

      • 在Ubuntu下安装QEMU:sudo apt install qemu-system-arm
    • 从官网下载最新的BusyBox发布版本:busybox-1.35.0.tar.bz2

    • 因为BusyBox源码更新较慢,ARM最新的编译器11.3编译BusyBox报错无法解决,所以我改用老版本的编译器,能编译通过

    • 10.2版本编译器ARM官方下载地址:gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz

      • 解压后需要重新输出编译器路径:
    • 交叉编译环境的配置方法和上面编译U-Boot时相同

    # 因为我当前不编译Linux PC下的程序,所以我直接将整个环境都配成交叉编译的
    export ARCH=arm
    export CROSS_COMPILE=arm-none-linux-gnueabihf-
    # 增加交叉编译器的路径,修改成你自己解压的路径
    export PATH=$PATH:/home/jim/Desktop/tools/gcc-arm-10.2/bin
    # 如果之前以及输出了别的版本gcc的路径,则需并重新注销或者重启Ubuntu后再执行上面的步骤
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 编译:
      • make menuconfig
      • 设置 Build Options 开启静态编译(提示: 可使用 / 搜索 static)
        • 在第一行Settings —>上回车,在滚动到中间位置,找到 [ ] Build static binary (no shared libs)并按空格,让括号内多一个星号表示选中,再按两次Esc,在弹出框中按回车保存配置
      • make -j4
      • make install
    • 编译过程中报错时需要安装的依赖库
      • sudo apt install libncurses5-dev

    • 以下内容无效。以下为尝试解决最新的ARM GCC编译器编译时的问题,但最终失败,但保留重新编译安装coreutils工具集的步骤:

    • 遇到报错无法解决:

    coreutils/dd.c: 在函数‘dd_output_status’中:
    coreutils/dd.c:123:21: 编译器内部错误: 非法指令
      123 | #define G (*(struct globals*)bb_common_bufsiz1)
          |                     ^~~~~~~
    coreutils/dd.c:192:29: 附注: in expansion of macro ‘G’
      192 |         seconds = (now_us - G.begin_time_us) / 1000000.0;
          |                             ^
    free(): invalid next size (fast)
    editors/awk.c: 在函数‘next_token’中:
    editors/awk.c:1121:17: 编译器内部错误: 已放弃
     1121 |                 debug_printf_parse("%s: using concat-inserted token\n", __func__);
          |                 ^~~~~~~~~~~~~~~~~~
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 重新编译安装coreutils也无法解决报错的问题:
    export ARCH=arm
    export CROSS_COMPILE=arm-none-linux-gnueabihf-
    export PATH=$PATH:/home/jim/Desktop/tools/arm-gnu-toolchain-11.3/bin
    
    • 1
    • 2
    • 3
    • 然后登出系统(注销),再重新登入(或者重启也可以),去掉当前环境中的交叉编译环境变量
    • 进入coreutils目录
    • ./bootstrap 运行要一会儿,且没有打印提示,可以通过看自己CPU占用率来判断是否结束
    • 执行时报错,则:
      • sudo apt-get install autoconf
      • sudo apt-get install autopoint
      • sudo apt-get install gperf
      • sudo apt-get install texinfo
    • ./configure
    • make CFLAGS=‘-w’ -j4
    • sudo make install
    • 重新编译Busybox仍然报错。
    • 以上内容无效。

    已在BusyBox源码文件夹下生成了_install目录,里面有板子上能用到的各种系统命令
    
    制作根文件系统:
    mkdir my_mnt
    dd if=/dev/zero of=rootfs.img bs=1024 count=16384  # 创建 16MB 虚拟磁盘
    mkfs.ext2 rootfs.img                               # 格式化成 ext2 格式文件系统
    sudo mount -o loop rootfs.img my_mnt               # 将镜像文件和块设备关联并挂载设备到my_mnt
    sudo cp -r _install/* my_mnt                       # 将 BUsybox 所有生成的程序拷贝到根目录
    
    # 创建4个tty设备(c代表字符设备,4是主设备号,1~4分别是次设备号)
    sudo mkdir -p my_mnt/dev
    sudo mknod my_mnt/dev/tty1 c 4 1
    sudo mknod my_mnt/dev/tty2 c 4 2
    sudo mknod my_mnt/dev/tty3 c 4 3
    sudo mknod my_mnt/dev/tty4 c 4 4
    
    # 创建终端
    sudo mknod -m 666 my_mnt/console c 5 1
    sudo umount my_mnt                                        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 将生成的rootfs.img拷贝Ubuntu桌面
    • 将之前的u-boot和vexpress-v2p-ca9.dtb拷贝到Ubuntu桌面
    • 编译好的rootfs.img、zImage和vexpress-v2p-ca9.dtb文件我已经放在另一个仓库中,地址为:https://gitee.com/langcai1943/linux_kernel_u-boot_busybox_code_comments/tree/develop/bin/v1.0.0
    • 在Ubuntu桌面上打开终端
    • 在Ubuntu终端中执行 qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel zImage -dtb vexpress-v2p-ca9.dtb -sd rootfs.img -append “root=/dev/mmcblk0 rw console=ttyAMA0”
    • 可以看到效果:
    jim@jim:~/Desktop/usr$ qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel zImage -dtb vexpress-v2p-ca9.dtb -sd rootfs.img -append "root=/dev/mmcblk0 rw console=ttyAMA0" 
    WARNING: Image format was not specified for 'rootfs.img' and probing guessed raw.
             Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
             Specify the 'raw' format explicitly to remove the restrictions.
    pulseaudio: set_sink_input_volume() failed
    pulseaudio: Reason: Invalid argument
    pulseaudio: set_sink_input_mute() failed
    pulseaudio: Reason: Invalid argument
    Booting Linux on physical CPU 0x0
    Linux version 6.1.0-rc6 (jim@jim) (arm-none-linux-gnueabihf-gcc (Arm GNU Toolchain 11.3.Rel1) 11.3.1 20220712, GNU ld (Arm GNU Toolchain 11.3.Rel1) 2.38.20220708) #1 SMP Fri Nov 25 23:17:29 CST 2022
    CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
    CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
    OF: fdt: Machine model: V2P-CA9
    Memory policy: Data cache writeback
    Reserved memory: created DMA memory pool at 0x4c000000, size 8 MiB
    OF: reserved mem: initialized node vram@4c000000, compatible id shared-dma-pool
    cma: Reserved 16 MiB at 0x6f000000
    Zone ranges:
      Normal   [mem 0x0000000060000000-0x000000006fffffff]
    Movable zone start for each node
    Early memory node ranges
      node   0: [mem 0x0000000060000000-0x000000006fffffff]
    Initmem setup node 0 [mem 0x0000000060000000-0x000000006fffffff]
    CPU: All CPU(s) started in SVC mode.
    percpu: Embedded 15 pages/cpu s30612 r8192 d22636 u61440
    Built 1 zonelists, mobility grouping on.  Total pages: 65024
    Kernel command line: root=/dev/mmcblk0 rw console=ttyAMA0
    printk: log_buf_len individual max cpu contribution: 4096 bytes
    printk: log_buf_len total cpu_extra contributions: 12288 bytes
    printk: log_buf_len min size: 16384 bytes
    printk: log_buf_len: 32768 bytes
    printk: early log buf free: 14944(91%)
    ......
    can't run '/etc/init.d/rcS': No such file or directory
    
    Please press Enter to activate this console. 
    / # ls
    bin         dev         linuxrc     lost+found  sbin        usr
    / # 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    软件外包开发的管理方法
    【面试专栏】java线程第二篇:Java线程/并发编程带来的问题(含线程题解答)
    TypeScript项目配置
    计算机毕业设计(附源码)python智能超市导购系统
    谁能成为首个RedCap规模商用的厂商?
    .NET开源快速、强大、免费的电子表格组件
    Pytest 框架执行用例流程浅谈
    《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3稳定性
    使用非递归的方式实现归并排序
    音视频开发31 FFmpeg 编码- avcodec_find_encoder和avcodec_find_encoder_by_name
  • 原文地址:https://blog.csdn.net/qq582880551/article/details/128047333