Something taking up 90GB of storage in MacOS Catalina 10.15 Beta
I cracked the code!
Preface
This seems to have worked fine for me, but there are no guarantees. DO NOT PROCEED WITHOUT A BACKUP OF YOUR DATA. Then again, you know that, you voluntarily installed a beta operating system. 😜
The root of this issue seems to be a failure in deleting APFS snapshots made by Time Machine. Under healthy operation, old snapshots are deleted as necessary whenever new disk space is required. However, this process failed, as we'll see below.
Symptoms
- Deleting files doesn't increase free space on the disk.
- Daisy Disk reports a large "hidden space". Deleting a file of X bytes would increase the size of this "hidden space" by X bytes.
First try thinning
Firstly, I would try to manually thin out the Time Machine snapshots. This requests Time Machine to automatically clean out enough snapshots to free a desired amount of space, in this case, 100 GB.
$ tmutil thinlocalsnapshots 100g 1
If this succeeded, it should say something like
Thinned local snapshots:
com.apple.TimeMachine.2019-06-21-141250.local
Listing some number of deleted snapshots. However, I doubt this will help. If the system could get this to work automatically, I don't see why manually invoking it would help. But YMMV, so it's worth a shot.
Manual snapshot deletion
After some number of snapshots were deleted, some space was freed up, but not much. the issue is that deleting any number of snapshots won't matter if even one snapshot exists holding onto the same data. In my case, there were two snapshots remaining that persisted even after thinning:
$ tmutil listlocalsnapshotdates
Snapshot dates for all disks:
2019-06-11-214224
2019-06-21-233121
I tried manually deleting these:
$ sudo tmutil deletelocalsnapshots 2019-06-21-233121
Deleted local snapshot '2019-06-21-233121'
$ sudo tmutil deletelocalsnapshots 2019-06-11-214224
Deleted local snapshot '2019-06-11-214224'
The response says they were deleted, but they actually weren't:
$ tmutil listlocalsnapshotdates
Snapshot dates for all disks:
2019-06-11-214224
2019-06-21-233121
At this point, I start going the nuclear route: directly using diskutil
to delete the APFS snapshots, without Time Machine's blessing to do so. First, I listed the APFS snapshots to see their UUIDs:
$ sudo diskutil apfs listSnapshots /System/Volumes/Data
Snapshots for disk1s1 (2 found)
|
+-- BFD78F4F-99BB-4D5B-AE16-5367DC9C615E
| Name: com.apple.TimeMachine.2019-06-11-214224.local
| XID: 10440723
| Purgeable: Yes
|
+-- 611E5357-8D10-4ABE-95F3-BE98C2DFCA3F
Name: com.apple.TimeMachine.2019-06-21-233121.local
XID: 10492913
Purgeable: Yes
NOTE: This snapshot limits the minimum size of APFS Container disk1
Then I tried deleting them manually:
$ sudo diskutil apfs deleteSnapshot disk1s1 -uuid BFD78F4F-99BB-4D5B-AE16-5367DC9C615E
Deleting APFS Snapshot BFD78F4F-99BB-4D5B-AE16-5367DC9C615E "com.apple.TimeMachine.2019-06-11-214224.local" from APFS Volume disk1s1
Started APFS operation
Error: -69863: Insufficient privileges
Strangely, even though I'm using sudo
to run the command as root, I'm told I have insufficient privileges. This might have something to do with the read-onliness of the system volume, or to do with it being the actively booted volume, but I don't know.
Going nuclear
I loaded up into recovery mode, and went to the command line. From there, I did a similar process to try to delete the snapshots. However, this required first unlocking and mounting the relevant volumes.
Running
diskutil list
, I found that my data and system volumes were assigned the labelsdisk1s1
anddisk2s5
, respectively.-
I think (I don't remember precisely) unlocked the volumes with:
-bash-3.2# diskutil apfs unlockVolume disk1s1 Password: -bash-3.2# diskutil apfs unlockVolume disk1s5 Password:
-
Then I mounted them:
-bash-3.2# diskutil mount disk1s1 -bash-3.2# diskutil mount disk1s5
-
I listed their snapshots:
-bash-3.2# diskutil apfs listSnapshots disk2s1 Snapshots for disk2s1 (2 found) | +-- Name: com.apple.TimeMachine.2019-06-11-214224.local | XID: 10440723 | +-- Name: com.apple.TimeMachine.2019-06-21-233121.local XID: 10492913 NOTE: This snapshot sets the minimal allowed size of APFS Container disk2 -bash-3.2# diskutil apfs listSnapshots disk2s5 Snapshot for disk2s5 (2 found) | +-- Name: com.apple.TimeMachine.2019-06-11-214224.local | XID: 187251 | +-- Name: com.apple.TimeMachine.2019-06-21-233121.local XID: 10492911 NOTE: This snapshot sets the minimal allowed size of APFS Container disk2
-
I tried deleting the snapshots by their "XID", but that didn't seem to work for all of them, so I instead deleted them by name:
-bash-3.2# diskutil apfs deleteSnapshot disk2s1 -name com.apple.TimeMachine.2019-06-11-214224.local Deleting APFS Snapshot XID 10440723 "com.apple.TimeMachine.2019-06-11-214224.local" from APFS Volume disk2s1 Started APFS operation Finished APFS operation -bash-3.2# diskutil apfs deleteSnapshot disk2s1 -name com.apple.TimeMachine.2019-06-21-233121.local Deleting APFS Snapshot XID 10492913 "com.apple.TimeMachine.2019-06-21-233121.local" from APFS Volume disk2s1 Started APFS operation Finished APFS operation -bash-3.2# diskutil apfs deleteSnapshot disk2s5 -name com.apple.TimeMachine.2019-06-11-214224.local Deleting APFS Snapshot XID 187251 "com.apple.TimeMachine.2019-06-11-214224.local" from APFS Volume disk2s5 Started APFS operation Finished APFS operation -bash-3.2# diskutil apfs deleteSnapshot disk2s5 -name com.apple.TimeMachine.2019-06-21-233121.local Deleting APFS Snapshot XID 10492911 "com.apple.TimeMachine.2019-06-21-233121.local" from APFS Volume disk2s5 Started APFS operation Finished APFS operation
-
Once this was done, I confirmed that the snapshots were gone:
-bash-3.2# diskutil apfs listSnapshots disk2s1 No snapshots for disk2s1 -bash-3.2# diskutil apfs listSnapshots disk2s5 No snapshots for disk2s5
And I confirmed that the space was in fact freed with
diskutil apfs list
.I restarted, and my Mac was back to normal. The space of all of the files I previously deleted is now visible and available.
And they lived happily ever after...
Did you tell the installer to go ahead and copy any of your user data to the newly installed system? If yes, it's probably worth checking for expanded sparse files or sparse bundles/disk images. - Depending on the wisdom of the copying program, sparse files or bundles might have gotten expanded to their full glory, and take up "real" disk space now. Good candidates for sparse files on MacOS are sparse disk images, where the "room for expansion" got reserved during creation, but wasn't supposed to be taking up any space until filled with data. A simple copy can expand it as well...
To identify large files to inspect, you could use find
:
-
find / -type f -size +2G -ls
would list every file exceeding a 2 GB threshold. -
if you want the output sorted by the size of those files, just add sort, and tell it to take the 7th column and display the results largest first (
head
further limits the output to the largest 20 of the bunch, to keep you from getting spammed):find / -type f -size +2G -ls | sort -k7 -r |head -20
Given the amount of space you're wondering about, chances are that this search would pop up the culprit. If it's something that was copied over from another installation, you could compare the space the file "really" takes up on disk by running du -sh </path/to/file>
for both files. If it's smaller on the source side, re-copy it with a tool that keeps sparse files intact.
To identify by directory:
If you're more of a visual person, you could use a graphic tool to display the space taken up by directories, and drill down from there:
- Disk Inventory X has been around forever, is free, and still actively maintained, while
- Daisy Disk offers a modern interface, and a "free trial".
Unfortunately (as you've experienced) those tools only give a vague idea where large files may lie in hiding, but those can often serve as starting point for the commandline-based examinations.
If you prefer to examine the directories from the command line, you can find the large ones using find
and du
:
-
find / -type d -exec du -sh {} \; |grep "G "
("G "
needs to be entered as Gcrtl-v<tab>
to search forG<tab>
) will list out all directories which are at least one G in size. Note that this will sum up nested directories several times depending on their nesting level (it will sum up /usr, /usr/local /usr/local/bin /usr/local/etc without trying to optimize the process).
It'd be interesting to hear back from you when you've identified the culprit!
@Alexander @Mane Manero
As the tmutil
usages shown:
Usage: tmutil deletelocalsnapshots [<mount_point> | <snapshot_date>]
You should feel free to delete snapshots using this command without sudo
and recovery mode
:
➜ ~ tmutil deletelocalsnapshots /System/Volumes/Data
Deleted 5 Time Machine local snapshots for volume group containing disk '/System/Volumes/Data'
com.apple.TimeMachine.2019-10-09-234112.local
com.apple.TimeMachine.2019-10-09-200334.local
com.apple.TimeMachine.2019-10-09-220434.local
com.apple.TimeMachine.2019-10-09-210802.local
com.apple.TimeMachine.2019-10-10-162541.local