跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    Fedora 存储:btrfs 子卷、挂载与容量排查

    Fedora 的默认安装早就不再用”一个 ext4 根分区”。F45 的 Cloud 镜像实测是 btrfs + zstd 压缩 + 四个子卷。不理解这层,df 的输出会一直看着不对。

    Terminal window
    lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINTS
    NAME SIZE FSTYPE MOUNTPOINTS
    sda 20G
    ├─sda1 2M
    ├─sda2 100M vfat /boot/efi
    └─sda3 19.9G btrfs /var
    /home
    /boot
    /

    /etc/fstab 里对应的四行:

    Terminal window
    grep -vE "^#|^$" /etc/fstab
    UUID=d04d5cb8-... / btrfs compress=zstd:1,defaults,subvol=root 0 1
    UUID=d04d5cb8-... /boot btrfs compress=zstd:1,subvol=boot 0 0
    UUID=d04d5cb8-... /home btrfs compress=zstd:1,subvol=home 0 0
    UUID=d04d5cb8-... /var btrfs compress=zstd:1,subvol=var 0 0

    三个要点:

    现象含义
    同一个 UUID 挂了四次不是四个分区,是一个文件系统的四个子卷
    subvol=子卷名,不是路径
    compress=zstd:1透明压缩,写入时压、读取时解

    btrfs 子卷共享同一个空间池:root、boot、home、var 四个子卷挂在同一块 19.9 GiB 空间上,因此 df 对每个挂载点都报出相同容量

    Terminal window
    df -hT / /boot
    Filesystem Type Size Used Avail Use% Mounted on
    /dev/sda3 btrfs 20G 2.1G 18G 11% /
    /dev/sda3 btrfs 20G 2.1G 18G 11% /boot

    btrfs 子卷共享同一块空间池,所以每行都显示整个文件系统的容量。/var 写满就是整盘写满,不存在”这个子卷还有余量”。

    另外 df 在 btrfs 上给的 Avail 是估算值。要看更准的:

    Terminal window
    sudo btrfs filesystem usage /
    sudo btrfs subvolume list /
    ID 256 gen ... path root
    ID 257 gen ... path boot
    ID 258 gen ... path home
    ID 259 gen ... path var

    F45 装机后实测:lsblk 显示 sda3 为 19.9G btrfs,同时挂着 /var /home /boot / 四个挂载点;df -hT 对 / 与 /boot 都报 20G 11%;btrfs subvolume list 列出 root boot home var snapshots 五个子卷

    Terminal window
    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) 容器与镜像

    删除后空间没释放是最常见的困惑——有进程还开着已删除的文件:

    Terminal window
    sudo lsof +L1 | head -10
    Terminal window
    lsblk # 确认新盘名(如 sdb)
    sudo mkfs.xfs /dev/sdb # 或 btrfs / ext4
    sudo mkdir -p /data
    sudo mount /dev/sdb /data
    sudo blkid /dev/sdb # 取 UUID

    写进 /etc/fstab 时用 UUID,不要写 /dev/sdb——设备名会随插拔顺序变:

    UUID=<新的> /data xfs defaults 0 0

    改完先测,别直接重启:

    Terminal window
    sudo mount -a # 有错会当场报出来
    findmnt /data