云计算百科
云计算领域专业知识百科平台

Linux 磁盘分区管理 | RAID存储技术 | 逻辑卷管理

文章目录

  • Linux 磁盘分区管理 | RAID存储技术 | 逻辑卷管理
    • 磁盘分区管理
      • 一、 GPT 分区方案深度解析
        • 1. 为什么需要 GPT?
        • 2. GPT 分区表结构(LBA 布局)
      • 二、 磁盘分区管理工具实战
        • 1. `gdisk` 工具管理 GPT 磁盘
          • 1.1 查看分区表与转换为 GPT
          • 1.2 创建新分区
          • 1.3 更改分区名称与查看详情
          • 1.4 删除分区
        • 2. `wipefs` 工具:彻底清除磁盘元数据
        • 3. `parted` 工具:全能分区管理大师
          • 3.1 设置单位与查看分区表
          • 3.2 管理 MBR (msdos) 磁盘
          • 3.3 管理 GPT 磁盘
          • 3.4 非交互式操作(单行命令)
      • 三、 文件系统持久化挂载(`/etc/fstab`)
        • 1. `/etc/fstab` 六字段详解
        • 2. 实战配置与测试
      • 四、 文件系统空间不足综合排障
        • 场景 1:大量的大文件占用空间
        • 场景 2:删除文件后,空间没有释放(经典陷阱)
        • 场景 3:inode 耗尽(大量小文件占满)
    • RAID存储技术
      • 一、 RAID 技术概述
        • 1.1 RAID 的历史与定义
        • 1.2 RAID 的实现方式
      • 二、 核心 RAID 级别详解
        • 2.1 RAID 0(条带化)
        • 2.2 RAID 1(镜像)
        • 2.3 RAID 5(分布式奇偶校验)
        • 2.4 RAID 6(双重分布式奇偶校验)
        • 2.5 RAID 10(条带化+镜像)
        • 2.6 复合 RAID 级别(RAID 50 / RAID 60)
        • 2.7 RAID 各级别参数对比总结
      • 三、 软 RAID 的配置与管理实战(`mdadm`)
        • 3.1 RAID 0 的创建与管理
        • 3.2 RAID 1 的容错与热备盘机制
        • 3.3 RAID 5 的动态扩容与故障模拟
    • 逻辑卷管理
      • 硬盘分区管理方案缺点
      • 逻辑卷管理(LVM)的优势
      • 基本概念
      • LVM 管理基本流程
        • 创建物理卷
        • 创建卷组
        • 创建逻辑卷
        • 创建文件系统
        • 清理 LVM
      • 扩展和缩减卷组
        • 环境准备
        • 扩展卷组
        • 缩减卷组
        • 扩展逻辑卷
        • 缩减逻辑卷
        • 扩展 XFS 文件系统
        • 扩展 EXT4 文件系统
        • 缩减 EXT4 文件系统
        • 逻辑卷快照
      • RAID 逻辑卷
        • 创建 RAID1 逻辑卷
        • 模拟故障与修复
        • 创建 RAID5 逻辑卷示例

Linux 磁盘分区管理 | RAID存储技术 | 逻辑卷管理

磁盘分区管理

一、 GPT 分区方案深度解析

1. 为什么需要 GPT?

传统的 MBR(Master Boot Record) 分区方案自 1982 年以来长期统治磁盘管理,但其具有两个硬性瓶颈:

  • 容量限制:MBR 记录分区总扇区数时仅使用 4 个字节,最大只能表示 2^32 个扇区。按每扇区 512 字节计算,MBR 单个分区最大无法超过 2 TiB。
  • 分区数量限制:MBR 最多支持 4 个主分区,即使利用扩展分区和逻辑分区,最多也只能扩展到 15 个分区。

而 GPT(GUID Partition Table) 是运行在 UEFI 固件 系统上的全新标准,彻底解决了上述问题:

  • 超大容量:GPT 使用 8 个字节(64 位)存储扇区总数,理论可支持 18 ZiB(约 18 亿 TB)的分区和磁盘。
  • 海量分区:GPT 默认支持 128 个分区(远超 MBR 的 15 个),无需繁琐的扩展分区逻辑。
  • 数据冗余:GPT 在磁盘头部和尾部各保存了一份分区表信息,具备极强的自我修复能力。
2. GPT 分区表结构(LBA 布局)

GPT 对磁盘的扇区管理采用了逻辑块寻址(LBA)的方式,其结构严谨且带有防护机制:

  • LBA0(保护性 MBR):
    • GPT 在磁盘第一个扇区保留了兼容性。前 446 字节用于存放启动引导程序,后 4 个分区表项中,有一个存放了特殊标识符 0xEE。
    • 作用:当使用老旧、不支持 GPT 的磁盘管理软件读取该磁盘时,系统会认为这是一个已分区的磁盘,从而避免误操作覆盖分区表,起到了保护作用。
  • LBA1(GPT 表头记录):
    • 这是 GPT 的核心元数据,记录了分区表自身的位置和大小、备份 GPT 所在的位置(通常位于磁盘最后 34 个 LBA),以及分区表的 CRC32 校验码。
    • 作用:操作系统启动时,会通过校验码判断 GPT 信息是否正确。一旦检测到损坏,系统会立刻从备份 GPT 中恢复数据,确保磁盘结构的完整性。
  • LBA2 ~ LBA33(分区记录区):
    • 默认情况下,每个 LBA(512 字节)可存放 4 组分区记录信息。因此,32 个 LBA 最大可提供 128 组分区记录。
    • 注意:虽然 GPT 理论上支持 128 个分区,但在实际使用中,如果逻辑分区超过 120 个,可能会出现无法格式化使用的异常情况。

二、 磁盘分区管理工具实战

在 Linux 中,针对不同分区表类型,系统提供了不同的管理工具。gdisk 专门用于管理 GPT 磁盘,而 parted 则是一个同时支持 MBR 和 GPT 的强大全能工具。

1. gdisk 工具管理 GPT 磁盘
1.1 查看分区表与转换为 GPT

使用 gdisk -l /dev/sdb 可以查看目标磁盘的分区表状态。 如果系统检测到磁盘当前是 MBR 格式,而我们需要将其转换为 GPT,可以进入交互式界面:

[root@server-xianyu ~]# gdisk /dev/sdb
Command (? for help): o # 输入o,清空所有分区,创建一个新的空 GPT 分区表
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y # 确认删除操作
Command (? for help): w # 输入w,将更改写入磁盘并退出

(注:如果你不想保存更改,可以输入 q 直接退出,避免破坏原有数据。)

1.2 创建新分区

转换并保存后,再次进入 gdisk,此时会识别到 GPT 方案。通过以下步骤创建一个 2GB 的分区:

Command (? for help): n # 输入n,添加新分区
Partition number (1-128, default 1): 回车 # 使用默认分区号1
First sector (34..., default = 2048): 回车 # 使用默认起始扇区(支持4K对齐)
Last sector (2048..., default = ...): +2G # 指定分区大小为2GB
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 回车 # 使用默认的Linux filesystem (8300) 类型

1.3 更改分区名称与查看详情

为了便于识别,我们可以给分区设置一个易读的名称(PARTLABEL):

Command (? for help): c # 输入c,更改分区名称
Using 1 # 选择分区号1
Enter name: data01 # 输入新的分区名称

完成创建和命名后,可以用 p 查看分区表,或者用 i 查看特定分区的详细 GUID 信息:

Command (? for help): i # 查看分区1详细信息
Using 1
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition name: 'data01'

1.4 删除分区

如果需要清理分区,使用 d 命令即可:

Command (? for help): d # 删除分区
Using 1 # 选择要删除的分区号

删除完成后,务必输入 w 保存并退出。

2. wipefs 工具:彻底清除磁盘元数据

在某些情况下,磁盘上残留的旧分区表或文件系统签名会导致新的分区操作失败。此时可以使用 wipefs 工具彻底清除这些元数据。

# 查看磁盘上现有的分区表签名
[root@server-xianyu ~]# wipefs /dev/sdb

# 清除未挂载磁盘的所有分区表信息(即重置为空白磁盘)
[root@server-xianyu ~]# wipefs -a /dev/sdb

# 如果系统提示有保护,可使用 -f 强制清除
[root@server-xianyu ~]# wipefs -fa /dev/sdb

⚠️ 注意:该操作非常危险,会将硬盘上的所有分区记录清空,请务必确认数据已备份或确认不需要保留原有数据后再执行。

3. parted 工具:全能分区管理大师

parted 可以交互式或非交互式地操作 MBR(msdos)和 GPT 磁盘。

3.1 设置单位与查看分区表

操作的第一步通常是将默认的 MB(1000进制)单位改为 MiB(1024进制),以保证扇区边界完美 4K 对齐:

(parted) unit MiB # 设置单位为 MiB
(parted) print # 查看当前分区表

3.2 管理 MBR (msdos) 磁盘

① 创建分区表与分区

(parted) mklabel msdos # 设置为 MBR 格式
(parted) mkpart primary xfs 1 2049 # 创建主分区,起始1MiB,结束2049MiB(大小2GiB)

② 扩展分区容量

(parted) resizepart 1 4097 # 将分区1的结束位置扩展到4097MiB(即扩大到4GiB)

(注:在 parted 中调整分区大小会立即生效,无需像传统 fdisk 那样删除重建。)

③ 删除分区

(parted) rm 1 # 删除分区1

3.3 管理 GPT 磁盘

parted 管理 GPT 磁盘的步骤与 MBR 基本一致,仅在创建分区和设置标签时有细微差别:

(parted) mklabel gpt # 设置为 GPT 格式
(parted) mkpart data01 xfs 1 2049 # 创建名为 data01 的 xfs 分区

扩展和删除操作与 MBR 下的 resizepart 和 rm 命令完全相同。

3.4 非交互式操作(单行命令)

parted 支持直接在一行命令行中完成操作,非常适合编写自动化脚本:

# 创建一个 msdos 分区表的主分区
parted /dev/sdb unit MiB mkpart primary 1 2049

# 创建一个 gpt 分区表的分区
parted /dev/sdb unit MiB mkpart data01 xfs 1 2049

# 删除分区1
parted /dev/sdb rm 1

三、 文件系统持久化挂载(/etc/fstab)

使用 mount 命令挂载的分区在服务器重启后会失效。为了实现开机自动挂载,需要将配置写入 /etc/fstab 文件。

1. /etc/fstab 六字段详解

该文件的每一行代表一个挂载配置,以空格分隔,包含 6 个字段:

  • 设备(Device):推荐使用 UUID(通过 blkid 命令获取),不建议使用 /dev/sdb1 这种设备名,避免因磁盘插拔顺序改变而导致开机挂载失败。
  • 挂载点(Mount point):必须是一个已存在的空目录(如 /data01)。
  • 文件系统类型(File system type):例如 xfs、ext4。
  • 挂载选项(Mount options):通常设置为 defaults(包含读写、异步等默认特性)。
  • dump 备份标记:一般为 0,表示不备份。
  • fsck 检查顺序:决定开机时是否运行文件系统检查。
    • 0:不检查(XFS 文件系统推荐设为 0,因为 XFS 有自有的日志机制)。
    • 1:优先检查(通常仅用于根分区 /)。
    • 2:按顺序检查(用于其他 ext4 文件系统分区)。
  • 2. 实战配置与测试

    # 1. 获取 UUID
    [root@server-xianyu ~]# blkid /dev/sdb1
    /dev/sdb1: UUID="f5c35f10-0274-45af-b044-73694989fe01" TYPE="xfs"

    # 2. 创建挂载点并编辑 fstab
    [root@server-xianyu ~]# mkdir /data01
    [root@server-xianyu ~]# vim /etc/fstab
    # 在文件末尾追加以下内容(注意必须用制表符或空格正确隔开):
    UUID="f5c35f10-0274-45af-b044-73694989fe01" /data01 xfs defaults 0 0

    # 3. 立即测试挂载(无需重启服务器!)
    [root@server-xianyu ~]# mount /data01
    # 或者使用 mount -a 测试所有 fstab 条目的正确性

    # 4. 验证
    [root@server-xianyu ~]# df -h /data01

    ⚠️ 重要提醒:在执行 mount /data01 或重启服务器之前,务必确认 /etc/fstab 配置无语法错误。如果配置错误,可能导致系统开机卡死在文件系统检查阶段而无法正常引导。

    四、 文件系统空间不足综合排障

    在运维过程中,“磁盘写满”是高频故障。针对不同的场景,排查与解决方法截然不同。

    场景 1:大量的大文件占用空间

    现象:df -h 显示该分区利用率已达到 100%,且系统响应变慢。 解决策略:使用 find 或 du 组合命令快速定位大文件并删除。

    # 直接查找大于100M的文件
    find /myapp-1/ -size +100M
    /myapp-1/etc/bigfile

    # 或者逐层进入目录,利用 du 和 sort 找出最大目录
    du -sk /myapp-1/* | sort -n | tail -2

    定位后直接 rm -f 删除即可。

    场景 2:删除文件后,空间没有释放(经典陷阱)

    现象:执行 rm -f 删除了一个 2GB 的日志文件,但 df -h 显示依然 100% 满。 原因:该文件虽然从目录中移除了,但仍有进程(如 tail -f 或程序进程)正在持续打开并写入该文件。Linux 不会释放被打开文件占用的磁盘块,直到该进程彻底退出。 解决方法:使用 lsof 查找被删除但仍被占用的文件,并终止该进程。

    [root@server-xianyu ~]# lsof |grep delete |grep /myapp-1
    tail 1654 root 3r REG 8,17 2061565952 /myapp-1/etc/bigfile (deleted)
    [root@server-xianyu ~]# kill 1654
    [root@server-xianyu ~]# df -h /myapp-1/
    # 空间立即释放!

    💡 建议:在日常清理大文件时,可以先执行 > /myapp-1/etc/bigfile 重定向清空文件内容,再执行 rm 删除,这样从源头避免了进程占用问题。

    场景 3:inode 耗尽(大量小文件占满)

    现象:df -h 显示还有大量剩余空间(如 1.8M 已用 / 905M 可用),但创建新文件时却报错 设备上没有空间。 原因:文件系统的**索引节点(Inode)**被大量 1KB 的空文件或小文件耗尽了。Inode 用于存放文件的元数据(如权限、位置、时间),每个文件必然占用 1 个 Inode。当 Inode 数量达到上限时,即使磁盘有空间,也无法创建新文件。 排查与解决:

    # 使用 df -hi 查看 inode 使用情况
    [root@server-xianyu ~]# df -hi /myapp-2
    文件系统 Inodes IUsed IFree IUse% Mounted on
    /dev/sdb2 64K 64K 0 100% /myapp-2

    # 解决方法一:直接删除不需要的海量小文件
    rm -f /myapp-2/file-0*

    # 解决方法二:将大量小文件合并为一个大文件(归档)
    cat /myapp-2/file-{00001..10000} > file-00001

    RAID存储技术

    一、 RAID 技术概述

    1.1 RAID 的历史与定义

    RAID 的概念最早起源于 1988 年,由美国加州大学伯克利分校的 D. A. Patterson 教授等人在论文《A Case of Redundant Array of Inexpensive Disks》中首次提出,其全称为 廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks)。当时大容量磁盘极其昂贵,RAID 的基本思想是将多块容量较小、相对廉价的磁盘组合起来,以较低的成本获得与昂贵大容量磁盘相当的容量、性能和可靠性。

    随着硬件成本的降低,“廉价”一词已失去实际意义。RAID 咨询委员会(RAB)决定用“独立”替代“廉价”,因此 RAID 现在的正式名称变为 独立磁盘冗余阵列(Redundant Array of Independent Disks)。尽管名称改变,但其核心技术思想并未发生实质变化。

    1.2 RAID 的实现方式

    从底层实现角度看,RAID 主要分为以下三种类型:

    • 软 RAID:所有 RAID 的逻辑功能(包括数据条带化、镜像、校验计算等)均由操作系统和 CPU 完成。它没有独立的 RAID 控制芯片和 I/O 处理芯片,因此效率最低,但成本极低,无需额外硬件支持。
    • 硬 RAID:配备了专门的 RAID 控制芯片、I/O 处理芯片以及独立的阵列缓存。所有的数据运算都由硬件独立完成,完全不占用服务器的 CPU 资源,性能极佳,但硬件成本很高。
    • 软硬混合 RAID:具备专门的 RAID 控制芯片,但缺乏独立的 I/O 处理芯片,部分控制逻辑仍需要 CPU 配合驱动程序来完成。其性能和成本介于软 RAID 和硬 RAID 之间。

    二、 核心 RAID 级别详解

    RAID 主要通过数据条带化(Striping)、**镜像(Mirroring)和数据校验(Parity)**三种技术来获取高性能、可靠性和容错能力。根据这些技术的不同组合,衍生出了多种 RAID 级别。业界公认的标准主要有 RAID 0~RAID 5,在实际应用中使用最广的是 RAID 0、RAID 1、RAID 5、RAID 6 和 RAID 10。

    2.1 RAID 0(条带化)
    • 原理:将数据分割成固定大小的块,并依次分布在多块磁盘上,通过并行读写提高性能。不提供任何数据冗余。
    • 优点:性能极高,读写速度快;没有容量冗余,空间利用率 100%。
    • 缺点:没有容错能力,一旦任意一块磁盘损坏,整个阵列的数据全部丢失。
    • 适用场景:视频编辑、大型数据库或实时流媒体等对性能要求极高、但数据可临时恢复的场景。
    2.2 RAID 1(镜像)
    • 原理:将数据完全复制到两块或以上的磁盘上。写入时数据同时写入所有磁盘,读取时可并行从多块磁盘读取提升性能。
    • 优点:提供 100% 的数据冗余,可靠性极高;读取性能提升;故障恢复极其简单。
    • 缺点:磁盘空间利用率仅为 50%,成本较高;写入性能略低于单块磁盘。
    • 适用场景:企业财务数据、客户信息、数据库服务器等对数据安全要求极高的关键业务。
    2.3 RAID 5(分布式奇偶校验)
    • 原理:将数据条带化分布在多块磁盘上,同时将奇偶校验信息均匀分布在所有磁盘上。当一块磁盘故障时,可通过剩余的奇偶校验信息计算恢复丢失的数据。
    • 优点:兼具性能和数据冗余;仅需额外一块磁盘的空间作为奇偶校验,空间利用率较高。
    • 缺点:写操作涉及校验计算,写入性能受限;在磁盘故障期间,数据恢复过程中系统性能会下降,且存在数据完整性风险。
    • 适用场景:文件服务器、中小企业数据库等需要兼顾性能和数据安全的场景。
    2.4 RAID 6(双重分布式奇偶校验)
    • 原理:在 RAID 5 的基础上,增加了第二份独立的奇偶校验信息,并将其也分布式存储在所有磁盘上。
    • 优点:提供了更高级别的数据冗余,即使同时发生两块磁盘故障,数据依然可以恢复。
    • 缺点:写入性能比 RAID 5 更低,需要更多的计算开销;硬件成本更高。
    • 适用场景:大容量存储系统、虚拟化环境、长期运行的关键数据库。
    2.5 RAID 10(条带化+镜像)
    • 原理:结合了 RAID 0 和 RAID 1 的优点。先对数据进行镜像(RAID 1),再对镜像后的数据进行条带化(RAID 0)。通常需要 4 块盘组成(两两镜像,再条带)。
    • 优点:兼具 RAID 0 的高性能和 RAID 1 的高可靠性;故障恢复极快,无需计算校验。
    • 缺点:空间利用率仅为 50%,成本高昂。
    • 适用场景:金融交易系统、在线电商平台、虚拟化环境等极度依赖高性能和高可用性的核心业务。
    2.6 复合 RAID 级别(RAID 50 / RAID 60)
    • RAID 50:由多个 RAID 5 阵列(至少 2 组)通过 RAID 0 条带化组合而成。提供了比 RAID 5 更高的性能和更强的容错能力(允许每组 RAID 5 中各坏一块盘)。
    • RAID 60:由多个 RAID 6 阵列(至少 2 组)通过 RAID 0 条带化组合而成。提供了比 RAID 6 更高的性能,以及极强的容错能力。
    2.7 RAID 各级别参数对比总结
    RAID级别最小磁盘数容错能力磁盘空间开销读取速度写入速度硬件成本
    RAID 0 2 0%
    RAID 1 2 单块磁盘 50%
    RAID 5 3 单块磁盘 1 / N
    RAID 6 4 两块磁盘 2 / N
    RAID 10 4 多块磁盘 50%
    RAID 50 6 多块磁盘 1 / N
    RAID 60 8 多块磁盘 50%

    三、 软 RAID 的配置与管理实战(mdadm)

    Linux 提供了强大的 mdadm 实用程序,用于创建、组装和管理软件 RAID 阵列。

    3.1 RAID 0 的创建与管理

    1. 创建 RAID 0 阵列

    # 安装 mdadm
    [root@server-xianyu ~]# yum install -y mdadm

    # 使用 /dev/sdb 和 /dev/sdc 创建一个 RAID 0 设备 /dev/md0
    [root@server-xianyu ~]# mdadm –create /dev/md0 –level 0 –raid-devices 2 /dev/sd{b,c}
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.

    2. 查看阵列信息 可以通过 /proc/mdstat 快速查看阵列概要状态,或通过 mdadm –detail 获取详细信息。

    # 查看概要
    [root@server-xianyu ~]# cat /proc/mdstat
    Personalities : [raid0]
    md0 : active raid0 sdc[1] sdb[0]
    41908224 blocks super 1.2 512k chunks

    # 查看详细属性
    [root@server-xianyu ~]# mdadm –detail /dev/md0
    ...
    Raid Level : raid0
    Array Size : 41908224 (39.97 GiB 42.91 GB)
    Raid Devices : 2
    State : clean
    Chunk Size : 512K
    ...
    Number Major Minor RaidDevice State
    0 8 16 0 active sync /dev/sdb
    1 8 32 1 active sync /dev/sdc

    重点关注属性:Raid Level、State、Chunk Size 以及设备清单。

    3. 格式化和挂载

    [root@server-xianyu ~]# mkfs.xfs /dev/md0
    [root@server-xianyu ~]# mkdir -p /raid/raid0
    [root@server-xianyu ~]# mount /dev/md0 /raid/raid0
    [root@server-xianyu ~]# df -h /raid/raid0
    Filesystem Size Used Avail Use% Mounted on
    /dev/md0 40G 319M 40G 1% /raid/raid0

    4. 删除 RAID 0

    [root@server-xianyu ~]# umount /dev/md0
    [root@server-xianyu ~]# mdadm –stop /dev/md0
    mdadm: stopped /dev/md0
    [root@server-xianyu ~]# mdadm –zero-superblock /dev/sd{b,c}

    ⚠️ RAID 0 的特性限制(重要):

  • RAID 0 条带化阵列无法增加新的成员盘扩容。执行 mdadm –add 会报错 Invalid argument。
  • RAID 0 无法强制故障一块成员盘。因为没有任何冗余,故障意味着整个阵列数据丢失,系统会直接拒绝该操作。

  • 3.2 RAID 1 的容错与热备盘机制

    1. 创建 RAID 1 阵列

    [root@server-xianyu ~]# mdadm –create /dev/md1 –level 1 –raid-devices 2 /dev/sd{b,c}
    mdadm: Note: this array has metadata at the start and may not be suitable...
    Continue creating array? yes
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md1 started.

    2. 等待同步完成 RAID 1 创建后,系统会自动进行数据同步。在同步完成之前,State 显示为 clean, resyncing,并且会有 Resync Status 进度条。必须等待进度达到 100% 后,才能进行格式化和挂载。

    3. 增加热备盘 RAID 1 支持在线增加热备盘(Spare Disk),一旦阵列中某块盘发生故障,热备盘会自动顶替并重建数据。

    # 将 /dev/sdd 添加为热备盘
    [root@server-xianyu ~]# mdadm –add /dev/md1 /dev/sdd
    mdadm: added /dev/sdd

    # 查看状态,/dev/sdd 状态变为 spare
    [root@server-xianyu ~]# mdadm –detail /dev/md1 |tail -5
    ...
    2 8 48 – spare /dev/sdd

    4. 模拟磁盘故障与自动重建

    # 强制将 /dev/sdc 标记为故障
    [root@server-xianyu ~]# mdadm –fail /dev/md1 /dev/sdc
    mdadm: set /dev/sdc faulty in /dev/md1

    # 查看成员状态变化
    [root@server-xianyu ~]# mdadm –detail /dev/md1 |tail -5
    ...
    2 8 48 1 spare rebuilding /dev/sdd
    1 8 32 – faulty /dev/sdc

    此时热备盘 /dev/sdd 立刻顶替了故障盘 /dev/sdc 的位置,并开始重建同步。在此期间,数据访问依然正常,完美体现了 RAID 1 的高可用性。

    5. 移除故障磁盘与删除 RAID

    # 移除物理故障盘
    [root@server-xianyu ~]# mdadm –remove /dev/md1 /dev/sdc
    mdadm: hot removed /dev/sdc from /dev/md1

    # 删除整个阵列
    [root@server-xianyu ~]# umount /dev/md1
    [root@server-xianyu ~]# mdadm –stop /dev/md1
    [root@server-xianyu ~]# mdadm –zero-superblock /dev/sd{b..d}

    ⚠️ RAID 1 的特性限制(重要): RAID 1 的设计初衷是数据冗余和可靠性,而不是为了增加存储容量。即使尝试对 RAID 1 进行扩容,其总容量也是不会增加的,因为镜像关系决定了容量仅等于最小的一块成员盘。


    3.3 RAID 5 的动态扩容与故障模拟

    1. 创建 RAID 5 阵列

    # 使用 4 块磁盘创建一个 RAID 5 设备 /dev/md5
    [root@server-xianyu ~]# mdadm –create /dev/md5 –level 5 –raid-devices 4 /dev/sd{b..e}

    2. 查看同步进度 RAID 5 创建后会有进度条,必须等待 Resync Status 达到 100% 后,阵列才进入 clean 状态,此时才能进行 mkfs 和挂载。

    3. 增加热备盘与模拟故障 与 RAID 1 类似,RAID 5 也支持热备盘。

    # 增加热备盘
    [root@server-xianyu ~]# mdadm –add /dev/md5 /dev/sdf

    # 模拟故障
    [root@server-xianyu ~]# mdadm –fail /dev/md5 /dev/sdb

    一旦 sdb 故障,热备盘 sdf 会立即顶替并开始重建(状态变为 spare rebuilding)。数据依然可以正常访问。

    4. 监控磁盘读写性能(sar 命令) 在 RAID 阵列故障修复或重建期间,可以使用 sar -dp 1 实时监控磁盘的性能状态:

    [root@server ~ 15:09:05]# sar -dp 1
    ...
    15时09分05秒 sdf 1718.18 0.00 439854.55 256.00 0.33 0.19 0.19 32.73
    15时09分05秒 sde 1718.18 439854.55 0.00 256.00 0.38 0.22 0.22 38.18
    ...

    重点注意 %util(磁盘繁忙程度)和 rd_sec/s / wr_sec/s(每秒读写扇区数量),可以准确判断磁盘是否处于高负载状态。

    5. RAID 5 的在线扩容(核心技能) 注意: 扩容的前提是阵列必须处于正常(clean)状态,降级或正在重构时不允许扩容。

    # 1. 新增两块盘作为热备盘
    [root@server-xianyu ~]# mdadm –add /dev/md5 /dev/sdb /dev/sdg

    # 2. 将阵列的活动成员盘数量从 4 扩容到 5
    [root@server-xianyu ~]# mdadm –grow /dev/md5 –raid-devices 5

    # 3. 等待重组完成,查看进度
    [root@server-xianyu ~]# mdadm –detail /dev/md5
    ...
    Reshape Status : 16% complete
    Delta Devices : 1, (4>5)
    ...

    # 4. 确认容量变化
    [root@server-xianyu ~]# lsblk /dev/md5
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    md5 9:5 0 80G 0 raid5 /raid/raid5 # 容量已成功增加

    # 5. 扩容文件系统(XFS 需要专用命令)
    [root@server-xianyu ~]# xfs_growfs /raid/raid5
    [root@server-xianyu ~]# df -h /raid/raid5/
    Filesystem Size Used Avail Use% Mounted on
    /dev/md5 80G 604M 80G 1% /raid/raid5

    6. 重建与清除 RAID 如果 stop 后,尚未清除 superblock,可以通过 mdadm –assemble 命令重新组合阵列以恢复数据:

    [root@server-xianyu ~]# mdadm –assemble /dev/md5 /dev/sd{b..g}

    最终彻底删除并还原磁盘:

    [root@server-xianyu ~]# umount /dev/md5
    [root@server-xianyu ~]# mdadm –stop /dev/md5
    [root@server-xianyu ~]# mdadm –zero-superblock /dev/sd{b..g}

    逻辑卷管理

    硬盘分区管理方案缺点

    传统分区管理存在三大短板:

    • 扩容麻烦:分区空间必须连续,扩容时要求分区后有剩余连续空间,操作复杂。
    • 无法跨盘:单个文件系统受限于单块硬盘容量,无法跨越多个物理磁盘。
    • 数据风险:一旦硬盘损坏,该分区上的所有数据将全部丢失。

    逻辑卷管理(LVM)的优势

    LVM 通过抽象存储层,带来了显著的灵活性和可靠性:

    • 灵活扩容/缩减:文件系统空间可以在线扩展或缩减,无需重新分区。
    • 跨盘整合:逻辑卷可以跨越多个物理硬盘,轻松创建超大容量文件系统。
    • 数据冗余:支持创建 RAID 镜像卷,单个硬盘损坏不影响数据。
    • 快照功能:保留某一时刻的数据状态,便于快速恢复。

    基本概念

    LVM 包含三个核心层次:

    • 物理卷(PV,Physical Volume):是 LVM 的基本存储块,由磁盘、分区或 RAID 设备初始化而来。
    • 卷组(VG,Volume Group):由一个或多个物理卷组成的存储池。
    • 逻辑卷(LV,Logical Volume):从卷组中划分出的逻辑空间,可视为虚拟分区,可在其上创建文件系统。

    关系图示:

    卷组由多个物理卷组成,在卷组中可创建多个逻辑卷,逻辑卷上可创建文件系统供用户使用。

    LVM 管理基本流程

  • 创建物理卷(PV)
  • 创建卷组(VG)
  • 创建逻辑卷(LV)
  • 在逻辑卷上创建文件系统并挂载使用
  • 创建物理卷

    # 创建单个 PV
    [root@server-xianyu ~]# pvcreate /dev/sdb
    Physical volume "/dev/sdb" successfully created.

    # 同时创建多个 PV
    [root@server-xianyu ~]# pvcreate /dev/sd{c,d}
    Physical volume "/dev/sdc" successfully created.
    Physical volume "/dev/sdd" successfully created.

    # 查看 PV 列表
    [root@server-xianyu ~]# pvs
    PV VG Fmt Attr PSize PFree
    /dev/sdb lvm2 — 20.00g 20.00g
    /dev/sdc lvm2 — 20.00g 20.00g
    /dev/sdd lvm2 — 20.00g 20.00g

    # 查看单个 PV 详细信息
    [root@server-xianyu ~]# pvdisplay /dev/sdb
    "/dev/sdb" is a new physical volume of "20.00 GiB"
    — NEW Physical volume —
    PV Name /dev/sdb
    VG Name
    PV Size 20.00 GiB
    Allocatable NO
    PE Size 0
    Total PE 0
    Free PE 0
    Allocated PE 0
    PV UUID MBHW0w-OkJL-CasO-PYRR-sduS-U2m5-zdkQ5d

    创建卷组

    # 创建包含单个 PV 的卷组
    [root@server-xianyu ~]# vgcreate webapp /dev/sdb
    Volume group "webapp" successfully created

    # 创建包含多个 PV 的卷组
    [root@server-xianyu ~]# vgcreate dbapp /dev/sd{c,d}
    Volume group "dbapp" successfully created

    [root@server-xianyu ~]# pvs
    PV VG Fmt Attr PSize PFree
    /dev/sdb webapp lvm2 a– <20.00g <20.00g
    /dev/sdc dbapp lvm2 a– <20.00g <20.00g
    /dev/sdd dbapp lvm2 a– <20.00g <20.00g

    # 查看 VG 列表
    [root@server-xianyu ~]# vgs
    VG #PV #LV #SN Attr VSize VFree
    dbapp 2 0 0 wz–n- 39.99g 39.99g
    webapp 1 0 0 wz–n- <20.00g <20.00g

    # 查看单个 VG 详细信息
    [root@server-xianyu ~]# vgdisplay dbapp
    — Volume group —
    VG Name dbapp
    ...
    PE Size 4.00 MiB
    Total PE 10238
    Alloc PE / Size 0 / 0
    Free PE / Size 10238 / 39.99 GiB

    注:PE(Physical Extend) 是 PV 的最小存储单元,创建 VG 时可通过 -s 选项设置大小,默认为 4 MiB。

    创建逻辑卷

    # 在卷组 webapp 中创建名为 webapp01,大小为 5G 的逻辑卷
    [root@server-xianyu ~]# lvcreate -n webapp01 -L 5G webapp
    Logical volume "webapp01" created.

    # 在卷组 dbapp 中创建名为 data01,大小为 25G 的逻辑卷(跨两块硬盘)
    [root@server-xianyu ~]# lvcreate -n data01 -L 25G dbapp
    Logical volume "data01" created.

    # 查看 LV 列表
    [root@server-xianyu ~]# lvs
    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
    data01 dbapp -wi-a—– 25.00g
    webapp01 webapp -wi-a—– 5.00g

    逻辑卷设备名支持三种格式:

    • /dev/vname/lvname
    • /dev/mapper/vname-lvname
    • /dev/dm-N

    [root@server-xianyu ~]# ls -l /dev/dbapp/data01 /dev/mapper/dbapp-data01
    lrwxrwxrwx 1 root root 7 617 18:26 /dev/dbapp/data01 –> ../dm-4
    lrwxrwxrwx 1 root root 7 617 18:26 /dev/mapper/dbapp-data01 –> ../dm-4

    # 查看单个 LV 详细信息
    [root@server-xianyu ~]# lvdisplay /dev/dbapp/data01
    — Logical volume —
    LV Path /dev/dbapp/data01
    LV Name data02
    VG Name dbapp
    ...
    LV Size 25.00 GiB
    Current LE 6400
    Segments 2

    注:LE(Logical Extend) 是 LV 的最小存储单元,通常一个 LE 对应一个 PE。

    此时,物理卷空间使用情况:

    [root@server-xianyu ~]# pvs
    PV VG Fmt Attr PSize PFree
    /dev/sdb webapp lvm2 a– <20.00g <15.00g
    /dev/sdc dbapp lvm2 a– <20.00g 0
    /dev/sdd dbapp lvm2 a– <20.00g 14.99g

    可以看到,/dev/sdc 已用完,/dev/sdd 还有剩余。

    查看设备映射关系:

    [root@server-xianyu ~]# lsblk /dev/sd{b..d}
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    sdb 8:16 0 20G 0 disk
    └─webapp-webapp01 253:3 0 5G 0 lvm
    sdc 8:32 0 20G 0 disk
    └─dbapp-data01 253:4 0 25G 0 lvm
    sdd 8:48 0 20G 0 disk
    └─dbapp-data01 253:4 0 25G 0 lvm

    创建文件系统

    [root@server-xianyu ~]# mkfs.xfs /dev/webapp/webapp01
    [root@server-xianyu ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html

    若需持久化挂载,需在 /etc/fstab 中添加相应条目。

    清理 LVM

    # 卸载文件系统
    [root@server-xianyu ~]# umount /dev/webapp/webapp01

    # 删除 LV
    [root@server-xianyu ~]# lvremove /dev/webapp/webapp01 /dev/dbapp/data01
    Do you really want to remove active logical volume webapp/webapp01? [y/n]: y
    Logical volume "webapp01" successfully removed
    Do you really want to remove active logical volume dbapp/data01? [y/n]: y
    Logical volume "data01" successfully removed

    # 删除 VG
    [root@server-xianyu ~]# vgremove webapp dbapp
    Volume group "webapp" successfully removed
    Volume group "dbapp" successfully removed

    # 删除 PV
    [root@server-xianyu ~]# pvremove /dev/sd{b..d}
    Labels on physical volume "/dev/sdb" successfully wiped.
    Labels on physical volume "/dev/sdc" successfully wiped.
    Labels on physical volume "/dev/sdd" successfully wiped.

    扩展和缩减卷组

    环境准备

    # 创建卷组 webapp 并创建逻辑卷 webapp01(10G)
    [root@server-xianyu ~]# vgcreate webapp /dev/sdb
    [root@server-xianyu ~]# lvcreate -n webapp01 -L 10G webapp

    扩展卷组

    如果卷组空间不足,可以添加新的物理卷到卷组中。

    [root@server-xianyu ~]# vgextend webapp /dev/sd{c,d}
    Physical volume "/dev/sdc" successfully created.
    Physical volume "/dev/sdd" successfully created.
    Volume group "webapp" successfully extended

    缩减卷组

    若要从卷组中移除物理卷,必须确保该物理卷上的数据已迁移到其他物理卷。

    # 查看物理卷使用状态
    [root@server-xianyu ~]# pvs
    PV VG Fmt Attr PSize PFree
    /dev/sdb webapp lvm2 a– <20.00g <10.00g
    /dev/sdc webapp lvm2 a– <20.00g <20.00g
    /dev/sdd webapp lvm2 a– <20.00g <20.00g

    # 尝试移除 /dev/sdb(失败,因为该 PV 正在使用)
    [root@server-xianyu ~]# vgreduce webapp /dev/sdb
    Physical volume "/dev/sdb" still in use

    # 将 /dev/sdb 上的数据迁移到其他 PV
    [root@server-xianyu ~]# pvmove /dev/sdb
    # 或者迁移到指定 PV
    [root@server-xianyu ~]# pvmove /dev/sdb /dev/sdd
    /dev/sdb: Moved: 100.00%

    # 再次查看,/dev/sdb 已空闲
    [root@server-xianyu ~]# pvs
    PV VG Fmt Attr PSize PFree
    /dev/sdb webapp lvm2 a– <20.00g <20.00g
    /dev/sdc webapp lvm2 a– <20.00g <20.00g
    /dev/sdd webapp lvm2 a– <20.00g <10.00g

    # 成功移除
    [root@server-xianyu ~]# vgreduce webapp /dev/sdb
    Removed "/dev/sdb" from volume group "webapp"

    扩展逻辑卷

    当卷组空间充足时,可以直接扩展逻辑卷的大小。

    # 给逻辑卷增加 2G 空间
    [root@server-xianyu ~]# lvextend -L +2G /dev/webapp/webapp01
    Size of logical volume webapp/webapp01 changed from 10.00 GiB (2560 extents) to 12.00 GiB (3072 extents).
    Logical volume webapp/webapp01 successfully resized.

    [root@server-xianyu ~]# lvs /dev/webapp/webapp01
    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
    webapp01 webapp -wi-a—– 12.00g

    缩减逻辑卷

    缩减逻辑卷有数据丢失风险,操作前需谨慎。

    [root@server-xianyu ~]# lvreduce -L -2G /dev/webapp/webapp01
    WARNING: Reducing active logical volume to 10.00 GiB.
    THIS MAY DESTROY YOUR DATA (filesystem etc.)
    Do you really want to reduce webapp/webapp01? [y/n]: `y`
    Size of logical volume webapp/webapp01 changed from 12.00 GiB (3072 extents) to 10.00 GiB (2560 extents).

    扩展 XFS 文件系统

    XFS 文件系统只支持扩展,不支持缩减。

    # 格式化并挂载
    [root@server-xianyu ~]# mkfs.xfs /dev/webapp/webapp01
    [root@server-xianyu ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html
    [root@server-xianyu ~]# cp /etc/host* /usr/share/nginx/html

    # 扩展逻辑卷(例如扩展到 15G)
    [root@server-xianyu ~]# lvextend -L 15G /dev/webapp/webapp01

    # 扩展 XFS 文件系统
    [root@server-xianyu ~]# xfs_growfs /usr/share/nginx/html

    # 验证
    [root@server-xianyu ~]# df -h /usr/share/nginx/html
    文件系统 容量 已用 可用 已用% 挂载点
    /dev/mapper/webapp-webapp01 15G 140M 15G 1% /usr/share/nginx/html

    # 一条命令同时扩展 LV 和文件系统
    [root@server-xianyu ~]# lvextend -rL 20G /dev/webapp/webapp01
    [root@server-xianyu ~]# lvs /dev/webapp/webapp01
    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
    webapp01 webapp -wi-ao—- 20.00g
    [root@server-xianyu ~]# df -h /usr/share/nginx/html
    文件系统 容量 已用 可用 已用% 挂载点
    /dev/mapper/webapp-webapp01 20G 176M 20G 1% /usr/share/nginx/html

    扩展 EXT4 文件系统

    EXT4 既支持扩展也支持缩减。

    # 重新格式化为 EXT4 并挂载
    [root@server-xianyu ~]# umount /usr/share/nginx/html
    [root@server-xianyu ~]# mkfs.ext4 /dev/webapp/webapp01
    [root@server-xianyu ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html
    [root@server-xianyu ~]# df -h /usr/share/nginx/html
    文件系统 容量 已用 可用 已用% 挂载点
    /dev/mapper/webapp-webapp01 20G 24K 19G 1% /usr/share/nginx/html
    [root@server-xianyu ~]# cp /etc/host* /usr/share/nginx/html

    # 扩展逻辑卷
    [root@server-xianyu ~]# lvextend -L 25G /dev/webapp/webapp01

    # 扩展 EXT4 文件系统
    [root@server-xianyu ~]# resize2fs /dev/webapp/webapp01
    [root@server-xianyu ~]# df -h /usr/share/nginx/html
    文件系统 容量 已用 可用 已用% 挂载点
    /dev/mapper/webapp-webapp01 25G 36K 24G 1% /usr/share/nginx/html

    # 一条命令同时扩展
    [root@server-xianyu ~]# lvextend -rL 30G /dev/webapp/webapp01
    [root@server-xianyu ~]# df -h /usr/share/nginx/html
    文件系统 容量 已用 可用 已用% 挂载点
    /dev/mapper/webapp-webapp01 30G 36K 28G 1% /usr/share/nginx/html

    缩减 EXT4 文件系统

    缩减 EXT4 需注意:

    • 必须离线操作,即卸载文件系统。
    • 缩减后的容量不能小于当前已用空间。

    步骤:

  • 卸载文件系统
  • 检查文件系统(e2fsck -f)
  • 缩小文件系统(resize2fs)
  • 缩小逻辑卷(lvreduce)
  • 重新挂载验证
  • # 卸载
    [root@server-xianyu ~]# umount /usr/share/nginx/html

    # 检查文件系统
    [root@server-xianyu ~]# e2fsck -f /dev/webapp/webapp01
    e2fsck 1.42.9 (28-Dec-2013)
    第一步: 检查inode,块,和大小
    第二步: 检查目录结构
    第3步: 检查目录连接性
    Pass 4: Checking reference counts
    第5步: 检查簇概要信息
    /dev/webapp/webapp01:14/1966080 文件(0.0% 为非连续的), 167445/7864320 块

    # 缩小文件系统到 10G
    [root@server-xianyu ~]# resize2fs /dev/webapp/webapp01 10G
    resize2fs 1.45.6 (20-Mar-2020)
    将 /dev/webapp/webapp01 上的文件系统调整为 2621440 个块(每块 4k)。
    /dev/webapp/webapp01 上的文件系统现在为 2621440 个块(每块 4k)。

    # 缩小逻辑卷到 10G
    [root@server-xianyu ~]# lvreduce -L 10G /dev/webapp/webapp01
    WARNING: Reducing active logical volume to 10.00 GiB.
    THIS MAY DESTROY YOUR DATA (filesystem etc.)
    Do you really want to reduce webapp/webapp01? [y/n]: `y`
    Size of logical volume webapp/webapp01 changed from 30.00 GiB (7680 extents) to 10.00 GiB (2560 extents).

    # 重新挂载验证
    [root@server-xianyu ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html
    [root@server-xianyu ~]# df -h /usr/share/nginx/html
    文件系统 容量 已用 可用 已用% 挂载点
    /dev/mapper/webapp-webapp01 9.7G 36K 9.3G 1% /usr/share/nginx/html
    [root@server-xianyu ~]# ls /usr/share/nginx/html
    host.conf hostname hosts lost+found

    补充说明:如果文件系统直接构建在磁盘分区上,扩展和缩减操作流程与此相同。

    逻辑卷快照

    快照可以记录某个时刻逻辑卷的数据状态,便于数据恢复。

    # 创建快照(快照大小不能小于原 LV)
    [root@server-xianyu ~]# lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01
    Logical volume "webapp01-snap1" created.

    # 挂载快照
    [root@server-xianyu ~]# mount /dev/webapp/webapp01-snap1 /webapp/webapp01/

    # 查看快照中的数据
    [root@server-xianyu ~]# ls /webapp/webapp01/
    host.conf hostname hosts hosts.allow hosts.deny

    # 在原 LV 中创建新数据
    [root@server-xianyu ~]# echo hello world > /webapp/webapp01/hello.txt
    [root@server-xianyu ~]# cat /webapp/webapp01/hello.txt
    hello world

    此时,快照中仍然保存着创建时刻的旧数据,可用于恢复。

    RAID 逻辑卷

    LVM 也支持创建 RAID 类型的逻辑卷(如 RAID1、RAID5),提供硬件级别的数据冗余。

    创建 RAID1 逻辑卷

    # 环境清理(卸载并删除之前的 LV)
    [root@server-xianyu ~]# umount /webapp/webapp0
    [root@server-xianyu ~]# umount /usr/share/nginx/html
    [root@server-xianyu ~]# lvremove /dev/webapp/webapp01*

    # 创建 RAID1 逻辑卷(需要至少两块 PV)
    [root@server-xianyu ~]# lvcreate –type raid1 -n webapp01 -L 15G webapp

    # 格式化和挂载
    [root@server-xianyu ~]# mkfs.xfs /dev/webapp/webapp01
    [root@server-xianyu ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html/
    [root@server-xianyu ~]# cp /etc/ho* /usr/share/nginx/html/

    模拟故障与修复

    # 模拟硬盘损坏(写入错误数据)
    [root@server-xianyu ~]# dd if=/dev/zero of=/dev/sdd bs=1M count=256

    # 此时文件系统仍可正常访问(RAID1 容错)
    [root@server-xianyu ~]# ls /usr/share/nginx/html/
    host.conf hostname hosts hosts.allow hosts.deny

    # 卸载并重新挂载,依然正常
    [root@server-xianyu ~]# umount /usr/share/nginx/html
    [root@server-xianyu ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html/

    # 修复 RAID
    # 1. 删除丢失的物理卷(VG 中移除故障 PV)
    [root@server-xianyu ~]# vgreduce –removemissing webapp –force

    # 2. 将原故障盘重新加入卷组(或换新盘后加入)
    [root@server-xianyu ~]# vgextend webapp /dev/sdd

    # 3. 修复 RAID1 逻辑卷
    [root@server-xianyu ~]# lvconvert –repair /dev/webapp/webapp01

    # 4. 扫描物理卷变化
    [root@server-xianyu ~]# pvscan

    # 5. 验证
    [root@server-xianyu ~]# pvs|grep webap
    /dev/sdb webapp lvm2 a– <20.00g 4.99g
    /dev/sdc webapp lvm2 a– <20.00g 4.99g
    /dev/sdd webapp lvm2 a– <20.00g <20.00g

    创建 RAID5 逻辑卷示例

    # 创建一个 RAID5 逻辑卷,可用大小 5GiB,3 条带,条带大小 64KiB,共 4 个设备(含 1 个奇偶校验)
    lvcreate –type raid5 -L 5G -i 3 -I 64 -n mylv vg00

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Linux 磁盘分区管理 | RAID存储技术 | 逻辑卷管理
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!