CentOS Stream 9入门学习教程,从入门到精通,CentOS Stream 9 磁盘存储管理 —语法详解与实战案例(7)

CentOS Stream 9 磁盘存储管理 ---语法详解与实战案例


一、磁盘存储管理概述

Linux 磁盘管理分为三个层次:

  1. 物理磁盘设备 :如 /dev/sda, /dev/nvme0n1
  2. 磁盘分区 :将物理磁盘划分为多个逻辑区域(如 /dev/sda1
  3. 文件系统:在分区上创建数据结构(如 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 请用 partedgdisk

常用子命令 (在 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 swap
  • 8e:Linux LVM
  • 7: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个主/扩展分区)
  • partprobepartx 用于避免重启生效
  • 分区后需格式化才能使用(见第六章)

六、综合案例:修改磁盘现有分区结构


🎯 案例概述

场景

现有磁盘 /dev/sdc 有3个分区,需:

  1. 删除第3个分区
  2. 将空间合并到第2个分区(需先删除再重建,数据会丢失!)
  3. 修改第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 分区:

  1. 格式化 /dev/sdb1 为 ext4,挂载到 /data
  2. 格式化 /dev/sdb5 为 xfs,挂载到 /backup
  3. 启用 /dev/sdb2 为 swap
  4. 配置开机自动挂载
  5. 测试读写权限

🧩 案例详解(完整脚本)

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 磁盘存储管理的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。

相关推荐
wadesir1 小时前
Linux网络优化服务配置(从零开始提升服务器网络性能)
linux·服务器·网络
tianyuanwo1 小时前
从PAM到零信任:Linux密码认证体系的深度解析与演进
linux·运维·服务器·pam·密码认证
unclecss1 小时前
键盘输入延迟 800 ms?!——一次终端“假死”排查笔记
linux·运维·笔记·性能优化·auditd
シ風箏1 小时前
Shell【脚本 06】监测文件数据量并压缩及查看远程服务器状态并删除文件脚本分享
linux·运维·服务器·github·shell
汤姆yu1 小时前
基于SpringBoot的人工智能学习网站
spring boot·后端·学习·人工智能学习
一个平凡而乐于分享的小比特2 小时前
Linux、Debian、Yocto、Buildroot、Android系统详解
android·linux·操作系统·debian·yocto·buildroot
赖small强2 小时前
【Linux C/C++开发】深入解析 Linux C/C++ 中的 Deferred Crash (延迟崩溃)
linux·c语言·c++·asan·core dump·延迟奔溃·mprotect
郝学胜-神的一滴2 小时前
Linux进程创建的封装与设计模式应用:结构化分析与实践指南
linux·服务器·开发语言·c++·程序人生·设计模式
infiniteWei2 小时前
【VIM 入门到精通】快速查找与替换:定位和修改文本的利器
linux·编辑器·vim