【Kenel】基于 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

按 e 进入编辑模式

然后在 grub menu 按 e 进入编辑模式

新增 console=ttyS0

然后在 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=consolesudo 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=yCONFIG_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.Lcd /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 许可协议。转载请注明

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

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

相关文章

利用Pix4D和ArcGIS计算植被盖度

除了水文分析和沟道形态分析之外,在实际工作中还要计算植被盖度! 植被盖度,也称为植被覆盖率或植物覆盖度,是指某一地表面积上植物冠层垂直投影面积占该地表面积的比例。它通常以百分比的形式表示,是描述地表植被状况的…

mapbox没有token/token失效,地图闪烁后变空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.

目录 mapbox没有token/token失效,地图闪烁后空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS. 一、问题描述 二、mapbox去除token验证 1、找到mapbox-gl文件夹 2、找到mapbox-gl.js文件 3、找到对应位置并修改 4、清…

uploads-labs靶场刷题记录

Pass-01 尝试上传一句话木马 1.php: <?php eval($_POST[cmd]);?>发现设置了白名单且抓包没有记录&#xff0c;说明在前端进行的拦截&#xff08;可以禁用前端的JS从而绕过拦截&#xff0c;达到直接上传木马的目的&#xff09;。 将一句话木马文件加上.jpg后缀1.php.jp…

nodejs 实现docker 精简可视化控制

地址 https://github.com/xiaobaidadada/filecat 说明 使用react 和nodejs 实现的非常轻量的服务docker管理。

ArchLinux VSCode 1.94.2无法安装or更新解决办法

此方法参考了这篇博客https://www.debugpoint.com/failed-connect-raw-githubusercontent-com-port-443/#google_vignette 某一次paru后&#xff0c;一直报错503什么的&#xff0c;在archlinux官网看到pacman安装的是个Open VSX版本的&#xff0c;是Arch官方的版本&#xff0c;…

Centos7搭建minio对象存储服务器

Centos7搭建minio对象存储服务器 安装二进制程序配置服务文件 安装二进制程序 参考&#xff1a;https://segmentfault.com/q/1010000042181876 minio中国版&#xff1a;https://www.minio.org.cn/download.shtml#/linux # 下载二进制程序 wget https://dl.min.io/server/min…

从MySQL到OceanBase离线数据迁移的实践

本文作者&#xff1a;玉璁&#xff0c;OceanBase 生态产品技术专家。工作十余年&#xff0c;一直在基础架构与中间件领域从事研发工作。现负责OceanBase离线导数产品工具的研发工作&#xff0c;致力于为 OceanBase 建设一套完善的生态工具体系。 背景介绍 在互联网与云数据库技…

R实验——logistic回归、LDA、QDAKNN

数据集介绍&#xff1a; mpg&#xff0c;miles per gallon即油耗&#xff0c;这个数据集来自卡内基梅隆大学维护的StatLib库。1983年美国统计协会博览会使用了该数据集。这个数据集是对StatLib库中提供的数据集稍加修改的版本。根据Ross Quinlan(1993)在预测属性“mpg”中的使…

【Linux报错】为什么“userdel 某用户”,这个用户还存在于家目录中?

你删除一个用户&#xff0c;却在 /home/ 家目录下还看到该用户家目录文件&#xff0c;是因为&#xff1a; 使用 userdel 命令来删除一个用户&#xff1a;默认情况下&#xff0c;该用户的主目录&#xff08;通常位于/home/username&#xff09;不会被自动删除。这是因为userdel有…

超硬核!大模型算法岗面试必问100题,我说的,不信就来看看

大模型算法岗常见面试题100道 *一、基础篇* 1、目前主流的开源模型体系有哪些&#xff1f; Transformer体系&#xff1a;由Google提出的Transformer 模型及其变体&#xff0c;如BERT、GPT 等。PyTorch Lightning&#xff1a;一个基于PyTorch的轻量级深度学习框架&#xff0c;…

如何将 Docker 镜像的 tar 文件迁移到另一台服务器并运行容器

实验室项目共建人&#xff1a;周凌飞、武正乔、杨霄汉 特别鸣谢&#xff1a;bilibili 博主 老韩一米九、一堂 杨国帅 提供设备部署以及上线指导 本博客部分内容由kimi生成&#xff0c;鸣谢&#xff1a;吴润生 迭代生成式AI提示词思考模型 在 Docker 容器化的世界里&#xf…

开源限流组件分析(三):golang-time/rate

文章目录 本系列前言提供获取令牌的API数据结构基础方法tokensFromDurationdurationFromTokensadvance 获取令牌方法reverseN其他系列API 令人费解的CancelAt是bug吗 取消后无法唤醒其他请求 本系列 开源限流组件分析&#xff08;一&#xff09;&#xff1a;juju/ratelimit开源…

Java之继承抽象类用法实例(三十一)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

git命令笔记(速查速查)

git命令功能总结 1.创建git的本地仓库2. 配置本地仓库(name和email地址)3. 工作区、版本库、暂存区、对象区3.1 add, commit3.2 打印提交日志3.2 修改文件 4.版本回退&#xff08;git reset&#xff09;5. 撤销修改&#xff08;在push之前撤销&#xff09;6.删除版本库中的文件…

SSM框架学习(七、MyBatis-Plus高级用法:最优化持久层开发)

目录 一、MyBatis-Plus快速入门 1.简介 2.快速入门 二、MyBatis-Plus核心功能 1.基于Mapper接口CRUD &#xff08;1&#xff09;Insert 方法 &#xff08;2&#xff09;Delete方法 &#xff08;3&#xff09;Update 方法 &#xff08;4&#xff09;Select方法 2.基于Serv…

Chrome DevTools 三: Performance 性能面板扩展—— 性能优化

Performance 性能 &#xff08;一&#xff09;性能指标 首次内容绘制 (First Contentful Paint&#xff0c;FCP)&#xff1a; 任意内容在页面上完成渲染的时间 最大内容绘制 (Largest Contentful Paint&#xff0c;LCP)&#xff1a; 最大内容在页面上完成渲染的时间 第一字节…

283.移动零

目录 题目解法解释&#xff1a; .reverse()怎么用的&#xff1f;Char 13: error: no matching function for call to reverse 什么是双指针&#xff1f;双指针的常见类型&#xff1a;总结&#xff1a; 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末…

88.【C语言】文件操作(5)

目录 文件的随机读写 1.fseek函数 代码示例 运行结果 2.ftell函数 代码示例 运行结果 3.rewind函数 代码示例 运行结果 承接79.【C语言】文件操作(4)文章 文件的随机读写 1.fseek函数 声明:int fseek ( FILE * stream, long int offset, int origin ); 格式:fsee…

APM 3.0.0|二次元味很冲的B站音乐软件

APM是一款专为B站音频设计的第三方播放器&#xff0c;支持从B站获取音频内容&#xff0c;提供桌面小组件&#xff0c;多语言支持&#xff0c;以及针对Android系统的优化。下载安装APK后打开应用&#xff0c;登录B站账号&#xff0c;浏览并播放音频内容。 大小&#xff1a;73M …

13分+文章利用scRNA-Seq揭示地铁细颗粒物引起肺部炎症的分子机制

写在前面 人们乘坐地铁时&#xff0c;不可避免地在地铁站台上吸入细颗粒物&#xff08;PM2.5&#xff09;&#xff0c;但PM2.5对人体又有哪些危害呢&#xff0c;今天和大家分享一篇文章&#xff0c;题目为“单细胞转录组学揭示吸入地铁细颗粒物引起的肺部炎症”&#xff0c;作…