Linux 存储管理
Linux 存储管理
目录
- 存储与磁盘的基本概念
- 查看磁盘与分区:df / du / lsblk / fdisk / parted
- 格式化分区:mkfs 与 xfs/ext4 差异
- 文件系统维护:fsck、swap、blkid
- 分区挂载:mount / umount / /etc/fstab
- 逻辑卷 LVM:pv / vg / lv 与扩容缩容
- 软 RAID:mdadm 配置 RAID0/1/5(进阶)
- 总结与练习
一、存储与磁盘的基本概念
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 设备(见第七章) |
二、查看磁盘与分区: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 df、man 1 du、man 8 lsblk、man 8 fdisk、man 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.xfs、man 8 mkfs.ext4、Red 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(注意:需先卸载)
- ext4 用
fsck/e2fsck;xfs 用xfs_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 fsck、man 8 xfs_repair、man 8 mkswap、man 8 swapon、man 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/data或fuser -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:
blkid或lsblk -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 mount、man 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 扩容命令不同:
- xfs →
xfs_growfs 挂载点(可在线)。 - ext4 →
resize2fs 设备。
前提: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 lvm、man 8 lvextend、man 8 lvreduce、man 8 xfs_growfs、man 8 resize2fs、Red 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 mdadm、Red Hat - 管理存储设备(含 RAID)、DigitalOcean - 用 mdadm 创建 RAID
八、总结与练习
8.1 核心速查
| 需求 | 命令 |
|---|---|
| 查看磁盘/挂载 | df -h、lsblk -f |
| 查看目录占用 | du -sh 目录 |
| 查看/分区 | fdisk -l、parted -l |
| 格式化 xfs / ext4 | mkfs.xfs / mkfs.ext4 |
| 检查文件系统 | fsck(ext4)/ xfs_repair(xfs) |
| 查看 UUID | blkid、lsblk -f |
| 挂载 / 卸载 | mount / umount |
| 开机自动挂载 | 编辑 /etc/fstab |
| 查看 swap | free -h、swapon --show |
| 创建/扩展 PV/VG/LV | pvcreate、vgcreate、lvcreate |
| 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确认。
参考资料
- Red Hat 官方文档 - 管理存储设备:https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/managing_storage_devices/
- man 手册:
man 1 df、man 1 du、man 8 lsblk、man 8 fdisk、man 8 parted、man 8 mkfs.xfs、man 8 mkfs.ext4、man 8 fsck、man 8 xfs_repair、man 8 blkid、man 8 mount、man 5 fstab、man 8 lvm、man 8 lvextend、man 8 lvreduce、man 8 xfs_growfs、man 8 resize2fs、man 8 mdadm - Rocky Linux 官方文档 - 文件系统:https://docs.rockylinux.org/books/admin_guide/07-file-systems/
- 菜鸟教程 - Linux 磁盘管理:https://www.runoob.com/linux/linux-filesystem.html
- DigitalOcean - 用 mdadm 创建 RAID:https://www.digitalocean.com/community/tutorials/how-to-create-raid-arrays-with-mdadm-on-ubuntu
