【Kernel】基于 QEMU 的 Linux 内核编译和安装

目录

本文主要记录个人做存储系统研究时,在 QEMU 环境下编译和安装 Linux 内核的过程

安装虚拟机系统

之前在 利用 RocksDB + ZenFS 测试 ZNS 的环境搭建和使用 给出过借助 VNC 进行图形化安装的步骤,这里再给出仅通过终端进行安装的步骤

bash 复制代码
# 下载 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 启动即可

安装完毕后,后续启动命令可以简化

bash 复制代码
qemu-system-x86_64 -m 8G -smp 4 -enable-kvm -nographic -hda u24s.qcow2

但是此时的启动过程中的 grub menu 不会显示,还需要修改下 grub 配置

bash 复制代码
sudo vim /etc/default/grub

# 修改下面三个配置项
#GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=3
GRUB_TERMINAL=console

sudo update-grub
sudo poweroff

如果想通过 ssh 登陆虚拟机,启动参数可以加一个端口转发

bash 复制代码
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 登陆虚拟机了

bash 复制代码
ssh -p 6666 [user]@localhost

共享目录

为了加速内核编译,可以在物理机器上编译内核,然后将编译好的内核文件借助共享目录传输到虚拟机中

bash 复制代码
# 在物理机器上创建共享目录
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 选项即可

之后在虚拟机中挂载共享目录

bash 复制代码
# 虚拟机中挂载共享目录
sudo mkdir -p /mnt/share
sudo mount -t 9p -o trans=virtio hostshare /mnt/share/ -oversion=9p2000.L

如果报错,很有可能是虚拟机的内核不支持 9p,需要编译内核,是打开以下内核配置选项:

config 复制代码
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)

编译内核

在物理机上准备环境

bash 复制代码
# 编译工具,词法语法分析库
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/

在虚拟机内获取内核配置

bash 复制代码
sudo mount -t 9p -o trans=virtio hostshare /mnt/share/ -oversion=9p2000.L

cd /mnt/share/linux-5.4.xxx
sudo make oldconfig

在物理机上编译内核

bash 复制代码
# 解决 make Error 问题
sudo scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
sudo scripts/config --set-str SYSTEM_REVOCATION_KEYS ""

# 编译内核和模块, -j24 表示使用 24 个线程编译, 可以根据自己的 CPU 核心数和内存大小调整
sudo make -j24

在虚拟机内安装内核

bash 复制代码
# 去除调试信息,解决 initrd.img 过大的问题
sudo make INSTALL_MOD_STRIP=1 modules_install
sudo make install
sudo poweroff

卸载内核

开发过程中可能会有 bug,需要在虚拟机卸载有问题的内核

bash 复制代码
# 删除 /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

参考资料

本文作者: ywang_wnlo
本文链接: https://ywang-wnlo.github.io/posts/5fce01ae/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明

相关推荐
头发还没掉光光9 分钟前
Linux网络之TCP协议
linux·运维·开发语言·网络·网络协议·tcp/ip
尼古拉斯·纯情暖男·天真·阿玮10 分钟前
实验七 防火墙与入侵防护实验
linux·服务器·网络
咕噜咕噜啦啦16 分钟前
Windows安装CVAT
linux·服务器·opencv
负二代0.020 分钟前
Linux的进程管理
linux·运维·服务器
IT 行者21 分钟前
Spring Security 7 之 OIDC /connect/userinfo 端点解析:ID Token 与用户信息获取
linux·服务器·spring
筑梦之路23 分钟前
linux XFS文件系统误删救星——筑梦之路
linux·运维·服务器
燃于AC之乐28 分钟前
【Linux系统编程】进程管理探秘:从硬件架构到僵尸/孤儿进程
linux·操作系统·硬件架构·进程管理·系统编程·冯诺依曼架构·僵尸、孤儿进程
Molesidy30 分钟前
【SOC】【Linux】基于全志F133+Linux内核的嵌入式Linux开发的学习过程记录
linux
重生之绝世牛码32 分钟前
Linux软件安装 —— Flink集群安装(集成Zookeeper、Hadoop高可用)
大数据·linux·运维·hadoop·zookeeper·flink·软件安装
艾莉丝努力练剑35 分钟前
【QT】Qt 从零上手:Hello World、项目文件与实战避坑指南
linux·运维·开发语言·c++·qt·继承·qt5