btrfs ERROR: error during balancing – No space left on device

My Kubuntu 12.04 system ran out of space on on the root partition and will not boot. The command df -h shows a lot of space available (with only 37% used):

/dev/sda2        45G   17G   29G  37%

The following page indicates that I should run the balance command:

https://btrfs.wiki.kernel.org/index.php/Problem_FAQ#I_get_.22No_space_left_on_device.22_errors.2C_but_df_says_I.27ve_got_lots_of_space

$ sudo btrfs fi balance start -dusage=5 /mount/point

I’m not entirely confident that this is the best approach, but it is the only one I found. However, when I run that command, I get this error:

ERROR: error during balancing '/blah/blah/blah' - No space left on device

I get the same error with:

$ sudo btrfs fi balance start -dusage=1 /mount/point

What is the right solution?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

There are ways to get balance to run in this situation.

sudo btrfs fi show
sudo btrfs fi df /mount/point
sudo btrfs fi balance start -dusage=10 /mount/point

If the balance command ends with “Done, had to relocate 0 out of XX chunks”, then you need to increase the “dusage” percentage parameter till at least one chunk is relocated.

if the balance command fails with:

ERROR: error during balancing '/blah/blah/blah' - No space left on device

You might actually need to delete files from the device to make some room. Then run the balance command again.

However, thanks to Marc’s Blog: btrfs – Fixing Btrfs Filesystem Full Problems here is another option:

One trick to get around this is to add a device (even a USB key will
do) to your btrfs filesystem. This should allow balance to start, and
then you can remove the device with btrfs device delete when the
balance is finished. It’s also been said on the list that kernel 3.14
can fix some balancing issues that older kernels can’t, so give that a
shot if your kernel is old.

Method 2

I have found success with temporarily adding another BTRFS device, whether a spare flash drive, or better yet, a temporary file in RAM or another partition.

For a file in RAM, you’d have to create a RAM disk first. Once you decide on the location, create the file, then briefly add it to the BTRFS storage array. I created a simple script for my own usage (btrfs-balance-add.sh):

#!/bin/sh

FILE="$1"
SIZE="$2"
if [ "$#" -lt 3 ]; then
    LOC="/"
else
    LOC="$3"
fi

btrfs filesystem df "$LOC" # Print old
truncate -s "$SIZE" "$FILE" # If filesystem doesn't support "truncate", then use dd
modprobe loop # in case system hasn't yet loaded support for loopback devices
DEV_LOOP="$(losetup -f)"
losetup "$DEV_LOOP" "$FILE"
btrfs device add -f "$DEV_LOOP" "$LOC"
btrfs balance start -dusage=20 -musage=20 "$LOC" # feel free to tweak these values
btrfs device delete "$DEV_LOOP" "$LOC"
btrfs filesystem df "$LOC" # Print new
losetup -d "$DEV_LOOP"
rm "$FILE"

Usage:

> sudo btrfs-balance-add.sh /mnt/ramdisk/delme.bin 1G /

Method 3

I tried everything in the accepted answer, and Marc’s blog, including incrementing the -dusage parameter and adding another block device, all to no avail. Even after deleting some files and freeing up a little space on the disk which was full, balance was not able to complete. For some reason it always seemed to be moving data onto the nearly full disk. In the end what did work for me was restricting balancing to the full device:

btrfs balance start -ddevid=<dev_id> <path>

where the dev_id can be found with:

btrfs fi show

Method 4

sudo apt-btrfs-snapshot delete-older-than 3d
Deletes snapshots older than 3 days. As you move data around, snapshot data becomes out of place and actual data needs to be written in multiple places on the drive. This removes snapshots pertaining to old data in old locations and frees up those sectors for use again. I also recommend duperemove to deduplicate data and extents on the btrfs filesystem.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x