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

windows无盘启动技术开发之使用本地镜像文件启动电脑

                                             by fanxiushu 2023-07-26 转载或引用请注明原始作者。
其实使用本地镜像文件启动电脑,这个windows操作系统本身就是自带的功能。

win7以上的系统,制作 vhd或vhdx格式的镜像文件,
然后在镜像文件中安装windows操作系统,然后放到真实硬盘的某个分区的某个目录中。
然后在真实的操作系统中修改BCD配置文件,把BCD配置成从刚才安装了操作系统的vhd或vhdx镜像文件启动,
这样电脑下次启动的时候,就自然从vhd或vhdx的镜像文件中启动了。

自从win7开始,创造了 vhd或vhdx格式的镜像文件以来,就有了这样的功能。
只不过我一直没用过,不知道能用来干嘛。
不过也确实挺新奇的,
你想啊,本来按照正常的思路,应该是老老实实的在真实硬盘分区中安装操作系统,
然后从真实硬盘分区中启动电脑,
现在变成了:可以从真实硬盘中的某个镜像文件(vhd或vhdx格式文件)中启动电脑。

本文并不打算介绍windows自带的这种功能,
而是从windows无盘启动技术出发,开发我们自己的从本地镜像文件启动windows操作系统的功能。
这个应该是我在阐述 UEFI引导程序开发的第2篇文章末尾提到过这么一个类似的功能:
windows无盘启动技术开发之UEFI(新一代BIOS)引导程序开发之二_uefi驱动开发_雨中风华的博客-CSDN博客

从无盘启动技术出发,开发自己的从本地镜像文件启动windows操作系统。
可以让我们从原理上深入理解windows上面的从vhdx这样的镜像文件启动系统的骚操作。
同时从原理上掌握,让我们有了更多的自主权,
比如镜像文件格式可以自己定义,(我一般都是使用原始镜像文件格式,因为这样简单而且高效)
比如把各类不同操作系统集成到一起来,
比如把linux和windows的镜像文件都放到NTFS分区的硬盘中,
当然这需要linux和windows中都开发类似的功能,工作量也不少。
而且牵涉到linux使用不同的文件系统,还得在linux内核中开发对应的NTFS文件系统。

当然,如果全程都是自己开发的网络方式的无盘启动,这个事情就变得轻松了些,
甚至可以把从从本地镜像文件启动这个功能,加入到网络无盘启动中去,作为一个小小的附加子功能。
我就是这么做的,在实现了网络方式的无盘启动之后,
也许是好玩,也许是验证这种技术可行性,当然目前好像也没发现这玩意有啥用处。

反正不管怎么说,先让我们来看看下面的演示视频,这个是我加入了本地镜像启动的无盘启动。

diskless-boot



视频的前半部分,是展示从网络方式的无盘启动过程。
视频的后半部分,展示的是从本地镜像文件启动的过程。
本地镜像启动稍微快些,因为毕竟是读写本地镜像文件,比网络传输快些。

现在,我们来看看本地镜像启动的具体实现过程。
其实正如我在在阐述 UEFI引导程序开发的第2篇文章末尾所提到的。
如果你对整个无盘启动技术熟悉,那么对从本地镜像文件启动的理解,也不会有什么难度。

本文主要讲述的是在UEFI启动环境下的本地镜像文件启动。
其实传统的BIOS也可以实现的,但是在传统BIOS下实现起来过于繁琐。
主要是我不是太熟练传统BIOS环境下16位程序的详细开发过程。
(CSDN阐述 Legacy BIOS引导程序开发,那个代码基本做于多年前,
当时也是花了想当多的精力到处查资料,恶补16环境下的程序开发,
随着传统BIOS渐渐退出历史舞台,对16位程序的开发只会越来越陌生。)
比如第一个难题就是如何在传统BIOS环境下,实现 NTFS文件系统。
虽然可以查很早以前关于DOS的实现,
或者比如WINXP泄露的代码,找到16位环境的NTFS实现,但是我想肯定得花相当多的精力。
再比如Legacy BIOS中,有部分实现代码必须是放到固定扇区的,
实现NTFS文件系统的代码也必须放到固定扇区中,就像 windows中的ntldr,bootmgr等这些引导程序一样。
Legacy BIOS不像  UEFI,
UEFI全程使用文件系统方式,你不用关心引导文件究竟该放到磁盘哪些扇区位置。
所以最终也只好放弃,只实现 UEFI 环境下的本地镜像文件启动。

自己实现本地镜像文件的启动,其实跟网络方式的无盘启动类似,
基本也需要实现两个核心部分:
1, UEFI环境下的引导程序,具体需要实现哪些功能,下面会讲述。
2,windows环境中的虚拟磁盘驱动。

对于第一部分,UEFI环境下的引导程序。
这个引导程序不限于放到本地磁盘的ESP分区的 EFI\Boot\bootx64.efi 中,
就如上面视频演示的那样,
这个UEFI引导程序也可以通过网络方式加载,比如PXE引导方式加载。
反正只要让他在UEFI环境中能正常运行起来就行。
这就是与传统BIOS的引导程序差别巨大的地方,可以说是十分方便。
当然,既然是本地镜像文件启动,放到本地硬盘的ESP启动分区的 EFI\Boot\bootx64.efi  更合理些。

这个UEFI环境下的引导程序开发,也没有多少好讲述的,
因为在CSDN前面阐述 UEFI引导程序开发的两篇文章中,已经阐述了关于UEFI引导程序的开发。
都是需要在 UEFI 引导程序中实现 BlockIO接口的虚拟磁盘驱动,
然后使用 LoadImage和StartImage等函数,从这个虚拟磁盘驱动中找到 EFI\Boot\bootx64.efi 引导程序,
然后加载它,之后就完事了,接着就是windows自己的事情。
与网络引导方式的唯一不同的就是这个 BlockIO虚拟磁盘驱动的数据来源。
网络引导方式的虚拟磁盘驱动,当然是从网络传输过来,所以必须实现 SNP(UNDI)或者UDP接口网络通信。
而现在这个数据来源是来自本地磁盘上的某个镜像文件,
因此,现在我就必须得正确读写本地磁盘上的这个镜像文件。

假如我们的本地硬盘格式化为NTFS文件系统,镜像文件放到某个NTFS分区上。
那我们就必须在UEFI引导程序中实现NTFS文件系统的访问。
同样的,如果本地磁盘格式是其他的。比如ext3、ext4等linux下的文件系统,
我们也必须在UEFI的引导程序中实现对这些文件系统的访问。

我这里采用的是 ntfs-3g 这个开源的 NTFS文件系统,
https://github.com/tuxera/ntfs-3g
这个代码里底层实现中,
读写具体扇区的接口函数,只实现了 windows和unix下,没有实现 UEFI。
但是我们可以仿照源码中windows和unix读写扇区的接口函数,实现UEFI中的扇区读写接口。
也可以不用麻烦自己实现,因为github上,有人已经实现了 UEFI环境下的 NTFS对应接口。
当然,大部分都是以UEFI单独驱动方式实现。
我们这里是直接集成到自己的 UEFI引导程序中,没必要再安装一个单独的 DXE驱动。
因此得做些修改。

在我们的UEFI引导程序中,通过 BS的LocateHandleBuffer 函数遍历所有 BlockIO设备,
然后尝试使用 NTFS-3G 去挂载BlockIO,能挂载成功,说明是 NTFS分区。
就这样,把所有是NTFS系统的分区都挂载上。
然后,我们就可以通过手动输入具体的某个镜像文件名,
或者遍历NTFS分区的某些目录,找到感兴趣的镜像文件。
然后以这个镜像文件作为我们新建立的BlockIO虚拟磁盘驱动的数据源。

至此,本地镜像启动的UEFI引导程序基本完成。
当然,为了让windows下的我们的虚拟磁盘驱动,
能接着访问UEFI引导程序使用的镜像文件,
我们还得通过共享内存的手段,把UEFI访问的镜像文件名等参数,传递给 windows下的虚拟磁盘驱动。
这个功能就像 iSCSI磁盘下所谓的 iBFT 一样。当然,原理一样,传递的参数等各方面都不同。

然后,接下来,就是windows平台下的虚拟磁盘驱动开发了。
这个也没必要细说,因为我在CSDN上介绍了许多这方面的知识。
你可以使用 windows的StorPort框架,也可以自己全套实现类似StorPort框架的虚拟磁盘驱动。

接着就是找到UEFI引导程序共享内存中的关于哪个镜像文件名等相关参数。
然后打开这个镜像文件,创建基于这个镜像文件的虚拟磁盘作为接下来的windows系统磁盘。

当然,上面的过程看似简单,但是,可能也并不是那么美好。
因为毕竟是在  Boot-Start 阶段,是非常早的启动阶段。
这个阶段,我们要访问真实硬盘中的镜像文件,
前提是对应的真实硬盘驱动必须启动起来,
这就又回到了前一篇文章阐述的无盘网络引导,网卡驱动的问题了。
但是情况稍好的是,大部分硬盘驱动,都是windows自己带的,
不像网卡驱动,种类繁多,非常难搞。
硬盘驱动种类不多,而且基本都是windows自己集成了对应驱动。
而且即便是第三方的磁盘控制器驱动,对应的厂商也会想方设法的跟windows联系,
把他们的磁盘控制器驱动集成到windows内核包中,否则真就没办法使用他们的硬盘启动系统了。
因此大部分磁盘,都能在boot-start阶段,找到对应的驱动能启动起来。

自然,如果遇到某些其他情况,磁盘控制器驱动是第三方的,而且并没有集成到windows的内核包中,
我们也得像上篇文章介绍的那样,手动在镜像文件中添加对应的硬盘控制器驱动。

以上说的是镜像文件放到 NTFS文件系统中的情况,
在NTFS文件系统中,windows端的虚拟磁盘驱动就省事多了,因为NTFS文件系统是现成的。

如果现在换一下,比如是linux系统下常用的 ext4 文件系统。又该如何办呢?
UEFI引导程序没啥好说的,都一样的工作量,无非是把 NTFS-3G换成了ext4,ext4开源代码肯定更多。
至于windows端,工作量就提升上来了。
主要就是对ext4文件系统的集成。
我们可以单独实现一个 boot-start 阶段运行的ext4文件系统驱动,
让它像windows中的ntfs文件系统驱动那样工作,能自动被识别,自动被挂载。
这样,我们在虚拟磁盘驱动中,依然可以简单使用 ZwCreateFile 函数打开ext4文件系统下的镜像文件。

当然,我们也可以把ext4开源代码直接集成到自己的虚拟磁盘驱动中来,
这省去了单独开发windows下的ext4文件系统驱动的麻烦,尤其是跟windows内核接口融合部分。
但是却增加了虚拟磁盘驱动的开发负担。
具体采用哪种办法,可以根据情况自己来定。

相关文章:

windows无盘启动技术开发之使用本地镜像文件启动电脑

by fanxiushu 2023-07-26 转载或引用请注明原始作者。 其实使用本地镜像文件启动电脑,这个windows操作系统本身就是自带的功能。 win7以上的系统,制作 vhd或vhdx格式的镜像文件, 然后在镜像文件中安装windows操作系统,然后放到真实…...

PoseiSwap 即将开启质押,利好刺激下 POSE通证短时涨超 30%

随着 Nautilus Chain 主网的上线,预示着 Web3 世界迎来全新的模块化、Layer3 时代,为 Web3 世界与 Web2 世界的深入融合构建基础。而 PoseiSwap 作为 Nautilus Chain 上的首个 DEX,也成为了加密行业首个以模块化为基础构建的 DEX。 基于 Naut…...

Linux文本编辑器-vim

目录 前言 Vim三种模式 打开方式 命令模式 插入模式 可视模式 保存和退出 前言 Vim是一个功能丰富且强大的文本编辑器,被广泛用于Linux系统。它是Vi的增强版本,提供了更多的功能和改进,同时可以通过插件扩展其功能; Vim三…...

vscode使用g++编译.c文件或.cpp文件

vscode是一个跨平台、轻量级、插件非常丰厚的IDE,这里介绍在vscode里使用g来编译.cpp文件。g也叫GCC, 在Window中,是使用MinGW方式实现g的,它分为32位和64位2个版本,其中,MinGW-64是64位的,MinGW-32是32位的…...

云计算的服务模式包括哪些|PetaExpress云服务商

云计算(cloud computing)它是一种分布式计算,是指通过网络“云”将巨大的数据计算处理程序分解成无数的小程序,然后通过由多个服务器组成的系统进行处理和分析,得到结果并返回给用户。云计算作为一种基于互联网的新型超…...

iOS--通知、代理、单例模式总结

通知 概要 观察者和被观察者都无需知晓对方,只需要通过标记在NSNotificationCenter中找到监听该通知所对应的类,从而调用该类的方法。并且在NSNotificationCenter中,观察者可以只订阅某一特定的通知,并对齐做出相应操作&#xf…...

选择最佳安全文件传输方法的重要性

在数字化时代,文件的传输是商务、教育、科研、医学等领域不可或缺的工作流程。为了保障数据安全,选择最佳安全文件传输方法非常关键。在本文中,我们将探讨选择最佳安全文件传输方法的重要性。 第一、最佳安全文件传输方法可以保证文件内容不被…...

IBM LSF 集群虚拟化和工作负载管理解决方案

IBM LSF 集群虚拟化和工作负载管理解决方案 全面综合的工作负载管理解决方案,不仅能够简化 HPC,还能大幅改善用户和管理员体验、可靠性和性能 用途 IBM Spectrum LSF Suites 组合通过为任务关键型 HPC 环境提供集成解决方案,重新定义集群虚…...

C++(14):重载运算与类型转换

当运算符被用于类类型的对象时,允许我们为其指定新的含义;同时,也能自定义类类型之间的转换规则。和内置类型的转换一样,类类型转换隐式地将一种类型的对象转换成另一种我们所需类型的对象。 当运算符作用于类类型的运算对象时&a…...

【深度学习】基于图形的机器学习:概述

一、说明 图神经网络(GNN)在数据科学和机器学习中越来越受到关注,但在专家圈之外仍然知之甚少。为了掌握这种令人兴奋的方法,我们必须从更广泛的图形机器学习(GML)领域开始。许多在线资源谈论GNN和GML&…...

内存泄漏是什么?有什么危害

内存泄漏是什么?有什么危害 1. 前言1.内存泄漏是什么?2. 为什么会发生内存泄漏3. 内存泄漏的危害4. 总结 1. 前言 在各种项目开发中,内存泄漏是一个很严重的问题。对资源管理、性能优越、系统稳定性,以及是否安全产生极大印象。本…...

【项目设计】基于负载均衡的在线oj平台

目录 一、项目介绍 二、开发环境以及技术 三、概要设计 四、关键算法 五、项目演示 六、代码实现 一、项目介绍 该项目是基于负载均衡的在线oj,模拟平时刷题网站(leetcode和牛客)写的一个在线判题系统 项目主要分为五个模块&#xff…...

生产环境Session解决方案、Session服务器之Redis

目录 一、服务器配置 二、安装nginx 三、安装配置Tomcat: 四、配置session Session服务器之Redis Redis与Memcached的区别 安装部署redis 一、服务器配置 IP地址 主机名 软件包列表 192.168.100.131 huyang1 nginx 192.168.100.133 huyang3 JDK Tomca…...

SPECjvm2008_1_01 openjdk8 x86_64 ARM64 运行时长、成绩 Run is valid, but not compliant

i5-9600k 架构: x86_64CPU 运行模式: 32-bit, 64-bitAddress sizes: 39 bits physical, 48 bits virtual字节序: Little Endian CPU: 6在线 CPU 列表: …...

安卓:百度地图开发(超详细)

一、百度地图介绍 百度地图SDK是一套供开发者使用的软件开发工具包(SDK),用于在Android应用程序中集成和使用百度地图功能。通过使用百度地图SDK,开发者可以实现在自己的应用中显示地图、获取定位信息、进行搜索、导航等功能。 百…...

DDSv1.4规范(中文版)

实时数据分发 (DDS) V1.4 (2015-04-10正式发布) https://www.omg.org/spec/DDS/1.4/PDF http://www.omg.org/spec/DDS/20140501/dds_dcps.idl...

oracle,获取每日24*60,所有分钟数

前言: 为规范用户的时间录入,因此我们采用下拉的方式,让用户选择需要的时间,因此我们需要将一天24小时的时间拆分为类似00:00,00:01...23:00,23:01,23:59。因此我们需要生成24*601440行的下拉复选值。具体效果如下图所示。 思路 1…...

vue elementui table去掉滚动条与实现表格自动滚动且无滚动条

当table内容列过多时,可通过height属性设置table高度以固定table高度、固定表头,使table内容可以滚动。 现在需求是右侧滚动条不好看,需要去除滚动条,并隐藏滚动条所占列的位置。让他可以滚动但是不出现滚动条,不然即时隐藏了滚动…...

SDK命令行工具配置

SDK命令行工具配置 最早的Android SDK工具包,包含一些GUI的工具。 而在一些场景(如打包)只需要命令行工具时,下载 command-line tools 即可。 到 Android Studio下载页 ,找到 Command line tools only 下载。 命令…...

【数字IC基础】竞争与冒险

竞争-冒险 1. 基本概念2. 冒险的分类3. 静态冒险产生的判断4. 毛刺的消除使用同步电路使用格雷码增加滤波电容增加冗余项,消除逻辑冒险引入选通脉冲 1. 基本概念 示例一: 如上图所示的这个电路,使用了两个逻辑门,一个非门和一个与…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...