This took me a while to figure out, so thought I’d write up.
If for whatever reason a do-release-upgrade of Ubuntu fails part way through (say because you’ve used 75% of metadata and btrfs doesn’t seem to fail gracefully ) and you’ve got a working apt-snapshot, after you get everything back in order again it will have left behind a snapshot that you no longer want:
1
2
3
4
root@foo:/# btrfs subvol list /
ID 256 top level 5 path @
ID 257 top level 5 path @home
ID 259 top level 5 path @apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28
So you think to yourself, “ok I can just delete it now”:
1
2
3
4
root@foo:/# btrfs subvol delete @apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28
ERROR: error accessing '@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28'
root@foo:/# btrfs subvol delete /@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28
ERROR: error accessing '/@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28'
… hmm the obvious things don’t work.
Turns out when a subvolume (in this case “@”) is mounted the snapshot subvolumes aren’t mounted anywhere and you actually have to give a place where it’s visible as a subvolume (not a direct mount).
Because that sentence made no sense, here’s an example, this doesn’t work:
1
2
3
4
root@foo:~# mkdir /@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28
root@foo:~# mount -t btrfs -o subvol=@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28 /dev/mapper/foo-root /@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28
root@foo:~# btrfs subvol delete @apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28
ERROR: error accessing '@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28'
because I’ve mounted the subvolume I want to delete and I’m giving the top of a FS to the subvolume delete command.
Instead, here’s what does work (even with the FS already mounted on /), create somewhere to mount it:
1
root@foo:/# mkdir /mnt/tmp
Mount it:
1
root@foo:/# mount /dev/mapper/foo-root /mnt/tmp
Show that the subvolumes are all available as directories under the mount point:
1
2
3
4
5
root@foo:/# ls -l /mnt/tmp/
total 0
drwxr-xr-x 1 root root 292 Mar 8 10:26 @
drwxr-xr-x 1 root root 240 Feb 21 08:31 @apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28
drwxr-xr-x 1 root root 14 Mar 8 10:24 @home
Delete it:
1
2
root@foo:/# btrfs subvol delete /mnt/tmp/@apt-snapshot-release-upgrade-quantal-2013-03-07_21\:34\:28
Delete subvolume '/mnt/tmp/@apt-snapshot-release-upgrade-quantal-2013-03-07_21:34:28'
Hooray! It didn’t error this time, it also actually worked:
1
2
3
root@foo:/# btrfs subvol list /
ID 256 top level 5 path @
ID 257 top level 5 path @home
Clean up:
1
root@foo:/# umount /mnt/tmp