如何调整 APFS 卷的大小以回收其容器内的所有空间?

如何调整 APFS 卷的大小以回收其容器内的所有空间?

我在 MacOS 10.14.6 上运行 MacPro 5,1,使用 500gb 三星 SSD 作为启动/主机驱动器。我最近用完了 500gb 固态硬盘上的空间,所以我指定了一个相同的 1tb 固态硬盘。

对我来说,全新安装不是一个选择,因此我使用 clonezilla 对新驱动器进行块复制(使用新手设置,全部为默认设置)。复制完成后,我从新的 1TB 驱动器启动,磁盘实用程序显示物理磁盘的完整 1TB,但 APFS 容器和卷的大小仍为 500GB,完全否定了我的升级 =(

这就是奇怪的地方。几个月前我曾尝试过这个,所以我不记得我做了什么或在哪里找到相关文档,但不知何故,我设法将容器大小调整为 1TB,但 APFS 卷大小从未改变,因为我仍然没有可用的磁盘空间(500GB)。如果有帮助的话,我觉得我隐约记得使用 GParted 的一个功能来实现这一点,但除此之外我什么都不记得了。

我该如何解决这个问题?就上下文而言,我的启动驱动器是 disk2,APFS 容器的物理存储位于 disk2s2。我尝试执行,resizeContainer disk2s2 0希望它能以某种方式意识到不匹配并修复 APFS 卷大小,但没有成功。我还尝试过,resizeContainer disk2s2 500g目的是将容器缩小到 500gb,然后resizeContainer disk2s2 0再次重试,并正确回收驱动器上未使用的 500gb。我将展示这两个的输出以及diskutil listdiskutil apfs list(缩写,我有很多其他驱动器哈哈),以及我在磁盘工具中看到的内容。

任何见解都非常感谢,因为我对此一头雾水。谢谢!

$ diskutil list
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                 Apple_APFS Container disk3         1000.0 GB  disk2s2

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +499.9 GB   disk3
                                 Physical Store disk2s2
   1:                APFS Volume JBax Mac Pro            484.6 GB   disk3s1
   2:                APFS Volume Preboot                 44.5 MB    disk3s2
   3:                APFS Volume Recovery                1.0 GB     disk3s3
   4:                APFS Volume VM                      3.2 GB     disk3s4

$ diskutil apfs list
APFS Container (1 found)
|
+-- Container disk3 C2500AD1-3713-42B3-847F-663C77A85C86
    ====================================================
    APFS Container Reference:     disk3
    Size (Capacity Ceiling):      499898105856 B (499.9 GB)
    Capacity In Use By Volumes:   489041268736 B (489.0 GB) (97.8% used)
    Capacity Not Allocated:       10856837120 B (10.9 GB) (2.2% free)
    |
    +-< Physical Store disk2s2 D63FD546-5CC2-4EB7-B5E7-8DA660BA026B
    |   -----------------------------------------------------------
    |   APFS Physical Store Disk:   disk2s2
    |   Size:                       999995133440 B (1000.0 GB)
    |
    +-> Volume disk3s1 66E7E184-D546-4493-854D-92632DF1A94D
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk3s1 (No specific role)
    |   Name:                      JBax Mac Pro (Case-insensitive)
    |   Mount Point:               /
    |   Capacity Consumed:         484590370816 B (484.6 GB)
    |   FileVault:                 No
    |
    +-> Volume disk3s2 42F434F9-B33D-423F-99C1-F7B04B2EE0C1
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk3s2 (Preboot)
    |   Name:                      Preboot (Case-insensitive)
    |   Mount Point:               Not Mounted
    |   Capacity Consumed:         44486656 B (44.5 MB)
    |   FileVault:                 No
    |
    +-> Volume disk3s3 26827351-189E-4ECB-983F-738A825FAD80
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk3s3 (Recovery)
    |   Name:                      Recovery (Case-insensitive)
    |   Mount Point:               /Volumes/Recovery 1
    |   Capacity Consumed:         1023565824 B (1.0 GB)
    |   FileVault:                 No
    |
    +-> Volume disk3s4 C571DD11-615E-43CF-BFC0-7FBEC0321EA7
        ---------------------------------------------------
        APFS Volume Disk (Role):   disk3s4 (VM)
        Name:                      VM (Case-insensitive)
        Mount Point:               /private/var/vm
        Capacity Consumed:         3221385216 B (3.2 GB)
        FileVault:                 No

磁盘工具的截图: 1. 磁盘工具-物理驱动器 2. 磁盘工具-容器

现在,当我们尝试操纵容器的大小时,会发生以下情况:

$ sudo diskutil apfs resizeContainer disk2s2 0
Password:
Started APFS operation
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

这是我尝试的第二种方法,尝试缩小然后回收:

$ sudo diskutil apfs resizeContainer disk2s2 500g
Started APFS operation
Aligning shrink delta to 499,995,135,488 bytes and targeting a new physical store size of 499,999,997,952 bytes
Determined the minimum size for the targeted physical store of this APFS Container to be 499,898,105,856 bytes
Error: -69605: There is not enough free space in the APFS Container for this operation

答案1

我认为您在 Mojave 的 macOS Recovery 中需要输入的命令如下所示。我建议您查看示例,然后确认 409640 和 1953115495 的值是否正确。此外,disk2启动到 macOS Recovery 时驱动器的标识符可能不正确。

gpt -f remove -b 409640 disk2
gpt -f add -b 409640 -s 1953115495 -t apfs disk2
diskutil apfs resizecontainer disk2s2 0

一个例子

目标是将 APFS 容器扩展到尽可能大的尺寸,在本例中就是包含 APFS 分区的当前大小。

以下是完成目标所采取的步骤。

  1. 重新启动 Mojave 的 macOS Recovery。

  2. 打开终端窗口。输入下面给出的命令来确认版本是 Mojave。

    sw_vers
    

    下面给出了示例输出。

    ProductName:    Mac OS X
    ProductVersion: 10.14.6
    BuildVersion:   18G103
    
  3. 输入以下命令以获取所需的标识符。

    diskutil list internal
    

    以下示例输出显示disk0s2是 1.1 TB APFS 分区的标识符。一个 500.0 GB 的 APFS 容器(标识符为)disk1位于此分区的开头。该容器当前有 4 个 APFS 卷,标识符disk1s1disk1s4

    /dev/disk0 (internal, physical):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *1.1 TB     disk0
       1:                        EFI EFI                     209.7 MB   disk0s1
       2:                 Apple_APFS Container disk1         1.1 TB     disk0s2
    
    /dev/disk1 (synthesized):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      APFS Container Scheme -                      +500.0 GB   disk1
                                     Physical Store disk0s2
       1:                APFS Volume Example Mac             19.0 GB    disk1s1
       2:                APFS Volume Preboot                 45.4 MB    disk1s2
       3:                APFS Volume Recovery                510.4 MB   disk1s3
       4:                APFS Volume VM                      20.5 KB    disk1s4
    
  4. 输入下面给出的命令来确定驱动器的扇区大小和分区的起始扇区disk0s2Device Block Size是驱动器的扇区大小(以字节为单位)。 以字节为单位Partition Offset除以驱动器的扇区大小(以字节为单位)等于分区的起始扇区disk0s2

    diskutil info disk0s2 | grep  -e Offset -e "Block Size"
    

    下面的输出显示驱动器的扇区大小为 512 字节,409640 是分区的起始扇区disk0s2

       Partition Offset:          209735680 Bytes (409640 512-Byte-Device-Blocks)
       Device Block Size:         512 Bytes
    

    注意:如果Device Block Size为 4096 字节,则Partition Offset需要将 512 字节设备块中的除以 8 才能确定分区的起始扇区disk0s2

  5. 输入下面给出的命令来确定disk1容器的扇区大小。在此示例中,disk1s1指定了卷。实际上,容器中任何卷的标识符disk1都可以替代。Disk Size以字节为单位除以驱动器的扇区大小(以字节为单位)等于容器的扇区大小disk1

    diskutil info disk1s1 | grep "Disk Size"
    

    下面的输出显示disk1容器大小为 976562496 个扇区。

       Disk Size:                 500.0 GB (499999997952 Bytes) (exactly 976562496 512-Byte-Units)
    

     

    注意:如果Device Block Size上一步中的是 4096 字节,则Disk Size需要将 512 字节设备块中的除以 8 才能确定disk1容器的扇区大小。

    disk1确定容器扇区大小的替代方法

    当容器中没有卷时,此替代方法很有用。输入下面给出的命令来确定Size (Capacity Ceiling)字节数,这也是容器的大小(以字节为单位)disk1

    diskutil apfs list disk1 | grep Ceiling
    

    下面的示例输出显示disk1容器的大小为 499999997952 字节/每扇区 512 字节 = 976562496 个扇区。

        Size (Capacity Ceiling):      499999997952 B (500.0 GB)
    
  6. 输入以下两个命令将分区的大小更改disk0s2为容器的大小disk1。第一个命令如下所示。此命令disk0s2从驱动器的 GUID 分区表 (GPT) 中删除分区disk0。的值是步骤 4 中确定的分区409640的起始扇区。disk0s2

    gpt -f remove -b 409640 disk0
    

    下面给出了示例输出。

    disk0s2 removed
    

    注意:上面显示的可能与命令生成的disk0s2不同。from表示的切片 2 ,而from表示 2 是 的 GUID 分区表 (GPT) 中条目的索引。换句话说,切片编号不必与 GPT 表条目的索引匹配。在此示例中,两者匹配,通常情况如此。disk0s2diskutildisk0s2diskutildisk0disk0s2gptdisk0

    在此示例中,即使 的GPT 中不再存在包含的分区,disk1s1和卷仍保持挂载状态。第二条命令如下所示。此命令将分区重新添加到驱动器的 GPT 中。 的值是在步骤 4 中确定的分区的起始扇区。的值是在步骤 5 中确定的容器的扇区大小。disk1s3disk0s2disk0disk0s2disk0409640disk0s2976562496disk1

    gpt -f add -b 409640 -s 976562496 -t apfs disk0
    

    下面给出了示例输出。

    disk0s2 added
    

    注意:以上两个gpt命令输出的索引可能不同。在此示例中,两个索引匹配,通常情况如此。

  7. 输入以下命令确认disk0s2分区现在disk1与容器的大小匹配。

    diskutil list internal
    

    下面的示例输出显示disk0s2分区和disk1容器的大小均为 500.0 GB。

    /dev/disk0 (internal, physical):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *1.1 TB     disk0
       1:                        EFI EFI                     209.7 MB   disk0s1
       2:                 Apple_APFS Container disk1         500.0 GB   disk0s2
    
    /dev/disk1 (synthesized):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      APFS Container Scheme -                      +500.0 GB   disk1
                                     Physical Store disk0s2
       1:                APFS Volume Example Mac             19.0 GB    disk1s1
       2:                APFS Volume Preboot                 45.4 MB    disk1s2
       3:                APFS Volume Recovery                510.4 MB   disk1s3
       4:                APFS Volume VM                      20.5 KB    disk1s4
    
  8. 输入下面给出的命令,将disk0s2分区和disk1容器扩展到最大可能的大小。要使此命令起作用,更改必须足够大,在本例中确实如此。

    diskutil apfs resizecontainer disk0s2 0
    

    示例输出如下所示。

    Started APFS operation
    Aligning grow delta to 573,532,069,888 bytes and targeting a new physical store size of 1,073,532,067,840 bytes
    Determined the maximum size for the targeted physical store of this APFS Container to be 1,073,531,039,744 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 -S /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 volume
    Checking the APFS volume superblock
    The volume Example Mac was formatted by diskmanagementd (945.275.7) and last modified by apfs_kext (945.275.7)
    Checking the object map
    Checking the snapshot metadata tree
    Checking the snapshot metadata
    Checking the extent ref tree
    Checking the fsroot tree
    Checking volume
    Checking the APFS volume superblock
    The volume Preboot was formatted by diskmanagementd (945.275.7) and last modified by apfs_kext (945.275.7)
    Checking the object map
    Checking the snapshot metadata tree
    Checking the snapshot metadata
    Checking the extent ref tree
    Checking the fsroot tree
    Checking volume
    Checking the APFS volume superblock
    The volume Recovery was formatted by diskmanagementd (945.275.7) and last modified by apfs_kext (945.275.7)
    Checking the object map
    Checking the snapshot metadata tree
    Checking the snapshot metadata
    Checking the extent ref tree
    Checking the fsroot tree
    Checking volume
    Checking the APFS volume superblock
    The volume VM was formatted by apfs.util (945.275.7) and last modified by apfs_kext (945.275.7)
    Checking the object map
    Checking the snapshot metadata tree
    Checking the snapshot metadata
    Checking the extent ref tree
    Checking the fsroot tree
    Verifying allocated space
    The volume /dev/disk0s2 appears to be OK
    Storage system check exit code is 0
    Growing APFS Physical Store disk0s2 from 499,999,997,952 to 1,073,532,067,840 bytes
    Modifying partition map
    Growing APFS data structures
    Finished APFS operation
    

    输入以下命令确认disk0s2分区和disk1容器现在大小均为 1.1 TB。

    diskutil list internal
    

    下面给出了示例输出。

    /dev/disk0 (internal, physical):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *1.1 TB     disk0
       1:                        EFI EFI                     209.7 MB   disk0s1
       2:                 Apple_APFS Container disk1         1.1 TB     disk0s2
    
    /dev/disk1 (synthesized):
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      APFS Container Scheme -                      +1.1 TB     disk1
                                     Physical Store disk0s2
       1:                APFS Volume Example Mac             19.0 GB    disk1s1
       2:                APFS Volume Preboot                 45.4 MB    disk1s2
       3:                APFS Volume Recovery                510.4 MB   disk1s3
       4:                APFS Volume VM                      20.5 KB    disk1s4
    
  9. 重新启动回到 macOS。

答案2

APFS 卷会自动调整大小。容器显示 1000GB,即整个驱动器,大致如此;卷应显示当前使用的空间。您之前用完了空间,这看起来差不多。

这是我的……[同样的 Mac Pro,同样的操作系统,磁盘安装在 PCI 卡上,这让它认为它是外部的]

/dev/disk6 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk6
   1:                        EFI EFI                     209.7 MB   disk6s1
   2:                 Apple_APFS Container disk7         998.2 GB   disk6s2
   3:                  Apple_HFS eDrive                  25.6 GB    disk6s3

/dev/disk7 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +998.2 GB   disk7
                                 Physical Store disk6s2
   1:                APFS Volume KickMeHard              401.8 GB   disk7s1
   2:                APFS Volume Preboot                 21.2 MB    disk7s2
   3:                APFS Volume VM                      20.5 KB    disk7s3
   4:                APFS Volume Recovery                507.6 MB   disk7s4

相关内容