Freeing up local disk space

It turns out that iCloud does not necessarily free up disk space, even when you ask it to.

It turns out that iCloud does not necessarily free up disk space, even when you ask it to.

I wanted to add a virtual machine, which required a lot of free disk space, so I started freeing up space by removing local downloads.

I cleared a bunch of videos and large pdf files I had used for presentations and quickly freed up 100GiB which should be plenty for the virtual machine I was going to need.

Annoyingly, freeing up disk space does not actually free up disk space. Even though Disk Utility reported that I had more than a 100GiB free, Parallels insisted that I didn't.

Investigating

Starting to wonder what was going on, I went to df to try to figure out what was going on, and found out that there is a discrepancy between what Disk Utility says and what df says:

It appears that despite my cleaning up, the files still claimed the space they originally used. To get around this, I needed to force the file system to release the resources.

What happens is that iCloud optimizes storage on demand when the disk starts to fill up, but if I need a lot of storage available to even start a process then I am stuck with a situation where I cannot use the disk space because it is only going to get freed up on demand, even if it is available.

Workaround

To work around this, I created a large file with a utility that does not care about free disk space before it starts writing. I created a file with 30GB-ish of all zeroes using dd and then promptly deleted it once it was created:

Lo and behold: Suddenly, free disk space balooned from 17GiB to 67GiB!

Results

A generalized utility to release claimed disk space could look like this:

#!/usr/bin/env bash

spin()
{
  spinner="/|\\-/|\\-"
  while :
  do
    for i in `seq 0 7`
    do
      echo -n "${spinner:$i:1}"
      echo -en "\010"
      sleep 0.2
    done
  done
}

avail()
{
  df -h | sed -n 2p | awk '{print $4}'
}

echo "Space available before reclaiming disk space: $(avail)"

spin &
spin_pid=$!

cd $TMPDIR
filename=zeroes.$$

dd if=/dev/zero \
    of=$filename \
    count=524288000 \
    bs=1024 >/dev/null 2>&1
rm -f $filename

kill $spin_pid
wait $spin_pid

echo -en "\010"
echo -n "Space available after reclaiming disk space:  $(avail)"
echo ""

Now you too can reclaim disk space used by iCloud files.

Mastodon