[笔记] wsl2 下使用 qemu/grub 模拟系统启动(多分区)

首先创建一块虚拟硬盘:

dd bs=512 count=204800 if=/dev/zero of=hd.img

然后使用 losetup -f 将其关联为本地回环设备

losetup -f hd.img
# 关联 hd.img 到空闲回环设备上
losetup -a
/dev/loop0: [2080]:409 (/root/code/demo05/hd.img)
# 查看刚刚关联到了哪里,这里关联到了 /dev/loop0 回环设备文件上

使用系统工具 fdisk 为虚拟硬盘创建分区系统,这里选择使用 GPT 分区系统,并创建了两块分区.

这里需要注意不要配置为 MBR 分区系统,会导致系统无法启动,grub-install 目前没找到如何设置支持 MBR 分区系统.

> fdisk hd.img
ghimi-surface# fdisk hd.imgWelcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x7b76f30f.Command (m for help): g # 创建分区系统为 gpt 格式
Created a new GPT disklabel (GUID: AC9ECA30-457D-1742-B3B7-75E228F7F59B).Command (m for help): n # 新建分区
Partition number (1-128, default 1): # 分区号
First sector (2048-204766, default 2048): # 起始扇区
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-204766, default 204766): +50M
# 结束扇区
Created a new partition 1 of type 'Linux filesystem' and of size 50 MiB.Command (m for help): n # 新建分区
Partition number (2-128, default 2): # 分区号
First sector (104448-204766, default 104448): # 起始扇区
Last sector, +/-sectors or +/-size{K,M,G,T,P} (104448-204766, default 204766):
# 结束扇区
Created a new partition 2 of type 'Linux filesystem' and of size 49 MiB.Command (m for help): t # 修改分区类型
Partition number (1,2, default 2): 1 
Partition type or alias (type L to list all): 4 # 设置分区类型为 BIOS boot 类型Changed type of partition 'Linux filesystem' to 'BIOS boot'.Command (m for help): p # 打印当前分区结果
Disk hd.img: 100 MiB, 104857600 bytes, 204800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AC9ECA30-457D-1742-B3B7-75E228F7F59BDevice      Start    End Sectors Size Type
hd.img1      2048 104447  102400  50M BIOS boot # 注意这里类型为 BIOS boot 类型
hd.img2    104448 204766  100319  49M Linux filesystemCommand (m for help): w # 同步分区结果到虚拟硬盘文件中
The partition table has been altered.

在创建完成后通过 kpartx -av 识别分区信息:

kpartx -av /dev/loop0
add map loop0p1 (252:0): 0 32768 linear 7:0 2048
add map loop0p2 (252:1): 0 67584 linear 7:0 34816
# -a 添加映射到系统设备文件中
# -v 详细打印映射结果

然后在 /dev/mapper 目录下可以看到刚刚识别的分区信息

ls -l /dev/mapper/loop*
brw------- 1 root root 252, 0 Dec 11 22:56 /dev/mapper/loop0p1
brw------- 1 root root 252, 1 Dec 11 22:56 /dev/mapper/loop0p2
# 或者通过 kpartx 查看
> kpartx -l /dev/loop0
loop0p1 : 0 102400 /dev/loop0 2048
loop0p2 : 0 100319 /dev/loop0 104448

现在我们可以为这两个分区进行格式化.

> mkfs.ext4 /dev/mapper/loop0p1
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 8448 4k blocks and 8448 inodesAllocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

第二个分区一般为系统分区,这里格式化为 ext4 类型:

> mkfs.ext4 /dev/mapper/loop0p2
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 8448 4k blocks and 8448 inodesAllocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

接下来挂在启动分区 /dev/mapper/loop0p1 ,为其安装 grub:

> mkdir hdisk && mount /dev/mapper/loop0p1 hdisk

为其安装 grub:

> grub-install --boot-directory=./hdisk/boot --no-floppy --force /dev/loop0
# --boot-directory 指定启动目录,未来内核存放的位置
# --no-floppy 不设置软盘
# --force 发生警告不停止安装
# /dev/loop0 注意这里指定的是磁盘而不是分区
# grub-install --boot-directory=hdisk/boot --no-floppy /dev/loop0
Installing for i386-pc platform.
Installation finished. No error reported.

接下来就可以通过 qemu 启动这块虚拟硬盘了:

qemu-system-x86_64 -drive file=hd.img,media=disk,format=raw,index=0
# drive 指定设备
# file=hd.img 指定虚拟磁盘文件
# media=disk 指定设备类型为硬盘
# format=raw 指定虚拟磁盘格式为 raw 格式,其他还有 vhdi,vdx,qcow2等格式
# index=0 指定设备索引号(总线中的识别顺序)为0

操作回滚

umount hdisk
# 移除子分区关联映射
> kpartx -dv /dev/loop0
del devmap : loop0p1
del devmap : loop0p2
# 移除回环设备关联映射
losetup -D

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

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

相关文章

Github与Gitlab

学习目标 能够使用GitHub创建远程仓库并使用能够安装部署GitLab服务器能够使用GitLab创建仓库并使用掌握CI/CD的概念掌握蓝绿部署, 滚动更新,灰度发布的概念 GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私…

使用Go实现一个百行聊天服务器

前段时间, redis作者不是整了个c语言版本的聊天服务器嘛, 地址, 代码量拢共不过百行. 于是, 心血来潮下, 我也整了个Go语言版本. 简单来说就是实现了一个聊天室的功能. 将所有注释空行都去掉, 刚好100行实现. 废话不多说, 先上代码: package mainimport ("fmt"&quo…

SoC中跨时钟域的信号同步设计(单比特同步设计)

一、 亚稳态 在数字电路中,触发器是一种很常用的器件。对于任意一个触发器,都由其参数库文件规定了能正常使用的“建立时间”(Setup time)和“保持时间”(Hold time )两个参数。“建立时间”是指在时钟…

【MySQL学习之基础篇】多表查询

文章目录 1. 多表关系1.1. 一对多1.2. 多对多1.3. 一对一 2. 多表查询概述2.1. 数据准备2.2. 概述 3. 查询的分类3.1. 内连接查询3.2. 外连接查询3.3. 自连接3.3.1. 自连接查询3.3.2. 联合查询 3.4. 子查询3.4.1. 概述3.4.2. 标量子查询3.4.3. 列子查询3.4.4. 行子查询3.4.5. 表…

python+requests+pytest 接口自动化实现

最近工作之余拿公司的项目写了一个接口测试框架,功能还不是很完善,算是抛砖引玉了,欢迎各位来吐槽。 主要思路: ①对 requests 进行二次封装,做到定制化效果 ②使用 excel 存放接口请求数据,作为数据驱动 ③…

LeetCode(60)K 个一组翻转链表【链表】【困难】

目录 1.题目2.答案3.提交结果截图 链接: K 个一组翻转链表 1.题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xf…

Modbus转Profinet网关使用方法

Modbus转Profinet网关(XD-MDPN100/200)是用于将Modbus协议和Profinet协议进行转换并进行通迅的设备。Modbus转Profinet网关(XD-MDPN100/200)无论是新项目还是改造项目都可轻松配置完成通迅互联。 正确的安装和配置对于确保设备的正…

低代码核心能力详解:简化应用开发的新思路

低代码平台作为一种快速地应用开发解决方法,为中小企业实现数字化转型提供了机会。但是,对于一些刚开始触碰低代码平台的企业来说,了解其核心能力是很重要的。本文将详细分析低代码平台的核心能力,并在挑选低代码平台以前为中小企…

云原生之深入解析OOM和CPU节流

一、前言 使用 Kubernetes 时,内存不足 (OOM) 错误和 CPU 节流是云应用程序中资源处理的主要难题,这是为什么呢?云应用程序中的 CPU 和内存要求变得越来越重要,因为它们与云成本直接相关。通过 limits 和 requests ,可…

航带模式拍完之后用重建大师跑出来的模型是弧形的,怎么处理?

答:空三设置-更多设置-定位方式中选择pos高精度,再跑一下看看。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型&a…

k8s-Pod

1、Pod 简介: (1) 概念: Pod 是 Kubernetes 中创建和管理的,最小的可部署的计算单元。Pod中存储了一组(一个或多个)容器,以及怎样运行这些容器的声明,这些容器共享存储、网络和环境&#xff0…

早上好,我的leetcode 【hash】(第二期)

写在前面:坚持才是最难的事情 C代码还是不方便写,改用python了,TAT 文章目录 1.两数之和49. 字母异位词分组128.最长连续序列 1.两数之和 你好,梦开始的地方~ https://leetcode.cn/problems/two-sum/description/?envTypestudy…

《打造第二大脑》—如何构建高效的笔记系统

最近看了一本书,因为我也用Obsidian来记笔记,(Obsidian之前有介绍过Obsidian使用教程(如何构建你的个人知识库,第二大脑))看完这本书后发现里面给的方法跟Obsidian很契合,所以就整理…

STM32单片机输出频率及占空比可调的PWM波

一、测试用环境 STM32F103C8T6&#xff0c;HAL库。 只考虑PWM的频率和占空比两个参数&#xff0c;死区、极性、对齐方式等不做讨论。 二、STM32Cube MX配置 1.PWM原理 上图中&#xff0c;定时器向上计数&#xff0c;当CNT<CCRx时&#xff0c;输出0&#xff0c;当CNT>C…

linux下的strerror和perror处理错误函数

strerror和perror是C语言中用于处理错误信息的函数。 strerror函数&#xff1a; strerror函数用于将错误码转换为对应的错误消息字符串。它接受一个整数参数&#xff0c;通常是由系统调用或库函数返回的错误码&#xff0c;然后返回一个描述该错误的字符串。 函数原型&#xff1…

PrimDiffusion:3D 人类生成的体积基元扩散模型NeurIPS 2023

NeurIPS2023 &#xff0c;这是一种用于 3D 人体生成的体积基元扩散模型&#xff0c;可通过离体拓扑实现明确的姿势、视图和形状控制。 PrimDiffusion 对一组紧凑地代表 3D 人体的基元执行扩散和去噪过程。这种生成建模可以实现明确的姿势、视图和形状控制&#xff0c;并能够在…

化学方程式小程序

brief introduction 相信大家上中学时都会被化学方程式折腾得死去活来&#xff0c;尤其是配平&#xff0c;怎么也算不对数字。于是我写出了这款近200行的自动配平程序&#xff0c;这是不是你们黑暗化学中的一丝光亮呢&#xff1f; usage 正常化学式输入&#xff0c;每一种物…

卷积的计算 - numpy的实现 2

卷积的计算 - numpy的实现 2 flyfish PyTorch计算 用于验证结果 import torchconv torch.nn.Conv2d(in_channels1, out_channels1, kernel_size2, stride1)# 定义一个卷积核 W torch.arange(1, 5).view(-1, 1, 2, 2).float()# 创建一个二维图像数据&#xff08;4x4 像素&a…

Ray RLlib User Guides:模型,处理器和动作分布

Ray RLlib用户手册地址 默认模型配置设置 在下面的段落中&#xff0c;我们将首先描述RLlib自动构建模型的默认行为&#xff08;如果您没有设置自定义模型&#xff09;&#xff0c;然后深入了解如何通过更改这些设置或编写自己的模型类来自定义模型。 默认情况下&#xff0c;…

D33|动态规划!启程!

1.动态规划五部曲&#xff1a; 1&#xff09;确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2&#xff09;确定递推公式 3&#xff09;dp数组如何初始化 4&#xff09;确定遍历顺序 5&#xff09;举例推导dp数组 2.动态规划应该如何debug 找问题的最好方式就是把…