【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 ...
随机推荐
- 【转载】 四轴PID算法:单环和串级
原文地址: http://m.elecfans.com/article/1122372.html --------------------------------------------------- ...
- 【转载】 Ubuntu下使用VSCode的launch.json及tasks.json编写
版权声明:本文为CSDN博主「子木呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_41687938/a ...
- 使用SSH连接局域网内的WSL Ubuntu
参考: https://zhuanlan.zhihu.com/p/586283483 https://www.cnblogs.com/lidabo/p/16855975.html ========== ...
- 多线程之深入理解park与unpark
1.背景 面试官问,如何暂停一个线程勒..... 说说你对park的理解....... 2.代码 package com.ldp.demo01; import com.common.MyThreadU ...
- vite创建的react项目如何兼容低版本安卓,低版本安卓不支持es6语法
Vite 是一个现代化的前端构建工具,默认情况下,它会生成基于 ES6+ 的代码.这对于大多数现代浏览器来说是没有问题的,但对于一些较旧版本的安卓浏览器可能会遇到兼容性问题. 为了使 Vite 创建的 ...
- Oracle——navicat连接Oracle数据库报错(12514)
2024/07/22 1.问题描述 2.解决办法 3.参考材料 1.问题描述 与其他厂商做数据对接时,对方提供相关视图,我navicat连接Oracle数据库时报错,其报错代码如下: ORA-1251 ...
- Ubuntu 安装 Docker Desktop
介绍 Docker 有两种版本:Docker Desktop 和 Docker Engine (也称作 Docker CE).Docker Desktop 是带图形界面的版本,非常适合需要在桌面环境中 ...
- PlugIR:开源还不用微调,首尔大学提出即插即用的多轮对话图文检索 | ACL 2024
即插即用的PlugIR通过LLM提问者和用户之间的对话逐步改进文本查询以进行图像检索,然后利用LLM将对话转换为检索模型更易理解的格式(一句话).首先,通过重新构造对话形式上下文消除了在现有视觉对话数 ...
- 【YashanDB知识库】收集分区表统计信息采样率小于1导致SQL执行计划走偏
[问题分类]性能优化,BUG [关键字]分区表,统计信息,采样率 [问题描述]收集表(分区表)级别的统计信息时,如果采样率小于1,dba_ind_statistics中partition_name i ...
- elementUI的select下拉框增加checkbox选择框(可全选/取消)
elementUI的select下拉框增加checkbox选择框 一.实现效果 二.实现方法 1.组件代码如下: <div> <el-select ref="select& ...