APFSのディスクを拡張する


なんで?

  • 240GBのSSDの内容を500GBのSSDに dd で丸コピーした
  • しかし、500GBのSSDで起動してみると容量が240GBのままで困った。

最初に

  • ディスクの容量を実際に変更するコマンドを実行中は、システムが応答を停止します。
  • おそらく、ディスクアクセスがすべてブロックされていると思われます。

どうすればいいか

現状確認

sudo diskutil list

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         239.8 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +239.8 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume MacOS                   52.8 GB    disk1s1
   2:                APFS Volume Preboot                 268.8 MB   disk1s2
   3:                APFS Volume Recovery                1.1 GB     disk1s3
   (略)

disk0の2番、Container disk1 の容量がディスクの容量と一致していない。

拡張

sudo diskutil apfs resizeContainer disk1 0

disk1 は APFS Containerの方。上記の表示でいう synthesized されたディスクの番号を指定する。 /dev/disk1 ではない。
次の 0 はサイズ変更 +100g とかが指定できる。 0 を指定すると最大容量まで拡張する。

Started APFS operation
Aligning grow delta to 260,050,452,480 bytes and targeting a new physical store size of 499,898,105,856 bytes
Determined the maximum size for the targeted physical store of this APFS Container to be 499,897,077,760 bytes
Resizing APFS Container designated by APFS Container Reference disk1
The specific APFS Physical Store being resized is disk0s2
Verifying storage system
Using live mode
Performing fsck_apfs -n -x -l /dev/disk0s2
Checking the container superblock
Checking the EFI jumpstart record
Checking the space manager
Checking the space manager free queue trees
Checking the object map
Checking the encryption key structures
Checking volume /dev/rdisk1s1
Checking the APFS volume superblock
Checking the object map
Checking the snapshot metadata tree
Checking the snapshot metadata
Checking the document ID tree
Checking the fsroot tree
Checking the extent ref tree
Verifying volume object map space
The volume /dev/rdisk1s1 appears to be OK
Checking volume /dev/rdisk1s2
Checking the APFS volume superblock
Checking the object map
Checking the snapshot metadata tree
Checking the snapshot metadata
Checking the fsroot tree
Checking the extent ref tree
Verifying volume object map space
The volume /dev/rdisk1s2 appears to be OK
Checking volume /dev/rdisk1s3
Checking the APFS volume superblock
Checking the object map
Checking the snapshot metadata tree
Checking the snapshot metadata
Checking the fsroot tree
Checking the extent ref tree
Verifying volume object map space
The volume /dev/rdisk1s3 appears to be OK
Checking volume /dev/rdisk1s4
Checking the APFS volume superblock
Checking the object map
Checking the snapshot metadata tree
Checking the snapshot metadata
Checking the fsroot tree
Checking the extent ref tree
Verifying volume object map space
The volume /dev/rdisk1s4 appears to be OK
Checking volume /dev/rdisk1s5
Checking the APFS volume superblock
Checking the object map
Checking the snapshot metadata tree
Checking the snapshot metadata
Checking snapshot 1 of 1 (com.apple.os.update-018EB80C949FBD899...)
Checking the fsroot tree
Checking the file extent tree
Checking the extent ref tree
Verifying volume object map space
The volume /dev/rdisk1s5 appears to be OK
Checking volume /dev/rdisk1s6
Checking the APFS volume superblock
Checking the object map
Checking the snapshot metadata tree
Checking the snapshot metadata
Checking the fsroot tree
Checking the extent ref tree
Verifying volume object map space
The volume /dev/rdisk1s6 appears to be OK
Verifying allocated space
The container /dev/disk0s2 appears to be OK
Storage system check exit code is 0
Growing APFS Physical Store disk0s2 from 239,847,653,376 to 499,898,105,856 bytes
Modifying partition map
Growing APFS data structures
Finished APFS operation

再度確認

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         239.8 GB   disk0s2
                                                         ~~~~~~~~

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +239.8 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume MacOS                   52.8 GB    disk1s1
   2:                APFS Volume Preboot                 268.8 MB   disk1s2
   3:                APFS Volume Recovery                1.1 GB     disk1s3
   4:                APFS Volume VM                      1.1 MB     disk1s4
   5:                APFS Volume macSSD                  15.2 GB    disk1s5
   6:              APFS Snapshot com.apple.os.update-... 15.2 GB    disk1s5s1

まだ、disk0s2が239.8GBになっている。このサイズはdisk1s0のサイズなのでここを拡張しないと実際に使用可能な容量が増えない。

拡張(その2)

repairdiskを実行

これを実行しないと次の拡張が意味不明なエラーで失敗する(容量が足りない。のようなエラー)

sudo diskutil repairdisk disk0

最初の質問がかなり怖いが、おそらく実際はデータが壊れることはないと思われる…
し、これを行うということは以前のディスクが残っているはずなので最悪どうにかなるでしょう。
(逆に言えばどうにもならなくなるのであればバックアップ取ってからにしましょう)

Repairing the partition map might erase disk0s1, proceed? (y/N) y
Started partition map repair on disk0
Checking prerequisites
Checking the partition list
Adjusting partition map to fit whole disk as required
Checking for an EFI system partition
Checking the EFI system partition's size
Checking the EFI system partition's file system
Repairing the EFI system partition's file system
Checking file system and repairing if necessary and if possible
Volume is already unmounted
Performing fsck_msdos -y /dev/rdisk0s1
** /dev/rdisk0s1
** Phase 1 - Preparing FAT
** Phase 2 - Checking Directories
** Phase 3 - Checking for Orphan Clusters
Found orphan cluster(s)
Fix? yes
Marked 116 clusters as free
Free space in FSInfo block (363872) not correct (363988)
Fix? yes
813 files, 181994 KiB free (363988 clusters)

***** FILE SYSTEM WAS MODIFIED *****
File system check exit code is 0
Restoring the original state found as unmounted
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 has been repaired
Finished partition map repair on disk0

本当に拡張

sudo diskutil apfs resizeContainer disk0s2 0

Started APFS operation
Aligning grow delta to 260,050,452,480 bytes and targeting a new physical store size of 499,898,105,856 bytes
Determined the maximum size for the targeted physical store of this APFS Container to be 499,897,077,760 bytes
長いので略
Finished APFS operation

最終確認

diskutil list

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         499.9 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +499.9 GB   disk1
                                 Physical Store disk0s2

容量が変更されました。お疲れさまでした。

蛇足

使わなかったコマンド

sudo diskutil apfs resizeContainer disk0s2 limits

Resize limits for APFS Physical Store partition disk0s2:
  Current Physical Store partition size on map:   239.8 GB (239847653376 Bytes)
  Minimum (constrained by file/snapshot usage):   75.9 GB (75942068224 Bytes)
  Recommended minimum (if used with macOS):       86.7 GB (86679486464 Bytes)
  Maximum (constrained by partition map space):   499.9 GB (499897077760 Bytes)

repairdiskを実行しないと

sudo diskutil apfs resizeContainer disk0s2 0
sudo diskutil apfs resizeContainer disk0s2 499.9g

The size (499.9g) must not be greater than the partition map allocatable size

だめである。 ちなみに容量をもっと減らしても同じエラーがでる。