当前位置: 首页 > news >正文

QEMU 引导时分离内核和文件系统

文章目录

    • 概要
    • 新建空 IMG
    • 初始化磁盘
    • 挂载磁盘、复制文件系统
    • 启动新的Host
    • 小结

概要

前文 RISCV 虚拟化环境搭建 中我们详细记录了搭建 RISCV 虚拟化环境的流程。

其中,启动 RISCVUbuntu Host 的命令为:

qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel u-boot/u-boot -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -drive file=./ubuntu-22.04-preinstalled-server-riscv64+unmatched.img,format=raw,if=virtio

但当我们需要修改内核,重新编译并升级内核时就很不方便。考虑到虚拟机内部编译非常慢,我们会在外部的 X86_64 主机中交叉编译好然后通过 scp 命令把文件夹共享到虚拟机中,再通过 make install 的方式升级内核。

上述过程当我们要频繁更新内核时很不方便。于是本文中我们会把文件系统单独复制出来到新的 IMG 文件中。QEMU 启动时不再使用 U-BOOT 引导,直接使用 -kernel Image 的形式更方便我们在外部环境随时更新内核而不用对其余部分做任何修改。

新建空 IMG

1:在前文的环境目录下通过以下命令新建一个 IMG 用于复制文件系统。

qemu-img create -f raw new-disk.img 40G

2:在 QEMU 启动 RISCV Host 的命令中加入我们新建的磁盘,引导系统。如下所示:

qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel u-boot/u-boot -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -drive file=./ubuntu-22.04-preinstalled-server-riscv64+unmatched.img,format=raw,if=virtio -device virtio-rng-pci -drive file=./new-disk.img,format=raw,if=virtio

初始化磁盘

1:在启动的 Ubuntu 中输入命令可以看到新的磁盘 /dev/vdb

sudo fdisk -l

2:使用 fdisk 工具为磁盘进行分区。

sudo fdisk /dev/vdb
  • 在 fdisk 的终端中键入命令 n 新建分区。输入 p 来创建主分区(主分区一般为 primary 类型)。随后一路默认。

  • 在 fdisk 的终端中键入命令 p 查看分区表,确认新分区已经创建。如果您看到类似下面的输出,说明您的新分区已经正确创建:

Device     Boot Start      End  Sectors Size Id Type
/dev/vdb1        2048 83886079 83884032  40G 83 Linux
  • 如果一切正确,在 fdisk 的终端中输入 w 来写入分区表并退出 fdisk

3:使用命令 sudo mkfs.ext4 /dev/vdb1 格式化新分区。

挂载磁盘、复制文件系统

1:格式化完成后,您可以挂载新的分区。创建挂载点并将新分区挂载到该目录:

sudo mkdir /mnt/new-disk
sudo mount /dev/vdb1 /mnt/new-disk

2:复制文件系统,排除不必要的文件:

sudo rsync -avx --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*"} / /mnt/new-disk

3:修改 Linux system’s filesystem table 配置文件 fstab,即 sudo vim /mnt/new-disk/etc/fstab 编辑这个文件,修改为以下内容:

/dev/vda        /        ext4   discard,errors=remount-ro       0 1

4:卸载磁盘镜像

sudo umount /mnt/new-disk

启动新的Host

由于新的文件系统已经构建完。我们可以使用新的命令来通过 QEMU 引导 Ubuntu。

qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel ./Image -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -device virtio-rng-pci -drive file=./new-disk.img,format=raw,if=virtio -append "root=/dev/vda1"

这时候,当我们修改内核在外部 X86_64 环境重新交叉编译之后就可以直接拷贝到 QEMU 这边替换掉 Image 文件,直接启动,非常方便。

小结

完结撒花!!!

相关文章:

  • Collectors.toList / list 转 list
  • Netty——BIO、NIO 与 Netty
  • 第十六章:Specialization and Overloading_《C++ Templates》notes
  • ‌App Store美学竞争:如何通过广告素材分析实现ASO弯道超车‌
  • 基于Spring Boot 的在线教育系统(源码+lw+部署文档+讲解),源码可白嫖!
  • PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具
  • SEO长尾关键词精准布局
  • 为什么后端路由需要携带 /api 作为前缀?前端如何设置基础路径 /api?
  • 批量图片压缩工具,高效减小文件大小并保持质量
  • deepSeek-SSE流式推送数据
  • OAuth 2.0认证
  • UE4学习笔记 FPS游戏制作12 添加第二把枪,制作枪的父类,动态生成物体,切换武器
  • 使用外部事件检测接入 CDH 大数据管理平台告警
  • 能不能解释一下 ,什么是React 的错误边界?
  • K8S学习之基础四十三:k8s中部署elasticsearch
  • hexo+butterfly搭建博客网站总结篇
  • 【大模型基础_毛玉仁】3.5 Prompt相关应用
  • 常考计算机操作系统面试习题(三下)
  • Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档
  • OSASIS(One-Shot Structure-Aware Stylized Image Synthesis)
  • 屋顶上的阳光与火光:战争如何改变了加沙的能源格局
  • 戴昕谈隐私、数据、声誉与法律现实主义
  • 钟声:美以芬太尼为借口滥施关税,纯属“内病外治”
  • 哈马斯官员:只要以军持续占领,哈马斯就不会放下武器
  • 阿曼外交大臣:伊美下一轮谈判暂定5月3日举行
  • 青年如何打破“千人一面”,创造属于自己的文化观?