[笔记] 使用 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.img

Welcome 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-75E228F7F59B

Device      Start    End Sectors Size Type
hd.img1      2048 104447  102400  50M BIOS boot # 注意这里类型为 BIOS boot 类型
hd.img2    104448 204766  100319  49M Linux filesystem

Command (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 inodes

Allocating 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 inodes

Allocating 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.mfbz.cn/a/240754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一些paper工具帮你搞定日常科研工作

如果你是在校生,科研er 你的日常避免各种各样的pepers;找papers,读papers,写papers。这三部曲贯穿这你整个科研工作,如何在有限的时间里,能够高效的完成科研,且保质保量,我们需要一些…

C# WPF上位机开发(内嵌虚拟机的软件开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习过halcon的同学都知道,它不仅有很多的图像算子可以使用,而且调试很方便。每一步骤的调试结果,都可以看到对…

MES系统设备日常点检:提升设备管理效率与维护质量

一、MES系统设备日常点检概述 MES系统设备日常点检是指通过MES系统对设备进行定期的外观、功能、性能等方面的检查,以评估设备的运行状态和潜在问题。这种检查方式有助于及时发现设备故障和隐患,确保设备的正常运行,提高生产效率。 二、MES系…

公益众筹源码系统:水滴筹模式+完整的安装包+部署教程

今天小编i来非大家来介绍一款公益众筹源码系统,带有完整的搭建教程。 一、系统开发 1.需求分析:在开发公益众筹源码系统之前,我们首先进行了深入的需求分析,明确了系统的目标、功能、性能等方面的要求。 2.技术选型:根…

什么是泊松图像混合

泊松图像混合(Poisson Image Editing)的原理基于泊松方程。该方法旨在保持图像中的梯度一致性,从而在图像编辑中实现平滑和无缝的混合。以下是泊松图像混合的基本原理和公式: 泊松方程 泊松方程是一个偏微分方程,通常…

【头歌系统Python实验】经典函数实例

目录 第1关:递归函数 - 汉诺塔的魅力 第2关:lambda 函数 - 匿名函数的使用 第3关:Map-Reduce - 映射与归约的思想 如果对你有帮助的话,不妨点赞收藏评论一下吧,爱你么么哒😘❤️❤️❤️ 第1关&#xff…

Leetcode刷题笔记题解(C++):BM11 链表相加(二)

思路&#xff1a;先对两个链表进行反转&#xff0c;反转求和注意进位运算&#xff0c;求和完成之后再进行反转得到结果 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <cstddef> class Soluti…

使用ffmpeg命令进行视频格式转换

1 ffmpeg介绍 FFmpeg 是一个非常强大和灵活的开源工具集&#xff0c;用于处理音频和视频文件。它提供了一系列的工具和库&#xff0c;可以用于录制、转换、流式传输和播放音频和视频。 FFmpeg 主要特点如下&#xff1a; 格式支持广泛&#xff1a;FFmpeg 支持几乎所有的音频和视…

AQS的应用

文章目录 1. 概述2. ReentrantLock 原理 什么是AQS 口述&#xff1a;全称是 AbstractQueuedSynchronizer&#xff0c;是一个框架&#xff0c;提供了这种 通用的同步器机制&#xff0c;它里面也是定义了很多的方法&#xff0c;像获取锁啊释放锁啊&#xff0c;其实释放啊获取啊是…

输出网络结构图,mmdetection

控制台输入&#xff1a;python tools/train.py /home/yuan3080/桌面/detection_paper_6/mmdetection-master1/mmdetection-master_yanhuo/work_dirs/lad_r50_paa_r101_fpn_coco_1x/lad_r50_a_r101_fpn_coco_1x.py 这个是输出方法里面的&#xff0c;不是原始方法。 如下所示&a…

Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版

1.确定自己的硬件信息&#xff0c;确定电脑有英伟达 (NVIDIA)显卡 在任务栏上右键打开任务管理器 2.下载安装 Anaconda &#xff08;建议安装迅雷下载&#xff0c;同时浏览器添加扩展 “迅雷Chrome支持”&#xff09; https://www.anaconda.com/ https://repo.anaconda.com/arc…

无需重启,修改Linux服务器时区

Linux修改服务器时区&#xff08;无需重启&#xff09; 1、复制命令&#xff1a;2、使用tzselect命令&#xff1a;3、使用date查看是否修改正确 1、复制命令&#xff1a; cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime2、使用tzselect命令&#xff1a; tzselect按照要…

GIT提交规范-范式和示例

关注公众号&#xff1a;”奇叔码技术“ 回复&#xff1a;“java面试题大全”或者“java面试题” 即可领取资料 主题&#xff1a;GIT提交规范 一、GIT提交范式 feat(功绩)&#xff1a; 新增 feature fix: 修复 bug docs: 仅仅修改了文档&#xff0c;比如 README, CHANGELOG, CO…

MISC之LSB

LSB隐写 简介 LSB隐写&#xff08;Least Significant Bit Steganography&#xff09;是一种隐写术&#xff0c;它通过将秘密信息嵌入到图像、音频或视频等多媒体文件中的最低有效位中来隐藏信息。在数字图像中&#xff0c;每个像素由红、绿、蓝三个通道的颜色值组成。每个颜色…

构建自己专属seata-server 镜像(分布式事务)?(第二篇)

码云地址&#xff1a;https://gitee.com/jessyxu/yc-seata-server 一.镜像构建前确保自己的seata-server 能够启动成功&#xff01; seata-server 官方建议&#xff1a;JDK版本不低于 1.8.0_281版本&#xff0c;兼容JDK 8、JDK11,可使用OpenJDK 8/11、Alibaba Dragonwell 8/、…

Java - Spring中Bean的循环依赖问题

什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Spring解决循环依赖的机理 Spring为什么可以解决set s…

MSPM0L1306例程学习-ADC部分(2)

MSPM0L1306例程学习系列 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/ MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 前边讲了3个例程&#xff0c…

企业选CRM系统,这3个关键点你一定不能错过

在充满竞争的商业市场中&#xff0c;企业需要一种强大的工具来管理客户关系&#xff0c;从而提高销售效率。CRM客户关系管理软件就是企业所需要的。然而仅仅是在国内&#xff0c;CRM的供应商就超过了一千家&#xff0c;那么应该怎样选择适合企业的CRM系统&#xff1f; 一、软件…

设计模式——观察者模式(Observer Pattern)

概述 观察者模式是使用频率最高的设计模式之一&#xff0c;它用于建立一种对象与对象之间的依赖关系&#xff0c;一个对象发生改变时将自动通知其他对象&#xff0c;其他对象将相应作出反应。在观察者模式中&#xff0c;发生改变的对象称为观察目标&#xff0c;而被通知的对象称…

Python 自动化之处理docx文件(一)

批量筛选docx文档中关键词 文章目录 批量筛选docx文档中关键词前言一、做成什么样子二、基本架构三、前期输入模块1.引入库2.路径输入3.关键词输入 三、数据处理模块1.基本架构2.如果是docx文档2.1.读取当前文档内容2.2.遍历匹配关键字2.3.触发匹配并记录日志 3.如果目录下还有…
最新文章