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

相关推荐
酷可达拉斯9 小时前
Linux操作系统-tcpdump抓包定位网络问题实战
linux·运维·服务器·网络·tcpdump
byte轻骑兵9 小时前
BlueZ 5.x 整体架构总览:用户态 + 内核态分层设计核心逻辑
linux·架构·bluez·电脑蓝牙·嵌入式蓝牙
ltl17 小时前
大多数「无锁」代码其实不是无锁的
linux
ltl17 小时前
Linux 内核的内存屏障:一个让我调了三天的 bug
linux
paopaokaka_luck18 小时前
基于springboot3+vue3的企业考勤管理系统(部门树递归、Echarts图形化分析)
开发语言·spring boot·学习·echarts·mybatis·需求分析·代码规范
minglie118 小时前
zynq高频小数据量PS闭环 抖动时间的测量
学习
long31618 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql
Lonely 净土19 小时前
Rocky Linux 安装教程
linux·运维·服务器
梦雨生生19 小时前
java开发工具(学习第一天)
java·开发语言·学习
李白你好1 天前
Windows 离线 Linux 提权辅助查询工具
linux