本文从实际运维场景出发,系统梳理 Linux 磁盘管理的核心知识,涵盖磁盘分区、文件系统、LVM 逻辑卷、RAID 阵列、性能监控与故障排查等全链路操作。
Linux 系统中磁盘设备文件位于 /dev 目录下,遵循统一的命名规范:
| 设备类型 | 命名格式 | 示例 |
|---|---|---|
| IDE 硬盘 | /dev/hd[a-d] |
/dev/hda, /dev/hdb |
| SATA/SAS/SCSI 硬盘 | /dev/sd[a-z] |
/dev/sda, /dev/sdb |
| NVMe 固态硬盘 | /dev/nvme[0-9]n[1-9] |
/dev/nvme0n1 |
| 虚拟磁盘(Virtio) | /dev/vd[a-z] |
/dev/vda, /dev/vdb |
| 软盘 | /dev/fd[0-1] |
/dev/fd0 |
| 光驱 | /dev/sr[0-9] |
/dev/sr0 |
分区编号规则:
/dev/sda1, /dev/sda5)/dev/sda1, /dev/sda2, /dev/sda3...)Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8697D9E1-358B-4689-BFA2-61E5DF607607893
| 参数 | 含义 | 说明 |
|---|---|---|
| Disk | 设备路径 | /dev/vda 表示第一块虚拟磁盘 |
| Size | 总容量 | 40 GiB = 42,949,672,960 字节 |
| Sectors | 总扇区数 | 83,886,080 个扇区 |
| Sector size | 扇区大小 | 逻辑/物理扇区均为 512 字节 |
| I/O size | I/O 操作大小 | 最小/最优 I/O 块大小 |
| Disklabel type | 分区表类型 | GPT(GUID Partition Table) |
| Disk identifier | 磁盘唯一标识 | GUID 格式的磁盘 UUID |
注意:现代 SSD 常使用 4K(4096 字节)物理扇区,但保持 512 字节逻辑扇区以兼容旧系统(称为 512e - 512-byte emulation)。
| 特性 | MBR(Master Boot Record) | GPT(GUID Partition Table) |
|---|---|---|
| 最大磁盘容量 | 2 TB | 9.4 ZB(实际 18 EB) |
| 最大分区数量 | 4 个主分区(或 3 主 + 1 扩展) | 128 个(可扩展) |
| 分区标识 | 1-4 字节标识符 | 16 字节 GUID |
| 数据冗余 | 单份分区表(无备份) | 头部和尾部双备份 |
| 校验机制 | CRC32 校验 | CRC32 校验 |
| 兼容性 | 所有系统 | 需要 UEFI(现代标准) |
| 适用场景 | 旧系统、小容量磁盘 | 新系统、大容量磁盘、服务器 |
生产环境建议:
# 查看所有磁盘
fdisk -lu
# 查看指定磁盘
fdisk -l /dev/vdb
输出示例:
Disk /dev/vdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos # ← MBR 分区表
Disk identifier: 0x03be7a69
Device Boot Start End Sectors Size Id Type
/dev/vdb1 2048 41943039 41940992 20G 83 Linux
关键字段解读:
Disklabel type: dos → MBR 分区表(旧式)Id: 83 → Linux 文件系统类型标识Start/End → 分区起始/结束扇区Sectors → 分区占用的扇区总数# 查看所有磁盘
parted -l
# 交互式操作指定磁盘
parted /dev/vdb
lsblk -f
# 输出:
# NAME FSTYPE LABEL UUID MOUNTPOINT
# vda
# ├─vda1 vfat 8C36-... /boot/efi
# ├─vda2 ext4 1234-... /
# vdb
# └─vdb1 ext4 5678-... /mnt
blkid /dev/vdb1
# /dev/vdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"
fdisk /dev/vdb
# 交互命令:
n # 新建分区
p # 主分区(e 为扩展分区)
1 # 分区号
2048 # 起始扇区(默认)
+20G # 大小(或输入结束扇区)
w # 写入分区表并退出
# 创建 GPT 分区表
parted /dev/vdb mklabel gpt
# 创建分区
parted /dev/vdb mkpart primary ext4 1MiB 20GiB
# 设置分区名称(GPT 支持)
parted /dev/vdb name 1 data-partition
gdisk /dev/vdb
# 交互命令:
n # 新建分区
1 # 分区号
# 起始扇区(默认)
+20G # 大小
8300 # 类型代码(Linux 文件系统)
w # 写入并退出
# fdisk 方式
fdisk /dev/vdb
# d → 选择分区号 → w
# parted 方式
parted /dev/vdb rm 1
⚠️ 危险操作:删除分区会丢失该分区所有数据,操作前务必确认备份。
常见分区类型代码:
| 代码 | 类型 | 用途 |
|---|---|---|
| 83 | Linux | 标准 Linux 文件系统分区 |
| 82 | Linux swap | 交换分区 |
| 8e | Linux LVM | LVM 物理卷 |
| fd | Linux RAID | RAID 自动检测 |
| ef | EFI System | UEFI 启动分区 |
| 07 | HPFS/NTFS | Windows 分区 |
| 文件系统 | 最大文件大小 | 最大分区大小 | 日志支持 | 压缩 | 加密 | 适用场景 |
|---|---|---|---|---|---|---|
| ext4 | 16 TB | 1 EB | ✅ | ❌ | ❌ | 通用场景,默认选择 |
| XFS | 8 EB | 8 EB | ✅ | ❌ | ❌ | 大文件、高并发 I/O |
| Btrfs | 16 EB | 16 EB | ✅ | ✅ | ✅ | 现代特性,快照、校验 |
| ZFS | 16 EB | 256 ZB | ✅ | ✅ | ✅ | 企业级,数据完整性 |
| NTFS | 16 TB | 256 TB | ✅ | ✅ | ✅ | Windows 兼容 |
| exFAT | 16 EB | 128 PB | ❌ | ❌ | ❌ | 跨平台移动存储 |
# ext4(最常用)
mkfs.ext4 /dev/vdb1
# XFS(大文件场景)
mkfs.xfs /dev/vdb1
# Btrfs(高级特性)
mkfs.btrfs /dev/vdb1
# 带标签的格式化
mkfs.ext4 -L data-disk /dev/vdb1
格式化参数详解(ext4):
mkfs.ext4 -m 1 -L data-disk -E nodiscard /dev/vdb1
# -m 1 : 保留 1% 空间给 root(默认 5%,大数据盘建议调低)
# -L : 设置卷标
# -E nodiscard: 跳过 discard(SSD 首次格式化可加速)
# 检查文件系统(只读)
fsck -n /dev/vdb1
# 检查并修复(卸载后执行)
fsck -y /dev/vdb1
# ext4 专用检查
e2fsck -f /dev/vdb1
# 查看文件系统详细信息
dumpe2fs /dev/vdb1 | head -50
tune2fs -l /dev/vdb1
重要:检查前必须卸载文件系统,否则可能造成数据损坏。
# ext4 扩容(先扩容分区,再扩容文件系统)
resize2fs /dev/vdb1
# ext4 缩容(先缩容文件系统,再缩容分区)
resize2fs /dev/vdb1 10G
# XFS 扩容(XFS 不支持缩容)
xfs_growfs /mnt
# 基本挂载
mount /dev/vdb1 /mnt
# 指定文件系统类型
mount -t ext4 /dev/vdb1 /mnt
# 挂载时指定选项
mount -o noatime,nodiratime /dev/vdb1 /mnt
常用挂载选项:
| 选项 | 说明 | 适用场景 |
|---|---|---|
noatime |
不更新访问时间 | 高 I/O 场景,减少写操作 |
nodiratime |
不更新目录访问时间 | 配合 noatime 使用 |
sync |
同步写入 | 数据安全优先 |
async |
异步写入(默认) | 性能优先 |
ro |
只读挂载 | 数据保护、备份场景 |
rw |
读写挂载(默认) | 正常使用 |
nobarrier |
禁用写屏障 | 电池备份场景(慎用) |
# 查看所有挂载
df -Th
# 人类可读格式
lsblk -f
# 查看挂载选项
cat /proc/mounts | grep /dev/vdb1
findmnt /dev/vdb1
df -Th 输出解读:
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda3 ext4 40G 3.3G 34G 9% /
/dev/vdb1 ext4 20G 24K 19G 1% /mnt
| 字段 | 含义 |
|---|---|
| Filesystem | 设备路径 |
| Type | 文件系统类型 |
| Size | 总容量 |
| Used | 已使用 |
| Avail | 可用空间 |
| Use% | 使用率 |
| Mounted on | 挂载点 |
# 正常卸载
umount /mnt
# 强制卸载(进程占用时)
umount -f /mnt
# 懒卸载(等操作完成后)
umount -l /mnt
# 查找占用进程
lsof /mnt
fuser -m /mnt
# 编辑 fstab
vim /etc/fstab
fstab 格式:
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt ext4 defaults,noatime 0 2
/dev/vdb1 /data ext4 defaults 0 2
LABEL=data-disk /backup xfs defaults 0 0
字段说明:
| 字段 | 说明 | 示例 |
|---|---|---|
| file system | 设备标识(UUID/路径/标签) | UUID=xxx |
| mount point | 挂载目录 | /mnt |
| type | 文件系统类型 | ext4, xfs, auto |
| options | 挂载选项 | defaults, noatime |
| dump | 备份标志(0=不备份,1=备份) | 0 |
| pass | 开机检查顺序(0=不检查,1=根分区,2=其他) | 2 |
推荐使用 UUID 而非设备路径:设备路径可能在硬件变动时改变(如添加新磁盘后 /dev/sdb 可能变成 /dev/sdc),而 UUID 是永久不变的。
# 获取 UUID
blkid /dev/vdb1
lsblk -f
# 测试 fstab 配置(不实际挂载)
mount -a --fake
# 应用 fstab 中未挂载的配置
mount -a
现代 Linux 发行版推荐使用 systemd 的 .mount 和 .automount 单元:
# 创建挂载单元
systemctl edit --force --full data.mount
[Unit]
Description=Data Partition
[Mount]
What=/dev/disk/by-uuid/a1b2c3d4-e5f6-7890-abcd-ef1234567890
Where=/data
Type=ext4
Options=defaults,noatime
[Install]
WantedBy=multi-user.target
# 启用并启动
systemctl enable data.mount
systemctl start data.mount
LVM(Logical Volume Manager)提供灵活的磁盘空间管理,支持动态扩容、缩容、快照等高级功能。
Physical Volume (PV) → Volume Group (VG) → Logical Volume (LV)
物理卷 → 卷组 → 逻辑卷
(/dev/sdb1) → (vg_data) → (lv_app, lv_logs)
| 层级 | 功能 | 命令前缀 |
|---|---|---|
| PV | 物理磁盘/分区 | pv* |
| VG | 存储池 | vg* |
| LV | 可分配的逻辑分区 | lv* |
# 1. 创建物理卷
pvcreate /dev/vdb1 /dev/vdc1
# 2. 创建卷组
vgcreate vg_data /dev/vdb1 /dev/vdc1
# 3. 创建逻辑卷
lvcreate -L 10G -n lv_app vg_data
lvcreate -L 5G -n lv_logs vg_data
# 4. 创建文件系统
mkfs.ext4 /dev/vg_data/lv_app
mkfs.ext4 /dev/vg_data/lv_logs
# 5. 挂载
mount /dev/vg_data/lv_app /app
mount /dev/vg_data/lv_logs /var/log
# 查看当前状态
vgdisplay vg_data
lvdisplay /dev/vg_data/lv_app
# 添加新物理卷到卷组
pvcreate /dev/vdd1
vgextend vg_data /dev/vdd1
# 扩容逻辑卷(在线扩容,无需卸载)
lvextend -L +5G /dev/vg_data/lv_app
# 或扩展到指定大小
lvextend -L 20G /dev/vg_data/lv_app
# 扩容文件系统(ext4)
resize2fs /dev/vg_data/lv_app
# XFS 文件系统
xfs_growfs /app
# 创建快照(用于备份前的一致性状态)
lvcreate -L 5G -s -n lv_app_snap /dev/vg_data/lv_app
# 挂载快照
mount /dev/vg_data/lv_app_snap /mnt/snap
# 备份快照数据
rsync -av /mnt/snap/ /backup/app/
# 删除快照
umount /mnt/snap
lvremove /dev/vg_data/lv_app_snap
# 查看物理卷
pvs
pvdisplay
# 查看卷组
vgs
vgdisplay
# 查看逻辑卷
lvs
lvdisplay
| 级别 | 名称 | 最少磁盘 | 可用容量 | 容错能力 | 读性能 | 写性能 | 适用场景 |
|---|---|---|---|---|---|---|---|
| RAID 0 | 条带 | 2 | 100% | ❌ 无 | ⭐⭐⭐ | ⭐⭐⭐ | 临时数据、性能优先 |
| RAID 1 | 镜像 | 2 | 50% | ✅ 1 盘 | ⭐⭐ | ⭐⭐ | 系统盘、关键数据 |
| RAID 5 | 分布式校验 | 3 | (n-1)/n | ✅ 1 盘 | ⭐⭐⭐ | ⭐⭐ | 读多写少、容量优先 |
| RAID 6 | 双分布式校验 | 4 | (n-2)/n | ✅ 2 盘 | ⭐⭐⭐ | ⭐ | 大容量、高可靠 |
| RAID 10 | 镜像+条带 | 4 | 50% | ✅ 多盘 | ⭐⭐⭐ | ⭐⭐⭐ | 数据库、高并发 |
# 安装工具
apt install mdadm
# 创建 RAID 1(镜像)
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/vdb1 /dev/vdc1
# 创建 RAID 5(3 块盘)
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/vdb1 /dev/vdc1 /dev/vdd1
# 创建 RAID 10(4 块盘)
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/vdb1 /dev/vdc1 /dev/vdd1 /dev/vde1
# 查看 RAID 状态
cat /proc/mdstat
mdadm --detail /dev/md0
# 创建文件系统并挂载
mkfs.ext4 /dev/md0
mount /dev/md0 /mnt/raid
# 保存 RAID 配置
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u
# 配置 fstab
UUID=$(blkid -s UUID -o value /dev/md0)
echo "UUID=$UUID /mnt/raid ext4 defaults 0 2" >> /etc/fstab
# 标记故障磁盘
mdadm --manage /dev/md0 --fail /dev/vdb1
# 移除故障磁盘
mdadm --manage /dev/md0 --remove /dev/vdb1
# 添加新磁盘
mdadm --manage /dev/md0 --add /dev/vdf1
# 查看重建进度
cat /proc/mdstat
watch -n 1 cat /proc/mdstat
# 挂载时启用配额
mount -o usrquota,grpquota /dev/vdb1 /mnt
# 或 fstab 配置
UUID=xxx /mnt ext4 defaults,usrquota,grpquota 0 2
# 创建配额数据库
quotacheck -cug /mnt
# 启用配额
quotaon /mnt
# 编辑用户配额
edquota -u username
# 设置软限制 10G,硬限制 12G
setquota -u username 10485760 12582912 0 0 /mnt
# 查看配额报告
repquota /mnt
quota -u username
# iostat - 综合 I/O 统计
iostat -x 1 5
# -x: 扩展统计
# 1: 每秒采样
# 5: 采样 5 次
# 关键指标:
# %util: 设备利用率(接近 100% 表示饱和)
# await: 平均 I/O 等待时间(ms,>20ms 需关注)
# svctm: 平均服务时间(已废弃,仅供参考)
# iotop - 进程级 I/O 监控
iotop -oP
# -o: 只显示有 I/O 的进程
# -P: 只显示进程(不显示线程)
# pidstat - 进程级详细统计
pidstat -d 1
# dstat - 综合系统监控
dstat -d --disk-util
# blktrace - 块设备级跟踪(高级)
blktrace -d /dev/vdb
# 查看当前调度器
cat /sys/block/vdb/queue/scheduler
# [mq-deadline] kyber bfq none
# 临时更改调度器
echo kyber > /sys/block/vdb/queue/scheduler
# 永久配置(GRUB)
GRUB_CMDLINE_LINUX_DEFAULT="elevator=kyber"
update-grub
调度器选择建议:
| 调度器 | 特点 | 适用场景 |
|---|---|---|
| mq-deadline | 默认,平衡延迟和吞吐 | 通用场景 |
| kyber | 低延迟,适合快速设备 | NVMe SSD |
| bfq | 公平队列,适合桌面 | 交互式应用 |
| none | 无调度,直通 | 高端 NVMe RAID |
# ext4 优化挂载选项
mount -o noatime,nodiratime,barrier=0,data=writeback /dev/vdb1 /mnt
# 或 fstab
UUID=xxx /data ext4 noatime,nodiratime,nobarrier 0 2
| 选项 | 优化效果 | 风险 |
|---|---|---|
noatime |
减少 30-50% 元数据写 | 无 |
nobarrier |
提升 5-10% 写性能 | 断电可能丢数据 |
data=writeback |
提升写性能 | 崩溃后需 fsck |
生产环境建议:数据库等关键业务不使用
nobarrier和data=writeback。
# 启用 TRIM(丢弃未使用块)
mount -o discard /dev/nvme0n1 /mnt
# 或 fstab
UUID=xxx /ssd ext4 discard,noatime 0 2
# 定期 TRIM(如果挂载时未启用)
fstrim -av /
# 配置周期性 TRIM
systemctl enable fstrim.timer
systemctl start fstrim.timer
# 快速定位大文件/目录
du -sh /* 2>/dev/null | sort -rh | head -20
du -sh /var/* 2>/dev/null | sort -rh | head -10
# 查找大于 100MB 的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# 查看已删除但仍被占用的文件(空间未释放)
lsof | grep deleted | sort -k7 -rn | head -20
# 清空日志文件(无需删除文件)
> /var/log/large-file.log
# 现象:文件系统变为只读
# 原因:文件系统损坏、I/O 错误、磁盘故障
# 查看 dmesg 错误
dmesg | grep -i error | tail -20
# 尝试重新挂载为读写
mount -o remount,rw /mnt
# 如果失败,检查并修复
umount /mnt
fsck -y /dev/vdb1
# 1. 确认瓶颈
iostat -x 1
# %util > 90% 表示设备饱和
# 2. 找出高 I/O 进程
iotop -o
# 3. 分析 I/O 模式
iostat -x -d /dev/vdb 1
# r/s, w/s: 每秒读写次数
# rkB/s, wkB/s: 每秒读写带宽
# 4. 检查 I/O 等待
vmstat 1 5
# wa 列:I/O 等待百分比
# SMART 检测(物理磁盘)
smartctl -a /dev/sda
smartctl -t short /dev/sda # 短测试
smartctl -t long /dev/sda # 长测试
# 查看坏块(ext4)
badblocks -v /dev/vdb1
# 检查 RAID 状态
cat /proc/mdstat
mdadm --detail /dev/md0
# 检查设备是否存在
ls -la /dev/vdb1
# 检查文件系统类型
blkid /dev/vdb1
file -s /dev/vdb1
# 检查日志
journalctl -xe | grep mount
dmesg | grep vdb
# 手动挂载测试
mount -v /dev/vdb1 /mnt
| 项目 | 规范 | 原因 |
|---|---|---|
| 分区表 | 一律使用 GPT | 支持 2TB+,更可靠 |
| 文件系统 | 默认 ext4,大数据用 XFS | 稳定、性能好、工具链成熟 |
| 挂载标识 | 使用 UUID | 避免设备名变动 |
| fstab pass | 数据盘设为 2 | 开机时检查,但非阻塞 |
| 保留空间 | 大数据盘调低为 1% | 避免浪费空间 |
| LVM | 生产环境必用 | 灵活扩容,支持快照 |
| 监控 | 磁盘使用率 >80% 告警 | 预留处理时间 |
1. 备份数据(快照或 rsync)
2. 检查当前磁盘状态(df, lsblk)
3. 扩展物理磁盘(云盘扩容/添加新盘)
4. 扩展分区(parted/growpart)
5. 扩展物理卷(pvresize)
6. 扩展逻辑卷(lvextend)
7. 扩展文件系统(resize2fs/xfs_growfs)
8. 验证(df, 写入测试)
9. 更新监控配置
阿里云 ECS:
growpart)# 阿里云在线扩容(无需重启)
growpart /dev/vdb 1 # 扩展分区
resize2fs /dev/vdb1 # 扩展文件系统
AWS EC2:
通用云环境:
| 操作 | 命令 |
|---|---|
| 查看磁盘 | fdisk -l, lsblk, parted -l |
| 查看挂载 | df -Th, findmnt, mount |
| 查看 UUID | blkid, lsblk -f |
| 创建分区 | fdisk, parted, gdisk |
| 格式化 | mkfs.ext4, mkfs.xfs, mkfs.btrfs |
| 挂载 | mount, mount -a |
| 卸载 | umount, umount -l |
| 检查修复 | fsck, e2fsck |
| 扩容 FS | resize2fs, xfs_growfs |
| LVM PV | pvcreate, pvdisplay, pvs |
| LVM VG | vgcreate, vgextend, vgs |
| LVM LV | lvcreate, lvextend, lvs |
| RAID | mdadm --create, mdadm --detail |
| 性能 | iostat, iotop, pidstat |
| 空间 | du, df, ncdu |
版本记录:本文基于 Debian/Ubuntu 系统环境编写,适用于 Linux 内核 5.x+。部分命令在不同发行版中可能略有差异。