当前位置: 首页 > article >正文

QEMU构建基于ubuntu的根文件系统

一、背景

前文已经介绍了利用busybox构建一个简易的qemu调试环境:无人知晓:qemu搭建arm64 linux kernel环境

但是busybox的功能比较少,难以满足我们的调试和实验需求,在商用产品上也很少使用;本文将介绍如何在qemu下构建一个ubuntu的rootfs(基于arm64平台)。

二、ubuntu 基础包下载

下载对应版本的base版本:

Index of /ubuntu-base/releases

命令行下载ubuntu基础包
wget http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-arm64.tar.gz

三、基于ubuntu基础包构建根文件系统

1、创建img,并将ubuntu-base解压到img

#创建img,4G大小
dd if=/dev/zero of=ubuntu.img bs=1M count=4096 
#将img格式化为ext4格式
mkfs.ext4 ubuntu.img

#将ubuntu-base包解压到img中
mkdir -p rootfs
sudo mount -t ext4 ubuntu.img rootfs/
sudo tar -xzf ubuntu-base-22.04-base-arm64.tar.gz -C rootfs/

#利用qemu-aarch64-static 运行ubuntu_arm64下指令来在X86上完成ubuntu-base-22.04-base-arm64
sudo apt-get install qemu-user-static

2、切换更新ubuntu-base包的基础环境

#chroot 到rootfs目录,后续你用qemu-user-static更新arm64 依赖软件
sudo ./chroot_mount.sh rootfs/ mount

依赖的chroot_mount.sh 脚本

#!/bin/bash

if [ -z "${1}" ]; then
    echo "Usage: $0 CHROOT_DIR [BRANCH_NAME|umount]"
    exit 1
fi

chrootdir="${1}"
branchname="${2:-}"

if [ ! -d "${chrootdir}" ]; then
    echo "Not dir ${chrootdir}"
    exit 1
fi

if [ "$(df -T "${chrootdir}" | tail -n1 | awk '{print $2}')" = "sffs" ]; then
    echo "Should not use sffs"
    exit 1
fi

function mountfs()
{
    mountpoint -q "${chrootdir}/dev" || mount --bind /dev "${chrootdir}/dev"
    mountpoint -q "${chrootdir}/dev/pts" || mount -t devpts pts "${chrootdir}/dev/pts"
    mountpoint -q "${chrootdir}/proc" || mount -t proc proc "${chrootdir}/proc"
    mountpoint -q "${chrootdir}/sys" || mount -t sysfs sys "${chrootdir}/sys"
}

function umountfs()
{
    mountpoint -q "${chrootdir}/dev/pts" && umount "${chrootdir}/dev/pts"
    mountpoint -q "${chrootdir}/dev" && umount "${chrootdir}/dev"
    mountpoint -q "${chrootdir}/proc" && umount "${chrootdir}/proc"
    mountpoint -q "${chrootdir}/sys" && umount "${chrootdir}/sys"
}

function chroot_run()
{
    env -i - LC_ALL=C.UTF-8 LANG=en_US.UTF-8 LANGUAGE=en_US: LROOT=/root TERM=${TERM} USER=root TZ=Asia/Shanghai HOME=/root _=/usr/bin/env /usr/sbin/chroot "${chrootdir}" "$@"
}

if [ "${branchname}" = "umount" ]; then
    umountfs
    exit 0
fi

if [ ! -s "${chrootdir}/etc/hosts" ]; then
    cat >"${chrootdir}/etc/hosts" << EOF
127.0.0.1       localhost
EOF
fi

if [ ! -s "${chrootdir}/etc/resolv.conf" ]; then
    cat >"${chrootdir}/etc/resolv.conf" << EOF
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF
fi

mountfs

echo "Enter chroot dir ${chrootdir}"
chroot_run bash -c "cd /root; exec bash --login -i"

3、安装必要的软件,添加用户和密码

apt update
apt install udev vim net-tools ssh ethtool ifupdown rsyslog bash-completion nfs-common telnetd sudo inetutils-ping

添加用户和密码,这里添加了一个geek用户名:

#add geek user, and to sudo group
useradd -s '/bin/bash' -m -G adm,sudo geek
passwd geek
#设置geek用户密码
passwd root
#设置root用户密码

4、卸载img

sudo ./chroot_mount.sh rootfs/ umount
sudo umount rootfs

5、配置网络user mode

qemu增加网络配置cmdline:

-netdev user,id=eth0,hostfwd=tcp::5022-:22,hostfwd=tcp::5080-:80 -device virtio-net-device,netdev=eth0 \

将22,80 端口分别转发到Host PC的5022口和5080口

这里可能会遇到的报错处理:

qemu-system-aarch64: -netdev user,id=eth0,xxxxxx network backend 'user' is not compiled into this binary
原因是自己构建的qemu版本: 默认是没有 "slirp" 模块的
sudo apt-get install libslirp-dev
qemu编译前,
./configure --enable-slirp --target-list=aarch64-softmmu

6、qemu启动命令

/home/geek/workspace/linux/qemu_src/qemu/build/qemu-system-aarch64 \
    -machine virt,virtualization=true,gic-version=3 \
    -nographic \
    -m size=2048M \
    -cpu cortex-a72 \
    -smp 8 \ 
    -kernel Image \
    -netdev user,id=eth0,hostfwd=tcp::5022-:22,hostfwd=tcp::5080-:80 -device virtio-net-device,netdev=eth0 \
    -drive format=raw,file=ubuntu.img \
    -append "noinitrd root=/dev/vda rw nokaslr console=ttyAMA0 loglevel=8 " \
    -s

7、ubuntu网络配置

此时登录到ubuntu还有网络连接问题,需要在ubuntu的/etc/network/interfaces中配置(直接编辑文件添加):

auto eth0
iface eth0 inet dhcp

8、其他

ssh 登录:

ssh -p 5022 geek@127.0.0.1
或者
ifconfig查看qemu启动ip地址
ssh -p 5022 geek@192.168.0.106

scp拷贝:

scp -P 5022  geek@127.0.0.1:/home/geek/workspace/test/* ./

三、小结

本文只是一篇操作记录文档,网络上的资源质量又乘次不齐,本文做了些整理和修正,希望能帮到有需要的伙伴。

2024年也即将结束,这篇流水账用来弥补之前定下的2024年更新20篇文档计划,也算完成了我年初设定的OKR/DPO了。

参考:

Documentation/Networking - QEMU

使用Qemu运行Ubuntu文件系统(1) - dolinux - 博客园

Rockchip RK3399 - 移植ubuntu 20.04.4根文件系统

12. Ubuntu 根文件系统构建 - [野火]嵌入式Linux镜像构建与部署--基于LubanCat-RK系列板卡 文档

从Buildroot系统移植到Ubuntu

qemu虚拟机配置网络_qemu虚拟机网络配置-CSDN博客

QEMU用户模式网络详解:配置与使用-CSDN博客

ubuntu22.04 x86环境上使用QEMU搭建arm虚拟机

基于Qemu LMT虚拟平台的bringup

qemu v7.2 network backend ‘user‘ is not compiled into this binary 问题_network backend 'user' is not compiled into this b-CSDN博客


http://www.kler.cn/a/582128.html

相关文章:

  • vue知识点(2)
  • Docker基础入门
  • 从0到1搭建前端项目
  • ROS实践(四)机器人建图及导航
  • C++ 布尔类型(bool)深度解析
  • Nginx快速安装-Linux-CentOS7
  • Docker介绍和安装
  • Three.js 进阶(灯光阴影关系和设置、平行光、阴影相机)
  • 如何将ipynb文件转换为pdf文件
  • 能否调整爬虫以支持多页商品列表?
  • 【制作PPT的AI工具】
  • http 服务器概念详细介绍
  • C++学习笔记(十六)——函数重载
  • 【每日学点HarmonyOS Next知识】重叠顺序、对话框位置、事件总线、PageMap显示、多表多item类型
  • 51单片机之蓝牙模块的使用
  • C#变量与变量作用域详解
  • 有哪些好用的AI视频加工创作网站
  • GStreamer —— 2.16、Windows下Qt加载GStreamer库后运行 - “播放教程 2:字幕管理“(附:完整源码)
  • Redis 持久化详解:RDB 与 AOF 的机制、配置与最佳实践
  • Rust规律归纳随笔