使用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 .