我的 Kubuntu 12.04 系统根分区空间不足,无法启动。该命令df -h
显示大量可用空间(仅使用了 37%):
/dev/sda2 45G 17G 29G 37%
以下页面指示我应该运行balance命令:
$ 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 文件系统上的数据和范围进行重复数据删除。