Fedora 存储:btrfs 子卷、挂载与容量排查
Fedora 的默认安装早就不再用”一个 ext4 根分区”。F45 的 Cloud 镜像实测是 btrfs + zstd 压缩 + 四个子卷。不理解这层,df 的输出会一直看着不对。
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTSNAME SIZE FSTYPE MOUNTPOINTSsda 20G├─sda1 2M├─sda2 100M vfat /boot/efi└─sda3 19.9G btrfs /var /home /boot //etc/fstab 里对应的四行:
grep -vE "^#|^$" /etc/fstabUUID=d04d5cb8-... / btrfs compress=zstd:1,defaults,subvol=root 0 1UUID=d04d5cb8-... /boot btrfs compress=zstd:1,subvol=boot 0 0UUID=d04d5cb8-... /home btrfs compress=zstd:1,subvol=home 0 0UUID=d04d5cb8-... /var btrfs compress=zstd:1,subvol=var 0 0三个要点:
| 现象 | 含义 |
|---|---|
| 同一个 UUID 挂了四次 | 不是四个分区,是一个文件系统的四个子卷 |
subvol= | 子卷名,不是路径 |
compress=zstd:1 | 透明压缩,写入时压、读取时解 |
为什么 df 看着”不对”
Section titled “为什么 df 看着”不对””df -hT / /bootFilesystem Type Size Used Avail Use% Mounted on/dev/sda3 btrfs 20G 2.1G 18G 11% //dev/sda3 btrfs 20G 2.1G 18G 11% /bootbtrfs 子卷共享同一块空间池,所以每行都显示整个文件系统的容量。/var 写满就是整盘写满,不存在”这个子卷还有余量”。
另外 df 在 btrfs 上给的 Avail 是估算值。要看更准的:
sudo btrfs filesystem usage /sudo btrfs subvolume list /ID 256 gen ... path rootID 257 gen ... path bootID 258 gen ... path homeID 259 gen ... path var
容量排查顺序
Section titled “容量排查顺序”df -h / # 1) 文件系统层面df -i / # 2) inode(btrfs 也会耗尽)sudo btrfs filesystem usage / # 3) btrfs 真实占用与未分配空间du -xh --max-depth=1 / | sort -h | tail -10 # 4) 谁在占sudo journalctl --disk-usage # 5) 日志sudo podman system df # 6) 容器与镜像删除后空间没释放是最常见的困惑——有进程还开着已删除的文件:
sudo lsof +L1 | head -10lsblk # 确认新盘名(如 sdb)sudo mkfs.xfs /dev/sdb # 或 btrfs / ext4sudo mkdir -p /datasudo mount /dev/sdb /datasudo blkid /dev/sdb # 取 UUID写进 /etc/fstab 时用 UUID,不要写 /dev/sdb——设备名会随插拔顺序变:
UUID=<新的> /data xfs defaults 0 0改完先测,别直接重启:
sudo mount -a # 有错会当场报出来findmnt /data