Linux 存储管理

Administrator 3

Linux 存储管理


目录

  1. 存储与磁盘的基本概念
  2. 查看磁盘与分区:df / du / lsblk / fdisk / parted
  3. 格式化分区:mkfs 与 xfs/ext4 差异
  4. 文件系统维护:fsck、swap、blkid
  5. 分区挂载:mount / umount / /etc/fstab
  6. 逻辑卷 LVM:pv / vg / lv 与扩容缩容
  7. 软 RAID:mdadm 配置 RAID0/1/5(进阶)
  8. 总结与练习

一、存储与磁盘的基本概念

Linux 存储涉及几个层次,理解它们之间的关系很关键:

物理磁盘 → 分区 → 文件系统 → 挂载点(目录)
(sda)  (sda1)  (xfs/ext4)  (/data)
  • 物理磁盘(Disk):如 /dev/sda/dev/nvme0n1,是实际的存储硬件。
  • 分区(Partition):把磁盘分成若干逻辑区域,如 /dev/sda1/dev/sda2
  • 文件系统(Filesystem):在分区上建立的格式化结构(xfs、ext4 等),决定如何存放数据。
  • 挂载点(Mount point):把文件系统关联到某个目录,之后通过该目录访问数据。

设备命名(Red Hat 系常见):

设备 说明
/dev/sda、/dev/sdb SATA/SCSI/USB 磁盘
/dev/nvme0n1、/dev/nvme0n2 NVMe 固态硬盘
/dev/vda 虚拟化磁盘(KVM 等)
/dev/mapper/* LVM 逻辑卷(见第六章)
/dev/md* 软 RAID 设备(见第七章)

参考:Red Hat - 管理存储设备


二、查看磁盘与分区:df / du / lsblk / fdisk / parted

2.1 df —— 查看文件系统使用情况

df -h            # 人类可读方式显示所有已挂载文件系统
df -h /data      # 查看某个挂载点
df -i            # 查看 inode 使用情况
df -T            # 显示文件系统类型

df(disk free)查看已挂载文件系统的空间与使用率,适合快速看磁盘还够不够用。

2.2 du —— 查看目录/文件占用

du -sh /var      # 查看 /var 总占用(-s summary,-h 人类可读)
du -sh /var/*    # 查看 /var 下每个子目录占用
du -h --max-depth=1 /var   # 显示 1 层深度的各目录占用
du -sh * | sort -rh | head   # 按占用大小排序查看

du(disk usage)统计某个目录/文件实际占用的磁盘空间,适合定位"谁占满了磁盘"。

2.3 lsblk —— 以树形查看块设备

lsblk              # 树形列出所有块设备及挂载点
lsblk -f           # 显示文件系统类型、UUID、挂载点(推荐)
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT   # 自定义列

lsblk(list block devices)以树状展示磁盘、分区、LVM 等层次关系,直观好用,是首选查看工具。

2.4 fdisk —— 传统分区工具

sudo fdisk -l          # 列出所有磁盘及分区(只读查看)
sudo fdisk /dev/sdb    # 进入交互式分区管理

在 fdisk 交互界面中常用命令:p 打印分区表、n 新建分区、d 删除分区、w 保存并退出、q 不保存退出。

fdisk 主要支持 MBR 分区表(最多 4 个主分区,单分区 ≤ 2TB)。

2.5 parted —— 现代分区工具(支持 GPT)

sudo parted -l                # 列出所有磁盘分区
sudo parted /dev/sdb          # 进入交互式
sudo parted /dev/sdb print    # 打印分区表
sudo parted /dev/sdb mklabel gpt   # 创建 GPT 分区表
sudo parted /dev/sdb mkpart primary xfs 1MiB 10GiB   # 创建分区

parted 支持 GPT 分区表(支持 >2TB、更多分区),是现代大容量磁盘(≥2TB)的首选。

fdisk vs parted 一句话:小磁盘用 fdisk(MBR),大磁盘(≥2TB)或需更多分区用 parted(GPT)。

参考:man 1 dfman 1 duman 8 lsblkman 8 fdiskman 8 parted菜鸟教程 - Linux 磁盘管理


三、格式化分区:mkfs 与 xfs/ext4 差异

分区建立后,还需要**格式化(创建文件系统)**才能使用。mkfs(make filesystem)负责这一工作。

3.1 mkfs 基本用法

sudo mkfs.xfs /dev/sdb1         # 格式化为 xfs
sudo mkfs.ext4 /dev/sdb1        # 格式化为 ext4
sudo mkfs -t xfs /dev/sdb1      # 等价写法

注意:格式化会清空分区上所有数据,操作前务必确认设备号无误!

3.2 xfs 与 ext4 的差异

对比项 xfs ext4
默认文件系统 RHEL/Rocky/CentOS 默认 Debian/Ubuntu 默认
最大文件大小 可达 8 EiB(极大) 最大 16 TiB
大文件/大目录性能 优秀,适合大文件 均衡
在线扩容(grow) 支持(xfs_growfs) 支持(resize2fs)
在线缩容(shrink) 不支持 支持(未挂载时)
元数据 高效,适合大文件系统 成熟稳定
检查工具 xfs_repair fsck / e2fsck
适用场景 大容量、大数据、数据库日志 通用、较小分区、需缩容场景

一句话:Red Hat 系(Rocky 等)默认用 xfs,适合大文件和高性能;ext4 是更"传统通用"的选择,且支持缩容

参考:man 8 mkfs.xfsman 8 mkfs.ext4Red Hat - 管理存储设备(含文件系统)


四、文件系统维护:fsck、swap、blkid

4.1 fsck —— 检查文件系统

sudo fsck /dev/sdb1        # 检查文件系统(ext 系列)
sudo fsck -y /dev/sdb1     # 自动修复(-y 全部 yes)
sudo xfs_repair /dev/sdb1  # 检查/修复 xfs(注意:需先卸载)
  • ext4fsck/e2fsckxfsxfs_repair(不能用 fsck 直接修 xfs)。
  • **通常要求先卸载(umount)**该文件系统再检查,避免损坏。
  • 系统在异常关机后,启动时会自动对文件系统做检查。

4.2 swap —— 交换分区/交换文件

swap(交换空间):当内存不足时,系统把不常用的内存数据临时换到磁盘的 swap 空间,起"虚拟内存"作用。

# 查看 swap
swapon --show
free -h                # 查看内存和 swap

# 用交换分区:先格式化再启用
sudo mkswap /dev/sdb2           # 格式化为 swap
sudo swapon /dev/sdb2           # 启用 swap 分区

# 用交换文件(无需单独分区):
sudo fallocate -l 2G /swapfile  # 创建 2G 交换文件
sudo chmod 600 /swapfile        # 权限改为仅 root
sudo mkswap /swapfile           # 格式化为 swap
sudo swapon /swapfile           # 启用交换文件

# 关闭某个 swap
sudo swapoff /dev/sdb2

要让 swap 开机自动启用,需写入 /etc/fstab(见第五章)。

4.3 blkid —— 查看 UUID 与文件系统类型

blkid                # 查看所有块设备的 UUID、类型、标签
blkid /dev/sdb1      # 查看指定设备
lsblk -f             # 也可用 lsblk -f 查看 UUID
  • UUID(Universally Unique Identifier)是每个文件系统的唯一标识,重启后不会变(设备名可能变,UUID 不变)。
  • 用 UUID 挂载最可靠(见第五章),这就是为什么 blkid 重要。

参考:man 8 fsckman 8 xfs_repairman 8 mkswapman 8 swaponman 8 blkid


五、分区挂载:mount / umount / /etc/fstab

5.1 mount —— 挂载文件系统

把格式化好的分区关联到目录,才能访问其中的数据。

# 手动挂载
sudo mount /dev/sdb1 /mnt/data      # 把 sdb1 挂到 /mnt/data
sudo mount -t xfs /dev/sdb1 /mnt/data   # 显式指定文件系统类型
sudo mount UUID=xxxx /mnt/data       # 用 UUID 挂载
sudo mount -a                        # 按 /etc/fstab 挂载所有

# 查看当前挂载情况
mount
df -h
lsblk

# 卸载(先确保没有进程正在使用)
sudo umount /mnt/data
sudo umount /dev/sdb1     # 也可用设备名卸载

挂载点目录需先存在mkdir -p /mnt/data)。卸载前若有进程占用会报"target is busy",可用 lsof /mnt/datafuser -m /mnt/data 查看占用进程。

5.2 /etc/fstab —— 开机自动挂载

手动挂载重启后会失效。要让文件系统开机自动挂载,需写入 /etc/fstab

/etc/fstab 每行一个挂载项,共 6 个字段

设备      挂载点    文件系统  选项    dump  pass
UUID=xxx  /mnt/data xfs      defaults 0     2
字段 含义 示例
① 设备 通常用 UUID(最可靠) UUID=xxxx
② 挂载点 挂载到的目录 /mnt/data
③ 文件系统类型 xfs、ext4、swap 等 xfs
④ 选项 defaults、noatime 等 defaults
⑤ dump 是否备份(0=不备份) 0
⑥ pass 开机检查顺序(0=不检查,1=根分区,2=其他) 2

典型 fstab 行示例

# <设备>            <挂载点>  <类型>  <选项>     <dump> <pass>
UUID=xxxx-xxxx     /         xfs     defaults    0      1
UUID=yyyy-yyyy     /boot     xfs     defaults    0      2
UUID=zzzz-zzzz     /mnt/data xfs     defaults    0      2
/swapfile          none      swap    sw          0      0

为什么用 UUID

  • 设备名(/dev/sdb)在插入其他磁盘或重启后可能改变
  • UUID 是文件系统的唯一且固定的标识,用 UUID 挂载更稳定可靠
  • 获取 UUID:blkidlsblk -f
# 添加自动挂载的步骤
sudo mkdir -p /mnt/data
sudo blkid /dev/sdb1           # 拿到 UUID
sudo vim /etc/fstab            # 添加一行 UUID=... /mnt/data xfs defaults 0 2
sudo mount -a                  # 测试挂载(验证 fstab 是否正确)
df -h                          # 确认已挂载

验证建议:编辑 fstab 后先执行 sudo mount -a 测试,若报错立即修正,否则可能导致开机无法进入系统

参考:man 8 mountman 5 fstab菜鸟教程 - Linux 挂载


六、逻辑卷 LVM:pv / vg / lv 与扩容缩容

6.1 LVM 是什么

LVM(Logical Volume Manager,逻辑卷管理器) 把多个物理磁盘/分区组合成"存储池",再灵活切分出逻辑卷。相比传统分区,最大的优势是支持动态扩容/缩容

物理卷 PV  →  卷组 VG  →  逻辑卷 LV  →  挂载
(/dev/sdb1)   (vg_data)   (/dev/mapper/vg_data-lv_data)  (/data)

三层概念

层次 名称 说明 查看命令
物理卷 PV Physical Volume 磁盘/分区,LVM 的基础 pvs / pvdisplay
卷组 VG Volume Group 多个 PV 组成一个"池" vgs / vgdisplay
逻辑卷 LV Logical Volume 从 VG 中切出的可挂载卷 lvs / lvdisplay

Red Hat 系安装时默认就使用 LVM(根分区 / 就在逻辑卷上)。

6.2 创建 LVM 的基本流程

# 1. 把磁盘分区(或直接用整块磁盘)创建为物理卷 PV
sudo pvcreate /dev/sdb1 /dev/sdc1

# 2. 创建卷组 VG
sudo vgcreate vg_data /dev/sdb1 /dev/sdc1

# 3. 创建逻辑卷 LV
sudo lvcreate -L 10G -n lv_data vg_data      # 10G 的逻辑卷
sudo lvcreate -l 100%FREE -n lv_data vg_data # 用尽剩余空间

# 4. 格式化并挂载
sudo mkfs.xfs /dev/mapper/vg_data-lv_data
sudo mkdir -p /data
sudo mount /dev/mapper/vg_data-lv_data /data

# 查看
pvs; vgs; lvs; lsblk

逻辑卷设备路径常为 /dev/mapper/卷组名-逻辑卷名(如 /dev/mapper/vg_data-lv_data),也常有一个符号链接 /dev/vg_data/lv_data

6.3 LVM 扩容

扩容 = 先扩大逻辑卷(lvextend),再扩大文件系统

# 第一步:扩大逻辑卷 LV
sudo lvextend -L +5G /dev/mapper/vg_data-lv_data    # 增加 5G
sudo lvextend -L 20G /dev/mapper/vg_data-lv_data    # 扩大到 20G
sudo lvextend -l +100%FREE /dev/mapper/vg_data-lv_data  # 用尽 VG 剩余

# 第二步:扩大文件系统(两种,取决于文件系统类型)
# xfs 用 xfs_growfs(在线扩容,无需卸载)
sudo xfs_growfs /data

# ext4 用 resize2fs
sudo resize2fs /dev/mapper/vg_data-lv_data

# 确认
df -h /data
lvs

关键:xfs 与 ext4 扩容命令不同

  • xfsxfs_growfs 挂载点(可在线)。
  • ext4resize2fs 设备

前提:VG 中要有剩余空间vgs 查看 VFree)。若 VG 空间不足,需先 pvcreate + vgextend 把新磁盘加入卷组。

6.4 LVM 缩容

缩容风险较高,务必谨慎、先备份。且xfs 不支持缩容,只有 ext4(未挂载时)可以

# 缩容流程(仅 ext4,且需先卸载)
sudo umount /data

# 1. 先缩小文件系统(必须先于逻辑卷)
sudo e2fsck -f /dev/mapper/vg_data-lv_data   # 先检查
sudo resize2fs /dev/mapper/vg_data-lv_data 5G   # 把文件系统缩到 5G

# 2. 再缩小逻辑卷 LV
sudo lvreduce -L 5G /dev/mapper/vg_data-lv_data

# 3. 重新挂载
sudo mount /dev/mapper/vg_data-lv_data /data

缩容要点

  • 顺序不能反:必须先缩小文件系统,再缩小逻辑卷;顺序反了会损坏数据。
  • xfs 不能缩容,只能扩;要缩容就用 ext4 或规划好大小。
  • 缩容前务必备份

6.5 常用 LVM 管理命令速查

层次 创建 查看 扩展 删除
PV pvcreate pvs pvresize pvremove
VG vgcreate vgs vgextend vgremove
LV lvcreate lvs lvextend lvremove

参考:man 8 lvmman 8 lvextendman 8 lvreduceman 8 xfs_growfsman 8 resize2fsRed Hat - 管理存储设备(含 LVM)


七、软 RAID:mdadm 配置 RAID0/1/5(进阶)

7.1 RAID 与软 RAID 是什么

RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)把多块磁盘组合成一个阵列,提高性能可靠性

  • 硬 RAID:由独立 RAID 卡实现,性能好,但需额外硬件。
  • 软 RAID:由操作系统(内核的 md 模块)实现,用 mdadm 工具管理,无需专用硬件,成本低,适合学习和小规模场景。

7.2 常见 RAID 级别

RAID 级别 最少磁盘 数据可靠性 容量利用率 特点
RAID 0 2 无冗余 100% 条带化,性能最高,但一块坏全坏
RAID 1 2 高(镜像) 50% 镜像备份,容错,写入慢一点
RAID 5 3 较高 (n-1)/n 分布式奇偶校验,允许坏一块
RAID 10 4 50% 先镜像后条带,性能+容错

生产环境常用 RAID 1(重要数据)和 RAID 10(数据库等高性能+容错);RAID 5 在大盘重建时风险较高。

7.3 mdadm 创建 RAID

sudo dnf install -y mdadm    # 安装 mdadm

# 创建 RAID 1(用两块盘 /dev/sdb /dev/sdc)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

# 创建 RAID 0
sudo mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

# 创建 RAID 5(需至少 3 块盘)
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

参数说明:--create 创建,--level 级别,--raid-devices=N 磁盘数量,/dev/md0 阵列设备名。

创建后格式化并挂载:

sudo mkfs.xfs /dev/md0
sudo mkdir -p /raid
sudo mount /dev/md0 /raid

7.4 查看与管理 RAID

cat /proc/mdstat       # 查看 RAID 状态
sudo mdadm --detail /dev/md0   # 详细查看阵列信息
sudo mdadm --detail --scan     # 扫描系统已有阵列

# 模拟磁盘故障并移除(RAID 1/5 的容错演示)
sudo mdadm /dev/md0 --fail /dev/sdb
sudo mdadm /dev/md0 --remove /dev/sdb

# 添加新盘重建
sudo mdadm /dev/md0 --add /dev/sde

7.5 开机自动组装 RAID

# 把阵列配置写入 /etc/mdadm.conf,否则重启后阵列可能不自动出现
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
sudo dracut --force     # 重新生成 initramfs(Red Hat 系)

说明:RAID 阵列的 UUID 记录在 /etc/mdadm.conf,开机时由 mdmonitor 等服务自动组装。

参考:man 8 mdadmRed Hat - 管理存储设备(含 RAID)DigitalOcean - 用 mdadm 创建 RAID


八、总结与练习

8.1 核心速查

需求 命令
查看磁盘/挂载 df -hlsblk -f
查看目录占用 du -sh 目录
查看/分区 fdisk -lparted -l
格式化 xfs / ext4 mkfs.xfs / mkfs.ext4
检查文件系统 fsck(ext4)/ xfs_repair(xfs)
查看 UUID blkidlsblk -f
挂载 / 卸载 mount / umount
开机自动挂载 编辑 /etc/fstab
查看 swap free -hswapon --show
创建/扩展 PV/VG/LV pvcreatevgcreatelvcreate
LV 扩容 lvextend + xfs_growfs/resize2fs
创建 RAID mdadm --create
查看 RAID cat /proc/mdstat

8.2 动手练习建议(虚拟机)

# 1. 查看当前存储
lsblk -f; df -h

# 2. 练习创建分区 + 格式化 + 挂载(虚拟机的空闲磁盘 /dev/sdb)
sudo fdisk /dev/sdb          # 创建一个分区 sdb1
sudo mkfs.xfs /dev/sdb1
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
df -h /mnt/data

# 3. 添加自动挂载(用 UUID)
sudo blkid /dev/sdb1
sudo vim /etc/fstab          # 加一行 UUID=... /mnt/data xfs defaults 0 2
sudo mount -a; df -h

# 4. LVM 扩容练习
sudo pvcreate /dev/sdc1; sudo vgextend vg_data /dev/sdc1
sudo lvextend -L +2G /dev/mapper/vg_data-lv_data
sudo xfs_growfs /mnt/data
df -h /mnt/data

# 5. 软 RAID 练习(3 块小盘)
sudo dnf install -y mdadm
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
cat /proc/mdstat

安全提醒:磁盘/分区/LVM/RAID 操作风险高、易损坏数据,务必在虚拟机或测试机上练习,并先备份重要数据。设备号(/dev/sdb 等)因机器而异,操作前务必用 lsblk 确认。


参考资料