Introduction:
A question often asked in the forum is whether it is possible to increase the size of a Pegasus macOS volume by rebuilding all the array drives to larger disks. This is a very good question and previously no process for this was available. As it turns out, there is a way to make this work, the process is documented here.
This process requires the use of the MAC terminal and promise CLI and is probably not for newbies. Also macOS issues a warning about possible loss of files at one point, so use at your own risk. So far it has been used twice successfully in the lab. The steps are readily available at various websites, although not all on the same page.
Note, these process steps are for journaled HFS+ only.
Process:
This process requires a redundant LUN, preferably RAID5 or RAID6. This process should also work with RAID 1 and RAID 10 LUNs. This process will not work with a RAID0 or passthru disks.
The first step is to replace the drives with larger drives through a series of rebuilds. For this KB a Pegasus 2 R6 was used attached to a MacBook Pro running Yosemite. The first 3 drives were 2TB with a RAID5 LUN and a journaled HFS+ filesystem. The last 3 drives were 4TB. The following commands are run from the Promsie CLI. To access the Promise CLI open a MAC terminal and entre promiseutil.
cliib> phydrv
===============================================================================
PdId Model Type Capacity Location OpStatus ConfigStatus
===============================================================================
1 TOSHIBA DT01 SATA HDD 2TB Encl1 Slot1 OK Array0 No.0
2 TOSHIBA DT01 SATA HDD 2TB Encl1 Slot2 OK Array0 No.1
3 TOSHIBA DT01 SATA HDD 2TB Encl1 Slot3 OK Array0 No.2
4 Hitachi HUS7 SATA HDD 4TB Encl1 Slot4 OK Unconfigured
5 WD WD40 SAS HDD 4TB Encl1 Slot5 OK Unconfigured
6 WD WD40 SAS HDD 4TB Encl1 Slot6 OK Unconfigured
cliib> phydrv -a offline -p 1
WAIT FOR REBUILD TO COMPLETE
cliib> phydrv -a offline -p 2
WAIT FOR REBUILD TO COMPLETE
cliib> phydrv -a offline -p 3
WAIT FOR REBUILD TO COMPLETE
cliib> phydrv
===============================================================================
PdId Model Type Capacity Location OpStatus ConfigStatus
===============================================================================
1 TOSHIBA DT01 SATA HDD 2TB Encl1 Slot1 Stale StaleConfig
2 TOSHIBA DT01 SATA HDD 2TB Encl1 Slot2 Stale StaleConfig
3 TOSHIBA DT01 SATA HDD 2TB Encl1 Slot3 Stale StaleConfig
4 Hitachi HUS7 SATA HDD 4TB Encl1 Slot4 OK Array0 No.0
5 WD WD40 SAS HDD 4TB Encl1 Slot5 OK Array0 No.1
6 WD WD40 SAS HDD 4TB Encl1 Slot6 OK Array0 No.2
The 2TB disk (PD1) was forced offline and a manual rebuild was started in the Promise Utility on the first 4TB disk (PD4).
After the rebuild was completed the second 2TB disk (PD2) was forced offline and a manual rebuild was started in the Promise Utuility on the second 4TB disk (PD4).
After the rebuild was completed the third 2TB disk (PD3) was forced offline and a manual rebuild was started in the Promise Utility on the third 4TB disk (PD6).
This can also be done from the Promise Utility.
When this process is complete macOS will still see a 4TB LUN but the array will have been moved to the 4TB disks.
The next step is to expand the LUN on the Pegasus to use all of the disk space. For unknown reasons 'migration' was greyed out in the Promise Utility so this step had to be done in the CLI.
The promise CLI command is...
migrate -a start -d 0 -l "id=0,capacity=8tb"
Be sure to use the correct array number (-d 0), logical drive id (id=0) and capacity of the new LUN, in the case it's 8TB (capacity=8tb). For most 0 will be correct for both the arrayID and logical driveID.
cliib> logdrv
===============================================================================
LdId Alias OpStatus Capacity Stripe RAID CachePolicy SYNCed
===============================================================================
0 expandtest OK 4TB 1MB RAID5 RAhead/WBack Yes
Cliib>
cliib> migrate -a start -d 0 -l "id=0,capacity=8tb"
cliib> logdrv
===============================================================================
LdId Alias OpStatus Capacity Stripe RAID CachePolicy SYNCed
===============================================================================
0 expandtest Synchronizing 8TB 1MB RAID5 RAhead/WBack No
cliib>
Note, this command will be slow, possibly it will finish overnight.
When finished the LUN will be using all the disk space of the 4TB drives.
The last step is to let macOS see and use the extra space in the LUN.
First it is necessary to find which disk on the MAC is the Pegasus LUN. Open a terminal and run 'disutil list'.
Promises-MacBook-Pro:~ promise$ diskutil list
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *121.3 GB disk0
1: EFI EFI 209.7 MB disk0s1
2: Apple_APFS Container disk1 60.9 GB disk0s2
3: Apple_APFS Container disk2 60.2 GB disk0s3
/dev/disk3 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *8.0 TB disk3
1: EFI EFI 209.7 MB disk3s1
2: Apple_HFS Pegasus 4TB RAID5 4.0 TB disk3s2
The Pegasus disk is named Pegasus 4TB RAID5, and it's disk3s2.
Next we repair the filesystem with diskutil list. Note that this command requires the disk (disk3) and not the partition (disk3s2). The command is...
sudo diskutil repairdisk disk3
Make sure to use the proper disk. The results will look like this.
Promises-MacBook-Pro:~ promise$ sudo diskutil repairdisk disk3
Password:
Repairing the partition map might erase disk3s1, proceed? (y/N) y
Started partition map repair on disk3
Checking prerequisites
Checking the partition list
Adjusting partition map to fit whole disk as required
Did grow entire partition map
Checking for an EFI system partition
Checking the EFI system partition's size
Checking the EFI system partition's file system
Checking the EFI system partition's folder content
Checking all HFS data partition loader spaces
Checking booter partitions
Reviewing boot support loaders
Checking Core Storage Physical Volume partitions
The partition map appears to be OK
Finished partition map repair on disk3
Promises-MacBook-Pro:~ promise$ sudo diskutil resizevolume disk3s2 R
Resizing to full size (fit to fill)
Started partitioning on disk3s2 Pegasus 4TB RAID5
Verifying the disk
Verifying file system
Volume was successfully unmounted
Performing fsck_hfs -fn -x /dev/rdisk3s2
Checking Journaled HFS Plus volume
Checking extents overflow file
Checking catalog file
Checking multi-linked files
Checking catalog hierarchy
Checking extended attributes file
Checking volume bitmap
Volume bitmap needs minor repair for orphaned blocks
Checking volume information
The volume Pegasus 4TB RAID5 was found corrupt and needs to be repaired
File system check exit code is 8
Restoring the original state found as mounted
Error: -69803: Couldn't modify partition map because file system verification failed;
please verify and repair each volume individually and then try again
Promises-MacBook-Pro:
First, take note the warning, you must type yes to continue.
Repairing the partition map might erase disk3s1, proceed? (y/N) y
SInce the filesystem was not previously damaged, it seems unlikely to fail in trying to repair said damage, and indeed it has caused no damage in testing, but still, the warning is there, do this at your own risk.
As you can see the repair failed.
Error: -69803: Couldn't modify partition map because file system verification failed
If this happens it is necessary to boot macOS to safe mode and manually run fsck. To boot to safe mode with Intel macOS first properly shut down the the MAC, then holding command + s power the mac back on.
The MAC will boot to a text screen with a root# prompt.
It will take a minute or two after the prompt appears for the Pegasus disk to mount, you will see messages in the window. Wait till after the disk has mounted before continuing.
We know from before that the Pegasus is at disk3s2. The fsck command would be....
fsck -fy /dev/disk3s2
If the results are that some errors were fixed run it again as many times as is necessary for the results to show that the disk is OK. Exit with...
reboot
If the disk is not OK the next step will fail.
The last step after the MAC has rebooted is to run this command from a terminal...
sudo diskutil resizevolume disk3s2 R
The R tells diskutil to resize to use all the disk space available.
Promises-MacBook-Pro:~ promise$ sudo diskutil resizevolume disk3s2 R
Resizing to full size (fit to fill)
Started partitioning on disk3s2 Pegasus 4TB RAID5
Verifying the disk
Verifying file system
Volume was successfully unmounted
Performing fsck_hfs -fn -x /dev/rdisk3s2
Checking Journaled HFS Plus volume
Checking extents overflow file
Checking catalog file
Checking multi-linked files
Checking catalog hierarchy
Checking extended attributes file
Checking volume bitmap
Checking volume information
The volume Pegasus 4TB RAID5 appears to be OK
File system check exit code is 0
Restoring the original state found as mounted
Resizing
Modifying partition map
Growing file system
Finished partitioning on disk3s2 Pegasus 4TB RAID5
/dev/disk3 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *8.0 TB disk3
1: EFI EFI 209.7 MB disk3s1
2: Apple_HFS Pegasus 4TB RAID5 8.0 TB disk3s2
Promises-MacBook-Pro:~ promise$
As you can see, disk3s2 is now 8TB in size.
2: Apple_HFS Pegasus 4TB RAID5 8.0 TB disk3s2
Finder shows all files are present and viewable.
End Notes:
These macOS commands will probably not run on OS-X and it is not clear when these diskutil options became available and stable. But they should work with any recent macOS.
And again, if not comfortable with the terminal and manual commands, this process is probably not for you.