发布于 

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 的机械硬盘 (希捷的叠瓦盘) 的效果。

CrystalDiskMark测试

HD Tune Pro 测速

查看硬盘

好了,开始实操,先看一下电脑上的硬盘

1
2
3
4
5
6
7
# 查看硬盘列表
Get-PhysicalDisk

# 或者这样更直观一点,先按 "MediaType","BusType" 排序,再只显示想要的属性。
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,Size

DeviceId 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 512GB 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 块盘。

CanPoolTrue 就是没内容没分区可以加入存储池使用的,本来把所有 CanPoolTrue 的硬盘拿来建池就是正常操作,但是里面还有一块 13GB 的傲腾,也是 CanPoolTrue

我又不想用这块傲腾,那要怎么选?拆下来吗?或者新建个分区吗?也不用这样,筛选一下就行,下面是常用的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 选择要添加到池的硬盘

# 按手动填写的 DeviceId 来添加
$DeviceId_array= @(
"7",
"6",
"3",
"9",
"8"
)
$DeviceId_list = $DeviceId_array -join '|'
$PhysicalDisks1 = (Get-PhysicalDisk | Where-Object {$_.DeviceId -match $DeviceId_list})

# 筛选 CanPool 为 True ,并且 Size 容量 大于 100GB 的来添加
$PhysicalDisks2 = (Get-PhysicalDisk -CanPool $True | Where-Object {$_.Size -gt 100GB})

# 筛选 CanPool 为 True ,并且 BusType 接口类型 为 SATA 的来添加
$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 GB
9 TOSHIBA THNSNJ128GCSU Z42S104**** SSD True OK Healthy Auto-Select 119.24 GB
7 TOSHIBA DT01ACA200 Z4OMX**** HDD True OK Healthy Auto-Select 1.82 TB
6 TOSHIBA DT01ACA200 Z4FXE**** HDD True OK Healthy Auto-Select 1.82 TB
8 TOSHIBA DT01ACA200 Z5JMY**** HDD True OK Healthy Auto-Select 1.82 TB

清除磁盘

要是硬盘不是空,-CanPoolFalse 怎么办?

1
2
3
4
5
6
7
8
# 查看硬盘,记下要清理的硬盘的 Number 值,假设是 9
Get-Disk

# 清理硬盘
Clear-Disk -Number 9 -RemoveData -RemoveOEM

# 重置硬盘,刷新 -CanPool 的状态
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

# 重置硬盘,刷新 -CanPool 的状态
$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 Mirror
New-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 Mirror

FriendlyName 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 Parity

FriendlyName 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/1GB
(Get-StorageTierSupportedSize -FriendlyName HDDTier -ResiliencySettingName Parity).TierSizeMax/1GB
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 10GB, 10GB

在 “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 10GB, 10GB

FriendlyName 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/1GB
(Get-StorageTierSupportedSize -FriendlyName HDDTier -ResiliencySettingName Parity).TierSizeMax/1GB
97.75
3714.5

其实在创建的时候我就决定了,凑个整数。2 块 120GB 固态做镜像,分 100GB。3 块 2T 机械做奇偶,分 3700GB

1
2
3
# 调整大小,只能往大了调整
Resize-StorageTier -InputObject (Get-StorageTier -FriendlyName "TieredDisk-SSDTier") -Size 100GB
Resize-StorageTier -InputObject (Get-StorageTier -FriendlyName "TieredDisk-HDDTier") -Size 3700GB
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/1GB
(Get-StorageTierSupportedSize -FriendlyName HDDTier -ResiliencySettingName Parity).TierSizeMax/1GB
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#disk#{d68baa51-2ce5-457e-8220-eabba84151ab}#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

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 NTFS

DriveLetter 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