使用buildroot构建系统并运行到qemu

  • 安装依赖的容器

docker run -itd -v /home/jcleng/desktop/work/docker/common:/home/jcleng/desktop/work/docker/common --name=buildroot buildroot/base
  • 下载buildroot文件

# 下载: https://buildroot.org/download.html
# 进入容器,并解压
docker exec -it buildroot sh

tar xvf buildroot-2022.02.5.tar.gz
cd buildroot-2022.02.5
  • 创建系统配置

# 使用模板
ls configs
ls configs|grep qemu_mips

make qemu_mips32r2el_malta_defconfig
# 再进行自定义修改
make menuconfig

## 我这里使用
[Target options] mips
[Toolchain] Enable C++ suport
[Kernel] 输入2.6.24 # 版本查看: https://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
[Target Package] Show packages that are also provided by busybox

# 测试编译
make busybox
  • 编译构建

# 编译,会下载内核等网络文件,注意网络
make

# kernel国内源,全局全部替换
https://cdn.kernel.org/pub
# 替换为
https://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub
# 其他的文件无法下载的话,手动到dl目录,直接搜索文件名称即可
https://downloads.uclibc-ng.org/releases/1.0.41/
https://www.busybox.net/downloads/
https://toolchains.bootlin.com/downloads/releases/sources/flex-2.6.4/
http://ftp.icm.edu.pl/packages/busybox/binaries/1.21.1/
# GitHub的文件手动下载
https://ghproxy.com/
# 换源
deb http://mirrors.aliyun.com/debian stable main
deb http://mirrors.aliyun.com/debian stable-updates main

# 完成之后
ls ./output/images/
# rootfs.ext2  start-qemu.sh  vmlinux
# 交叉编译的环境文件 toolchain-wrapper
ls ./output/host/bin
# mipsel-linux-g++
# mipsel-linux-gcc
# ....
file ./toolchain-wrapper
./toolchain-wrapper: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=84ed86d5263b99be320f5c55e1fbc500b7b3ce05, stripped
  • 启动虚拟机

# 需要先安装qemu
./start-qemu.sh

# 用户名root密码空

# uname -a
Linux buildroot 5.15.18 #1 SMP Sat Sep 10 07:36:46 UTC 2022 mips64 GNU/Linux
  • 清除

br-user@a6534757d1da:/home/jcleng/desktop/work/docker/common/buildroot-2022.02.5$ make help
Cleaning:
  clean                  - delete all files created by build
  distclean              - delete all non-source files (including .config)

# dl下载的文件不会删除
make clean
make distclean

# 其他命令
make help
  • 其他

# 安装qemu
# 我是nixos
virtualisation.libvirtd.enable = true;
virtualisation.libvirtd.onBoot = "start";
# 创建virbr0和eth10虚拟网卡,把virbr0作为网桥
virtualisation.libvirtd.allowedBridges = [
  "virbr0"
];
networking.bridges = {
  br0 = {
    interfaces = [
      "virbr0"
    ];
  };
};
networking.interfaces = {
  virbr0 = {
    virtual = true;
  };
  eth10 = {
    virtual = true;
    ipv4 = {
      addresses = [
        {
          address = "131.211.84.78";
          prefixLength = 25;
        }
      ];
    };
  };
};

# pkg可以安装图形化
virt-manager

# 重新用管理员进入docker
docker exec -it -u 0:0 buildroot bash
  • 常见编译错误

# 老的内核版本会提示
scripts/unifdef.c:209:25: error: conflicting types for ‘getline’
# 修改scripts/unifdef.c把getline改为别的名字例如get_line,共3处的


Incorrect selection of kernel headers: expected 5.15.x, got 2.6.x
# 编辑
/usr/include/linux/version.h
# 修改为当前内核的版本, 比如 132632
output/build/linux-headers-2.6.24/usr/include/linux/version.h

# 修改文件 toolchain/helpers.mk, check_kernel_headers_version = 空即可
check_kernel_headers_version =
  • 局域网

# 启动虚拟机之后会有一个虚拟网卡eth10
ping 131.211.84.78

ip a
# 25: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
#     link/ether 52:54:00:a4:71:0a brd ff:ff:ff:ff:ff:ff
#     inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
#        valid_lft forever preferred_lft forever
  • 使用交叉编译工具链

# 进入容器之后,推荐直接设置PATH,不再链接原来的PATH,去除不必要的影响,那么先把busybox复制到这里
cd /home/jcleng/desktop/work/docker/common/buildroot-2022.02.5/output/host/bin
wget http://ftp.icm.edu.pl/packages/busybox/binaries/1.21.1/busybox-x86_64
chmod +x busybox-x86_64 && mv busybox-x86_64 busybox

export PATH=/home/jcleng/desktop/work/docker/common/buildroot-2022.02.5/output/host/bin

# 之后就用busybox的命令
busybox ls
# 查看命令
mipsel-linux-gcc --version
# mipsel-linux-gcc.br_real (Buildroot 2022.02.5) 10.4.0
# Copyright (C) 2020 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# 测试文件 h.c
#include <stdio.h>
int main(){
        printf("Hello World!\n");
        return 0;
}

# 容器中编译
mipsel-linux-gcc h.c -o h_mipsel
# 静态编译
mipsel-linux-gcc h.c -o h_mipsel_static -static

# 进入虚拟机
wget http://131.211.84.78:9993/h_mipsel
chmod +x ./h_mipsel
./h_mipsel
# Hello World!
  • 其他编译好的模拟器

https://people.debian.org/~aurel32/qemu/mipsel/
# 说明
https://people.debian.org/~aurel32/qemu/mipsel/README.txt
# 运行 -net nic 才能联网
qemu-system-mipsel -M malta -kernel ./vmlinux-2.6.32-5-4kc-malta -hda ./debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net user -net nic
# 帐户密码都是root

# qemu 仿真 framebuffer,加加参数
-device bochs-display
# 不启动图形
-nographic
#
ls /dev/fb0
  • 可执行文件的查看

nix-shell -p bintools-unwrapped
objdump -x ./demo
# 查看Dynamic Section,静态编译没有Dynamic Section

file ./demo
  • 测试使用

md5sum buildroot-2022.02.5.tar.gz
91256064d91bee4cc6c6a9077c572a8b  buildroot-2022.02.5.tar.gz
  • 非root用户

docker exec -it -u root miniui bash
useradd jcleng
exit

docker exec -it -u $UID:$GID miniui bash
  • 其他直接下载的交叉编译工具链

https://codescape.mips.com/components/toolchain/2018.09-03/downloads.html
du -hd 1 .
# 148K    ./arch
# 2.9M    ./board
# 2.6M    ./boot
# 1.1M    ./configs
# 4.0M    ./docs
# 180K    ./fs
# 76K     ./linux
# 46M     ./package
# 3.4M    ./support
# 96K     ./system
# 676K    ./toolchain
# 284K    ./utils
# 638M    ./dl
# 8.0G    ./output
# 8.7G    .