通过Windows存储池将虚拟磁盘拆分成若干个vhdx
有一个虚拟磁盘文件,需要以物理磁盘(Physical Disk)的方式被挂载,且需要被拆分成若干个小文件。
Windows本身支持的虚拟磁盘(vhd和vhdx)是不支持像Vmware虚拟磁盘(vmdk)一样被拆分成每个2G的小文件的,这就导致在一些场景下的不便,例如很多云盘仅支持小于4G甚至2G的文件上传。而Vmware虚拟磁盘并不支持挂载为物理磁盘,这就导致无法对其扩展一些仅支持物理磁盘的特性,例如BitLocker。
笔者就在通过小米云备份一个将近60GB的vhdx文件时遇到了困难,小米云仅仅支持小于4GB的文件上传,这远远不够。于是笔者先是考虑vmdk本身支持的将虚拟磁盘文件以2G的大小分割,但vmdk的分割仅在配合虚拟机服务启停时会触发,查找了很多资料发现vmdk的挂载(映射)并不是通过物理磁盘的方式挂载的,而更像是仅仅模拟了一个带有盘符的文件夹。再是考虑不使用Vmware自带的磁盘挂载工具,转而使用第三方程序例如PowerISO、OFSMount,但OFSMount虽然可以选择模拟物理磁盘,但无法正确读取分割后的vmdk文件。
几经周折后偶然发现Windows自带的存储管理功能,其最初的使用方法是“集结”各不同物理磁盘的空间为一个整体,进而通过备份、校验等方式提高文件存储安全性和在出现故障时的保全性。
经过尝试后发现存储管理还支持通过若干个4GB及以上的Windows虚拟磁盘创建存储池。但如果创建并挂载的虚拟磁盘小于4GB,创建存储池时将不显示;恰好等于4GB时,创建存储池将提示“无法创建池,检查驱动器连接:不支持该请求(0x00000032)”的错误。这就陷入了僵局,要是每个都大于4GB,还是无法上传,难道通过存储管理也没有办法实现这个需求?
于是去查看磁盘管理中该磁盘,发现磁盘的大小从创建时确定的4GB变为了3.88GB,差了正好128MB,这就是Windows中默认的一个保留分区的大小,于是在创建时将128MB加上,将虚拟硬盘大小设为4424MB,果然成功地创建了一个存储池。
那么,只要将大的虚拟磁盘里的文件存储到通过许多个小虚拟磁盘组建的存储池中就可以了。但是由于虚拟磁盘的大小被设定为比4GB多了128MB,会不会最终的小虚拟磁盘文件们还是无法被上传呢。稍加思考,发现存储管理中有个“优化存储空间”的功能,它会使文件在各个物理驱动器中分布的更加均匀,也就是说最终每个虚拟磁盘文件的大小不会相差很多。那么在它们过大的时候,添加虚拟磁盘的个数,再通过均匀的分布就可以缩小它们每个文件的大小。
接下来来创建足够多的虚拟磁盘,创建的个数取决于组建存储池后每个虚拟磁盘实际能存储的数据。通过测试发现,每个4GB的虚拟磁盘实际约能存储2GB不到的数据量,虽然乍一看利用率不到50%,但单个“装满的”虚拟磁盘文件在真正的物理磁盘中占用的实际空间远不会真正达到4GB,具体会比单个虚拟磁盘文件存放的有效数据多0.4GB左右,这也是可以接受的。
笔者大约需要存储60G的数据,那么大概就需要32个虚拟磁盘。将数据存入后,每个虚拟磁盘文件实际大约2GB左右,虽然在存储管理中的利用率和池容量显示的非常夸张,但好在可以无限创建并添加新的虚拟磁盘来扩大池容量,而实际组成存储池的虚拟磁盘文件占用并不会比实际的存储量大很多,这些数据便显得没有意义。同时,一旦单个虚拟磁盘文件接近我们能接受的上限,也可以通过增加它们的个数和优化驱动器使用率来降低每个虚拟磁盘中实际有意义的数据量大小。虽然vhdx不会自己压缩未经使用的空间,但可以使用Hyper-V管理控制台逐个压缩它们的大小,也可以使用Powershell的Hyper-V模块来通过脚本批量压缩。
最终创建完成后的存储空间中的文件数据量和虚拟磁盘文件的实际大小总和对比,利用率大概在92%左右,这并不难接受。当然,如果在创建存储空间时选择“简单(无复原)”以外的复原类型,这相当于为每份数据进行了备份,但这并没有意义。所有的虚拟磁盘文件都存储在同一块物理硬盘上,很难发生由于丢失或删除它们其中的某一个而导致需要进行数据复原的情况,除非存储他们的一整块物理磁盘损坏,那将无法读取所有的虚拟磁盘文件,也就更无法复原任何数据。
当然,这么做将会使部分数据安全性暴露于文件系统层之上,虚拟硬盘文件被删除、恶意损坏都会导致数据无法恢复,但好在这么做的目的就是为了备份这些文件。
最终:Bitlocker支持√,分割虚拟磁盘文件√,<4GB√。
最后,你在安装Powershell的Hyper-V模块后可以在Powershell控制台或脚本中使用
Mount-VHD
[-Path] <String[]>
[-NoDriveLetter]
[-ReadOnly]
[-SnapshotId <Guid>]
[-Passthru]
[-CimSession <CimSession[]>]
[-ComputerName <String[]>]
[-Credential <PSCredential[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
挂载每个虚拟磁盘文件;使用
Dismount-VHD
[-Path] <String[]>
[-SnapshotId <Guid>]
[-Passthru]
[-CimSession <CimSession[]>]
[-ComputerName <String[]>]
[-Credential <PSCredential[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
和
Optimize-VHD
[-Path] <String[]>
[-Mode <VhdCompactMode>]
[-AsJob]
[-Passthru]
[-CimSession <CimSession[]>]
[-ComputerName <String[]>]
[-Credential <PSCredential[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
来分离和压缩它们的大小。
通过Windows存储池将虚拟磁盘拆分成若干个vhdx相关推荐
- 小明有N(4≤N≤60)个玻璃球,他想将N个玻璃球拆分成若干份(份数≥2,且每份中的数量互不相等),从而使拆分后的每份玻璃球数量的乘积最大。请你编写程序帮助小明计算出最大乘积是多少...
小明想要将N个玻璃球拆分成若干份,使得每份的玻璃球数量的乘积最大.为了计算出最大的乘积,你可以使用贪心算法. 首先,将N个玻璃球拆分成若干份,使得每份的玻璃球数量的乘积最大,意味着每份的玻璃球数量应尽 ...
- 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
题目描述: 代码: #include<iostream> using namespace std;int n; int total; int a[10001];void print(int ...
- LeetCode 2178. 拆分成最多数目的偶整数之和(等差数列求和)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 finalSum .请你将它拆分成若干个 互不相同 的偶整数之和,且拆分出来的偶整数数目 最多 . 比方说,给你 finalSum = 12 ...
- python分解word文档为多个_将一个word文档按一页或多页拆分成多个文档
工作中,有时候碰到需要将一个比较大的word按照指定的页数分割成若干个小的word文档,下面提供分割的方法供参考: 一.按照单页拆分 1.在Word里面打开那个需要分割的文档(假设它的文件名叫做&qu ...
- 将一个word文档按一页或多页拆分成多个文档
工作中,有时候碰到需要将一个比较大的word按照指定的页数分割成若干个小的word文档,下面提供分割的方法供参考: 一.按照单页拆分 1.在Word里面打开那个需要分割的文档(假设它的文件名叫做&qu ...
- 每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
Word Break 原题链接Word Break 给定一个字符串和单词字典,将字符串切分成若干个单词,使每个单词都在字典中.判断是否可以成功切分 假设字符串s[0 : n-1]可以成功切分成若干个单 ...
- mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...
一.MYSQL数据库设计规范 1.数据库命名规范 a.采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; b.命名简洁明确(长度不能超过30个字符); c.例如:us ...
- 如何将Excel中一列内容拆分成两列?
如何将Excel中一列内容拆分成两列? 目录 如何将Excel中一列内容拆分成两列? 1.例如:将下表中B列一月销售中计划与实际销售数量拆分成两列 2.首先在B列后插入一空白列,即选中C列鼠标右键点击 ...
- linux+多个字符分割字符串数组中,String的split()方法可以将字符串按照特定的分隔符拆分成字符串数组...
在java.lang包中有String.split()方法,返回是一个数组------不管按照什么拆,拆出来是一个数组 String str = "1,2,3,4,5,6"; St ...
最新文章
- 图解ZooKeeper!小学生也能看懂!
- 只需一行代码,你的纯文本秒变Markdown
- php图片如何让浮动,页面中用css属性怎么控制图片自定义浮动?(示例)
- nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
- ca证书 csr_linux下使用openssl生成 csr crt CA证书
- Tokyo Tyrant安装和配置
- 【SpringCloud】Spring cloud Alibaba Sentinel 服务降级 (阿里版本Hystrix)
- Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)
- cocos2d-x 3.2 DrawNode 绘图API
- CPaintDC 、CWindowDC、 CClientDC、cMemDC、 CDC
- 一图区分1.85mm/2.4mm/2.92mm/3.5mm/SMA射频接头
- TimeZone.getTimeZone 时区参数说明
- 为什么程序员不需要MATLAB技能?
- 用云开发搭建的微信答题小程序v1.0
- Bugku旧平台crypto writeup
- effective modern cpp
- 微信小程序开发笔记——wsdchong
- vue中使用scrollTo实现锚点定位
- ResNet 残差网络、残差块
- 第十届中国云计算大会开幕,“云界十年”评选结果正式公布