PowerShell 在 Windows10 下创建分层存储
正常情况分层存储这个功能只能在 Windows Server 服务器上面创建使用,但是通过 PowerShell 命令也可以在 Windows10 上创建分层存储。
建议最低配置还是 2 块固态 + 3 块或以上的机械,虽然 1 块固态 + 1 块机械也可以做,但挂 1 块就全挂了,不建议这样操作,除非数据不重要。
有什么用 大概就类似于 “傲腾加速机械硬盘”、“intel Cache Acceleration Software”、“AMD StoreMI”、“希捷的固态混合硬盘 (SSHD)”、“PrimoCache 二级缓存加速机械硬盘” 之类的,用更快的固态硬盘当缓存来加速较慢的机械硬盘。
算是用比较折衷的价格来获取 “固态硬盘的高性能” 和 “机械硬盘的廉价容量” 的方案。
写入数据时会优先写入到固态层,常用的读取数据(热数据)也会优先存放在固态层。在热数据变化不频繁、短时间内单次写入不超过固态缓存层容量的情况下,还是有不错的使用体验的。
但是现在个人计算机上的 PCIe Gen 4.0x4 的高性能固态只需要大概 500 块 RMB/1TB 的价格,对于个人用户来说,把多余的旧硬盘卖了,买块新固态更实在点……
所以这个方案还是企业上才有应用场景,根据冷热数据比例来搭配存储,比如说每 10TB 机械用 1TB 固态来加速之类的。
这里是用 2 块 (做镜像) 256GB 的三星 860EVO 固态硬盘来加速一块 2TB 的机械硬盘 (希捷的叠瓦盘) 的效果。
查看硬盘 好了,开始实操,先看一下电脑上的硬盘
1 2 3 4 5 6 7 Get-PhysicalDisk Get-PhysicalDisk |`Sort-Object -Property "MediaType" ,"BusType" -Descending |`Format-Table -Property DeviceId,FriendlyName,SerialNumber,BusType,MediaType,CanPool,Size
硬盘信息如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 PS C:\Windows\system32> Get-PhysicalDisk |`Sort-Object -Property "MediaType" ,"BusType" -Descending |`Format-Table -Property DeviceId,FriendlyName,SerialNumber,BusType,MediaType,CanPool,SizeDeviceId FriendlyName SerialNumber BusType MediaType CanPool Size -------- ------------ ------------ ------- --------- ------- ---- 3 GALAX KA1D0128A F688075**** SATA SSD True 120034123776 9 TOSHIBA THNSNJ128GCSU Z42S104**** SATA SSD True 128035676160 4 J.ZAO QL SERIES 512 GB SSD 0000 _0006_2207_****_****_2703_3000_0747. NVMe SSD False 512110190592 5 INTEL MEMPEK1W016GA PHBT715400K1016D _00000001. NVMe SSD True 14403239936 7 TOSHIBA DT01ACA200 Z4OMX**** SATA HDD True 2000398934016 6 TOSHIBA DT01ACA200 Z4FXE**** SATA HDD True 2000398934016 8 TOSHIBA DT01ACA200 Z5JMY**** SATA HDD True 2000398934016 2 WDC WD40PURX-78AKYY0 WD-WX52 ****ERR3 SATA HDD False 4000787030016 0 ST4000VX000-2AG166 ZDHA**** SATA HDD False 4000787030016 1 ST4000VX007-2DT166 ZDHA**** SATA HDD False 4000787030016
选择硬盘 我打算用来建分层存储的,就是这里面的 2 块 120GB 固态硬盘 (SSD),3 块 2TB 机械硬盘 (HDD)。
2 块固态做镜像,3 块机械做奇偶校验,这样都可以容忍各自损坏 1 块盘。
CanPool
为 True
就是没内容没分区可以加入存储池使用的,本来把所有 CanPool
为 True
的硬盘拿来建池就是正常操作,但是里面还有一块 13GB 的傲腾,也是 CanPool
为 True
。
我又不想用这块傲腾,那要怎么选?拆下来吗?或者新建个分区吗?也不用这样,筛选一下就行,下面是常用的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $DeviceId_array = @ ( "7" , "6" , "3" , "9" , "8" ) $DeviceId_list = $DeviceId_array -join '|' $PhysicalDisks1 = (Get-PhysicalDisk | Where-Object {$_ .DeviceId -match $DeviceId_list })$PhysicalDisks2 = (Get-PhysicalDisk -CanPool $True | Where-Object {$_ .Size -gt 100 GB})$PhysicalDisks3 = (Get-PhysicalDisk -CanPool $True | Where-Object {$_ .BusType -eq "SATA" })
好了,这三个 $PhysicalDisks
得到的结果都是那 2 块 120GB 固态硬盘 (SSD),3 块 2TB 机械硬盘 (HDD)。
1 2 3 4 5 6 7 8 9 PS C:\Windows\system32> $PhysicalDisks3 | Sort-Object -Property "MediaType" -Descending Number FriendlyName SerialNumber MediaType CanPool OperationalStatus HealthStatus Usage Size ------ ------------ ------------ --------- ------- ----------------- ------------ ----- ---- 3 GALAX KA1D0128A F688075**** SSD True OK Healthy Auto-Select 111.79 GB9 TOSHIBA THNSNJ128GCSU Z42S104**** SSD True OK Healthy Auto-Select 119.24 GB7 TOSHIBA DT01ACA200 Z4OMX**** HDD True OK Healthy Auto-Select 1.82 TB6 TOSHIBA DT01ACA200 Z4FXE**** HDD True OK Healthy Auto-Select 1.82 TB8 TOSHIBA DT01ACA200 Z5JMY**** HDD True OK Healthy Auto-Select 1.82 TB
清除磁盘 要是硬盘不是空,-CanPool
为 False
怎么办?
1 2 3 4 5 6 7 8 Get-Disk Clear-Disk -Number 9 -RemoveData -RemoveOEM Get-PhysicalDisk -DeviceNumber 9 | Reset-PhysicalDisk
你也可以按上面一样把硬盘批量选出来,然后 Reset-PhysicalDisk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $DeviceId_array = @ ( "7" , "6" , "3" , "9" , "8" ) $DeviceId_list = $DeviceId_array -join '|' $DiskList = (Get-Disk | Where-Object {$_ .Number -match $DeviceId_list })$DiskList | Clear-Disk -RemoveData -RemoveOEM -PassThru $PhysicalDisks1 = (Get-PhysicalDisk | Where-Object {$_ .DeviceId -match $DeviceId_list })$PhysicalDisks1 | Reset-PhysicalDisk
创建池 1 2 New-StoragePool –StoragePoolFriendlyName "TieredStoragePool" –StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $PhysicalDisks3
"TieredStoragePool"
就是池的命名 , –StorageSubsystemFriendlyName
这个的参数照抄就行,-PhysicalDisks
提供上面选的硬盘
1 2 3 4 5 6 PS C:\Windows\system32> New-StoragePool –StoragePoolFriendlyName "TieredStoragePool" `–StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $PhysicalDisks3 FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize ------------ ----------------- ------------ ------------ ---------- ---- ------------- TieredStoragePool OK Healthy False False 5.68 TB 1.25 GB
创建层(模板) 1 2 3 New-StorageTier -StoragePoolFriendlyName "TieredStoragePool" -FriendlyName "SSDTier" -MediaType SSD -ResiliencySettingName MirrorNew-StorageTier -StoragePoolFriendlyName "TieredStoragePool" -FriendlyName "HDDTier" -MediaType HDD -ResiliencySettingName Parity
固态做镜像 (Mirror),机械硬盘做奇偶 (Parity),创建的这两个层只是做 “参数” 来用的。
简单 Simple:就是不做任何冗余
镜像 Mirror:至少 2 块盘,可以空间为 1 块盘
奇偶 Parity:至少要 3 块盘,可用空间为 N-1 块盘
你要是没有复数的盘做冗余,或者单纯不想做冗余,你可以选择 Simple
1 2 3 4 5 6 7 8 9 10 11 12 13 14 PS C:\Windows\system32> New-StorageTier -StoragePoolFriendlyName "TieredStoragePool" -FriendlyName "SSDTier" `-MediaType SSD -ResiliencySettingName MirrorFriendlyName TierClass MediaType ResiliencySettingName FaultDomainRedundancy Size FootprintOnPool StorageEfficiency ------------ --------- --------- --------------------- --------------------- ---- --------------- ----------------- SSDTier Unknown SSD Mirror 1 0 B 0 B PS C:\Windows\system32> New-StorageTier -StoragePoolFriendlyName "TieredStoragePool" -FriendlyName "HDDTier" `-MediaType HDD -ResiliencySettingName ParityFriendlyName TierClass MediaType ResiliencySettingName FaultDomainRedundancy Size FootprintOnPool StorageEfficiency ------------ --------- --------- --------------------- --------------------- ---- --------------- ----------------- HDDTier Unknown HDD Parity 1 0 B 0 B
创建虚拟磁盘
你可以提前看一下最大有多少的容量,然后把 -StorageTierSizes
的值一步到位,例如
1 2 3 4 5 PS C:\Windows\system32>(Get-StorageTierSupportedSize -FriendlyName SSDTier -ResiliencySettingName Mirror).TierSizeMax/1 GB (Get-StorageTierSupportedSize -FriendlyName HDDTier -ResiliencySettingName Parity).TierSizeMax/1 GB 109.75 3724.5
然后把 -StorageTierSizes
设为 100GB,3700GB
,取个整数
1 2 3 4 5 6 7 $SSD_Tier = Get-StorageTier -FriendlyName "SSDTier" $HDD_Tier = Get-StorageTier -FriendlyName "HDDTier" New-VirtualDisk -StoragePoolFriendlyName "TieredStoragePool" ` -FriendlyName "TieredDisk" ` -StorageTiers $SSD_Tier , $HDD_Tier ` -StorageTierSizes 10 GB, 10 GB
在 “TieredStoragePool” 池里,创建名为 “TieredDisk” 的硬盘,以上面创建的两个层为参数,容量分配为 固态硬盘层 10GB,机械硬盘层 10GB
1 2 3 4 5 6 7 8 PS C:\Windows\system32> $SSD_Tier = Get-StorageTier -FriendlyName "SSDTier" $HDD_Tier = Get-StorageTier -FriendlyName "HDDTier" New-VirtualDisk -StoragePoolFriendlyName "TieredStoragePool" -FriendlyName "TieredDisk" -StorageTiers $SSD_Tier , $HDD_Tier -StorageTierSizes 10 GB, 10 GBFriendlyName ResiliencySettingName FaultDomainRedundancy OperationalStatus HealthStatus Size FootprintOnPool StorageEfficiency ------------ --------------------- --------------------- ----------------- ------------ ---- --------------- ----------------- TieredDisk OK Healthy 20 GB 39 GB 51.28 %
调整虚拟磁盘的大小 先看看现在有什么层
1 2 3 4 5 6 7 8 PS C:\Windows\system32> Get-StorageTier | Sort-Object -Property "FriendlyName" -Descending FriendlyName TierClass MediaType ResiliencySettingName FaultDomainRedundancy Size FootprintOnPool StorageEfficiency ------------ --------- --------- --------------------- --------------------- ---- --------------- ----------------- TieredDisk-SSDTier Performance SSD Mirror 1 10 GB 20 GB 50.00 % TieredDisk-HDDTier Capacity HDD Parity 1 10 GB 15 GB 66.67 % SSDTier Unknown SSD Mirror 1 0 B 0 B HDDTier Unknown HDD Parity 1 0 B 0 B
再看看各个层还能用多大的空间 ,你也可以在创建虚拟磁盘之前就看,创建的时候容量一步到位
1 2 3 4 5 PS C:\Windows\system32> (Get-StorageTierSupportedSize -FriendlyName SSDTier -ResiliencySettingName Mirror).TierSizeMax/1 GB (Get-StorageTierSupportedSize -FriendlyName HDDTier -ResiliencySettingName Parity).TierSizeMax/1 GB 97.75 3714.5
其实在创建的时候我就决定了,凑个整数。2 块 120GB 固态做镜像,分 100GB。3 块 2T 机械做奇偶,分 3700GB
1 2 3 Resize-StorageTier -InputObject (Get-StorageTier -FriendlyName "TieredDisk-SSDTier" ) -Size 100 GBResize-StorageTier -InputObject (Get-StorageTier -FriendlyName "TieredDisk-HDDTier" ) -Size 3700 GB
1 2 3 4 5 6 7 8 PS C:\Windows\system32> Get-StorageTier | Sort-Object -Property "FriendlyName" -Descending FriendlyName TierClass MediaType ResiliencySettingName FaultDomainRedundancy Size FootprintOnPool StorageEfficiency ------------ --------- --------- --------------------- --------------------- ---- --------------- ----------------- TieredDisk-SSDTier Performance SSD Mirror 1 100 GB 200 GB 50.00 % TieredDisk-HDDTier Capacity HDD Parity 1 3.61 TB 5.42 TB 66.67 % SSDTier Unknown SSD Mirror 1 0 B 0 B HDDTier Unknown HDD Parity 1 0 B 0 B
看看还剩下多少没用的空间
1 2 3 4 5 PS C:\Windows\system32>(Get-StorageTierSupportedSize -FriendlyName SSDTier -ResiliencySettingName Mirror).TierSizeMax/1 GB (Get-StorageTierSupportedSize -FriendlyName HDDTier -ResiliencySettingName Parity).TierSizeMax/1 GB 7.75 24.5
这点剩余空间也不在乎了,固态是普通的家用固态,手动留点空间做 OP 空间用好了。
(这点不同品牌不同主控的处理方法都不一样,不一定有用,而且整个盘添加进了存储池也不知道这做法还没有用,我真的就是凑个整数而已。
你也不用指望每一分空间都用完,要留一点,全用完创建的时候会失败报错的。)
创建分区 现在磁盘管理器那边已经能看一个 100GB + 3700GB 的 3800GB 的硬盘了。
你可以在这里手动创建分区使用,或者继续用命令创建也行。
初始化虚拟磁盘,GPT 分区表
1 Get-VirtualDisk -FriendlyName "TieredDisk" | Initialize-Disk -PartitionStyle GPT -PassThru
1 2 3 4 5 PS C:\Windows\system32> Get-VirtualDisk -FriendlyName "TieredDisk" | Initialize-Disk -PartitionStyle GPT -PassThru Number Friendly Name Serial Number HealthStatus OperationalStatus Total Size Partition Style ------ ------------- ------------- ------------ ----------------- ---------- --------------- 10 TieredDisk {d68baa51-2ce5-457e-8220-eabb ... Healthy Online 3.71 TB RAW
虚拟硬盘进行分区,分配盘符为 G,使用全部容量
1 New-Partition -DiskNumber 10 -DriveLetter "G" -UseMaximumSize
1 2 3 4 5 6 7 PS C:\Windows\system32> New-Partition -DiskNumber 10 -DriveLetter "G" -UseMaximumSize DiskPath:\\?\storage PartitionNumber DriveLetter Offset Size Type --------------- ----------- ------ ---- ---- 2 G 16777216 3.71 TB Basic
格式化 G 盘,NTFS 格式
1 Format-Volume -DriveLetter 'G' -FileSystem NTFS
1 2 3 4 5 PS C:\Windows\system32> Format-Volume -DriveLetter 'G' -FileSystem NTFSDriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining Size ----------- ------------ -------------- --------- ------------ ----------------- ------------- ---- G NTFS Fixed Healthy OK 3.71 TB 3.71 TB
热数据迁移 当你创建了分层存储之后,任务计划程序 里面就会自动启用 \Microsoft\Windows\Storage Tiers Management
下面的 Storage Tiers Optimization
任务
默认每 4 个小时迁移一次热数据到比较快的层,你可以改快一点。
这个任务的操作 里面也能看到命令是 %windir%\system32\defrag.exe -c -h -g -# -m 8 -i 13500
可以手动运行此命令来触发迁移热数据,具体参数是什么意思自己查吧。
参考 Windows 存储池 - ChasingDreams - 博客园 (cnblogs.com)
如何使用 PowerShell 创建虚拟磁盘 » 豪尔赫・伯恩哈特 (jorgebernhardt.com)
分层存储空间写入慢速层 (Server2019) | 服务家庭论坛 (servethehome.com)
原文作者:tjxwork 原文链接:https://www.tjxblog.com/blog/2023-0008 发布时间:2023-03-01