LinuxNotes

第 11 章:磁盘与文件系统

zjc 于 2026-01-11 发布

这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 磁盘问题通常表现为空间不足、IO 延迟高、文件系统只读、挂载丢失或数据损坏。本章从设备识别、分区、格式化、挂载、交换分区、LVM、RAID、IO 指标和故障处理讲起。

11.1 存储栈

Application
  -> File System
     -> LVM / Software RAID
        -> Block Device
           -> Device Mapper
              -> Disk / SSD / Cloud Disk

不同层次的问题表现不同:

常见现象
应用 写放大、锁文件、慢日志
文件系统 只读、元数据慢、inode 耗尽
块设备 IO error、延迟高
云盘 / RAID 容量、IOPS、吞吐限制
网络 存储链路抖动

11.2 设备识别

块设备:

lsblk
lsblk -f
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
blkid
sudo fdisk -l
sudo parted -l

云服务器常见命名:

名称 常见含义
/dev/vda virtio 磁盘
/dev/sda SCSI / SATA
/dev/nvme0n1 NVMe
/dev/xvda Xen 虚拟盘
/dev/mapper/vg-lv LVM 逻辑卷

设备名在重启或变更后可能变化。fstab 推荐使用 UUID 或稳定标识。

查看 UUID:

blkid /dev/vdb1
lsblk -fp

11.3 分区与格式化

查看分区表:

sudo parted /dev/vdb print
sudo fdisk -l /dev/vdb

parted 示例:

sudo parted -s /dev/vdb mklabel gpt
sudo parted -s /dev/vdb mkpart primary xfs 1MiB 100%
sudo parted /dev/vdb print

格式化:

sudo mkfs.xfs /dev/vdb1
sudo mkfs.ext4 /dev/vdb1

查看文件系统信息:

sudo xfs_info /data
sudo tune2fs -l /dev/vdb1

格式化会清除数据,执行前必须确认设备路径和分区号。

11.4 挂载与 fstab

临时挂载:

sudo mkdir /data
sudo mount /dev/vdb1 /data
df -hT /data

卸载:

sudo umount /data
sudo umount -l /data

umount -l 是懒卸载,只作为特殊场景处理,不是常规操作。

开机自动挂载:

# /etc/fstab
UUID=12345678-1234-1234-1234-123456789012 /data xfs defaults,nofail 0 0

校验:

sudo findmnt --verify
sudo mount -a

常用选项:

选项 含义
defaults 常见默认组合
nofail 设备缺失时不阻塞启动
noatime 减少访问时间更新
ro / rw 只读 / 读写
_netdev 等待网络

关键数据盘建议加 nofail,避免单块数据盘异常导致整机无法启动。

11.5 文件系统选择

文件系统 特点 常见用途
ext4 成熟稳定 通用数据盘
XFS 大文件、高并发写性能好 数据库、大文件
btrfs 快照、压缩等能力 场景化使用
tmpfs 内存文件系统 临时缓存
overlay 容器镜像分层 容器运行时

数据库选型应结合 workload、备份工具、云厂商能力和团队经验,不只看单项参数。

11.6 容量与 inode

容量:

df -hT
df -kT
du -sh /data/*
du -h --max-depth=2 /data | sort -h

inode:

df -ih
find /data -xdev -type f | wc -l

常见问题:

现象 原因
空间满但 du 不大 已删除文件仍被占用
inode 满 海量小文件
写入卡住 IO 队列高或存储故障
只读文件系统 错误后自我保护

处理:

lsof +L1
sudo journalctl --disk-usage
find /data -type f -size +1G -printf '%s %p\n' | sort -nr | head

11.7 Swap

查看:

free -h
swapon --show
cat /proc/swaps
cat /proc/sys/vm/swappiness

创建 swap 文件:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

开机启用:

# /etc/fstab
/swapfile none swap sw 0 0

关闭:

sudo swapoff /swapfile
sudo rm /swapfile

数据库等服务通常要谨慎使用 swap,重点还是控制内存和监控水位。swap 是缓冲手段,不是常态内存方案。

11.8 LVM

概念:

Physical Volume PV
  -> Volume Group VG
     -> Logical Volume LV
        -> File System

查看:

sudo pvs
sudo vgs
sudo lvs

创建:

sudo pvcreate /dev/vdb
sudo vgcreate datavg /dev/vdb
sudo lvcreate -n datalv -L 100G datavg
sudo mkfs.xfs /dev/datavg/datalv
sudo mount /dev/datavg/datalv /data

扩容:

sudo lvextend -L +50G /dev/datavg/datalv
sudo xfs_growfs /data

ext4:

sudo lvextend -L +50G /dev/datavg/datalv
sudo resize2fs /dev/datavg/datalv

缩容风险高,XFS 通常不支持在线缩容。生产应优先规划扩容和备份,而非临时缩容。

11.9 RAID

常见级别:

级别 特点 容错
RAID 0 条带,性能高
RAID 1 镜像 一块
RAID 5 分布式校验 一块
RAID 6 双校验 两块
RAID 10 镜像加条带 每组一块

查看软件 RAID:

cat /proc/mdstat
sudo mdadm --detail /dev/md0

云盘和硬件 RAID 通常由平台或 RAID 卡暴露为块设备,应结合厂商工具监控健康状态。

RAID 不是备份。误删除、文件损坏、逻辑错误和安全事件仍需要独立备份。

11.10 文件系统检查

unmount 后检查:

sudo umount /data
sudo fsck -n /dev/vdb1
sudo fsck /dev/vdb1

ext4:

sudo e2fsck -f /dev/vdb1

XFS:

sudo xfs_repair -n /dev/vdb1
sudo xfs_repair /dev/vdb1

只读修复:

sudo xfs_repair -L /dev/vdb1

-L 会清空日志,可能丢数据,只能作为最后手段并在备份、变更评审和专家确认后执行。

11.11 IO 指标

iostat -xz 1
iostat -dx 1 /dev/vdb
vmstat 1
pidstat -d 1
iotop -P -d 2

关键指标:

指标 含义
r/s、w/s 每秒读写次数
rkB/s、wkB/s 每秒读写数据量
await 平均 IO 等待
r_await、w_await 读写等待
aqu-sz 队列深度
util 设备忙碌度
iowait CPU 等待 IO 占比

判断:

await 高 + util 高
  -> 存储能力或 workload 问题

iowait 高 + iostat 不高
  -> NFS、内存压力或调度问题,需要继续分层

单个进程 w/s 高
  -> 应用写放大或日志刷盘

11.12 云盘与性能

云盘常见限制:

资源 说明
容量 最大和最小规格
IOPS 随容量或类型变化
吞吐 MB/s 上限
突发 有限时长
并发连接 多盘挂载能力

排查前先确认:

lsblk
df -hT
iostat -xz 1

再对照云平台当前规格。云盘性能指标和实现随厂商变化,不要只凭经验判断。

11.13 故障案例

案例一:根分区写满

df -hT /
du -sh /var/* /tmp /root 2>/dev/null
sudo journalctl --disk-usage
lsof +L1

常见来源:

  1. journal 过大;
  2. core dump;
  3. 应用日志;
  4. 包缓存;
  5. 临时文件;
  6. 容器镜像和卷。

根分区写满可能导致 SSH、cron、日志和数据库异常,应设置提前告警。

案例二:文件系统只读

dmesg -T | tail -100
findmnt -no TARGET,OPTIONS /data
sudo touch /data/test

常见原因:

  1. 磁盘 IO 错误;
  2. journal 损坏;
  3. 存储链路断开;
  4. 人为只读挂载。

处理前先保存日志,再评估备份和修复方案,不要直接重启。

案例三:数据库盘延迟高

iostat -xz 1 /dev/vdb
pidstat -d 1
sudo lsblk -o NAME,SIZE,TYPE,MOUNTPOINT

检查:

  1. 云盘规格;
  2. checkpoint 和刷盘;
  3. 日志写入量;
  4. 快照或备份并发;
  5. 同宿主机干扰;
  6. 应用是否有批量扫描。

本章小结

磁盘排障要先分层:容量、inode、挂载、块设备、IO 指标和云盘规格。df 看文件系统,dufind 定位空间,iostat 看设备压力,dmesg 看内核错误。LVM 提供扩容灵活性,RAID 提供硬件冗余,但它们都不能替代备份和容量预测。

思考题

  1. dfdu 的统计口径有什么不同?
  2. /etc/fstab 使用 UUID 有什么优势?
  3. XFS 和 ext4 在扩容、缩容上的差异是什么?
  4. iostatawaitutil 如何解读?
  5. 设计一个数据库磁盘的容量、水位和 IO 监控方案。