CentOS Stream 9 磁盘存储管理 ---语法详解与实战案例
一、磁盘存储管理概述
Linux 磁盘管理分为三个层次:
- 物理磁盘设备 :如
/dev/sda,/dev/nvme0n1 - 磁盘分区 :将物理磁盘划分为多个逻辑区域(如
/dev/sda1) - 文件系统:在分区上创建数据结构(如 ext4, xfs),用于存储文件
✅ 查看当前磁盘设备:
bash
lsblk # 树状列出块设备
sudo fdisk -l # 详细列出磁盘和分区
df -h # 查看已挂载文件系统使用情况
二、磁盘分区简介
2.1 分区类型
| 类型 | 说明 |
|---|---|
| 主分区 | 最多4个,可直接格式化挂载 |
| 扩展分区 | 一种特殊主分区,不能直接使用,用于容纳逻辑分区 |
| 逻辑分区 | 在扩展分区内创建,数量无硬性限制(受磁盘空间限制) |
⚠️ 注意:MBR 分区表最多支持4个主分区(或3主+1扩展),GPT 无此限制。
2.2 分区表类型
| 类型 | 最大磁盘 | 最大分区数 | 适用场景 |
|---|---|---|---|
| MBR | 2TB | 4主分区 | 传统 BIOS 系统 |
| GPT | 18EB | 128+ | UEFI 系统、大容量磁盘 |
✅ 查看分区表类型:
bash
sudo parted -l
# 或
sudo fdisk -l /dev/sda | grep "Disklabel type"
三、文件系统简介
3.1 常见 Linux 文件系统
| 文件系统 | 特点 | 适用场景 |
|---|---|---|
| ext4 | 成熟稳定,日志型,兼容性好 | 通用(推荐默认) |
| xfs | 高性能,大文件支持好,不可收缩 | 大数据、数据库 |
| btrfs | 支持快照、压缩、RAID(实验性功能多) | 测试/高级用户 |
| vfat | 兼容 Windows(FAT32) | U盘、双系统共享 |
| swap | 交换分区,用于虚拟内存 | 内存扩展 |
✅ 查看支持的文件系统:
bash
cat /proc/filesystems
四、Linux磁盘分区管理
4.1 磁盘及分区命名规则
| 设备类型 | 命名规则 | 示例 |
|---|---|---|
| SATA/SAS/USB | /dev/sd[a-z][1-9] |
/dev/sda1 |
| NVMe SSD | /dev/nvme[0-9]n1p[1-9] |
/dev/nvme0n1p1 |
| 虚拟磁盘 | /dev/vd[a-z][1-9] |
/dev/vda1 |
✅ 示例:
bash
/dev/sda # 第一块 SATA 磁盘
/dev/sda1 # sda 的第一个分区
/dev/nvme0n1 # 第一块 NVMe 磁盘
/dev/nvme0n1p2 # nvme0n1 的第二个分区
4.2 磁盘分区管理命令 fdisk
功能 :交互式分区工具(仅支持 MBR,GPT 请用 parted 或 gdisk)
常用子命令 (在 fdisk 交互界面中输入):
| 命令 | 功能 |
|---|---|
p |
打印分区表 |
n |
新建分区 |
d |
删除分区 |
t |
修改分区类型 |
w |
保存并退出 |
q |
不保存退出 |
m |
显示帮助 |
✅ 查看帮助:
bash
fdisk -h
➤ 创建新分区(交互式)
✅ 案例:为
/dev/sdb创建一个主分区
bash
sudo fdisk /dev/sdb
在交互界面中操作(带注释):
text
Command (m for help): n # 输入 n 创建新分区
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p # 选择主分区(默认)
Partition number (1-4, default 1): 1 # 分区号,默认1
First sector (2048-20971519, default 2048): [Enter] # 起始扇区,默认
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, default 20971519): +5G # 分配5GB空间
Created a new partition 1 of type 'Linux' and of size 5 GiB.
Command (m for help): p # 打印当前分区表,确认无误
Command (m for help): w # 写入分区表并退出
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
📝 说明:
+5G:从当前起始扇区开始,分配5GB空间w:必须执行才能生效,否则分区不会创建- 分区创建后需格式化才能使用
➤ 修改分区类型(如改为 swap)
✅ 案例:将
/dev/sdb2改为 swap 分区
bash
sudo fdisk /dev/sdb
交互操作:
text
Command (m for help): t # 输入 t 修改类型
Partition number (1,2, default 2): 2 # 选择分区2
Hex code (type L to list all codes): L # 查看类型列表
...
Hex code (type L to list all codes): 82 # 82 = Linux swap
Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Command (m for help): w # 保存退出
✅ 查看分区类型代码:
bash
sudo fdisk /dev/sdb
# 输入 L 查看所有类型
常用代码:
83:Linux 文件系统(默认)82:Linux swap8e:Linux LVM7:HPFS/NTFS/exFAT(Windows)
➤ 删除分区
✅ 案例:删除
/dev/sdb1
bash
sudo fdisk /dev/sdb
交互操作:
text
Command (m for help): d # 输入 d 删除
Partition number (1,2, default 2): 1 # 选择要删除的分区号
Partition 1 has been deleted.
Command (m for help): w # 保存退出
⚠️ 警告:删除分区会丢失该分区所有数据!
五、综合案例:对新磁盘进行分区
🎯 案例概述
场景 :
新增一块 20GB 磁盘 /dev/sdb,需划分为:
- 10GB 主分区 → 用于数据存储(ext4)
- 2GB swap 分区 → 用于内存交换
- 剩余空间 → 逻辑分区(用于备份,xfs)
🧩 案例详解(带详细注释)
bash
#!/bin/bash
# 文件名:partition_new_disk.sh
# 功能:自动化为新磁盘 /dev/sdb 创建分区结构
echo "🚀 开始为 /dev/sdb 创建分区..."
echo "=================================="
# === 1. 使用 fdisk 创建分区表(交互式脚本化)===
echo "🔧 正在创建分区结构..."
# 使用 here document 自动化 fdisk
sudo fdisk /dev/sdb <<EOF
n # 新建分区
p # 主分区
1 # 分区号1
# 默认起始扇区
+10G # 大小10GB
n # 新建分区
p # 主分区
2 # 分区号2
# 默认起始
+2G # 大小2GB
t # 修改分区2类型
2 # 选择分区2
82 # 改为 swap 类型
n # 新建分区
e # 扩展分区(用于容纳逻辑分区)
3 # 分区号3
# 默认起始
# 默认结束(使用剩余所有空间)
n # 在扩展分区内新建逻辑分区
# 逻辑分区号默认4
# 默认起始
# 默认结束(使用扩展分区所有空间)
p # 打印确认
w # 保存退出
EOF
echo "✅ 分区表创建完成!"
# === 2. 通知内核重新读取分区表 ===
echo "🔄 通知内核重新加载分区表..."
sudo partprobe /dev/sdb || sudo partx -a /dev/sdb
sleep 2
# === 3. 验证分区 ===
echo "🔍 验证分区结果:"
lsblk /dev/sdb
# 预期输出:
# sdb
# ├─sdb1 # 10G 数据分区
# ├─sdb2 # 2G swap
# └─sdb5 # 逻辑分区(剩余空间,注意:逻辑分区从5开始编号)
echo "✅ 分区结构已创建,下一步需格式化文件系统"
echo "=================================="
💡 使用方法:
bash
chmod +x partition_new_disk.sh
sudo ./partition_new_disk.sh
📝 说明:
- 逻辑分区自动从编号5开始(即使前面只有3个主/扩展分区)
partprobe或partx用于避免重启生效- 分区后需格式化才能使用(见第六章)
六、综合案例:修改磁盘现有分区结构
🎯 案例概述
场景 :
现有磁盘 /dev/sdc 有3个分区,需:
- 删除第3个分区
- 将空间合并到第2个分区(需先删除再重建,数据会丢失!)
- 修改第1个分区类型为 LVM
⚠️ 警告:修改现有分区结构会导致数据丢失!务必先备份!
🧩 案例详解
bash
#!/bin/bash
# 文件名:modify_disk_partition.sh
# 功能:修改 /dev/sdc 现有分区结构
echo "⚠️ 警告:此操作将删除分区并丢失数据!"
read -p "是否继续?(y/N): " confirm
[[ "$confirm" != "y" && "$confirm" != "Y" ]] && echo "❌ 操作取消" && exit 1
echo "🚀 开始修改 /dev/sdc 分区..."
echo "=================================="
# === 1. 备份当前分区表(重要!)===
echo "💾 备份当前分区表到 /tmp/sdc_partition_backup.txt..."
sudo fdisk -l /dev/sdc > /tmp/sdc_partition_backup.txt
# === 2. 使用 fdisk 修改分区 ===
sudo fdisk /dev/sdc <<EOF
p # 打印当前分区(供参考)
d # 删除分区
3 # 删除第3个分区
d # 删除分区
2 # 删除第2个分区(准备重建)
n # 新建分区
p # 主分区
2 # 使用原分区号2
# 默认起始(紧接sdc1之后)
# 默认结束(使用剩余所有空间,包含原sdc3空间)
t # 修改分区1类型
1 # 选择分区1
8e # 改为 Linux LVM 类型
p # 打印确认
w # 保存退出
EOF
echo "✅ 分区结构修改完成!"
# === 3. 重新加载分区表 ===
echo "🔄 重新加载分区表..."
sudo partprobe /dev/sdc
# === 4. 验证结果 ===
echo "🔍 新分区结构:"
lsblk /dev/sdc
sudo fdisk -l /dev/sdc
echo "✅ 操作完成!注意:"
echo " - 原 sdc2 和 sdc3 数据已丢失"
echo " - sdc2 现在占用原 sdc2+sdc3 空间"
echo " - sdc1 类型已改为 LVM (8e)"
echo "=================================="
💡 使用方法:
bash
chmod +x modify_disk_partition.sh
sudo ./modify_disk_partition.sh
📌 生产环境建议:
- 使用
gparted图形工具(需 GUI)进行无损调整 - 或使用 LVM 逻辑卷管理,支持动态调整
七、Linux文件系统管理
7.1 创建文件系统命令 mkfs
语法:
bash
mkfs -t 文件系统类型 分区设备
# 或
mkfs.文件系统类型 分区设备
✅ 常用命令:
bash
sudo mkfs.ext4 /dev/sdb1 # 创建 ext4
sudo mkfs.xfs /dev/sdb5 # 创建 xfs
sudo mkfs.vfat /dev/sdb1 # 创建 FAT32
sudo mkfs -t swap /dev/sdb2 # 创建 swap(也可用 mkswap)
✅ 案例:格式化分区
bash
# 格式化为 ext4(数据分区)
sudo mkfs.ext4 -L DATA /dev/sdb1
# -L:设置卷标(LABEL)
# 格式化为 xfs(备份分区)
sudo mkfs.xfs -L BACKUP /dev/sdb5
# 创建 swap 文件系统
sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2 # 启用 swap
✅ 查看文件系统 LABEL:
bash
sudo blkid /dev/sdb1
# 输出:/dev/sdb1: LABEL="DATA" UUID="..." TYPE="ext4"
7.2 文件系统的挂载和卸载命令
➤ mount ------ 挂载文件系统
语法:
bash
mount [设备] [挂载点]
✅ 临时挂载:
bash
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
df -h /mnt/data # 验证挂载
✅ 指定文件系统类型和选项:
bash
sudo mount -t ext4 -o noatime /dev/sdb1 /mnt/data
# noatime:不更新访问时间,提升性能
➤ umount ------ 卸载文件系统
语法:
bash
umount [挂载点 或 设备]
✅ 卸载:
bash
sudo umount /mnt/data
# 或
sudo umount /dev/sdb1
⚠️ 若提示 "target is busy":
bash
# 查看谁在使用
sudo lsof /mnt/data
# 或
sudo fuser -v /mnt/data
# 强制卸载(慎用)
sudo umount -l /mnt/data # lazy unmount
➤ /etc/fstab ------ 开机自动挂载
格式(6列):
设备 挂载点 文件系统 选项 备份 检查
/dev/sdb1 /mnt/data ext4 defaults 0 2
✅ 推荐使用 UUID(更稳定):
bash
sudo blkid /dev/sdb1
# 复制 UUID,如:UUID=1234-5678
# 编辑 /etc/fstab
sudo nano /etc/fstab
添加行:
fstab
UUID=1234-5678 /mnt/data ext4 defaults,noatime 0 2
LABEL=BACKUP /mnt/backup xfs defaults 0 2
/dev/sdb2 none swap defaults 0 0
✅ 验证 fstab 并挂载:
bash
sudo mount -a # 挂载所有 fstab 中未挂载的文件系统
sudo mount | grep /mnt # 验证
7.3 文件系统检查和修复命令 fsck
功能 :检查并修复文件系统错误(需在未挂载状态下运行)
语法:
bash
fsck [选项] 分区设备
✅ 常用选项:
-y:自动修复(不询问)-n:只检查,不修复-f:强制检查(即使文件系统标记为 clean)
✅ 案例:修复 ext4 文件系统
bash
# 1. 先卸载
sudo umount /dev/sdb1
# 2. 检查并自动修复
sudo fsck -y /dev/sdb1
# 3. 重新挂载
sudo mount /dev/sdb1 /mnt/data
✅ 针对特定文件系统:
bash
sudo fsck.ext4 -y /dev/sdb1
sudo fsck.xfs -n /dev/sdb5 # xfs 通常用 xfs_repair
✅ xfs 专用修复工具:
bash
sudo umount /dev/sdb5
sudo xfs_repair /dev/sdb5
sudo mount /dev/sdb5 /mnt/backup
⚠️ 注意:
- 切勿在挂载状态下运行 fsck!
- 系统启动时若检测到文件系统错误,会自动进入修复模式
八、综合案例:创建和使用文件系统
🎯 案例概述
场景 :
基于之前创建的 /dev/sdb 分区:
- 格式化
/dev/sdb1为 ext4,挂载到/data - 格式化
/dev/sdb5为 xfs,挂载到/backup - 启用
/dev/sdb2为 swap - 配置开机自动挂载
- 测试读写权限
🧩 案例详解(完整脚本)
bash
#!/bin/bash
# 文件名:setup_filesystems.sh
# 功能:格式化分区、挂载、配置自动挂载、测试
echo "🚀 开始设置文件系统..."
echo "=================================="
# === 1. 格式化分区 ===
echo "🔧 正在格式化分区..."
# 数据分区 - ext4
sudo mkfs.ext4 -L DATA /dev/sdb1
echo "✅ /dev/sdb1 格式化为 ext4 完成"
# 备份分区 - xfs
sudo mkfs.xfs -L BACKUP /dev/sdb5
echo "✅ /dev/sdb5 格式化为 xfs 完成"
# Swap 分区
sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2
echo "✅ /dev/sdb2 启用为 swap"
# === 2. 创建挂载点 ===
echo "📁 创建挂载目录..."
sudo mkdir -p /data /backup
# === 3. 临时挂载 ===
echo "🔗 临时挂载文件系统..."
sudo mount /dev/sdb1 /data
sudo mount /dev/sdb5 /backup
# === 4. 配置开机自动挂载 ===
echo "⚙️ 配置 /etc/fstab..."
# 获取 UUID
UUID_DATA=$(sudo blkid -s UUID -o value /dev/sdb1)
UUID_BACKUP=$(sudo blkid -s UUID -o value /dev/sdb5)
# 备份原 fstab
sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)
# 追加新配置
cat << EOF | sudo tee -a /etc/fstab
# Added by setup_filesystems.sh
UUID=$UUID_DATA /data ext4 defaults,noatime 0 2
UUID=$UUID_BACKUP /backup xfs defaults 0 2
/dev/sdb2 none swap defaults 0 0
EOF
echo "✅ /etc/fstab 配置完成"
# === 5. 验证挂载配置 ===
echo "🔍 验证挂载配置..."
sudo mount -a # 重新挂载所有
if [ $? -eq 0 ]; then
echo "✅ mount -a 执行成功"
else
echo "❌ mount -a 失败,请检查 /etc/fstab"
exit 1
fi
# === 6. 验证挂载点 ===
echo "📊 查看挂载情况:"
df -h /data /backup
free -h | grep Swap # 查看 swap
# === 7. 测试读写权限 ===
echo "🧪 测试读写权限..."
# 测试 /data
sudo touch /data/test_file.txt
echo "Hello from /data" | sudo tee /data/test_file.txt > /dev/null
sudo cat /data/test_file.txt
# 测试 /backup
sudo touch /backup/backup_test.txt
echo "Hello from /backup" | sudo tee /backup/backup_test.txt > /dev/null
sudo cat /backup/backup_test.txt
echo "✅ 读写测试成功!"
# === 8. 设置权限(可选)===
echo "🔐 设置目录权限(允许 alice 用户读写)..."
sudo chown -R alice:alice /data /backup 2>/dev/null && echo "✅ 权限设置完成"
echo
echo "🎉 所有操作完成!"
echo "📌 挂载点:"
echo " - 数据:/data"
echo " - 备份:/backup"
echo " - Swap:已启用"
echo "📌 开机将自动挂载"
echo "=================================="
💡 使用方法:
bash
chmod +x setup_filesystems.sh
sudo ./setup_filesystems.sh
✅ 预期输出:
/dev/sdb1 9.8G 37M 9.3G 1% /data
/dev/sdb5 18G 33M 18G 1% /backup
Swap: 2.0G
Hello from /data
Hello from /backup
✅ 学习建议与最佳实践
- 分区前备份:修改分区表前务必备份重要数据。
- 使用 UUID/LABEL :在
/etc/fstab中优先使用 UUID 或 LABEL,避免设备名变化导致挂载失败。 - 合理选择文件系统 :
- 通用场景:
ext4 - 大文件/高性能:
xfs - 需要快照:
btrfs(谨慎用于生产)
- 通用场景:
- 定期检查文件系统 :
fsck应在维护窗口或救援模式下运行。 - 监控磁盘空间 :设置
df -h定期检查,避免100%占用导致系统异常。 - LVM 优于直接分区:生产环境推荐使用 LVM,支持动态扩容、快照等高级功能。
📚 附录:磁盘管理命令速查表
| 功能 | 命令示例 |
|---|---|
| 查看磁盘 | lsblk, sudo fdisk -l |
| 分区 | sudo fdisk /dev/sdb |
| 格式化 ext4 | sudo mkfs.ext4 /dev/sdb1 |
| 格式化 xfs | sudo mkfs.xfs /dev/sdb1 |
| 创建 swap | sudo mkswap /dev/sdb2 && sudo swapon /dev/sdb2 |
| 挂载 | sudo mount /dev/sdb1 /mnt/data |
| 卸载 | sudo umount /mnt/data |
| 开机挂载 | 编辑 /etc/fstab |
| 检查文件系统 | sudo fsck -y /dev/sdb1(卸载后) |
| 修复 xfs | sudo xfs_repair /dev/sdb1(卸载后) |
| 查看 UUID | sudo blkid /dev/sdb1 |
这份文档覆盖了 CentOS Stream 9 磁盘存储管理的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。