看到这篇文章,大概都是看到这条错误开始的

wrong fs type, bad option, bad superblock on /dev/sdx, missing codepage or helper program, or other error.

因为nas电源可能不太够,在插入硬盘的时候导致正在读写的主硬盘掉盘了,重启后群辉报错,存储空间只读,ssh上去重新挂载了下是可以挂读写的,因为不可能吧数据全部拷贝出来格式化,因为网上几乎0资料,摸索到凌晨3点,下面记录一下修复操作

ssh上去,换成root权限来执行

sudo su

检查一下错误日志

dmesg | grep BTRFS

发现有以下错误

btrfs error (device dm-2): qgroup generation mismatch, marked as inconsistent

卸载分区

df -h
umount -fl /dev/mapper/cachedev_2

进行分区修复,需要一会

btrfs check --repair /dev/mapper/cachedev_2

如果上面那条秒退出,那么可以试试下面这两条再去试试上一条

btrfs check --clear-space-cache v1 /dev/mapper/cachedev_2
btrfs check --clear-space-cache v2 /dev/mapper/cachedev_2

修超级快,不需要修会自动跳过的

btrfs rescue super-recover -v /dev/mapper/cachedev_2

计算校验,需要很长时间,没有输出,处理完会退出

btrfs scrub start -Bf/dev/mapper/cachedev_2

可以开一个新终端用这条命令检查计算校验的进度

btrfs scrub status /dev/mapper/cachedev_2

最后,清错误记录

btrfs rescue zero-log /dev/mapper/cachedev_2

清错误计数器

btrfs dev stats -z /dev/mapper/cachedev_0

重启nas

明明都没有错误了,还是只读?不要慌
点开存储管理器,点报警的存储空间右边三个点,转换为读/写
然后无论再怎么重启都能正常读写了


2022年3月9日,Pve的Btrfs突然提示空间不足,df -h显示还有4G可用,重启了一下,就显示可用0了,实际上总空间减去已用还有4G

Filesystem                Size      Used Available Use% Mounted on
/dev/sdb3                29.3G     25.9G      0  100% /mnt/sdb3

看了一下 btrfs fi df /mnt/sdb3 发现Metadata要满了,那么怎么扩展Btrfs的Metadata呢?

尝试了一下 btrfs bal start /mnt/sdb3 进行清理优化,提示空间不足,无法进行

建一个5G的文件在另一个硬盘,并用 losetup 把它挂成一个虚拟硬盘

dd if=/dev/zero of=/mnt/sda1/tmpBtrfs.img bs=1G count=5
losetup -v -f /mnt/sda1/tmpBtrfs.img

把这个虚拟盘加到当前有问题的存储空间中

btrfs device add /dev/loop1 /mnt/sdb3

如果无法操作显示只读,那么需要这样清掉缓存

btrfs check --clear-space-cache v1 /dev/sdb3
btrfs check --clear-space-cache v2 /dev/sdb3

这时候去 df -h显示已经正常了,只要进行一下清理优化,Metdata就会自动扩展(不需要跑完全程,跑一会Ctrl + C掐掉再去看其实已经增加了)

btrfs bal start /mnt/sdb3

这时候这5G虚拟盘就已经完成他的使命了,把它卸掉

btrfs device delete /dev/loop1 /mnt/sdb3
losetup -d /mnt/sda1/tmpBtrfs.img
rm /mnt/sda1/tmpBtrfs.img

用btrfs组raid的时候有时莫名奇妙就挂不上去了,明明盘都在线却显示

BTRFS warning :  devid 2 uuid 43870ae8-44c9-4f4d-9463-0917b94bc581 is missing

这时候只要运行一下 blkid 显示一下所有分区的uuid,就能正常挂载了,咩咩也不知道是什么原理


这是一些额外的内容

压缩

挂载时-o加上参数compress=zlib

子卷

# 创建
btrfs subvolume create 路径
# 删除
btrfs subvolume delete 路径
# 显示所有
btrfs subvolume show
# 显示单个
btrfs subvolume show 路径
# 挂载成压缩的
mount -o compress=zlib,subvol=子卷名字 主盘的设备 路径

空间限制

有个问题,就是程序拿不到这个限制后的剩余空间,而是拿到全部的

# 开启功能
btrfs quota enable 路径
# 设置限制最大占10G 解除限制设置成none
btrfs qgroup limit 10G 路径

raid

使用btrfs,可以实现多盘raid0并且空间利用率100%,当然了数据火葬场(
直接多盘格式化的话就像是jbod那样连在一起的
可以看这个视频,也可以看下面的内容 https://www.bilibili.com/video/BV1g14y1h7B3
先给大盘sdg分区,第一个分区从2048到+按第二块盘sdh的block数-1,剩下的分一个区
格式化

mkfs.btrfs -L wxr0 -m raid0 -d raid0 /dev/sdh /dev/sdg1

给他挂载到一个目录,然后

btrfs device add /dev/sdg2 挂载点

这样就得到了一个空间利用率100%的raid0,前面的部分是两个盘的raid0,后面连接着大盘剩下的空间
简单点说,就相当于在两块盘上做了一个两盘raid0和一个单盘raid1,再把这两做个jbod,但这个过程无需系统内核软raid参与,如你所见,视频是在openwrt上进行这种神仙操作的
作为缓存盘,速度和容量优先,要说安全性,btrfs有crc校验能告诉你哪些文件坏了