17、RAID 存储

17.1RAID 概念

RAID,即廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks)

大容量磁盘价格高昂,RAID的核心思路是将多块容量小成本低的磁盘组合成大容量高性能可靠性的大容量磁盘。

随着磁盘成本大幅下降,“廉价”概念失去意义,RAID咨询委员会(RAID Advisory Board, RAB)将“廉价(Inexpensive)”替换为“独立(Independent)”,RAID自此定义为独立磁盘冗余阵列(Redundant Array of Independent Disks)

17.2RAID 实现方式

从技术实现维度,RAID主要分为三类,核心差异在于是否依赖专用硬件芯片:

  • 软 RAID:无独立的RAID控制/处理芯片和I/O处理芯片,所有RAID功能由操作系统和CPU完成,实现成本低但效率最差。

  • 硬 RAID:配备专用RAID控制/处理芯片、I/O处理芯片及阵列缓冲,不占用主机CPU资源,性能优异但硬件成本高。

  • 软硬混合 RAID:具备RAID控制/处理芯片,但无独立I/O处理芯片,需CPU和驱动程序辅助完成功能,性能与成本介于软RAID和硬RAID之间。

操作系统识别到的设备是raid卡提供的设备,而不是直接管理底层硬盘。

17.3RAID 级别

RAID通过数据条带、镜像、数据校验三类核心技术实现高性能、高可靠性、容错能力和扩展性。不同技术的组合策略形成不同RAID级别,以适配不同数据应用场景。

D. A. Patterson等的论文最初定义了RAID1~RAID5,1988年后扩展出RAID0和RAID6;后续厂商推出的RAID7、RAID10/01、RAID50等无统一标准,业界公认的核心级别为RAID0~RAID5,实际应用中以RAID0、RAID1、RAID4、RAID5、RAID6、RAID10为主。

各RAID级别无高低之分,需结合业务对可用性、性能、成本的需求选择适配的级别和实现方式。

17.4RAID 实践

实验环境需在虚拟机中添加6块20G硬盘,设备名分别为sdb、sdc、sdd、sde、sdf、sdg,用于后续各类RAID阵列的创建与测试。

Linux系统中通过mdadm工具实现软RAID的创建、配置、监控与维护,以下为核心RAID级别的实操流程。

管理 RAID 0

1 创建 RAID 0
# 安装mdadm工具(CentOS系统),mdadm:Linux 系统唯一的软 RAID 管理工具(创建 / 查看 / 删除 RAID 全靠它)
[root@centos7 ~]# yum install -y mdadm

# 创建RAID 0阵列:设备名/dev/md0,级别0,成员盘2块(sdb、sdc)
[root@centos7 ~]# 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.

注释:--level指定RAID级别,--raid-devices指定成员盘数量,/dev/sd{b,c}sdbsdc的简写。

2 查看 RAID 0 状态
# 查看RAID概要信息(内核态RAID状态)#active:RAID 状态正常运行,raid0:阵列级别
#sdc[1] sdb[0]:成员盘是 sdb、sdc
[root@centos7 ~]# cat /proc/mdstat     
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] 
md0 : active raid0 sdc[1] sdb[0]
      41908224 blocks super 1.2 512k chunks

unused devices: <none>

# 查看RAID设备详细信息
[root@centos7 ~]# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri Aug  2 17:03:58 2024
        Raid Level : raid0
        Array Size : 41908224 (39.97 GiB 42.91 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Fri Aug  2 17:03:58 2024
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

            Layout : original
        Chunk Size : 512K

Consistency Policy : none

              Name : centos7.laoma.cloud:0  (local to host centos7.laoma.cloud)
              UUID : afe03287:7cfb8b2e:82844a2e:8f721e04
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

注释:核心关注Raid Level(级别)、State(状态,clean为正常)、Chunk Size(条带块大小)、成员盘状态。Array Size : 41908224 (39.97 GiB) # 总容量(2块20G盘≈40G) Raid Devices : 2 # 总成员盘数

# 查看RAID设备与物理盘的映射关系
[root@centos7 ~]# lsblk /dev/md0
NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md0    9:0    0  40G  0 raid0

[root@centos7 ~]# lsblk /dev/sdb /dev/sdc
NAME  MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
sdb     8:16   0  20G  0 disk  
└─md0   9:1    0  20G  0 raid0 
sdc     8:32   0  20G  0 disk  
└─md0   9:1    0  20G  0 raid0 
3 格式化与挂载 RAID 0
# 格式化RAID设备为XFS文件系统,RAID 只是逻辑设备,必须格式化才能存储文件
[root@centos7 ~]# mkfs.xfs /dev/md0
# 创建挂载目录,用于存放RAID0的数据
[root@centos7 ~]# mkdir -p /raid/raid0
# 挂载RAID设备到挂载点,把 RAID0 设备 /dev/md0 绑定到目录 /raid/raid0
[root@centos7 ~]# mount /dev/md0 /raid/raid0
# 验证挂载结果
[root@centos7 ~]# df -h /raid/raid0
Filesystem      Size  Used Avail Use% Mounted on
/dev/md0         40G  319M   40G   1% /raid/raid0

# 测试数据写入,复制系统文件到 RAID0,验证可正常读写
[root@centos7 ~]# cp /etc/ho* /raid/raid0
[root@centos7 ~]# ls /raid/raid0/
host.conf  hostname  hosts  hosts.allow  hosts.deny
4 删除 RAID 0
# 卸载挂载点,(必须先卸载,否则无法删除)
[root@centos7 ~]# umount /dev/md0

# 停止RAID阵列(销毁阵列)
[root@centos7 ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0

# 清除物理盘上的RAID超级块(恢复为普通磁盘),清除磁盘RAID超级块(恢复为普通空盘),执行后,sdb、sdc 变回普通物理磁盘,可重新使用
[root@centos7 ~]# mdadm --zero-superblock /dev/sd{b,c}
5 补充说明
  • RAID 0不支持新增成员盘扩展容量:

bash [root@centos7 ~]# mdadm --add /dev/md0 /dev/sdd mdadm: add new device failed for /dev/sdd as 2: Invalid argument

报错原因 RAID0 是纯条带化,无冗余、无校验 一旦创建,不能新增磁盘,扩容会直接失败

  • RAID 0不支持标记单盘故障(无冗余,单盘故障即阵列失效):

bash [root@centos7 ~]# mdadm --fail /dev/md0 /dev/sdc mdadm: Cannot remove /dev/sdc from /dev/md0, array will be failed.

报错原因 RAID0 无冗余能力 只要坏一块盘,阵列直接崩溃,数据全丢 所以系统不允许单独标记故障盘

管理 RAID 1

1 创建 RAID 1
# 创建RAID 1阵列:设备名/dev/md1,级别1,成员盘2块(sdb、sdc)
[root@centos7 ~]# 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 as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.

注释:RAID 1元数据默认存储在磁盘开头,若用于/boot分区需指定--metadata=0.90兼容老旧引导程序。

2 查看 RAID 1 状态
[root@centos7 ~]# mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Fri Aug  2 17:41:25 2024
        Raid Level : raid1
        Array Size : 20954112 (19.98 GiB 21.46 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Fri Aug  2 17:41:57 2024
             State : clean, resyncing 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

     Resync Status : 33% complete

              Name : centos7.laoma.cloud:1  (local to host centos7.laoma.cloud)
              UUID : f024b6e0:d2a5793c:f8bdebc6:6bcc7027
            Events : 5

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

注释:resyncing表示镜像数据正在同步,需等待同步完成(100%)后再进行格式化操作。

# 查看RAID与物理盘映射
[root@centos7 ~]# lsblk /dev/md1
NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md1    9:1    0  20G  0 raid1

[root@centos7 ~]# lsblk /dev/sdb /dev/sdc
NAME  MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
sdb     8:16   0  20G  0 disk  
└─md1   9:1    0  20G  0 raid1 
sdc     8:32   0  20G  0 disk  
└─md1   9:1    0  20G  0 raid1 
3 格式化与挂载 RAID 1
# 等待同步完成后,格式化RAID设备
[root@centos7 ~]# mkfs.xfs /dev/md1
# 创建挂载点
[root@centos7 ~]# mkdir /raid/raid1
# 挂载设备
[root@centos7 ~]# mount /dev/md1 /raid/raid1
# 验证挂载
[root@centos7 ~]# df -h /raid/raid1
Filesystem      Size  Used Avail Use% Mounted on
/dev/md1         20G  175M   20G   1% /raid/raid1

# 测试数据写入
[root@centos7 ~]# cp /etc/ho* /raid/raid1
[root@centos7 ~]# ls /raid/raid1/
host.conf  hostname  hosts  hosts.allow  hosts.deny
4 增加热备盘
# 为RAID 1添加热备盘sdd
[root@centos7 ~]# mdadm --add /dev/md1 /dev/sdd
mdadm: added /dev/sdd

# 查看热备盘状态(spare为备用)
[root@centos7 ~]# mdadm --detail /dev/md1 |tail -5
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

       2       8       48        -      spare   /dev/sdd
5 模拟磁盘故障
# 手动标记sdc为故障盘
[root@centos7 ~]# mdadm --fail /dev/md1 /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md1

# 查看故障后状态(sdd自动顶替并同步)
[root@centos7 ~]# mdadm --detail /dev/md1 |tail -5
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       2       8       48        1      spare rebuilding   /dev/sdd

       1       8       32        -      faulty   /dev/sdc

# 验证数据可正常访问
[root@centos7 ~]# ls /raid/raid1/
host.conf  hostname  hosts  hosts.allow  hosts.deny
[root@centos7 ~]# cat /raid/raid1/hostname 
centos7.laoma.cloud
6 删除故障磁盘
# 移除故障盘sdc
[root@centos7 ~]# mdadm --remove /dev/md1 /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md1

# 验证移除结果
[root@centos7 ~]# mdadm --detail /dev/md1 |tail -5
            Events : 43

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       2       8       48        1      active sync   /dev/sdd
7 再次模拟故障
[root@centos7 ~]# mdadm --fail /dev/md1 /dev/sdd

[root@centos7 ~]# mdadm -D /dev/md1|tail -5
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       -       0        0        1      removed

       2       8       48        -      faulty   /dev/sdd

[root@centos7 ~]# ls /raid/raid1
host.conf  hostname  hosts  hosts.allow  hosts.deny
[root@centos7 ~]# echo hello raid1 > /raid/raid1/test.txt

[root@centos7 ~]# umount /raid/raid1 
[root@centos7 ~]# mount /dev/md1 /raid/raid1
[root@centos7 ~]# ls /raid/raid1
host.conf  hostname  hosts  hosts.allow  hosts.deny  test.txt

总结:raid1阵列中任一成员故障,不影响数据的完整性。

8 删除 RAID 1
# 卸载挂载点
[root@centos7 ~]# umount /dev/md1

# 停止RAID阵列
[root@centos7 ~]# mdadm --stop /dev/md1
mdadm: stopped /dev/md1

# 清除物理盘超级块
[root@centos7 ~]# mdadm --zero-superblock /dev/sd{b..d}

使用dd工具填充更彻底。

[root@centos7 ~ 11:22:09]# dd if=/dev/zero of=/dev/sdb bs=1M count=1024

作用:使用0填充/dev/sdb硬盘。

  • if:Input File,/dev/zero 全为0

  • of:Output File

  • bs:Block Size,每次添加多大数据流

  • count:一共填充多少个Block

9 补充说明

RAID 1核心价值是数据冗余,而非扩容:即使新增磁盘,阵列总容量仍等于单盘容量(镜像机制),无法通过加盘提升可用空间。

管理 RAID 5

1 创建 RAID 5
# 创建RAID 5阵列:设备名/dev/md5,级别5,成员盘4块(sdb、sdc、sdd、sde)
[root@centos7 ~]# mdadm --create /dev/md5 --level 5 --raid-devices 4 /dev/sd{b..e}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.

注释:RAID 5最少需3块盘,此处用4块盘(1块用于分布式校验)。

2 查看 RAID 5 状态
[root@centos7 ~]# mdadm --detail /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Sat Aug  3 17:16:10 2024
        Raid Level : raid5
        Array Size : 62862336 (59.95 GiB 64.37 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Sat Aug  3 17:16:24 2024
             State : clean, degraded, recovering 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 17% complete

              Name : centos7.laoma.cloud:5  (local to host centos7.laoma.cloud)
              UUID : b1661262:66062c09:76e887ce:fecb1340
            Events : 3

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      spare rebuilding   /dev/sde

注释:recovering表示阵列正在构建/同步,需等待同步完成后再格式化。

# 查看RAID与物理盘映射
[root@centos7 ~]# lsblk /dev/md5
NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md5    9:5    0  60G  0 raid5 /raid/raid5

[root@centos7 ~]# lsblk /dev/sd{b..e}
NAME  MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
sdb     8:16   0  20G  0 disk  
└─md5   9:5    0  60G  0 raid5 
sdc     8:32   0  20G  0 disk  
└─md5   9:5    0  60G  0 raid5 
sdd     8:48   0  20G  0 disk  
└─md5   9:5    0  60G  0 raid5 
sde     8:64   0  20G  0 disk  
└─md5   9:5    0  60G  0 raid5
3 格式化与挂载 RAID 5
# 等待阵列同步完成后,格式化设备
[root@centos7 ~]# mkfs.xfs /dev/md5
# 创建挂载点
[root@centos7 ~]# mkdir /raid/raid5
# 挂载设备
[root@centos7 ~]# mount /dev/md5 /raid/raid5
# 验证挂载
[root@centos7 ~]# df -h /raid/raid5/
Filesystem      Size  Used Avail Use% Mounted on
/dev/md5         60G  461M   60G   1% /raid/raid5

# 测试数据写入
[root@centos7 ~]# cp /etc/ho* /raid/raid5
[root@centos7 ~]# ls /raid/raid5/
host.conf  hostname  hosts  hosts.allow  hosts.deny
4 增加热备盘
# 为RAID 5添加热备盘sdf
[root@centos7 ~]# mdadm --add /dev/md5 /dev/sdf
mdadm: added /dev/sdf

# 查看热备盘状态
[root@centos7 ~]# mdadm --detail /dev/md5 |tail -7
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

       5       8       80        -      spare   /dev/sdf
5 模拟磁盘故障
# 标记sdb为故障盘
[root@centos7 ~]# mdadm --fail /dev/md5 /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md5

# 查看故障后状态(sdf自动顶替并同步)
[root@centos7 ~]# mdadm --detail /dev/md5 |tail -7
     Number   Major   Minor   RaidDevice State
       5       8       80        0      spare rebuilding   /dev/sdf
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

       0       8       16        -      faulty   /dev/sdb

# 验证数据可正常访问
[root@centos7 ~]# ls /raid/raid5/
host.conf  hostname  hosts  hosts.allow  hosts.deny
[root@centos7 ~]# cat /raid/raid5/hostname 
centos7.laoma.cloud
6 删除故障磁盘
# 移除故障盘sdb
[root@centos7 ~]# mdadm --remove /dev/md5 /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md5

# 验证移除结果
[root@centos7 ~]# mdadm --detail /dev/md5 |tail -5
    Number   Major   Minor   RaidDevice State
       5       8       80        0      active sync   /dev/sdf
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde
7 扩容 RAID 5

注释:RAID 5仅支持扩容(增加成员盘),不支持减容;扩容仅在阵列“clean”正常状态下可执行,降级/重构时禁止。

# 新增2块盘(sdb、sdg)到RAID 5
[root@centos7 ~]# mdadm --add /dev/md5 /dev/sdb /dev/sdg
mdadm: added /dev/sdb
mdadm: added /dev/sdg

# 查看新增盘状态(spare为备用)
[root@centos7 ~]# mdadm --detail /dev/md5 |tail -8
    Number   Major   Minor   RaidDevice State
       5       8       80        0      active sync   /dev/sdf
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

       6       8       16        -      spare   /dev/sdb
       7       8       96        -      spare   /dev/sdg

# 扩展阵列成员数为5(--grow为扩容参数)
[root@centos7 ~]# mdadm --grow /dev/md5 --raid-devices 5

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

              Name : centos7.laoma.cloud:5  (local to host centos7.laoma.cloud)
              UUID : 1d4e3f21:1178a4fd:db214497:593e3353
            Events : 79

    Number   Major   Minor   RaidDevice State
       5       8       80        0      active sync   /dev/sdf
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde
       7       8       96        4      active sync   /dev/sdg

       6       8       16        -      spare   /dev/sdb

# 验证RAID容量(从60G扩容至80G)
[root@centos7 ~]# lsblk /dev/md5
NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md5    9:5    0  80G  0 raid5 /raid/raid5

# 扩展文件系统(XFS文件系统用xfs_growfs)
[root@centos7 ~]# xfs_growfs /raid/raid5
[root@centos7 ~]# df -h /raid/raid5/
Filesystem      Size  Used Avail Use% Mounted on
/dev/md5         80G  604M   80G   1% /raid/raid5
8 再次模拟磁盘故障
[root@centos7 ~]# mdadm --remove /dev/md5 /dev/sdb
[root@centos7 ~]# mdadm --fail /dev/md5 /dev/sdg

[root@centos7 ~]# mdadm -D /dev/md5 |tail
            Events : 97

    Number   Major   Minor   RaidDevice State
       5       8       80        0      active sync   /dev/sdf
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde
       -       0        0        4      removed

       7       8       96        -      faulty   /dev/sdg

[root@centos7 ~]# ls /raid/raid5
host.conf  hostname  hosts  hosts.allow  hosts.deny
[root@centos7 ~]# echo hello raid5 > /raid/raid5/test.txt

[root@centos7 ~]# umount /raid/raid5 
[root@centos7 ~]# mount /dev/md5 /raid/raid5
[root@centos7 ~]# ls /raid/raid5
host.conf  hostname  hosts  hosts.allow  hosts.deny  test.txt
9 删除 RAID 5
# 卸载挂载点
[root@centos7 ~]# umount /dev/md5

# 停止RAID阵列
[root@centos7 ~]# mdadm --stop /dev/md5
mdadm: stopped /dev/md5

# 清除物理盘超级块
[root@centos7 ~]# mdadm --zero-superblock /dev/sd{b..g}

也可以使用dd彻底擦除:

for device in /dev/sd{b..g}
do
  dd if=/dev/zero of=$device bs=1M count=1024
done
10 重构 RAID 5

注释:若停止阵列后未清除超级块,可通过以下命令重构阵列,数据不丢失:

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

补充:

raid阵列可以进一步使用分区技术分割成多个分区,然后再格式化使用。特别是raid5这种大容量的盘。

18、LVM 存储

实验环境需在虚拟机中添加3块20G的硬盘,设备名分别为sdb、sdc、sdd,可通过以下命令查看硬盘信息:

[root@centos7 ~]# lsblk /dev/sd{b..d}
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk 
sdc    8:32   0  20G  0 disk 
sdd    8:48   0  20G  0 disk

18.1逻辑卷基本管理

1 传统硬盘分区管理的缺点

传统硬盘分区方案在灵活性和可靠性上存在明显不足,主要体现在:

  1. 分区空间需占用物理连续的磁盘区域,扩容操作难度大(尤其是扩容分区后方无空闲空间时);

  2. 基于分区创建的文件系统无法跨多个硬盘,受单块硬盘容量限制;

  3. 硬盘物理损坏时,分区内的所有数据会直接丢失,无冗余保护机制

2 逻辑卷管理的优势

LVM 作为一种灵活的存储管理方案,弥补了传统分区的不足,核心优势包括:

  1. 灵活的空间调整:支持逻辑卷空间的在线扩展和缩减,无需重新规划磁盘布局;

  2. 跨盘存储能力:逻辑卷可整合多块硬盘的空间,轻松创建超大容量文件系统;

  3. 数据冗余保护:支持创建镜像卷(RAID 逻辑卷),单块硬盘损坏时数据不丢失;

  4. 快照功能:可创建逻辑卷快照,保留某一时刻的数据集,类似虚拟机快照,便于数据恢复。

3 LVM 核心概念

LVM 将多个磁盘/分区整合为统一的存储池,再按需划分逻辑卷使用,核心概念如下:

  • 物理卷(PV, Physical Volume):LVM 的基础存储单元,由磁盘、磁盘分区或 RAID 等块设备创建,包含 LVM 专属的管理参数;

  • 卷组(VG, Volume Group):由一个或多个物理卷组成的逻辑存储池,可理解为“虚拟硬盘”;

  • 逻辑卷(LV, Logical Volume):从卷组中划分出的逻辑空间,可理解为“虚拟分区”,可在其上创建文件系统并挂载使用。

简单总结:卷组整合多个物理卷形成存储池,逻辑卷从卷组中划分并提供给用户使用。

4 LVM 基本管理流程

LVM 的核心操作遵循“创建物理卷 → 创建卷组 → 创建逻辑卷”的流程,具体如下:

步骤 图中内容 对应 LVM 原理 通俗理解
Partition physical storage 3 个独立的硬盘图标 最底层的物理存储:服务器上的裸硬盘 / 未使用的磁盘分区 相当于 3 个独立的空储物间 / 3 个空纸箱,是最原始的硬件空间
Create physical volume (PV) 3 个独立的、标记为 PV 的硬盘 给裸盘打上 LVM 标记,将物理存储转换为 LVM 可管理的单元 给储物间做物业登记 / 给纸箱打包,让它们成为 LVM 体系的 “原料”
Create volume group (VG) 3 个 PV 堆叠成一个大的整体 将多个 PV 合并,形成一个统一的大存储池,统一管理所有空间 把 3 个独立储物间打通,变成一个超大仓库 / 把多个纸箱拼成一个大储物池
Create logical volume (LV) 从大 VG 中划出一个上层的 LV,下方标注Unused space 从大存储池中按需划分出给业务使用的逻辑卷,剩余空间保留 从大仓库里划出一个专属储物格,剩下的空间留在仓库里,随时可以后续扩容

5 创建物理卷(PV)

物理卷是 LVM 的基础,需先将块设备初始化为 PV 才能纳入 LVM 管理:

# 1. 创建单个物理卷
[root@centos7 ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

# 2. 批量创建多个物理卷(sdc、sdd)
[root@centos7 ~]# pvcreate /dev/sd{c,d}
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.

# 3. 查看所有 PV 列表(简洁版)
[root@centos7 ~]# 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

# 4. 查看单个 PV 的详细信息(以 /dev/sdb 为例)
[root@centos7 ~]# 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  # PE(物理扩展单元)大小,加入VG后自动分配
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               MBHW0w-OkJL-CasO-PYRR-sduS-U2m5-zdkQ5d

6 创建卷组(VG)

卷组整合多个物理卷形成统一存储池,可按需创建单 PV 或多 PV 的 VG:

# 1. 创建包含单个 PV 的卷组(卷组名:webapp,关联 PV:/dev/sdb)
[root@centos7 ~]# vgcreate webapp /dev/sdb
  Volume group "webapp" successfully created

# 2. 创建包含多个 PV 的卷组(卷组名:dbapp,关联 PV:/dev/sdc、/dev/sdd)
[root@centos7 ~]# vgcreate dbapp /dev/sd{c,d}
  Volume group "dbapp" successfully created

# 3. 查看 PV 归属(验证 PV 已加入对应 VG)
[root@centos7 ~]# 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

# 4. 查看所有 VG 列表(简洁版)
[root@centos7 ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  dbapp    2   0   0 wz--n-   39.99g  39.99g # 2个PV,无LV,总容量~40G
  webapp   1   0   0 wz--n-  <20.00g <20.00g # 1个PV,无LV,总容量~20G

# 5. 查看单个 VG 的详细信息(以 dbapp 为例)
[root@centos7 ~]# vgdisplay dbapp
  --- Volume group ---
  VG Name               dbapp
  System ID             
  Format                lvm2
  Metadata Areas        2 # 包含2个PV的元数据
  Metadata Sequence No  1
  VG Access             read/write # 读写权限
  VG Status             resizable # 可调整大小
  MAX LV                0 # 最大可创建LV数量(无限制)
  Cur LV                0 # 当前已创建LV数量
  Open LV               0 # 已挂载的LV数量
  Max PV                0 # 最大可加入PV数量(无限制)
  Cur PV                2 # 当前已加入PV数量
  Act PV                2 # 活跃的PV数量
  VG Size               39.99 GiB # 卷组总容量
  PE Size               4.00 MiB # PE(物理扩展单元)大小,LVM最小分配单元
  Total PE              10238 # 总PE数量
  Alloc PE / Size       0 / 0 # 已分配PE/容量
  Free  PE / Size       10238 / 39.99 GiB # 空闲PE/容量
  VG UUID               kjY26m-D0ax-WmMq-fMJv-1Tnb-imqh-GOAWkG

7 创建逻辑卷(LV)

逻辑卷从卷组中划分,可直接创建文件系统,支持跨 PV 分配空间:

# 1. 创建单 PV 逻辑卷(卷组:webapp,LV名:webapp01,大小:5G)
[root@centos7 ~]# lvcreate -n webapp01 -L 5G webapp
  Logical volume "webapp01" created.

# 2. 创建跨 PV 逻辑卷(卷组:dbapp,LV名:data01,大小:25G,跨sdc、sdd)
[root@centos7 ~]# lvcreate -n data01 -L 25G dbapp
  Logical volume "data01" created.

# 3. 查看所有 LV 列表(简洁版)
[root@centos7 ~]# lvs
  LV     VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  data01 dbapp  -wi-a-----  25.00g # -wi-a-----:可读写、已创建、已激活
  webapp01 webapp -wi-a-----   5.00g 
逻辑卷设备名格式说明

逻辑卷支持三种访问路径,本质指向同一设备:

[root@centos7 ~]# ls -l /dev/dbapp/data01 /dev/mapper/dbapp-data01
lrwxrwxrwx 1 root root 7 6月  17 18:26 /dev/dbapp/data01 -> ../dm-4
lrwxrwxrwx 1 root root 7 6月  17 18:26 /dev/mapper/dbapp-data01 -> ../dm-4
  • /dev/<VG名>/<LV名>:直观易记,推荐使用;

  • /dev/mapper/<VG名>-<LV名>:系统映射路径;

  • /dev/dm-N:内核设备映射器路径(N为数字)。

查看逻辑卷详细信息
[root@centos7 ~]# lvdisplay /dev/dbapp/data01
  --- Logical volume ---
  LV Path                /dev/dbapp/data01 # LV 访问路径
  LV Name                data02 # 注:此处为笔误,实际应为data01
  VG Name                dbapp # 所属卷组
  LV UUID                W8UafB-A7RJ-dBjM-bsA2-8Obc-p8gE-bMZgmm
  LV Write Access        read/write
  LV Creation host, time centos7.linux.com, 2022-12-26 11:42:40 +0800
  LV Status              available # 可用状态
  # open                 0 # 未挂载
  LV Size                25.00 GiB # LV 大小
  Current LE             6400 # LE(逻辑扩展单元)数量,1LE=1PE
  Segments               2 # 跨2个PV(sdc、sdd)
  Allocation             inherit # 继承VG的分配策略
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:4 # 块设备号

# 验证 PV 空间使用(sdc 已用完,sdd 用了5G)
[root@centos7 ~]# 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

# 验证 LV 跨盘(data01 同时占用 sdc、sdd)
[root@centos7 ~]# 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 

8 在逻辑卷上创建文件系统

逻辑卷创建后需格式化文件系统并挂载,才能供业务使用:

# 1. 格式化 XFS 文件系统(CentOS7 推荐)
[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01

# 2. 临时挂载逻辑卷(重启失效)
[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html

# 3. 持久化挂载(修改 /etc/fstab,重启生效)
# 需在 /etc/fstab 中添加如下行:
# /dev/webapp/webapp01  /usr/share/nginx/html  xfs  defaults  0 0
[root@centos7 ~]# mount -a # 挂载

9 LVM 清理

如需清理 LVM 配置,需按“卸载文件系统 → 删除 LV → 删除 VG → 删除 PV”的顺序操作:

# 1. 卸载已挂载的逻辑卷
[root@centos7 ~]# umount /dev/webapp/webapp01

# 2. 删除逻辑卷(需确认,输入y)
[root@centos7 ~]# 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

# 3. 删除卷组
[root@centos7 ~]# vgremove webapp dbapp
  Volume group "webapp" successfully removed
  Volume group "dbapp" successfully removed

# 4. 删除物理卷(清除 LVM 元数据)
[root@centos7 ~]# 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.

18.2卷组的扩展与缩减

卷组的容量可通过添加/移除 PV 灵活调整,满足业务存储需求变化。

1 环境准备

先创建基础卷组和逻辑卷,用于后续扩展/缩减测试:

# 1. 创建卷组 webapp(关联 PV /dev/sdb,自动初始化 PV)
[root@centos7 ~]# vgcreate webapp /dev/sdb
  Physical volume "/dev/sdb" successfully created.
  Volume group "webapp" successfully created

# 2. 在 webapp 中创建 10G 逻辑卷 webapp01
[root@centos7 ~]# lvcreate -n webapp01 -L 10G webapp
  Logical volume "webapp01" created.

2 扩展卷组(VG)

当卷组空间不足时,可添加新 PV 扩展容量:

# 将 /dev/sdc、/dev/sdd 加入 webapp 卷组(自动初始化 PV)
[root@centos7 ~]# vgextend webapp /dev/sd{c,d}
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.
  Volume group "webapp" successfully extended

3 缩减卷组(VG)

如需移除卷组中的 PV(如更换更大硬盘),需确保 PV 未被使用,步骤如下:

# 1. 查看 PV 使用状态(/dev/sdb 已分配10G,sdc/sdd 空闲)
[root@centos7 ~]# 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 # 空闲

# 2. 直接移除已使用的 PV 会报错
[root@centos7 ~]# vgreduce webapp /dev/sdb
  Physical volume "/dev/sdb" still in use

# 3. 迁移 PV 数据(将 /dev/sdb 的数据移到 /dev/sdd)
[root@centos7 ~]# pvmove /dev/sdb /dev/sdd
  /dev/sdb: Moved: 0.51%
  /dev/sdb: Moved: 100.00%

# 4. 再次查看 PV 状态(/dev/sdb 空闲,/dev/sdd 已使用)
[root@centos7 ~]# 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 # 已使用

# 5. 移除空闲的 /dev/sdb 从 webapp 卷组
[root@centos7 ~]# vgreduce webapp /dev/sdb
  Removed "/dev/sdb" from volume group "webapp"

# 6. 验证移除结果(/dev/sdb 已脱离 webapp)
[root@centos7 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/sdb          lvm2 ---   20.00g  20.00g
  /dev/sdc   webapp lvm2 a--  <20.00g <20.00g
  /dev/sdd   webapp lvm2 a--  <20.00g <10.00g

18.3逻辑卷的扩展与缩减

逻辑卷的容量可直接调整,需结合卷组空闲空间操作。

1 扩展逻辑卷(LV)

卷组有空闲空间时,可直接扩展 LV 容量:

# 给 webapp01 增加 2G 空间(总容量变为 12G)
[root@centos7 ~]# 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.

# 验证 LV 大小
[root@centos7 ~]# lvs /dev/webapp/webapp01 
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-a----- 12.00g

2 缩减逻辑卷(LV)

逻辑卷空间充足时,可缩减容量(注意:缩减有数据丢失风险,需谨慎):

# 给 webapp01 减少 2G 空间(总容量变回 10G)
[root@centos7 ~]# 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).
  Logical volume webapp/webapp01 successfully resized.

# 验证 LV 大小
[root@centos7 ~]# lvs /dev/webapp/webapp01 
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-a----- 10.00g

18.4文件系统的扩展与缩减

LV 容量调整后,需同步调整文件系统大小,否则无法使用新增空间(或缩减后空间异常)。

1 扩展 XFS 文件系统

XFS 是 CentOS7 默认文件系统,仅支持扩展,不支持缩减,步骤如下:

环境准备
# 1. 格式化 LV 为 XFS
[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01

# 2. 创建挂载点并挂载
[root@centos7 ~]# mkdir /usr/share/nginx/html
[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html

# 3. 写入测试数据
[root@centos7 ~]# cp /etc/host* /usr/share/nginx/html
[root@centos7 ~]# ls /usr/share/nginx/html
host.conf  hostname  hosts  hosts.allow  hosts.deny
扩展操作
# 第一步:扩展 LV 到 15G
[root@centos7 ~]# lvextend -L 15G /dev/webapp/webapp01
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 15.00g # -wi-ao----:已挂载、可读写、激活

# 第二步:扩展 XFS 文件系统(指定挂载点)
[root@centos7 ~]# xfs_growfs /usr/share/nginx/html

# 验证文件系统大小(已扩展到15G,数据未丢失)
[root@centos7 ~]# df -h /usr/share/nginx/html
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01   15G  140M   15G    1% /usr/share/nginx/html
[root@centos7 ~]# ls /usr/share/nginx/html
host.conf  hostname  hosts  hosts.allow  hosts.deny

# 快捷方式:LV + 文件系统一键扩展(-r 参数自动调用 xfs_growfs)
[root@centos7 ~]# lvextend -rL 20G /dev/webapp/webapp01

# 验证最终大小(20G)
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 20.00g                                                    
[root@centos7 ~]# df -h /usr/share/nginx/html
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01   20G  176M   20G    1% /usr/share/nginx/html

2 扩展 EXT4 文件系统

EXT4 支持扩展和缩减,扩展步骤如下:

环境准备
# 1. 卸载原有 XFS 文件系统
[root@centos7 ~]# umount /usr/share/nginx/html

# 2. 格式化 LV 为 EXT4
[root@centos7 ~]# mkfs.ext4 /dev/webapp/webapp01

# 3. 重新挂载并写入测试数据
[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html
[root@centos7 ~]# df -h /usr/share/nginx/html
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01   20G   24K   19G    1% /usr/share/nginx/html
[root@centos7 ~]# cp /etc/host* /usr/share/nginx/html
[root@centos7 ~]# ls /usr/share/nginx/html
host.conf  hostname  hosts  hosts.allow  hosts.deny
扩展操作
# 第一步:扩展 LV 到 25G
[root@centos7 ~]# lvextend -L 25G /dev/webapp/webapp01
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 25.00g 

# 第二步:扩展 EXT4 文件系统(指定 LV 设备名)
[root@centos7 ~]# resize2fs /dev/webapp/webapp01

# 验证文件系统大小(25G,数据未丢失)
[root@centos7 ~]# df -h /usr/share/nginx/html
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01   25G   36K   24G    1% /usr/share/nginx/html
[root@centos7 ~]# ls /usr/share/nginx/html
host.conf  hostname  hosts  hosts.allow  hosts.deny

# 快捷方式:LV + 文件系统一键扩展(-r 参数自动调用 resize2fs)
[root@centos7 ~]# lvextend -rL 30G /dev/webapp/webapp01

# 验证最终大小(30G)
[root@centos7 ~]# lvs /dev/webapp/webapp01
  LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  webapp01 webapp -wi-ao---- 30.00g                                                    
[root@centos7 ~]# df -h /usr/share/nginx/html
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01   30G   36K   28G    1% /usr/share/nginx/html

3 缩减 EXT4 文件系统(自学)

EXT4 缩减需离线操作(卸载文件系统),且缩减后容量不能小于已用容量,步骤如下:

# 第一步:卸载文件系统(必须离线)
[root@centos7 ~]# umount /usr/share/nginx/html 

# 第二步:检查文件系统完整性(-f 强制检查)
[root@centos7 ~]# 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@centos7 ~]# resize2fs /dev/webapp/webapp01 10G
resize2fs 1.45.6 (20-Mar-2020)
将 /dev/webapp/webapp01 上的文件系统调整为 2621440 个块(每块 4k)。
/dev/webapp/webapp01 上的文件系统现在为 2621440 个块(每块 4k)。

# 第四步:缩减 LV 到 10G(需确认,输入y)
[root@centos7 ~]# 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).
  Logical volume webapp/webapp01 successfully resized.

# 第五步:挂载并验证(数据未丢失,容量为10G)
[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html
[root@centos7 ~]# df -h /usr/share/nginx/html
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/webapp-webapp01  9.7G   36K  9.3G    1% /usr/share/nginx/html
[root@centos7 ~]# ls /usr/share/nginx/html
host.conf  hostname  hosts  hosts.allow  hosts.denylost+found

补充说明:若文件系统基于传统磁盘分区创建,扩展/缩减操作与上述 LVM 逻辑卷的操作完全一致。

18.5逻辑卷快照

LVM 快照可保留逻辑卷某一时刻的完整数据,用于数据备份或恢复,核心特性:快照容量需不小于原 LV 容量(避免数据溢出)。

 # 1. 创建快照(-s 表示快照,-n 快照名,-L 快照大小,指定原 LV)
 [root@centos7 ~]# lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01
   Logical volume "webapp01-snap1" created.
 ​
 # 2. 挂载快照(查看快照中的数据)
 # 快照的文件系统和原先逻辑卷的文件系统的uuid是一致的。 默认情况下,快照和原卷同一时刻只能挂载一个。
 # 一定要挂载,则需要修改uuid
 [root@centos7 ~]# uuidgen 
 bcb510b4-6e18-4b47-849f-c0b4f79dcc33
 ​
 # 2-1. 修改xfs文件系统uuid命令使用xfs_admin
 [root@centos7 ~]# xfs_admin -U bcb510b4-6e18-4b47-849f-c0b4f79dcc33 /dev/webapp/webapp01-snap1
 ​
 # 2-2. 修改ext4文件系统uuid命令使用tune2fs
 [root@centos7 ~]# tune2fs -U bcb510b4-6e18-4b47-849f-c0b4f79dcc33 /dev/webapp/webapp01-snap1
 ​
 # 挂载测试
 [root@centos7 ~]# mkdir /webapp/webapp01-snap1
 [root@centos7 ~]# mount /dev/webapp/webapp01-snap1 /webapp/webapp01-snap1
 ​
 # 3. 验证快照数据(与原 LV 一致)
 [root@centos7 ~]# ls /webapp/webapp01-snap1
 host.conf  hostname  hosts  hosts.allow  hosts.deny
 ​
 # 4. 在快照 LV 中写入新数据(验证快照独立性)
 [root@centos7 ~]# echo hello world > /webapp/webapp01-snap1/hello.txt
 [root@centos7 ~]# cat /webapp/webapp01-snap1/hello.txt
 hello world

18.6RAID 逻辑卷(自学)

LVM 支持创建 RAID 类型的逻辑卷(如 RAID1、RAID5),提供数据冗余保护,以下为实战示例。

1 环境准备

清理原有配置,为创建 RAID 逻辑卷做准备:

 [root@centos7 ~]# umount /webapp/webapp01
 [root@centos7 ~]# umount /usr/share/nginx/html
 [root@centos7 ~]# lvremove /dev/webapp/webapp01* # 删除原 LV 及快照

2 创建 RAID1 逻辑卷(镜像卷)

RAID1 提供数据镜像,单盘损坏不丢失数据:

# 1. 创建 RAID1 逻辑卷(--type raid1,15G 大小,卷组 webapp)
[root@centos7 ~]# lvcreate --type raid1 -n webapp01 -L 15G webapp
[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01 

# 2. 挂载并写入测试数据
[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html/
[root@centos7 ~]# cp /etc/ho* /usr/share/nginx/html/

3 模拟硬盘故障与修复

# 1. 模拟 /dev/sdd 损坏(写入零数据覆盖)
[root@centos7 ~]# dd if=/dev/zero of=/dev/sdd bs=1M count=256

# 2. 验证文件系统仍可访问(RAID1 冗余保护)
[root@centos7 ~]# ls /usr/share/nginx/html/
host.conf  hostname  hosts  hosts.allow  hosts.deny

# 3. 卸载并重新挂载(验证稳定性)
[root@centos7 ~]# umount /usr/share/nginx/html
[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html/

# 4. 修复 RAID1 逻辑卷
## 4.1 移除损坏的 PV
[root@centos7 ~]# vgreduce --removemissing webapp --force

## 4.2 重新添加 /dev/sdd 到卷组
[root@centos7 ~]# vgextend webapp /dev/sdd

## 4.3 修复 RAID1 逻辑卷
[root@centos7 ~]# lvconvert --repair /dev/webapp/webapp01

## 4.4 扫描 PV 变化
[root@centos7 ~]# pvscan

## 4.5 验证修复结果
[root@centos7 ~]# pvs|grep webapp
  /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

4 创建 RAID5 逻辑卷示例

RAID5 兼顾容量和冗余(需至少 3 块盘,1 块做校验):

# 创建 RAID5 逻辑卷:5G 可用空间,3 条数据条带,条带大小 64KiB,卷组 vg00,LV 名 mylv
lvcreate --type raid5 -L 5G -i 3 -I 64 -n mylv vg00
  • -i 3:指定 3 个数据条带(对应 3 块 PV);

  • -I 64:条带大小 64KiB;

  • --type raid5:RAID5 类型。

19. 4.10课前思考:Linux RAID 与 LVM 课前思考 问题

文档用途:Linux 存储课前预习 / 课后背诵 / 面试答题


1. RAID 0 实现的原理是什么?有什么特点?

问题:RAID 0 实现的原理是什么?有什么特点?

答案

  • 实现原理:将数据以条带化形式拆分,均匀并发写入多块硬盘,无冗余校验、无数据备份。

  • 特点

    1. 读写性能在所有 RAID 级别中最快;

    2. 无任何冗余能力,任意 1 块硬盘损坏,数据全部丢失;

    3. 最少需要 2 块硬盘;

    4. 总容量 = 所有硬盘容量之和。


2. RAID 1 实现的原理是什么?有什么特点?

问题:RAID 1 实现的原理是什么?有什么特点?

答案

  • 实现原理:采用镜像机制,同一份数据同时写入两块硬盘,两块盘数据完全一致。

  • 特点

    1. 100% 数据冗余,损坏 1 块盘,数据可完整恢复;

    2. 读取性能较好,写入性能略低;

    3. 最少需要 2 块硬盘;

    4. 总容量 = 总硬盘容量的 1/2。


3. RAID 5 实现的原理是什么?有什么特点?

答案: 实现原理:RAID5 采用数据条带化拆分 + 分布式奇偶校验,将数据分块写入多块硬盘,通过异或运算生成校验数据,并把校验数据循环分散存储在所有硬盘上;单盘损坏时,可通过剩余数据与校验数据反向计算恢复丢失数据。是生产环境最常用的 RAID 级别,兼顾性能、容量、冗余三大需求。

特点: 1.最少需要 3 块硬盘,允许坏一个盘; 2.可用容量 =(磁盘数 - 1)× 单盘容量,容量利用率高;

3.读性能优秀、写性能中等,兼顾性能与安全; 4.校验数据分布式存储,无性能瓶颈; 5.适合数据库、文件服务、Web 存储等通用生产场景。

6.任意 1 块盘损坏,可通过剩余数据 + 校验数据反向计算恢复丢失数据 例:3 块盘(A、B、C) A 盘存数据 D1,B 盘存数据 D2 C 盘存校验 P = D1 XOR D2 若 A 盘损坏:D1 = D2 XOR P 即可恢复


4. 假设你有 6 块 2T 硬盘,现需要为 web 应用提供 4T 存储空间,为 db 应用也提供 4T 存储空间。如何使用 raid 技术实现?讲述实现过程。

  1. 答案

    1. 方案设计

      将 6 块 2T 硬盘平均分为2 组,每组 3 块,分别创建RAID5,每组可用容量均为 4T,分别供给 Web、DB 使用。

    2. 容量验证

      单组 RAID5 可用容量 = (3-1)×2T = 4T(注意而不是6T,损耗的 2T 是 RAID5 的校验空间)

      两组分别提供 4T,刚好满足 Web、DB 各 4T 的存储需求。

    3. 实现过程

    4. 分组:Web 组使用 /dev/sda、sdb、sdc;DB 组使用 /dev/sdd、sde、sdf

    5. 创建 Web RAID5:

      mdadm --create /dev/md0 --level 5 --raid-devices 3 /dev/sda /dev/sdb /dev/sdc
    命令片段 完整含义 / 参数作用 通俗解释
    mdadm Linux 系统软 RAID 专用管理命令 管理磁盘阵列的核心工具,所有 RAID 创建 / 查看 / 修复都用它
    --create 创建新的 RAID 阵列(简写 -C 告诉系统:我要新建一个磁盘阵列
    /dev/md0 RAID 阵列的设备名称 Linux 软 RAID 固定命名规则:第一个阵列 = md0,第二个 = md1,以此类推
    --level 5 指定 RAID 级别为 RAID5(简写 -l 5 选择阵列类型:我们要做的是 RAID5(分布式校验、单盘容错)
    --raid-devices 3 指定活动成员盘数量为 3 块(简写 -n 3 告诉系统:这个 RAID5 由 3 块硬盘 组成
    /dev/sda /dev/sdb /dev/sdc 组成 RAID5 的 3 块物理硬盘 真正参与阵列的磁盘(你的 3 块 2T 硬盘)

    6.创建 DB RAID5:

    mdadm --create /dev/md1 --level 5 --raid-devices 3 /dev/sdd /dev/sde /dev/sdf

    7.格式化:mkfs.xfs /dev/md0mkfs.xfs /dev/md1

    8.挂载:/dev/md0 挂载到 Web 目录,/dev/md1 挂载到 DB 目录

    9.确认:两组阵列可用容量均为4T,匹配需求

    3 块 2T 做 RAID5 → 可用 4T

    6 块分两组各 3 块 → 两组各 4T → 完美满足 Web+DB 各 4T


5. LVM 技术有哪些优点?

1.使用逻辑卷可以更加灵活地扩展和缩减文件系统空间。

2.使用逻辑卷创建的文件系统可以跨多个硬盘,适合创建超大容量文件系统。

3.使用逻辑卷可以创建镜像卷,保证数据的冗余性。即使单个硬盘损坏,文件系统中数据也会

丢失。

4.使用逻辑卷还可以创建快照,保留某一时刻数据,就像虚拟机快照一样。


6. 概述使用 LVM 技术为 web 应用提供存储过程。

答案

  1. 准备物理硬盘:新增用于 web 存储的硬盘(如 /dev/sdb);

  2. 创建物理卷 PV:pvcreate /dev/sdb

  3. 创建卷组 VG:vgcreate webvg /dev/sdb

  4. 创建逻辑卷 LV:lvcreate -n weblv -L 指定容量 webvg

  5. 格式化文件系统:mkfs.xfs /dev/webvg/weblv

  6. 挂载到 web 目录:mount /dev/webvg/weblv /var/www/html

  7. 配置开机挂载:将挂载信息写入/etc/fstab,防止重启失效。

LVM 核心层级:物理硬盘 → PV → VG → LV → 格式化挂载 → 业务使用


步骤 1:准备物理硬盘

操作:新增用于 web 存储的硬盘(如 /dev/sdb

详细解释

  1. 给服务器添加一块全新的物理硬盘(无需分区);

  2. Linux 中硬盘默认命名为 /dev/sdb(第一块新盘);

  3. 作用:提供原始物理存储空间,作为 LVM 的基础硬件。


步骤 2:创建物理卷 PV(Physical Volume)

命令pvcreate /dev/sdb

详细解释

  1. pvcreate:LVM 创建物理卷的命令;

  2. 作用:给物理硬盘打上 LVM 标记,将裸盘转换为 LVM 能识别管理的单元;

  3. 意义:让系统知道这块盘可以加入 LVM 存储池。


步骤 3:创建卷组 VG(Volume Group)

命令vgcreate webvg /dev/sdb

详细解释

  1. vgcreate:创建 LVM 卷组;

  2. webvg自定义卷组名称(专门给 Web 应用用,命名见名知意);

  3. 作用:将 PV(/dev/sdb)加入卷组,形成一个统一的大存储池

  4. 意义:所有逻辑卷都从这个存储池中划分空间。


步骤 4:创建逻辑卷 LV(Logical Volume)

命令lvcreate -n weblv -L 指定容量 webvg

详细解释

  1. lvcreate:创建逻辑卷(最终给 Web 用的存储设备);

  2. -n weblv-n 指定逻辑卷名称为 weblv(Web 专用 LV);

  3. -L 指定容量-L 指定 LV 大小(如 10G、20G,根据 Web 需求分配);

  4. webvg:从 webvg 这个存储池中划分空间;

  5. 生成设备路径:/dev/webvg/weblv(后续格式化、挂载用此路径)。


步骤 5:格式化文件系统

命令mkfs.xfs /dev/webvg/weblv

详细解释

  1. mkfs.xfs:创建 XFS 文件系统(CentOS7~8 默认文件系统);

  2. 作用:逻辑卷只是逻辑空间,必须格式化才能存储文件 / 网站数据;

  3. 意义:让 LV 具备文件存储能力,支持 Web 应用写入网页、图片、配置等数据。


步骤 6:挂载到 web 目录

命令mount /dev/webvg/weblv /var/www/html

详细解释

  1. mount:挂载命令;

  2. /dev/webvg/weblv:LVM 逻辑卷设备;

  3. /var/www/htmlWeb 应用默认根目录

  4. 作用:将逻辑卷与 Web 目录绑定,写入 Web 目录的数据都会存到 LV 中

  5. 效果:Web 服务器可以正常读写存储数据。


步骤 7:配置开机挂载(永久生效)

操作:将挂载信息写入 /etc/fstab

详细解释

  1. 直接 mount 挂载是临时生效,服务器重启后会失效;

  2. 写入 /etc/fstab 配置文件,系统开机时自动挂载

  3. 配置格式(示例):

    /dev/webvg/weblv   /var/www/html   xfs   defaults  0 0
  4. 作用:保证服务器重启后,Web 存储依然正常可用,是生产环境必做步骤。


7. 如果 web 应用使用的存储空间不足,如何扩容?

答案

  1. 新增物理硬盘(如 /dev/sdc);

  2. 将新硬盘创建为 PV:pvcreate /dev/sdc

  3. 扩容 web 对应的卷组 VG:vgextend webvg /dev/sdc

  4. 扩容 web 对应的逻辑卷 LV:lvextend -L +新增容量 /dev/webvg/weblv

  5. 扩容文件系统(同步识别新空间):

    • XFS 文件系统:xfs_growfs /var/www/html

    • EXT4 文件系统:resize2fs /dev/webvg/weblv

  6. 验证扩容结果:df -h 查看 web 目录容量已增加。

Web 网站访问量变大、图片 / 日志变多,原有存储空间已满,需要扩容!


步骤 1:新增物理硬盘(硬件操作)

操作:给服务器插入一块新硬盘(系统识别为 /dev/sdc

详细解释

  1. 原有的硬盘空间已经占满,必须新增物理硬件提供新空间;

  2. 硬盘插入服务器后,Linux 系统会自动识别,命名为 /dev/sdc(第三块硬盘);

  3. 这一步是硬件基础,没有新硬盘就无法扩容。


步骤 2:将新硬盘创建为 PV(物理卷)

命令pvcreate /dev/sdc

详细解释

  1. 命令含义

    • pv = Physical Volume(物理卷)

    • create = 创建

    • pvcreate:把物理硬盘转换为 LVM 能识别管理的格式

  2. 作用

    新硬盘是 “裸盘”,LVM 无法直接使用,必须打上 LVM 标记,变成标准化的 PV;

  3. 结果

    /dev/sdc

    成为 LVM 体系的一员,等待加入存储池。


步骤 3:扩容 Web 对应的卷组 VG

命令vgextend webvg /dev/sdc

详细解释

  1. 命令含义

    • vg = Volume Group(卷组,Web 的存储池)

    • extend = 扩展、扩容

    • vgextend:把新的 PV 加入现有卷组,扩大存储池大小

  2. 作用

    原存储池

     webvg

    空间已满,将新硬盘

     /dev/sdc

    加入后,

    整个存储池变大

  3. 核心意义

    所有逻辑卷的空间,都从这个存储池划分,池变大了,才能给 Web 分配新空间。


步骤 4:扩容 Web 对应的逻辑卷 LV

命令lvextend -L +新增容量 /dev/webvg/weblv

示例lvextend -L +20G /dev/webvg/weblv

详细解释

  1. 命令含义

    • lv = Logical Volume(逻辑卷,Web 实际使用的盘)

    • extend = 扩展

    • lvextend:给 Web 专用的逻辑卷 weblv 扩容;

  2. 参数详解

    • -L:指定扩容大小

    • +20G在原有容量基础上,增加 20G(最常用写法);

    • /dev/webvg/weblv:Web 逻辑卷的固定路径;

  3. 作用

    从变大的 webvg 存储池中,划出空间给 Web 逻辑卷;

  4. 注意这一步只是逻辑层面扩容,系统还没识别到新空间!


步骤 5:扩容文件系统(最关键!同步识别新空间)

逻辑卷扩容后,文件系统不知道空间变大了,必须执行这一步同步!

① XFS 文件系统(Web 生产环境 99% 使用)

命令xfs_growfs /var/www/html

详细解释

  • xfs_growfs:XFS 文件系统专用扩容命令;

  • /var/www/html:Web 网站根目录(挂载点);

  • 作用:让文件系统识别到新增的空间,在线扩容,无需卸载、无需停机


步骤 6:验证扩容结果

命令df -h

详细解释

  • df -h:查看系统磁盘挂载和使用情况;

  • 查看结果:/var/www/html 目录的总容量已增加,扩容成功;

  • 业务验证:Web 应用可以正常写入新数据,无任何异常。


极简核心总结(必背,面试 / 实操直接用)

  1. 加硬盘 → 提供新物理空间

  2. 建 PV → 新盘转为 LVM 格式

  3. 扩 VG → 扩大存储池

  4. 扩 LV → 给 Web 逻辑卷加空间

  5. 扩文件系统 → 让系统识别新空间

  6. 验证 → 查看容量生效

一句话记住

LVM 扩容 = 先扩池 → 再扩盘 → 最后同步文件系统,全程不关机!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐