Ubuntu20 QEMU Buildroot

文章目录

    • 测试环境
    • QEMU
    • Linux Kernel
    • Buildroot
    • Run
    • 参考

测试环境

最新的配最新的, 坑才是最少的, 环境如下:

  • Ubuntu 20.04 (focal, 5.11.0-41-generic)
  • QEMU: 6.2.0
  • Linux Kernel: 5.10.90
  • Buildroot: 2021.02.8

构建一个能跑起来的5.10内核的Linux x86_64系统, 主要跑通流程

QEMU

QEMU, 一个通用的开源机器仿真器和虚拟机(A generic and open source machine emulator and virtualizer). 可以在 x86_64 PC上运行为另一台机器(如ARM/RISC/MIPS等)设计的OS, 还有其他用途这里不表.

官网 Download QEMU - QEMU 下载

Ubuntu20 QEMU Buildroot_第1张图片

或者 Tags · qemu/qemu (github.com) 下载

Ubuntu20 QEMU Buildroot_第2张图片

# Ninja, google的一个程序员推出的一个专注于速度的构建系统, 被用于构建Google Chrome,Android,LLVM的一部分
# 由于用CMake作为后端, 也被许多项目使用, 比如这里的QEMU
# 先装Ninja, 可以 sudo apt-get install -y ninja-build 或者源码方式安装
git clone https://github.com/ninja-build/ninja.git
cd ninja
git checkout release
cmake -Bbuild-cmake
cmake --build build-cmake
sudo cp build-cmake/ninja /usr/bin
ninja --version	# 1.10.2

# Qemu, 可以apt安装, 也可以源码方式安装
wget https://download.qemu.org/qemu-6.2.0.tar.xz
tar xvJf qemu-6.2.0.tar.xz
# 可以 mkdir build, 这里就不建了
cd qemu-6.2.0
./configure
make -j $(nproc)
sudo make install
# 可执行文件和依赖文件被拷贝到了/usr/local/bin, /usr/local/share等
# 一些路径不在$PATH里面, 要加到环境变量
echo -e "\nexport PATH=\$PATH:/usr/local/share" >> ~/.bashrc
source ~/.bashrc
# 检查
qemu-i386 --version	# qemu-i386 version 6.2.0

Linux Kernel

直接从 The Linux Kernel Archives 拉长期支持版的5.10:

Ubuntu20 QEMU Buildroot_第3张图片

# https://www.kernel.org/
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.90.tar.xz
tar xvJf linux-5.10.90.tar.xz
cd linux-5.10.90/

# 根据 make menuconfig 和 make 的报错提示安装
# sudo apt install build-essential kernel-package fakeroot libncurses5-dev libssl-dev flex bison libelf-dev
sudo apt install -y flex bison libelf-dev

# default setting is `make x86_64_defconfig`
make menuconfig

# make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
# https://askubuntu.com/questions/1329538/compiling-the-kernel-5-11-11
# https://stackoverflow.com/questions/67670169/compiling-kernel-gives-error-no-rule-to-make-target-debian-certs-debian-uefi-ce
# https://unix.stackexchange.com/questions/293642/attempting-to-compile-kernel-yields-a-certification-error/649484#649484
# cat .config | grep CONFIG_SYSTEM
# 配置项可以通过 make menuconfig 配置, 也可以下面的方式
scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
scripts/config --set-str SYSTEM_REVOCATION_KEYS ""

# BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
# Failed to generate BTF for vmlinux
# Try to disable CONFIG_DEBUG_INFO_BTF
scripts/config --set-val DEBUG_INFO_BTF n

# 压上全部CPU核
make -j $(nproc)
# 最后显示
# Kernel: arch/x86/boot/bzImage is ready  (#2)

# 其实x86_64的内核镜像是指向x86的, 后面就直接用x86/boot/bzImage
# linux-5.10.90/arch/x86_64/boot$ ls -lh
# total 0
# lrwxrwxrwx 1 z z 22 Jan 10 22:36 bzImage -> ../../x86/boot/bzImage

# 如果想替换本机内核参考
# https://blog.csdn.net/weixin_39580042/article/details/110814159
# 主要是:
# 安装内核模块(make modules_install)
# 拷贝内核(arch/x86/boot/bzImage)和配置文件(.config)到/boot, 
# 更新内核update-initramfs
# 更新grub: update-grub

# 这里记得输出内核镜像文件为
# arch/x86/boot/bzImage

Buildroot

可能早早预料到新生代农民工的必备需求, Buildroot 的 logo 是一个安全帽 … emm…

Ubuntu20 QEMU Buildroot_第4张图片

Buildroot是一个简单,高效且易于使用的工具,可以通过交叉编译生成嵌入式Linux系统. 当然x86_64也能用:

  • 处理 交叉编译工具链、根文件系统生成、内核映像编译和引导加载程序编译等
  • 类似内核的 menuconfig、gconfig 和 xconfig 配置接口, 简单易用
  • 支持各种软件包, X.org stack, Gtk3, Qt 5, GStreamer, Webkit, Kodi, 支持大量与网络相关和系统相关的实用程序(如用 apt 安装的, 或者自己手写的)

官网 Buildroot - Making Embedded Linux Easy 拉最新的 long term support release: **2021.02.8**, 或者从 Tags · buildroot/buildroot (github.com)

Ubuntu20 QEMU Buildroot_第5张图片

# 源码下 https://github.com/buildroot/buildroot/tags
# 官网下 https://buildroot.org/download.html
# 压缩包只有6.9MB, 是因为啥东西它都会联网下
wget https://buildroot.org/downloads/buildroot-2021.02.8.tar.gz
tar zxvf buildroot-2021.02.8.tar.gz
cd buildroot-2021.02.8/
make menuconfig

# 配完后可以kconfigdiff查看
# 默认是32位的i386架构, 这里配置成64bit架构x86_64
Target Options -> Target Architecture -> x86_64
# 文件系统配制成ext4
Filesystem images -> ext2/3/4 root file system -> ext4
# 设置rootfs-overlay 
# board/z/rootfs-overlay 
# System configuration -> Root filesystem overlay directories (Set this to your rootfs overlay directory)

# make的时候要联网下东西, 但国外网站都懂的, 总是404
# Connecting to sources.buildroot.net (sources.buildroot.net)|104.26.1.37|:80... connected.
# HTTP request sent, awaiting response... 404 Not Found
# 2022-01-10 22:56:01 ERROR 404: Not Found.

# 切换到国内源
# 原有配置 
# cat .config | grep -E "BR2_KERNEL_MIRROR|BR2_GNU_MIRROR|BR2_LUAROCKS_MIRROR|BR2_CPAN_MIRROR"
# BR2_KERNEL_MIRROR="https://cdn.kernel.org/pub"
# BR2_GNU_MIRROR="http://ftpmirror.gnu.org"
# BR2_LUAROCKS_MIRROR="http://rocks.moonscript.org"
# BR2_CPAN_MIRROR="http://cpan.metacpan.org"
# 因为=总是最后生效的, 所以可以直接追加进去, 再运行一次 make menuconfig 就保存进去了
echo 'BR2_KERNEL_MIRROR="https://mirror.bjtu.edu.cn/kernel/"' >> .config
echo 'BR2_GNU_MIRROR="http://mirrors.nju.edu.cn/gnu/"' >> .config
echo 'BR2_LUAROCKS_MIRROR="https://luarocks.cn"' >> .config
echo 'BR2_CPAN_MIRROR="http://mirrors.nju.edu.cn/CPAN/"' >> .config

make menuconfig

# 配置完成就可以开始 build the root filesystem
make -j $(nproc)

# 输出
# output/images/rootfs.ext4

Run

# 内核位置: linux-5.10.90/arch/x86/boot/bzImage
# 根文件系统位置: buildroot-2021.02.8/output/images/rootfs.ext4

# 如果出现
# qemu: could not load PC BIOS 'bios-256k.bin'
# /usr/local/share/qemu/bios-256k.bin
# 把 /usr/local/share 加到 PATH
# echo -e "\nexport PATH=\$PATH:/usr/local/share" >> ~/.bashrc
# source ~/.bashrc

# 记不住... 可以写到脚本里面
# qemu-system-, 后面跟的是各种支持的cpu架构, 有 arm, mips, riscv, x86_64等
# -kernel, 指定内核镜像(开机后内核是要加载到内存里面的)
# -boot , Boot the first virtual hard drive, 指定启动设备. c硬盘, d光盘 n网络, 硬件也可以自己设置 bootindex 属性来指定引导顺序
# -m 512, 分配512MB内存(Memory, 缺省M, 可指定G)
# -hda, 指定硬盘镜像(这里的根文件系统在这个里面)
# -append, 给出内核命令行参数, 输出重定向到虚拟串行端口ttyS0
# -display none, Do not display video output. 

qemu-system-x86_64 -kernel linux-5.10.90/arch/x86/boot/bzImage \
-boot c -m 512 -hda buildroot-2021.02.8/output/images/rootfs.ext4 \
-append "root=/dev/sda rw console=ttyS0" \
-serial stdio -display none

# 还可能会碰到
# -initrd, 指定INITRD镜像
# -net, 虚拟网卡
# -smp, 指定CPU数量
# -cpu, 指定cpu型号

# 更多参数可参考
# https://wiki.gentoo.org/wiki/QEMU/Options

出现登录提示

Ubuntu20 QEMU Buildroot_第6张图片

默认登录名为root, 不需要密码. 按下Ctrl+C会退出QEMU

Welcome to Buildroot
buildroot login: root

# 可以看到是5.10内核
# uname -a
Linux buildroot 5.10.90 #2 SMP Mon Jan 10 22:31:20 PST 2022 x86_64 GNU/Linux

# CPU信息
# cat /proc/cpuinfo | grep -E 'processor|model name' | awk -F':' '{printf "%s",$NF} NR % 2 == 0 {print ""}'
 0 QEMU Virtual CPU version 2.5+
 
# 内存信息, 命令行中qemu设置的是512MB
# cat /proc/meminfo | grep MemTotal
MemTotal:         486952 kB

# 硬盘信息, 只用了 2.6MB 大小
# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                54.1M      2.6M     47.3M   5% /
devtmpfs                234.1M         0    234.1M   0% /dev
tmpfs                   237.8M         0    237.8M   0% /dev/shm
tmpfs                   237.8M     48.0K    237.7M   0% /tmp
tmpfs                   237.8M     16.0K    237.8M   0% /run

可以配置Ctrl+C不退出

# https://unix.stackexchange.com/questions/167165/how-to-pass-ctrl-c-to-the-guest-when-running-qemu-with-nographic
# change the interrupt key from ^c to ctrl-]
stty intr ^]
# 然后qemu里面就可以用 ctrl-c, 用ctrl-]可以返回shell
# shell改回ctrl-c
stty intr ^c

参考

  • How to set up a minimal Linux kernel dev environment on Ubuntu 20.04 - offlinemark
  • https://boozlachu.medium.com/
  • Linux 内核模块作弊 (cirosantilli.com)
  • 5 Minute Device-Tree “Hello, World!” Linux Kernel Driver (centennialsoftwaresolutions.com)
  • 在Ubuntu中安装Qemu模拟ARM架构 - 知乎 (zhihu.com)
  • 记第一次编译Linux内核_andy dennis的博客-CSDN博客
  • linux内核编译_Linux内核(5.8.10)编译学习!_weixin_39580042的博客-CSDN博客
  • 给buildroot添加自己的软件包,自动安装到rootfs - 连任 - 博客园 (cnblogs.com)
  • buildroot国内源 国内镜像(20210322通过 - 连任 - 博客园 (cnblogs.com)
  • qemu 参数简介 - 艾阳君 - 博客园 (cnblogs.com)

欢迎扫描二维码关注微信公众号, 及时获取最新文章:
在这里插入图片描述

你可能感兴趣的:(嵌入式Linux,linux,qemu,buildroot,kernel,ubuntu)