ubuntu22.04搭建qemu环境测试内核

news2024/11/15 13:27:51

ubuntu22.04搭建qemu环境测试内核

  • 安装qemu
  • 创建qemu目录
  • 编译内核
  • 编译文件系统
  • 启动qemu

安装qemu

sudo apt-get install qemu

krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace$ dpkg -l | grep qemu
ii  ipxe-qemu                                  1.21.1+git-20220113.fbbdc3926-0ubuntu1  all          PXE boot firmware - ROM images for qemu
ii  ipxe-qemu-256k-compat-efi-roms             1.0.0+git-20150424.a25a16d-0ubuntu4     all          PXE boot firmware - Compat EFI ROM images for qemu
ii  libvirt-daemon-driver-qemu                 8.0.0-1ubuntu7.3                        amd64        Virtualization daemon QEMU connection driver
ii  qemu                                       1:6.2+dfsg-2ubuntu6.6                   amd64        fast processor emulator, dummy package
ii  qemu-block-extra                           1:6.2+dfsg-2ubuntu6.5                   amd64        extra block backend modules for qemu-system and qemu-utils
ii  qemu-system-common                         1:6.2+dfsg-2ubuntu6.5                   amd64        QEMU full system emulation binaries (common files)
ii  qemu-system-data                           1:6.2+dfsg-2ubuntu6.5                   all          QEMU full system emulation (data files)
ii  qemu-system-gui                            1:6.2+dfsg-2ubuntu6.5                   amd64        QEMU full system emulation binaries (user interface and audio support)
ii  qemu-system-x86                            1:6.2+dfsg-2ubuntu6.5                   amd64        QEMU full system emulation binaries (x86)
ii  qemu-utils                                 1:6.2+dfsg-2ubuntu6.5                   amd64        QEMU utilities
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace$

创建qemu目录

运行qemu需要编译内核和busybox的源码,最好单独建立一个目录专门作为qemu运行环境目录

krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$//本文使用的是这个目录,此目录下将会存放内核源码以及busybox源码和生成的文件系统等

编译内核

  1. 下载linux源码包linux-4.19.90.tar.gz(下载链接:kernel.org),并解压到qemu-environment目录:tar -xvf linux-4.19.90.tar.gz
  2. 配置内核.config文件:
    (1) 先用默认配置文件创建.config文件
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/linux-4.19.90$ make defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  YACC    scripts/kconfig/zconf.tab.c
  LEX     scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
*** Default configuration is based on 'x86_64_defconfig'
#
# configuration written to .config
#
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/linux-4.19.90$ make menuconfig

(2)配置ram选项,在device drivers->block devices下,选中ram block device support,并改大default ram disk size到128MB(64MB一般也够用了)
在这里插入图片描述

  1. 编译内核
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/linux-4.19.90$ make -j16
  ... ...
  OBJCOPY arch/x86/boot/setup.bin
  BUILD   arch/x86/boot/bzImage
Setup is 15772 bytes (padded to 15872 bytes).
System is 8153 kB
CRC 328649af
Kernel: arch/x86/boot/bzImage is ready  (#1)
  1. 可能遇到的编译错误:
    (1)objtool: missing symbol table
arch/x86/entry/thunk_64.o: warning: objtool: missing symbol table
make[2]: *** [scripts/Makefile.build:403:arch/x86/entry/thunk_64.o] 错误 1

解决方法:按照对应的补丁进行修改后重新编译,https://www.spinics.net/lists/kernel/msg3797871.html

(2) multiple definition

ld: arch/x86/boot/compressed/pgtable_64.o:(.bss+0x0): multiple definition of `__force_order'; arch/x86/boot/compressed/kaslr_64.o:(.bss+0x0): first defined here
ld: arch/x86/boot/compressed/head_64.o: warning: relocation in read-only section `.head.text'
ld: warning: creating DT_TEXTREL in a PIE
make[2]: *** [arch/x86/boot/compressed/Makefile:116:arch/x86/boot/compressed/vmlinux] 错误 1
make[1]: *** [arch/x86/boot/Makefile:112:arch/x86/boot/compressed/vmlinux] 错误 2
make: *** [arch/x86/Makefile:292:bzImage] 错误 2

解决方法:将arch/x86/boot/compressed/pgtable_64.c文件里__force_order定义注释掉

编译文件系统

  1. 下载busybox:https://busybox.net/

  2. 解压busybox-1.35.0.tar.bz2到目录

  3. busybox目录里make menuconfig:
    (1) 在settings下配置成静态编译
    在这里插入图片描述(2) 在settings下配置busybox安装目录,高版本busybox默认配置了生成目录在_install里
    在这里插入图片描述可以改成自己想要的目录,这里选择让busybox在上一级目录里新建一个文件夹qemu_sample安装进去
    在这里插入图片描述

  4. 编译busybox,并安装

krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/busybox-1.35.0$ make -j16
  SPLIT   include/autoconf.h -> include/config/*
  GEN     include/bbconfigopts.h
  GEN     include/common_bufsiz.h
  GEN     include/embedded_scripts.h
  HOSTCC  applets/usage
  HOSTCC  applets/applet_tables
  ... ...
   AR      libbb/lib.a
  LINK    busybox_unstripped
Static linking against glibc, can't use --gc-sections
Trying libraries: crypt m resolv rt
 Library crypt is not needed, excluding it
 Library m is needed, can't exclude it (yet)
 Library resolv is needed, can't exclude it (yet)
 Library rt is not needed, excluding it
 Library m is needed, can't exclude it (yet)
 Library resolv is needed, can't exclude it (yet)
Final link with: m resolv
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/busybox-1.35.0$ make install
  1. 安装成功后,查看下qemu-environment目录:
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/busybox-1.35.0$ ls ../
busybox-1.35.0  linux-4.19.90  qemu-sample
  1. 在生成的文件系统内创建必要的目录和文件:
    (1) 创建目录
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ ls
bin  linuxrc  sbin  usr
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ mkdir dev etc lib mnt proc sys tmp var
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ ls
bin  dev  etc  lib  linuxrc  mnt  proc  sbin  sys  tmp  usr  var
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ mkdir -p etc/init.d
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$

(2) 创建文件

krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ touch etc/init.d/rcS
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ vim etc/init.d/rcS 
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ chmod 777 etc/init.d/rcS
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ cat etc/init.d/rcS
echo "Welcome to linux..."
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ touch etc/passwd
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ vim etc/passwd 
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ chmod 777 etc/passwd 
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ cat etc/passwd 
root::0:0:root:/:/bin/sh
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ touch etc/inittab
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ vim etc/inittab 
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ chmod 777 etc/inittab 
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ cat etc/inittab 
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ touch etc/fstab
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ vim etc/fstab 
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ chmod 777 etc/fstab 
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ cat etc/fstab 
proc    /proc   proc    defaults        0       0
tmpfs   /tmp    tmpfs   defaults        0       0
sysfs   /sys    sysfs   defaults        0       0
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample$ cd dev
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample/dev$ sudo mknod console c 5 1
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample/dev$ sudo mknod null c 1 3
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment/qemu-sample/dev$  sudo mknod tty1 c 4 1
  1. 创建raw ext4 image文件,用/dev/zero初始化(/dev/zero这个设备文件提供无限个’\0’字符,可用于初始化一些文件)。dd指令表示输入文件是/dev/zero,输出文件是./rootfs.ext4,输入输出的块大小均是1M Byte,拷贝32个1M块。也可以创建更大的image文件,只要小于前面编译内核时设置的ramdisk大小128MB就行。
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ dd if=/dev/zero of=./rootfs.ext4 bs=1M count=32
记录了32+0 的读入
记录了32+0 的写出
33554432字节(34 MB,32 MiB)已复制,0.0484468 s,693 MB/s
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ mkfs.ext4 rootfs.ext4
mke2fs 1.46.5 (30-Dec-2021)
丢弃设备块: 完成                            
创建含有 8192 个块(每块 4k)和 8192 个 inode 的文件系统

正在分配组表: 完成                            
正在写入 inode表: 完成                            
创建日志(1024 个块): 完成
写入超级块和文件系统账户统计信息: 已完成

  1. 创建一个目录,将image文件挂载到这个目录从而便于操作,往image文件里拷贝前面制作的根文件系统
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ mkdir fs
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ sudo mount -o loop rootfs.ext4 ./fs
rokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ sudo cp -rf ./qemu-sample/* ./fs
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ sudo umount ./fs
  1. 压缩image文件成img.gz格式
krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ gzip --best -c rootfs.ext4 > rootfs.img.gz

启动qemu

krokodil@krokodil-SY-ZL-H110N-D3V:~/workspace/qemu-environment$ qemu-system-x86_64 -kernel linux-4.19.90/arch/x86/boot/bzImage -initrd ./rootfs.img.gz

ps:
如果是在arm64架构上,则略有不同。
make -j16后不会生成bzImage文件(因为arch/arm64/Makefile与arch/x86/Makefile不同),但是会有arch/arm64/boot/Image文件,也可以启动。
启动qemu指令略不同:

qemu-system-aarch64 -kernel linux-4.19.90/arch/arm64/boot/Image -initrd rootfs.img.gz -machine virt -cpu cortex-a57 -machine type=virt -nographic

qemu通过-drive启动:

dd if=/dev/zero of=/home/krokodil/workspace/qemu-environment/share.img bs=1M count=350
mkfs.ext4 /home/krokodil/workspace/qemu-environment/share.img
mount -o loop /home/krokodil/workspace/qemu-environment/share.img /home/krokodil/workspace/qemu-environment/fs
sudo cp -r /home/krokodil/workspace/qemu-environment/qemu-sample/* /home/krokodil/workspace/qemu-environment/fs/
cd /home/krokodil/workspace/qemu-environment/linux-4.19.90
sudo make CONFIG_PREFIX=/home/krokodil/workspace/qemu-environment/fs install
cd /home/krokodil/workspace/qemu-environment/
qemu-system-x86_64 -kernel linux-4.19.90/arch/x86/boot/bzImage -drive file=./share.img -append "init=/linuxrc root=/dev/sda"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言GD包基于栅格图像实现地理探测器与连续参数的自动离散化

本文介绍基于R语言中的GD包,依据栅格影像数据,实现自变量最优离散化方法选取与执行,并进行地理探测器(Geodetector)操作的方法。 首先,在R语言中进行地理探测器操作,可通过geodetector包、GD包等…

Qt扫盲-QSS概述

QSS概述一、概述二、详细一、概述 QSS 其实是Qt样式表,Qt样式表是Qt界面的一种强大的机制,除了通过继承QStyle已经可以实现的功能外,它还允许您自定义窗口组件的外观。Qt样式表的概念、术语和语法很大程度上受到HTML层叠样式表(CSS)的启发。…

作为网络工程师,你知道什么是VLAN 跳跃攻击吗?

您听说过 VLAN 跳跃吗?这是黑客用来访问他们无权进入的网络的一种技术。在本文中,我们将探讨什么是 VLAN 跳跃、它的工作原理以及恶意行为者如何利用它。我们还将了解可用于执行 VLAN 跳跃的工具以及企业如何保护自己免受这些攻击。 一、什么是VLAN&…

商业智能BI工具评估指南

随着行业软件业务功能的不断完善,同行业软件日趋趋同,竞争更加白热化。同时,随着企业数字化转型的深入,企业自身对数据的使用需求越来越强烈。在用户的业务处理过程中,在业务软件内直接给用户提供数据分析结果具有更高…

认识python和python基础知识点

目前python版本分为python2和python3,主流都是使用Python3,因为python2到2020年开源社区就不在维护了,目前公司开发使用也基本都是python3.下面的演示基于python3 Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于P…

基于Java springboot 疫情在线网课管理系统

🍅 作者主页 超级帅帅吴 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 文章目录一、前言介绍1.1 背景及意义1.2 系统运行环境二、系统设计2.1系统架构设计2.2角色功能图2.3登录时序图设计三、…

文件系统的认识

文件系统磁盘磁盘的物理结构磁盘的存储结构磁盘的逻辑抽象结构对磁盘组进行管理创建和删除文件时,os做了什么?创建一个文件时,os做了什么?删除一个文件,os做了什么?制作软硬链接软连接和硬链接区别制作静、…

Vue 使用过程中的问题总结(npm Nodejs Vue Vue-cli)

目录 关系图示 vue和webpack 的关系 Node.js npm package.json 有什么作用? Vue2 和 Vue3的区别 Vue-cli的版本区别 Vue在VsCode中的常见配置 Vuter Live server Prettier vscode vue 自动格式化 Vue.js devtools 常见报错 Vue 报错error:0308010C:di…

数学建模学习笔记-算法(线性规划模型)-下(例题运用)

目录 1.线性规划的基本公式 例题: ​编辑​编辑 1.符号 2.基本假设 3.模型的分析与建立 那么可以得出目标函数是 约束条件是 一.固定风险水平,优化收益 二.固定盈利水平,极小化风险 三.设置一个投资偏好系数S 语法解析 代码 输出结…

CET6 历年真题原词复现 核心词汇 做题技巧 听力拿分技巧汇总(这篇文章是英语四六级考试最后的版本,谢谢大家一路陪伴)

话不多说直接进入 这次是最后一次 也是最用心的一次关于CET6的整理,CET4很简单,我认为没有必要去整理或者帮助各位同学,cet4只是cet6的前置任务罢了,但要是你说你考完cet4就收手了,不考了,不考6级了。我只…

(十一) Docker network

Docker network一、概述1.1、简介1.2、常用基本命令1.2、作用二、网络模式2.1、四种模式介绍2.2、容器实例内默认网络IP生产规则三、模式说明1、bridge2、host3、none4、container5、自定义网络1、概念2、没有自定义网络时3、自定义网络4、Link5、自定义bridge网络与默认bridge…

寒假每日一题W2D1——选数异或

题目描述 给定一个长度为 n 的数列 A1,A2,⋅⋅⋅,An 和一个非负整数 x,给定 m 次查询,每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x。 输入输出格式及数据范围 输入输出样例 思路 ①对于两个数的异或值为x,可以化简为&…

RHCE第二天之chrony服务部署详解

文章目录一、chrony服务器介绍二、安装与配置三、chrony服务部署四、chronyc 的常见命令五、chronyc sources 输出结果解析一、chrony服务器介绍 ①Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP&…

谈谈如何在简历筛选中尽可能 “存活下来“, 如何在面试过程中 “游刃有余“

本文只是个人学习总结出来的技巧, 仅供参考 如果有不认同的地方, 也不必太较真, 因人而异 目录 1. 为什么要做简历 1.2 好简历与差简历的区别 2. 如何做一份好的简历 2.1 知己知彼 2.2 构思内容 2.3 模板的选择 2.4 填充内容 2.5 不断的更新迭代 2.6 其他注意事项 3…

Wondershare Recovery - 万兴数据恢复专家,恢复你 Mac 上的重要文件

Wondershare Recovery - 万兴数据恢复专家,恢复你 Mac 上的重要文件 Wondershare Recoverit 是恢复被删除文件最有效的软件之一。计算机用户面临的一个主要问题是失去机密信息。我们可能是误删除了数据和文件,或者可能是由于病毒袭击、操作系统故障或硬盘…

LaoCat带你认识容器与镜像(二【二章】)

系列二章二小节,发现概念性的知识看得人并不多,csdn的一篇解决问题的博文,却涨粉近400,有点意思~ 本章内容 操作Docker容器 本文实操全部基于Ubuntu 20.04 同样,容器也是Docker重要的核心成员之一,Docker容…

如何与沃尔格林Walgreens建立EDI连接?

沃尔格林Walgreens从1901年芝加哥一个家庭作坊式的小店开始,经历了百年沧桑,如今已经拥有4000多家连锁药店,在自己100多年的发展历史中年年赢利,创造了连续100多年的赢利神话。 与沃尔格林Walgreens建立合作,一个重要环…

C++:函数指针进阶(三):Lambda函数详解(二)

一:Lambda表达式概述 Lambda表达式是现代C在C11和更高版本中的一个新语法糖,在C11,C14,C17和C20中Lambda表达的内容还在不断更新。Lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义…

记自己开发的淘宝客优惠券

目录 1.首页 1.1详情 1.2口令 1.3分类 1.4搜索 1.5个人中心 2.API开发教程 2.1什么是淘宝客 组成模式 2.2API申请 2.3SDK下载 2.3后台管理 闲暇时间浏览网站时,看到有关淘宝优惠券推广的文章,就想着能不能自己也做一个微信小程序。 但是&…

论文投稿指南——中文核心期刊推荐(化学 2)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…