Resize APFS partition in Mojave
I'm attempting to resize a partition that's too small for my needs. Here's the output from diskutil list
:
~> diskutil list
/dev/disk0 (internal):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 500.3 GB disk0
1: EFI EFI 314.6 MB disk0s1
2: Apple_APFS Container disk1 400.0 GB disk0s2
3: Apple_APFS Container disk2 100.0 GB disk0s3
/dev/disk1 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +400.0 GB disk1
Physical Store disk0s2
1: APFS Volume Macintosh HD 234.4 GB disk1s1
2: APFS Volume Preboot 23.6 MB disk1s2
3: APFS Volume Recovery 518.1 MB disk1s3
4: APFS Volume VM 6.4 GB disk1s4
/dev/disk2 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +100.0 GB disk2
Physical Store disk0s3
1: APFS Volume Mojave Beta 90.2 GB disk2s1
2: APFS Volume Preboot 46.3 MB disk2s2
3: APFS Volume Recovery 512.3 MB disk2s3
4: APFS Volume VM 3.2 GB disk2s4
I looked at this MacObserver post and I tried this:
sudo diskutil apfs resizeContainer disk0s3 150G
I also took a peek at this post, too re: diskutil
documention.
Console output is as follows:
Started APFS operation Aligning grow delta to 49,999,994,880 bytes and targeting a new physical store size of 149,999,996,928 bytes Determined the maximum size for the targeted physical store of this APFS Container to be 100,000,002,048 bytes Error: -69519: The target disk is too small for this operation, or a gap is required in your partition map which is missing or too small, which is often caused by an attempt to grow a partition beyond the beginning of another partition or beyond the end of partition map usable space
I know I've got 50 gigs laying around on the other drive, but how do I reclaim from the Macintosh HD
and give it to the Mojave Beta
drive? Thank you for reading. I welcome your suggestions.
Update
Just for S's and G's, I tried making the big drive smaller and see what happens.
Current status:
Shrinking APFS Physical Store disk0s2 from 399,963,168,768 to 349,999,996,928 bytes
Shrinking APFS data structures
[ - 0%..10%..20%..30%..40%............................... ] 45.0%
Me right now
Update 2
I didn't blow up my hard drive, but it didn't work...well, it sorta worked...here's what diskutil list
looks like right now after that attempt:
~> diskutil list
/dev/disk0 (internal):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 500.3 GB disk0
1: EFI EFI 314.6 MB disk0s1
2: Apple_APFS Container disk1 350.0 GB disk0s2
3: Apple_APFS Container disk2 100.0 GB disk0s3
/dev/disk1 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +350.0 GB disk1
Physical Store disk0s2
1: APFS Volume Macintosh HD 234.4 GB disk1s1
2: APFS Volume Preboot 23.6 MB disk1s2
3: APFS Volume Recovery 518.1 MB disk1s3
4: APFS Volume VM 6.4 GB disk1s4
/dev/disk2 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +100.0 GB disk2
Physical Store disk0s3
1: APFS Volume Mojave Beta 90.3 GB disk2s1
2: APFS Volume Preboot 46.3 MB disk2s2
3: APFS Volume Recovery 512.3 MB disk2s3
4: APFS Volume VM 3.2 GB disk2s4
So shrinking the big one and then attempting to make the little partition bigger. No ****ing idea where the other 50 gigs went, but it's in there somewhere. I looked at Disk Utility app and it shows a 350GB partition, a 100GB partition, and 50GB of free space.
If Apple monitors this, please make it simpler to resize partitions. This is a huge PITA and it shouldn't be.
Solution 1:
Apple does not provide a way to do what you want to do. There are third party tools that can move a partition, but last time I checked, they will not work with APFS container partitions.
Partitions are stored on a drive contiguously. This means you can not just add any free space to a partition. The free space must exist directly below the partition. Let my show you an example similar to your situation.
First is the output from the command diskutil list disk1
. The drive below is a a sparse disk image. I created the image to help illustrate my answer. The image is partitioned fairly close to your disk0
.
Marlin:driveinfo davidanderson$ diskutil list disk1
/dev/disk1 (disk image):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme +500.3 GB disk1
1: EFI EFI 314.6 MB disk1s1
2: Apple_APFS Container disk3 400.0 GB disk1s2
3: Apple_APFS Container disk4 100.0 GB disk1s3
Here is the output from sudo gpt -r show /dev/disk1
. This command shows the values store in the GUID Partition Table (GPT). In this case, the units are blocks of 512 bytes.
Marlin:driveinfo davidanderson$ gpt -r show /dev/disk1
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 614448 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
614488 781250000 2 GPT part - 7C3457EF-0000-11AA-AA11-00306543ECAC
781864488 195283952 3 GPT part - 7C3457EF-0000-11AA-AA11-00306543ECAC
977148440 5
977148445 32 Sec GPT table
977148477 1 Sec GPT header
Since disk0
is your boot drive, you can not use the gpt
command without a sudo
and System Integrity Protection (SIP) disabled. An alternative to the gpt
command is a third party tool called driveinfo. If you use this tool, you will not need to disable SIP or use a sudo
. Below is the output from this command. Here, the units are in bytes.
Marlin:driveinfo davidanderson$ ./driveinfo -rd disk1
Code Size Type Identifier Mounted Name
---- --------------- -------------- ---------- ------- ----
512 PMBR
512 Pri GPT header
16,384 Pri GPT table
3,072 Free Space
314,597,376 EFI disk1s1 No EFI
400,000,000,000 Apple_APFS disk1s2 No
99,985,383,424 Apple_APFS disk1s3 No
2,560 Free Space
16,384 Sec GPT table
512 Sec GPT header
Next, I will enter the command below to create 50 GB of free space. This is similar to what you did.
sudo diskutil apfs resizeContainer disk0s2 350G
The results are shown below.
Marlin:driveinfo davidanderson$ diskutil list disk1
/dev/disk1 (disk image):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme +500.3 GB disk1
1: EFI EFI 314.6 MB disk1s1
2: Apple_APFS Container disk3 350.0 GB disk1s2
3: Apple_APFS Container disk4 100.0 GB disk1s3
Marlin:driveinfo davidanderson$ sudo gpt -r show disk1
start size index contents
0 1 PMBR
1 1 Pri GPT header
2 32 Pri GPT table
34 6
40 614448 1 GPT part - C12A7328-F81F-11D2-BA4B-00A0C93EC93B
614488 683593744 2 GPT part - 7C3457EF-0000-11AA-AA11-00306543ECAC
684208232 97656256
781864488 195283952 3 GPT part - 7C3457EF-0000-11AA-AA11-00306543ECAC
977148440 5
977148445 32 Sec GPT table
977148477 1 Sec GPT header
Marlin:driveinfo davidanderson$ ./driveinfo -rd disk1
Code Size Type Identifier Mounted Name
---- --------------- -------------- ---------- ------- ----
512 PMBR
512 Pri GPT header
16,384 Pri GPT table
3,072 Free Space
314,597,376 EFI disk1s1 No EFI
349,999,996,928 Apple_APFS disk1s2 No
50,000,003,072 Free Space
99,985,383,424 Apple_APFS disk1s3 No
2,560 Free Space
16,384 Sec GPT table
512 Sec GPT header
The 50 GB of free space was created immediately after
disk1s2
. In order to add this free space todisk1s3
, the space would have to occur immediately afterdisk1s3
.
So, to add the 50 GB of free space to disk0s3
you would have to first move this partition up by 50 GB. I do not believe there currently exists software which can move a APFS container. Therefore, you can not move space from one APFS container to another APFS container.
Alternative solutions could include:
- Clone the contents
disk0s3
todisk0s2
. See Geoff Nixon's answer for one such way to clone the contents. - Install a fresh copy of Mojave
in
disk0s2
, then use the Migration Assistant application to copy important data fromdisk0s3
. I should warn you that I have no knowledge if the Migration Assistant will work with two APFS container partitions on the same drive. - Backup
disk0s3
to another drive by using Time Machine or some other means. You could then try restoring todisk0s2
Implementing any of the above solutions would allow you to remove disk0s3
and resize disk0s2
to contain the space originally occupied by both partitions.
Appendix
Often a user needs to know the partitioning of a drive. In particular, were the free space is. The diskutil list disk0
command shows the partitions in ascending order and the size of each partition. However, this command does not show free space. The Disk Utility application does occasionally show free space but the value is often incorrect and does not show where the free space is with respect to the other partitions
So, where is the free space shown? Here are a few ways to determine where the free space is.
- The
sudo gpt -r show /dev/disk0
command will show the logical sector blocks used by each partition. The command will also show the free space between each partition in logical sector block units. In the days of OS X, you could run this command on the boot drives. Starting with macOS, System Integrity Protection (SIP) has to be disabled to do this. - Use the
diskutil info -plist disk0s#
command to retrieve partition number#
start and size byte values. You need to repeat the command for each partition on a drive. Next, you can compile a table similar to the output from thegpt -r show /dev/disk0
command. Basically, free space is any space not allocated to a partition, the Protected Master Boot Record (PMBR) and the GUID Partition Tables (GPT). -
Write a BASH script that would automate way number 2. A free script can be downloaded from this site. Assuming your downloads goto to the default
Downloads
folder, you can get the free space by entering the command shown below. Note: You do not need to entersudo
or disable SIP.~/Downloads/driveinfo-1.0.1/driveinfo -r disk0
A Note about using APFS container partitions
It is not normal to have two APFS container partitions on the same drive. Doing so, defeats one of the principle reasons for the creation of the APFS. If you need two different APFS volumes, the you should create each volume in the same APFS container partition. This is also true, if you want to have two or more different versions of High Sierra and/or Mojave installed.
When you want remove a APFS volume, then the free space is automatically returned to the APFS container. You should not need to enter a sudo diskutil apfs resizeContainer disk0s# 0
command. If you delete a volume containing a version of macOS, then there is some additional clean up that needs to be preformed. The necessary clean up steps are outlined in the accepted answer to the question: Remove macOS from a APFS container?
Solution 2:
I'm not following much of the prior discussion. It looks like you have plenty enough space to consolidate.
Get back your 50G on the first physical partition.
diskutil ap resizeContainer disk0s2 0
-
Restore the logical partition you want to keep from the second APFS container to an additional logical partition on the first container.
asr restore --source /dev/disk2s1 --target /dev/disk1
.This may take some time if it needs to defragment. (If this gives you some trouble (during inversion), you may need to nuke (
diskutil ap deleteVolume
) the Preboot, VM, and Recovery partitions on the second container. I assume that's ok by you, and I haven't actually seen that be an issue for some time.) Mount your new "Mojave Beta" logical partition, the one now on the first container. Make sure it looks right.
Get rid of the second APFS container:
diskutil ap deleteContainer disk0s3
; then remove the physical partition entirely:diskutil eraseVolume free free disk0s3
.And finally, reclaim the remainder of the disk on the first (only) APFS Container once more:
diskutil ap resizeContainer disk0s2 0
.
No? Am I missing something?