【Kernel】基于 QEMU 的 Linux 内核编译和安装
本文主要记录个人做存储系统研究时,在 QEMU 环境下编译和安装 Linux 内核的过程
安装虚拟机系统
之前在 利用 RocksDB + ZenFS 测试 ZNS 的环境搭建和使用 给出过借助 VNC 进行图形化安装的步骤,这里再给出仅通过终端进行安装的步骤
# 下载 Ubuntu 镜像
wget https://releases.ubuntu.com/24.04.1/ubuntu-24.04.1-live-server-amd64.iso
# 制作磁盘镜像,大小随意
qemu-img create -f qcow2 u24s.qcow2 80G
# ubuntu 镜像挂在 cdrom 上启动
# -enable-kvm 用于开启 KVM 虚拟化
# -boot once=d 用于只从 cdrom 启动一次
# -nographic 用于关闭图形界面
qemu-system-x86_64 -m 8G -smp 4 -enable-kvm -nographic -hda u24s.qcow2 \
-cdrom ubuntu-24.04.1-live-server-amd64.iso -boot once=d
然后在 grub menu 按 e
进入编辑模式
然后在 vmlinuz 那一行新增 console=ttyS0
,之后 ctrl+x
启动即可
安装完毕后,后续启动命令可以简化
qemu-system-x86_64 -m 8G -smp 4 -enable-kvm -nographic -hda u24s.qcow2
但是此时的启动过程中的 grub menu 不会显示,还需要修改下 grub 配置
sudo vim /etc/default/grub
# 修改下面三个配置项
#GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=3
GRUB_TERMINAL=console
sudo update-grub
sudo poweroff
如果想通过 ssh 登陆虚拟机,启动参数可以加一个端口转发
qemu-system-x86_64 -m 8G -smp 4 -enable-kvm -nographic -hda u24s.qcow2 \
-net nic,model=virtio -net user,hostfwd=tcp::6666-:22
之后就可以在物理机器上通过 ssh 登陆虚拟机了
ssh -p 6666 [user]@localhost
共享目录
为了加速内核编译,可以在物理机器上编译内核,然后将编译好的内核文件借助共享目录传输到虚拟机中
# 在物理机器上创建共享目录
mkdir -p xxx/share
# 启动虚拟机时挂载共享目录
qemu-system-x86_64 -m 8G -smp 4 -enable-kvm -nographic -hda u24s.qcow2 \
-fsdev local,path=xxx/share,id=share_dir,security_model=none \
-device virtio-9p-pci,fsdev=share_dir,mount_tag=hostshare \
-net nic,model=virtio -net user,hostfwd=tcp::6666-:22
如果报错,很有可能是 qemu
不支持 9p
,需要从源码编译 qemu
,在 configure
时加上 --enable-virtfs
选项即可
之后在虚拟机中挂载共享目录
# 虚拟机中挂载共享目录
sudo mkdir -p /mnt/share
sudo mount -t 9p -o trans=virtio hostshare /mnt/share/ -oversion=9p2000.L
如果报错,很有可能是虚拟机的内核不支持 9p
,需要编译内核,是打开以下内核配置选项:
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_NET_9P_DEBUG=y (Optional)
CONFIG_9P_FS=y
CONFIG_9P_FS_POSIX_ACL=y
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_PCI_HOST_GENERIC=y (only needed for the QEMU Arm 'virt' board)
编译内核
在物理机上准备环境
# 编译工具,词法语法分析库
sudo apt install build-essential bison flex
# 如果编译时缺少 openssl 的相关头文件,需要安装相关库
sudo apt install libssl-dev
# 利用 make menuconfig 图形界面配置编译选项需要安装 ncurses 环境:
sudo apt install libncurses5-dev
# 下载 kernel 源码,解压
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.xxx.tar.xz
tar xvf linux-5.4.xxx.tar.xz
mv linux-5.4.xxx xxx/share/
在虚拟机内获取内核配置
sudo mount -t 9p -o trans=virtio hostshare /mnt/share/ -oversion=9p2000.L
cd /mnt/share/linux-5.4.xxx
sudo make oldconfig
在物理机上编译内核
# 解决 make Error 问题
sudo scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
sudo scripts/config --set-str SYSTEM_REVOCATION_KEYS ""
# 编译内核和模块, -j24 表示使用 24 个线程编译, 可以根据自己的 CPU 核心数和内存大小调整
sudo make -j24
在虚拟机内安装内核
# 去除调试信息,解决 initrd.img 过大的问题
sudo make INSTALL_MOD_STRIP=1 modules_install
sudo make install
sudo poweroff
卸载内核
开发过程中可能会有 bug,需要在虚拟机卸载有问题的内核
# 删除 /lib/modules/ 目录下以内核的版本号为名称的目录
sudo rm -rf /lib/modules/5.4.xxx+/
# (可选)删除 /usr/src/linux/ 目录下不需要的内核源码
# sudo rm -rf /usr/src/linux-headers-5.4.xxx
# 删除 /boot 目录下启动的内核和内核映像文件
sudo rm /boot/*5.4.xxx*
# 更改 grub 的配置文件,删除不需要的内核启动列表
sudo update-grub2
参考资料
- 【QEMU】Invocation
- 【QEMU】Invocation
- 【ask ubuntu】No rule to make target 'debian/canonical-certs.pem'
- 【CSDN】qemu 中使用 9p virtio, 支持 host 和 guest 中共享目录
- 【CSDN】解决 Linux 编译内核模块 (initrd.img) 过大的问题
本文作者: ywang_wnlo
本文链接: https://ywang-wnlo.github.io/posts/5fce01ae/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明
【Kernel】基于 QEMU 的 Linux 内核编译和安装的更多相关文章
- Linux内核编译、安装流程
原文链接:https://blog.csdn.net/qq_28437139/article/details/83692907 此处只讲linux内核编译步骤至于安装虚拟机,安装ubuntu操作系统请 ...
- Linux内核编译与安装
2013-04-16 Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.L ...
- 运行在TQ2440开发板上以及X86平台上的linux内核编译
一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...
- 使用QEMU调试Linux内核代码
http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...
- Linux内核编译完整过程
Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过 ...
- linux内核编译环境配置
linux内核编译环境配置 如果不是编译内核,只需要安装与内核相匹配的kernel-devel开发包即可.即是/lib/modules/`uname -r`/build -> /usr/src/ ...
- Lab1:Linux内核编译及添加系统调用(详细版)
实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...
- Linux内核编译配置脚本
环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL Linux内核编译配置脚本 在linux开发过程中熟练使用脚本可以大大简化命令行操作,同时对于需要经常重复操作的指令也是一种备忘 ...
- Linux 内核 编译模块
背景: 由于调试内核或者由于分区大小限制,有时候内核组件不一定完全需要编进内核中. 所以,在开发中经常将内核组件编译成为模块,等到在恰当的时机加载. 概览: Linux内核模块的编译方法有两种: 1. ...
- Linux 下编译、安装、配置 QT
转自Linux 下编译.安装.配置 QT 注意:编译安装耗时费力,且很容易出错,要不断调整编译参数,不推荐使用,否则这将会是一个纠结痛苦的过程. 打算做嵌入式图像处理,计划方案嵌入式Linux+Ope ...
随机推荐
- ImageNet数据集下载
ImageNet数据集是Vision领域最重要的数据集之一,十分经典也十分常用,但是该数据集体量较大,而且由于在外网下载速度较慢,其中最为重要的一点是该数据集只提供给高校科研工作者,这也就意味着你必须 ...
- 乌克兰学者的学术图谱case3
============================================ 背景: 弗兰采维奇材料问题研究是欧洲最大的材料科研院所,在核电.航空.航天.军工及其他装备制造领域的先进材料研 ...
- [SDOI2010] 城市规划 题解
前言 题目链接:洛谷. 题意简述 树套环上求至少间隔两个位置的最大独立集. (树套环,即树上每个结点都是一个结点或环) 题目分析 将题目拆解成树上 DP 和环上 DP 即可.用 tarjan 缩点就行 ...
- Linux环境变量,知识点汇总
一.什么是环境变量? 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数. 环境变量本质就是一张表,保存在内存当中. 该表在用户登录系统的时候 ...
- posix是什么都不知道,还好意思说你懂Linux?
Linux开发者越来越多,但是仍然有很多人整不明白POSIX是什么.本文就带着大家来了解一下到底什么是POSIX,了解他的历史和重要性. 一.什么是posix? 1. 概念 POSIX:可移植操作系统 ...
- AvaloniaChat—从源码构建指南
AvaloniaChat介绍 一个使用大型语言模型进行翻译的简单应用. 我自己的主要使用场景 在看英文文献的过程中,比较喜欢对照着翻译看,因此希望一边是英文一边是中文,虽然某些软件已经自带了翻译功能, ...
- 源码解析之为何要用ConcurrentHashMap
为什么要用ConcurrentHashMap? ConcurrentHashMap是JUC包下的一个线程安全的HashMap类,我们都知道多线程的场景下要用ConcurrentHashMap来代替Ha ...
- 低版本安卓home assistant网页浏览器
试了很久 一直有问题的一点 , 使用普通浏览器加载不出来登录界面 只能加载出icon 然后就没反应了 考虑到了webview的问题 但是没想到安卓5.0之前是固定且不可升级的webview 从 And ...
- Semantic Kernel/C#:一种通用的Function Calling方法,文末附经测试可用的大模型
Funcion Calling介绍 函数调用允许您将模型如gpt-4o与外部工具和系统连接起来.这对于许多事情都很有用,比如为AI助手赋能,或者在你的应用程序与模型之间建立深度集成. 如果您了解或者使 ...
- Atziluth's Last Contest. 001题解
被dalaoYHH爆虐 问题 H:mcd 题目描述 给出两个长为 \(n\) 的数列 \({a_n},{b_n}\),保证 \(a_i\le b_i(i=1,2,\cdots,n)\). 现在您需要对 ...