37

I have my /home on a BTRFS partition and I need to shrink it.

Unfortunately, Gparted does not have the resize option for this FS.

Can I resize it in any other way without losing my data?

1

4 Answers 4

26

According to this page in the btrfs wiki:

To shrink the filesystem by 4 GiB: btrfs filesystem resize -4g /mnt or btrfsctl -r -4g /mnt Set the FS size . To set the filesystem to a specific size, omit the leading + or - from the size.

The btrfs and btrfsctl commands in Ubuntu is provided by the package called btrfs-utils, which you can install in the Software Center. You run these commands in the Terminal (Ctrl+Alt+T). Replace 4g by however much you really want to shrink the partition, and /mnt by the mount point of the partition. For example, to shrink a btrfs partition mounted at /media/Alpha by 500 MiB, you would run:

btrfs filesystem resize -500m /media/Alpha

Or:

btrfsctl -r -500m /media/Alpha

Assuming the guidelines for resizing btrfs filesystems are the same as for other filesystems, you should avoid resizing a partition that is on the same physical disk as the running system. So, if necessary, boot from a live system to resize a partition on the drive that has your installed Ubuntu system. (This applies to resizing done in GParted, too.)

If some utilities or applications don't see the results of the resizing operation when it is performed, rebooting is a good idea.

See the btrfs and btrfsctl manual pages for more details about the use of these commands. And hopefully the btrfs wiki will be back up soon.

I am not personally very familiar with btrfs filesystems, but it seems strange to me that these resize commands take the mount point of the filesystem rather than the device name. If anyone can explain that, please comment or feel free to edit this answer to improve it.

7
  • It does seem strange, so I need to have to volume mounted to resize it? I always thought that it's much safer to do so with unmounted volumes... Anyway thanks for your answer!
    – Borsook
    Nov 3, 2011 at 16:38
  • 18
    The commands listed resize only the filesystem, not the partition. That's why they work on a mounted system. Once you've resized the FS you should be able to use your favourite partition management tool to change the size of the actual partition. But, the latest gparted will just do it all for you, so there's little reason to bother.
    – Perkins
    May 14, 2012 at 22:23
  • Is there a way to resize from the front so a separate lengthy move operation wouldn't be neccessary?
    – Paul
    Jun 1, 2020 at 18:52
  • 1
    @Perkins to shrink the partition by 500M as well afterwards use (substitute the device and size) parted -a opt /dev/sdX "resizepart 3 -500m". The 3 is the partition number, i.e. /dev/sdX3.
    – Hi-Angel
    Aug 3, 2022 at 12:10
  • @Hi-Angel If that's your favorite partition management tool, go for it! :D
    – Perkins
    Aug 30, 2022 at 1:13
20

According to the GParted features page, btrfs shrink is supported. If the option isn't available, installing the btrfs-tools package may fix it. If that doesn't work, it could be because Ubuntu includes an older version of GParted, in which case you could use the GParted Live CD:

http://gparted.sourceforge.net/livecd.php

(which is also how Ubuntu recommends using it anyway)

0
3

This isn't a direct answer to the question, it's for people who land here from a google search, wondering if you can do an online shrink of / - yes, you can

I needed more swap, and btrfs doesn't allow you to run swap from a file, so I had to shrink / and recreate partitions (carefully). Here is what I did, bearing in mind I wanted an extra 64G of swap:

sudo btrfs filesystem resize -96g /
sudo fdisk /dev/nvme0n1

I had 2 partitions, 1 for / and the other for swap. Deleted both, then recreated (before a reboot!). Old size of partition 1 was 867.5G and new size was 803.5, giving an extra 64G for the swap partition. When it asks if you want to overwrite the btrfs signature, say NO! If you're doing swap as I was, you'll need to change "type" of the swap partition to "82", either when creating, or afterwards using the "t" command

After reboot, I ran

sudo btrfs filesystem resize max /

df -h then reports:

/dev/nvme0n1p1  804G  498G  305G  63% /

So, the reason I shrank the filesystem by 96G initially, was because different tools calculate G and M slightly differently, so it's to make super sure the filesystem doesn't get clobbered by the new partition being slightly smaller than the filesystem on it!

After reboot, if you've changed your swap partition, you will also need to run mkswap on it e.g. sudo mkswap /dev/nvme0n1p2 and either "swapon" or reboot again

This should possibly go at the top of the answer, but needless to say, you run a set of the above commands at your own risk, and you should make sure any important files are backed up in case something goes wrong and you lose the whole filesystem! I hope this helps someone!

1
  • Good answer, I might suggest adding some info on not changing the start sector of the btrfs partition when deleting/recreating it using fdisk. Not necessary in your case as your btrfs partition was 1 but may not be so for others. To prevent these issues, I recommend using LVM in the future. Aug 20, 2023 at 12:03
1

Use this command to install btrfs support in GParted:

sudo apt install btrfs-progs

After that you can easily shrink and resize your partition in GParted. This way you can do all the work in GUI. No command line needed

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .