理论和工具已就绪,接下来开始DIY

  1. 这块主板自带5个sata 3.0,而组一套堪用的storage space需要7个sata口,其中4块HDD,2块SSD和一块系统盘。所以还需要配一块通道卡,前面提到买了一块IBM的M1015,这是一块lsi 2008芯片的阵列卡,其硬件配置跟公版的lsi sas 9211-8i一致,所以可以刷lsi sas 9211-8i固件。刷机过程中遇到一些小问题,不过也能很快解决,参考这里(link1)和这里(link2)。M1015自带两个mini SFF8087接口,需要用到1*SFF 8087转4*sata/sas的数据线,深水宝有售;
  2. 航嘉电源的sata电源接口只有5个,需买方口转sata口电源线。
  3. 由于机箱的散热不好,所以还买了两个5.25转3.5光驱位硬盘盒,将4块机械盘分开放置,便于散热。
  4. 8G的内存未免太少了,于是翻出两条2G的同频内存插上,内存从原来的8G升级至12G。
  5. 1块intel series 320 160G SSD担任系统盘,接入主板的sata1接口,4块机械盘接入M1015的port0,2块ssd接入port1。在bios中,将启动顺序的第一顺位设为intel 160G SSD

物理连线就绪,开始安装OS。我使用了serva32这个工具来安装windows server,它是一款pxe网络安装工具,需要第二台电脑担任pxe/dhcp/tftp服务器。相比USB的安装方式,pxe安装省去了写盘的痛苦,特别是需要频繁重装测试的时候尤其方便,特此推荐。安装过程可参考官网,前提条件是网卡支持pxe。

完成操作系统的安装和激活后开始storage spaces的探秘之旅。

NOTE

Storage Spaces可以通过GUI或powershell两种方式进行配置,不过GUI有很多限制,所以本系列的配置全部在powershell下进行。

下面先练练手,创建一个简单的纯机械硬盘组成的3盘位的parity虚拟盘。大体步骤如下:

<>

1 诞生

1.1 创建storagepool

1
2
3
New-StoragePool -PhysicalDisks (Get-PhysicalDisk -CanPool $True | Where MediaType -eq HDD) `
                -StorageSubSystemFriendlyName (Get-StorageSubSystem).FriendlyName `
                -FriendlyName pool01
  • PhysicalDisk,指的是添加到存储池中的机械硬盘,由于本次创建的是纯机械硬盘组成的,所以在后面的括号里面,需要限定条件
    1. 每块硬盘只能存在于一个存储池中,所以只有canpool$true的机械盘才能添加的存储池;
    2. 本次只用机械硬盘,因而MediaType限定为HDD,假如需要用到SSD,则MediaType则改成SSD;
  • StorageSubSystemFriendlyName,不知道干什么用的,照抄吧;
  • FriendlyName,顾名思义就是别名,起个容易记的名字就行了,我的习惯是pool+序号,简单粗暴。

1.2 创建stroage space

敲黑板,重点来了,下面是必考题:

1
2
3
4
5
New-VirtualDisk -StoragePoolFriendlyName pool01 `
                -FriendlyName vdisk01 `
                -ResiliencySettingName parity `
                -NumberOfColumns 3 `
                -Interleave 16KB
  • StoragePoolFriendlyName,从pool01这个存储池中创建一块虚拟盘
  • FriendlyName,给虚拟盘起的别名。存储空间也叫虚拟盘,为了简便起见,我以vdisk来作为虚拟盘别名的前缀。
  • ResiliencySettingName,就上面说到的raid类型,本次创建的是parity
  • NumberOfColumns,这个参数指定了物理硬盘的数量,也是数据条带化的数量,譬如说一个3 columns的parity虚拟盘,每一个数据块将条带化成3份数据并分别写到3块硬盘中。物理硬盘数量越多,io性能越好。
  • Interleave,条带大小,它跟NumberOfColumns关系密切,默认值为256KB。

1.3 创建volume/partition

  • 获得虚拟盘的编号

    1
    
    Get-VirtualDisk -FriendlyName "vdisk01" | Get-Disk

新建的虚拟盘编号为xx,为了便于统一描述,下面将以$numOfDisk变量代替该编号。所以还得执行以下命令:

1
  $numOfDisk=(Get-VirtualDisk -FriendlyName "vdisk01" | Get-Disk)
  • 上线虚拟盘

新建的虚拟盘处于离线状态,需先上线才能执行后续的操作。

1
  Set-disk -number $numOfDisk -isOffline $false

isOffline,此处应用了负负得正的原理,这种骚操作还挺少见。

  • 初始化虚拟盘

    1
    
    Initialize-Disk -Number $numOfDisk -PartitionType GPT

PartitionType,也可以用MBR,不过都现在已经是9102了,再用MBR就显得不合时宜了。

  • 添加卷/分区

    1
    
    New-Partition -DiskNumber $numOfDisk -UseMaximumSize -AssignDriveLetter E

UseMaxmumSize, 新建分区的大小等于虚拟盘的容量。这意味着此块虚拟盘只能创建一个分区,如果希望在该虚拟盘中创建多个分区,则多个分区的大小之和不得超过虚拟盘的容量。 AssignDriveLetter,为该分区分配盘符。

  • 分区格式化

    1
    
    Format-Volume -DriveLetter E -FileSystem ReFS -NewFileSystemLabel "archive_ds" -Cluster
    • DriverLetter,对盘符为E的分区进行格式化。
    • FileSystem,一般选ntfs或refs
    • ClusterSize,默认是64KB

这时候在“我的电脑”中就看到了E盘。可以正常的读写,先测试一把看下性能。

<>

纳尼?!微软的东西这么垃圾?!我不甘心,寻思着创建了一块mirror类型的虚拟盘再试一下,为了减少干扰,我决定删掉parity vdisk,然后重建。

2. 毁灭

死亡是生命的开始,删除的步骤跟创建的正好相反,依次是删除分区-删除虚拟盘-删除存储池

2.1 删除volume/partition

实际上这一步骤是多余的,因为SS允许直接删除虚拟盘。

1
Remove-partition -disknumber $disknumber

$disknumber可以通过Get-Disk | select-object disknumber来查看

1
PS C:\Windows\system32> get-disk

get-disk命令既可以查看virtualdisk,也可以查看简单卷的物理硬盘,而get-physicaldisk和get-virtualdisk目的性就很强。

2.2 删除storage space

1
Remove-VirtualDisk -FriendlyName $virtualdiskFriendlyName

2.3 删除storage pool

1
Remove-StoragePool -FriendlyName $storagepoolfriendlyname

紧接着创建一个mirror vdisk,脚本如下:

<>

看起来也不怎么地,这令我陷入了深深的思考…

就这样了吗?显然不是,我还指望下半生靠微软续命呢,于是又踏上了优化的不归路。

如果等不及看一场的,下面的花絮可以忽略。

花絮

在创建存储池的时候如果使用旧硬盘,容易遇到这样或那样的问题,下面的操作专治各种不服,任君选用。

  • 更改physicaldisk的friendlyname

添加硬盘后,windows会自动分配friendlyname。不知为何,我的4块wd硬盘全部分配了同样的friendlyname,不利于区分,所以要更名:

1
2
3
4
  get-physicaldisk | where-object { $_.uniqueid -eq '50024e290210e739' } `
                   | set-physicaldisk -newfriendlyname "hdd-wd2t-e739"

  get physicaldisk | ft model, uniqueid, friendlyname

hdd-wd2t-xxxx,其中hdd表示这是一块机械盘,wd2t表示西数的2T,xxxx为该硬盘的序列号后四位,或者该硬盘区别于其它的特定标识。

  • 重置硬盘

当将一块使用过的硬盘插入服务器时,执行get-physicaldisk命令后将发现其canpool的状态为false,这意味着storage space还无法使用该硬盘,需要先对该硬盘进行重置

1
  Reset-PhysicalDisk -uniqueid $uniqueid
  • 重使能硬盘

这是什么鬼。我实在想不出有更言简意赅的表述,简言之,先disable硬盘,再enable硬盘。

重置硬盘后,其canpool状态仍然为false,这时候需要通过windows中的disk management将该硬盘disable,随后enable,这时canpool状态将变为true。非常诡异的现象,windows就是这么任性。

  • 查看storagepool中的硬盘

    1
    2
    
    Get-StoragePool -FriendlyName $StoragePoolName | Get-PhysicalDisk `
                | Select FriendlyName, MediaType