btrfs 错误:平衡期间出错 - 设备上没有剩余空间

btrfs 错误:平衡期间出错 - 设备上没有剩余空间

我的 Kubuntu 12.04 系统根分区空间不足,无法启动。该命令df -h显示大量可用空间(仅使用了 37%):

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

以下页面指示我应该运行balance命令:

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

我并不完全相信这是最好的方法,但这是我发现的唯一方法。但是,当我运行该命令时,出现以下错误:

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

我得到同样的错误:

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

什么是正确的解决方案?

答案1

在这种情况下,有一些方法可以balance逃跑。

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

如果balance命令以“Done, had to relocate 0 out of XX chunks”结尾,那么您需要增加“dusage”百分比参数,直到至少重新定位一个块。

如果balance命令失败并显示:

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

您实际上可能需要从设备中删除文件以腾出一些空间。然后再次运行平衡命令。

不过,感谢Marc 的博客:btrfs - 修复 Btrfs 文件系统完整问题这是另一种选择:

解决这个问题的一个技巧是向您的 btrfs 文件系统添加一个设备(甚至 USB 密钥也可以)。这应该允许开始平衡,然后您可以在平衡完成时使用 btrfs device delete 删除设备。列表中还提到,内核 3.14 可以解决一些旧内核无法解决的平衡问题,因此,如果您的内核较旧,请尝试一下。

答案2

我发现临时添加另一个 BTRFS 设备(无论是备用闪存驱动器还是更好)取得了成功,RAM 或其他分区中的临时文件

对于 RAM 中的文件,您必须创建 RAM 磁盘第一的。决定位置后,创建文件,然后将其简单添加到 BTRFS 存储阵列中。我创建了一个简单的脚本供我自己使用(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"

用法:

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

答案3

我尝试了接受的答案和马克的博客中的所有内容,包括增加参数-dusage和添加另一个块设备,但都无济于事。即使删除了一些文件并释放了已满的磁盘上的一点空间,balance也无法完成。由于某种原因,它似乎总是将数据移动到几乎已满的磁盘上。最后对我有用的是限制整个设备的平衡:

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

可以通过以下方式dev_id找到:

btrfs fi show 

答案4

sudo apt-btrfs-snapshot 删除-旧于 3d 删除超过 3 天的快照。当您移动数据时,快照数据会变得不合适,而实际数据需要写入驱动器上的多个位置。这将删除与旧位置中的旧数据相关的快照,并释放这些扇区以供再次使用。我还建议使用 duperemove 对 btrfs 文件系统上的数据和范围进行重复数据删除。

相关内容