1.RAID 存储

1.1RAID 概念

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

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

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

1.2RAID 实现方式

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

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

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

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

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

1.3RAID 级别

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

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

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

1.4RAID 实践

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

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

1.4.1管理 RAID 0

1 .创建 RAID 0
 # 安装mdadm工具(CentOS系统)
 [root@centos7 ~ 10:08:40]# yum install -y mdadm
 ​
 # 创建RAID 0阵列:设备名/dev/md0,级别0,成员盘2块(sdb、sdc)
 [root@centos7 ~ 10:08:52]# mdadm --create --level=0 --raid-device=2 /dev/md0 /dev/sdb /dev/sdc
 mdadm: Defaulting to version 1.2 metadata
 mdadm: array /dev/md0 started.
 [root@centos7 ~ 10:13:15]# lsblk
 NAME            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
 sda               8:0    0  200G  0 disk  
 ├─sda1            8:1    0    1G  0 part  /boot
 └─sda2            8:2    0  199G  0 part  
   ├─centos-root 253:0    0   50G  0 lvm   /
   ├─centos-swap 253:1    0    2G  0 lvm   [SWAP]
   └─centos-home 253:2    0  147G  0 lvm   /home
 sdb               8:16   0   20G  0 disk  
 └─md0             9:0    0   40G  0 raid0 
 sdc               8:32   0   20G  0 disk  
 └─md0             9:0    0   40G  0 raid0 
 sdd               8:48   0   20G  0 disk  
 sde               8:64   0   20G  0 disk  
 sdf               8:80   0   20G  0 disk  
 sdg               8:96   0   20G  0 disk  
 sr0              11:0    1  4.4G  0 rom   

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

2 .查看 RAID 0 状态
 # 查看RAID概要信息(内核态RAID状态)
 [root@centos7 ~ 10:13:29]# cat /proc/mdstat
 Personalities : [raid0] 
 md0 : active raid0 sdc[1] sdb[0]
       41908224 blocks super 1.2 512k chunks
       
 unused devices: <none>
 ​
 # 查看RAID设备详细信息
 [root@centos7 ~ 10:25:48]# mdadm --detail /dev/md0
 /dev/md0:
            Version : 1.2
      Creation Time : Thu Apr  9 10:13:15 2026
         Raid Level : raid0
         Array Size : 41908224 (39.97 GiB 42.91 GB)
       Raid Devices : 2
      Total Devices : 2
        Persistence : Superblock is persistent
 ​
        Update Time : Thu Apr  9 10:13:15 2026
              State : clean 
     Active Devices : 2
    Working Devices : 2
     Failed Devices : 0
      Spare Devices : 0
 ​
         Chunk Size : 512K
 ​
 Consistency Policy : none
 ​
               Name : centos7.wangjie.cloud:0  (local to host centos7.wangjie.cloud)
               UUID : 7c93829e:6b3712fe:3d4c9c79:9193ee9a
             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(条带块大小)、成员盘状态。

 # 查看RAID设备与物理盘的映射关系
 [root@centos7 ~ 10:27:17]# lsblk /dev/md0
 NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
 md0    9:0    0  40G  0 raid0 
 ​
 [root@centos7 ~ 10:27:30]# lsblk /dev/sdb /dev/sdc
 NAME  MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
 sdb     8:16   0  20G  0 disk  
 └─md0   9:0    0  40G  0 raid0 
 sdc     8:32   0  20G  0 disk  
 └─md0   9:0    0  40G  0 raid0 
3 .格式化与挂载 RAID 0
 # 格式化RAID设备为XFS文件系统
 [root@centos7 ~ 10:27:44]# mkfs.xfs /dev/md0
 meta-data=/dev/md0               isize=512    agcount=16, agsize=654720 blks
          =                       sectsz=512   attr=2, projid32bit=1
          =                       crc=1        finobt=0, sparse=0
 data     =                       bsize=4096   blocks=10475520, imaxpct=25
          =                       sunit=128    swidth=256 blks
 naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
 log      =internal log           bsize=4096   blocks=5120, version=2
          =                       sectsz=512   sunit=8 blks, lazy-count=1
 realtime =none                   extsz=4096   blocks=0, rtextents=0
 ​
 # 创建挂载点
 [root@centos7 ~ 10:29:06]# mkdir -p /raid/raid0
 ​
 # 挂载RAID设备到挂载点
 [root@centos7 ~ 10:29:24]# mount /dev/md0 /raid/raid0
 ​
 # 验证挂载结果
 [root@centos7 ~ 10:29:42]# df -h /raid/raid0
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/md0         40G   33M   40G   1% /raid/raid0
 ​
 # 测试数据写入
 [root@centos7 ~ 10:29:53]# cp /etc/ho* /raid/raid0
 [root@centos7 ~ 10:30:15]# ls /raid/raid0/
 host.conf  hostname  hosts  hosts.allow  hosts.deny
4. 删除 RAID 0
 # 卸载挂载点
 [root@centos7 ~ 10:30:22]# umount /dev/md0
 ​
 # 停止RAID阵列(销毁阵列)
 [root@centos7 ~ 10:32:37]# mdadm --stop /dev/md0
 mdadm: stopped /dev/md0
 ​
 # 清除物理盘上的RAID超级块(恢复为普通磁盘)
 [root@centos7 ~ 10:32:51]# mdadm --zero-superblock /dev/sdb /dev/sdc
5 .补充说明
  • RAID 0不支持新增成员盘扩展容量:

 [root@centos7 ~]# mdadm --add /dev/md0 /dev/sdd mdadm
 add new device failed for /dev/sdd as 2: Invalid argument
  • RAID 0不支持标记单盘故障(无冗余,单盘故障即阵列失效):

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

1.4.2 管理 RAID 1

1 .创建 RAID 1
 # 创建RAID 1阵列:设备名/dev/md1,级别1,成员盘2块(sdb、sdc)
 [root@centos7 ~ 10:33:55]# mdadm --create  /dev/md1 --leve 1 --raid-device 2 /dev/sdb /dev/sdc
 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 ~ 11:04:35]# mdadm --detail /dev/md1
 /dev/md1:
            Version : 1.2
      Creation Time : Thu Apr  9 11:04:35 2026
         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 : Thu Apr  9 11:05:01 2026
              State : clean, resyncing 
     Active Devices : 2
    Working Devices : 2
     Failed Devices : 0
      Spare Devices : 0
 ​
 Consistency Policy : resync
 ​
      Resync Status : 25% complete
 ​
               Name : centos7.wangjie.cloud:1  (local to host centos7.wangjie.cloud)
               UUID : 9106c3ab:fbc719f2:7039321d:765b612d
             Events : 4
 ​
     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 ~ 11:05:01]# lsblk /dev/md1
 NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
 md1    9:1    0  20G  0 raid1 
 ​
 [root@centos7 ~ 11:05:16]# 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 ~ 11:06:33]# mkfs.xfs -f /dev/md1
 meta-data=/dev/md1               isize=512    agcount=4, agsize=1309632 blks
          =                       sectsz=512   attr=2, projid32bit=1
          =                       crc=1        finobt=0, sparse=0
 data     =                       bsize=4096   blocks=5238528, imaxpct=25
          =                       sunit=0      swidth=0 blks
 naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
 log      =internal log           bsize=4096   blocks=2560, version=2
          =                       sectsz=512   sunit=0 blks, lazy-count=1
 realtime =none                   extsz=4096   blocks=0, rtextents=0
 ​
 # 创建挂载点
 [root@centos7 ~ 11:05:52]# mkdir /raid/raid1
 ​
 # 挂载设备
 [root@centos7 ~ 11:06:17]# mount /dev/md1 /raid/raid1
 ​
 # 验证挂载
 [root@centos7 ~ 11:09:23]# df -h /raid/raid1
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/md1         20G   33M   20G   1% /raid/raid1
 ​
 # 测试数据写入
 [root@centos7 ~ 11:09:37]# cp /etc/ho* /raid/raid1
 [root@centos7 ~ 11:09:58]# ls /raid/raid1
 host.conf  hostname  hosts  hosts.allow  hosts.deny
4 .增加热备盘
 # 为RAID 1添加热备盘sdd
 [root@centos7 ~ 11:10:05]# mdadm --add /dev/md1 /dev/sdd
 mdadm: added /dev/sdd
 ​
 # 查看热备盘状态(spare为备用)
 [root@centos7 ~ 11:10:48]# 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 ~ 11:11:09]# mdadm --fail /dev/md1 /dev/sdc
 mdadm: set /dev/sdc faulty in /dev/md1
 ​
 # 查看故障后状态(sdd自动顶替并同步)
 [root@centos7 ~ 11:11:45]# 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 ~ 11:12:03]# ls /raid/raid1/
 host.conf  hostname  hosts  hosts.allow  hosts.deny
 [root@centos7 ~ 11:12:13]# cat /raid/raid1/hostname
 centos7.wangjie.cloud
6 .删除故障磁盘
 # 移除故障盘sdc
 [root@centos7 ~ 11:12:28]# mdadm --remove /dev/md1 /dev/sdc
 mdadm: hot removed /dev/sdc from /dev/md1
 ​
 # 验证移除结果
 [root@centos7 ~ 11:14:05]# mdadm --detail /dev/md1 | tail -5
             Events : 46
 ​
     Number   Major   Minor   RaidDevice State
        0       8       16        0      active sync   /dev/sdb
        2       8       48        1      active sync   /dev/sdd
7 .再次模拟故障
 [root@centos7 ~ 11:14:05]# mdadm --fail /dev/md1 /dev/sdd
 ​
 [root@centos7 ~ 11:14:05]# 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 ~ 11:14:05]# ls /raid/raid1
 host.conf  hostname  hosts  hosts.allow  hosts.deny
 [root@centos7 ~ 11:14:05]# echo hello raid1 > /raid/raid1/test.txt
 ​
 [root@centos7 ~ 11:14:05]# umount /raid/raid1 
 [root@centos7 ~ 11:14:05]# mount /dev/md1 /raid/raid1
 [root@centos7 ~ 11:14:05]# ls /raid/raid1
 host.conf  hostname  hosts  hosts.allow  hosts.deny  test.txt

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

8.删除 RAID 1
 # 卸载挂载点
 [root@centos7 ~ 11:14:26]# umount /dev/md1
 ​
 # 停止RAID阵列
 [root@centos7 ~ 11:14:40]# mdadm --stop /dev/md1
 mdadm: stopped /dev/md1
 ​
 # 清除物理盘超级块
 [root@centos7 ~ 11:14:52]# mdadm --zero-superblock /dev/sdb /dev/sdd

使用dd工具填充更彻底。

 [root@centos7 ~ 11:14:52]# 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核心价值是数据冗余,而非扩容:即使新增磁盘,阵列总容量仍等于单盘容量(镜像机制),无法通过加盘提升可用空间。

1.4.3管理 RAID 5

1. 创建 RAID 5
 # 创建RAID 5阵列:设备名/dev/md5,级别5,成员盘4块(sdb、sdc、sdd、sde)
 [root@centos7 ~ 11:34:46]# mdadm --create /dev/md5 --leve 5 --raid-device 4 /dev/sd{b..e}
 mdadm: /dev/sdc appears to be part of a raid array:
        level=raid1 devices=2 ctime=Thu Apr  9 11:04:35 2026
 Continue creating array? yes
 mdadm: Defaulting to version 1.2 metadata
 mdadm: array /dev/md5 started.

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

2 .查看 RAID 5 状态
 [root@centos7 ~ 11:35:36]# mdadm --detail /dev/md5
 /dev/md5:
            Version : 1.2
      Creation Time : Thu Apr  9 11:35:35 2026
         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 : Thu Apr  9 11:35:49 2026
              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 : 15% complete
 ​
               Name : centos7.wangjie.cloud:5  (local to host centos7.wangjie.cloud)
               UUID : e2e82cd2:a232a083:d4fc883b:49ae4c09
             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 ~ 11:35:52]# lsblk /dev/md5
 NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
 md5    9:5    0  60G  0 raid5 
 ​
 [root@centos7 ~ 11:36:46]# 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 ~ 11:37:24]# mkfs.xfs -f /dev/md5
 meta-data=/dev/md5               isize=512    agcount=16, agsize=982144 blks
          =                       sectsz=512   attr=2, projid32bit=1
          =                       crc=1        finobt=0, sparse=0
 data     =                       bsize=4096   blocks=15714304, imaxpct=25
          =                       sunit=128    swidth=384 blks
 naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
 log      =internal log           bsize=4096   blocks=7680, version=2
          =                       sectsz=512   sunit=8 blks, lazy-count=1
 realtime =none                   extsz=4096   blocks=0, rtextents=0
 ​
 # 创建挂载点
 [root@centos7 ~ 11:38:17]# mkdir /raid/raid5
 ​
 # 挂载设备
 [root@centos7 ~ 11:38:41]# mount /dev/md5 /raid/raid5
 ​
 # 验证挂载
 [root@centos7 ~ 11:38:57]# df -h /raid/raid5/
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/md5         60G   33M   60G   1% /raid/raid5
 [root@centos7 ~ 11:39:11]# cp /etc/ho*/raid/raid5
 cp: missing destination file operand after ‘/etc/ho*/raid/raid5’
 Try 'cp --help' for more information.
 ​
 # 测试数据写入
 [root@centos7 ~ 11:39:35]# cp /etc/ho* /raid/raid5
 [root@centos7 ~ 11:39:45]# ls /raid/raid5
 host.conf  hostname  hosts  hosts.allow  hosts.deny
4 .增加热备盘
 # 为RAID 5添加热备盘sdf
 [root@centos7 ~ 11:39:52]# mdadm --add /dev/md5 /dev/sdf
 mdadm: added /dev/sdf
 ​
 # 查看热备盘状态
 [root@centos7 ~ 11:40:12]# 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 ~ 11:40:31]# mdadm --fail /dev/md5 /dev/sdb
 mdadm: set /dev/sdb faulty in /dev/md5
 ​
 # 查看故障后状态(sdf自动顶替并同步)
 [root@centos7 ~ 11:41:01]# 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 ~ 11:41:20]# ls /raid/raid5/
 host.conf  hostname  hosts  hosts.allow  hosts.deny
 [root@centos7 ~ 11:41:50]# cat /raid/raid5/hostname
 centos7.wangjie.cloud
6 .删除故障磁盘
 # 移除故障盘sdb
 [root@centos7 ~ 11:42:05]# mdadm --remove /dev/md5 /dev/sdb
 mdadm: hot removed /dev/sdb from /dev/md5
 ​
 # 验证移除结果
 [root@centos7 ~ 11:42:49]# 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 ~ 11:42:58]# mdadm --add /dev/md5 /dev/sdb /dev/sdg
 mdadm: added /dev/sdb
 mdadm: added /dev/sdg
 ​
 # 查看新增盘状态(spare为备用)
 [root@centos7 ~ 11:43:44]# 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 ~ 11:44:01]# mdadm --grow /dev/md5 --raid-device 5
 ​
 # 等待阵列重构完成(查看进度)
 [root@centos7 ~ 11:46:34]# mdadm --detail /dev/md5 |tail -7
        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 ~ 11:47:07]# 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 ~ 11:47:07]# xfs_growfs /raid/raid5
 [root@centos7 ~ 11:47:07]# df -h /raid/raid5/
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/md5         80G  604M   80G   1% /raid/raid5
8 .再次模拟磁盘故障
 # 移除故障盘sdb
 [root@centos7 ~ 13:34:27]# mdadm --remove /dev/md5 /dev/sdb
 mdadm: hot removed /dev/sdb from /dev/md5
 [root@centos7 ~ 13:45:01]# mdadm --fail /dev/md5 /dev/sdg
 mdadm: set /dev/sdg faulty in /dev/md5
 [root@centos7 ~ 13:45:20]# mdadm -D /dev/md1|tail -5
 mdadm: cannot open /dev/md1: No such file or directory
 [root@centos7 ~ 13:45:52]# mdadm -D /dev/md5|tail -5
        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 ~ 13:48:46]# ls /raid/raid5
 host.conf  hostname  hosts  hosts.allow  hosts.deny
 [root@centos7 ~ 13:49:36]# echo hello raid5 > /raid/raid5/test.txt
 [root@centos7 ~ 13:49:51]# umount /raid/raid5
 ​
 [root@centos7 ~ 13:49:57]# mount /dev/md5 /raid/raid5
 [root@centos7 ~ 13:50:10]# ls /raid/raid5
 host.conf  hostname  hosts  hosts.allow  hosts.deny  test.txt
9. 删除 RAID 5
 # 卸载挂载点
 [root@centos7 ~ 13:50:18]# umount /dev/md5
 ​
 # 停止RAID阵列
 [root@centos7 ~ 13:50:44]# mdadm --stop /dev/md5
 mdadm: stopped /dev/md5
 ​
 # 清除物理盘超级块
 [root@centos7 ~ 13:50:56]# mdadm --zero-superblock /dev/sd{b..g}
 ​
 # 也可以使用dd彻底擦除:
 [root@centos7 ~ 13:51:33]# for device in /dev/sd{b..g}
 > do
 > dd if=/dev/zero of=$device bs=1M count=1024
 > done

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

2.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

2.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 的核心操作遵循“创建物理卷 → 创建卷组 → 创建逻辑卷”的流程,具体如下:

5 .创建物理卷(PV)

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

 # 1. 创建单个物理卷
 [root@centos7 ~ 14:21:46]# pvcreate /dev/sdb
   Physical volume "/dev/sdb" successfully created.
   
 # 2. 批量创建多个物理卷(sdc、sdd)
 [root@centos7 ~ 14:22:04]# pvcreate /dev/sd{c..d}
   Physical volume "/dev/sdc" successfully created.
   Physical volume "/dev/sdd" successfully created.
   
 # 3. 查看所有 PV 列表(简洁版)
 [root@centos7 ~ 14:22:15]# pvs
   PV         VG     Fmt  Attr PSize    PFree 
   /dev/sda2  centos lvm2 a--  <199.00g  4.00m
   /dev/sdb          lvm2 ---    20.00g 20.00g
   /dev/sdc          lvm2 ---    20.00g 20.00g
   /dev/sdd          lvm2 ---    20.00g 20.00g

6 .创建卷组(VG)

 # 1. 创建包含单个 PV 的卷组(卷组名:webapp,关联 PV:/dev/sdb)
 [root@centos7 ~ 14:22:18]# vgcreate webapp /dev/sdb
   Volume group "webapp" successfully created
   
 # 2. 创建包含多个 PV 的卷组(卷组名:dbapp,关联 PV:/dev/sdc、/dev/sdd)
 [root@centos7 ~ 14:23:10]# vgcreate dbapp /dev/sd{c,d}
   Volume group "dbapp" successfully created
 ​
 # 3. 查看 PV 归属(验证 PV 已加入对应 VG)
 [root@centos7 ~ 14:23:54]# pvs
   PV         VG     Fmt  Attr PSize    PFree  
   /dev/sda2  centos lvm2 a--  <199.00g   4.00m
   /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 ~ 14:23:58]# vgs
   VG     #PV #LV #SN Attr   VSize    VFree  
   centos   1   3   0 wz--n- <199.00g   4.00m
   dbapp    2   0   0 wz--n-   39.99g  39.99g
   webapp   1   0   0 wz--n-  <20.00g <20.00g

7 .创建逻辑卷(LV)

 # 1. 创建单 PV 逻辑卷(卷组:webapp,LV名:webapp01,大小:5G)
 [root@centos7 ~ 14:24:03]# lvcreate -n webapp01 -L 5G webapp
   Logical volume "webapp01" created.
   
 # 2. 创建跨 PV 逻辑卷(卷组:dbapp,LV名:data01,大小:25G,跨sdc、sdd)
 [root@centos7 ~ 14:37:47]# lvcreate -n data01 -L 25G dbapp
   Logical volume "data01" created.
   
 # 3. 查看所有 LV 列表(简洁版)  
 [root@centos7 ~ 14:38:01]# lvs
   LV       VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
   home     centos -wi-ao---- 146.99g                                                    
   root     centos -wi-ao----  50.00g                                                    
   swap     centos -wi-ao----   2.00g                                                    
   data01   dbapp  -wi-a-----  25.00g                                                    
   webapp01 webapp -wi-a-----   5.00g                   
   
 # 验证 PV 空间使用(sdc 已用完,sdd 用了5G)
 [root@centos7 ~ 14:38:05]# pvs
   PV         VG     Fmt  Attr PSize    PFree  
   /dev/sda2  centos lvm2 a--  <199.00g   4.00m
   /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 ~ 14:38:31]# 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 ~ 14:42:45]# mkdir -p /usr/share/nginx/html
 [root@centos7 ~ 14:43:08]# 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 ~ 14:40:08]# vim /etc/fstab
 ​
 ​
 [root@centos7 ~ 14:43:14]# df -h /usr/share/nginx/html/
 Filesystem                   Size  Used Avail Use% Mounted on
 /dev/mapper/webapp-webapp01  5.0G   33M  5.0G   1% /usr/share/nginx/htm

9 .LVM 清理

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

 # 1. 卸载已挂载的逻辑卷
 [root@centos7 ~ 14:55:55]# umount /dev/webapp/webapp01
 ​
 # 2. 删除逻辑卷(需确认,输入y)
 [root@centos7 ~ 14:56:17]# 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 ~ 14:56:49]# vgremove webapp dbapp 
   Volume group "webapp" successfully removed
   Volume group "dbapp" successfully removed
 ​
 # 4. 删除物理卷(清除 LVM 元数据)
 [root@centos7 ~ 14:57:05]# 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.

2.2卷组的扩展与缩减

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

1 .环境准备

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

 [root@centos7 ~ 15:08:43]# vgcreate webapp /dev/sdb
   Physical volume "/dev/sdb" successfully created.
   Volume group "webapp" successfully created
 [root@centos7 ~ 15:09:45]# lvcreate -n webapp01 -L 10G webapp
 WARNING: xfs signature detected on /dev/webapp/webapp01 at offset 0. Wipe it? [y/n]: y
   Wiping xfs signature on /dev/webapp/webapp01.
   Logical volume "webapp01" created.
 [root@centos7 ~ 15:10:10]# vgextend webapp /dev/sd{c,d}
   Physical volume "/dev/sdc" successfully created.
   Physical volume "/dev/sdd" successfully created.
   Volume group "webapp" successfully extended
 [root@centos7 ~ 15:10:28]# pvs
   PV         VG     Fmt  Attr PSize    PFree  
   /dev/sda2  centos lvm2 a--  <199.00g   4.00m
   /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
 [root@centos7 ~ 15:10:43]# vgreduce webapp /dev/sdb
   Physical volume "/dev/sdb" still in use
 [root@centos7 ~ 15:11:38]# pvmove /dev/sdb /dev/sdd
   /dev/sdb: Moved: 6.48%
   /dev/sdb: Moved: 100.00%
 ​
 ​
 ​
 ^[[A^[[A^[[A^H^H^H[root@centos7 ~ 15:12:30]# 
 [root@centos7 ~ 15:12:30]# 
 [root@centos7 ~ 15:12:30]# 
 [root@centos7 ~ 15:12:30]# pvs
   PV         VG     Fmt  Attr PSize    PFree  
   /dev/sda2  centos lvm2 a--  <199.00g   4.00m
   /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@centos7 ~ 15:12:36]# vgreduce webapp /dev/sdb
   Removed "/dev/sdb" from volume group "webapp"
 [root@centos7 ~ 15:12:41]# pvs
   PV         VG     Fmt  Attr PSize    PFree  
   /dev/sda2  centos lvm2 a--  <199.00g   4.00m
   /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
 ​

2.3逻辑卷的扩展与缩减

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

1 .扩展逻辑卷(LV)

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

 # 给 webapp01 增加 2G 空间(总容量变为 12G)
 [root@centos7 ~ 15:12:45]# 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.
 ​
 # 给 webapp01 的空间设置为15G
 [root@centos7 ~ 15:14:00]# lvextend -L 15G /dev/webapp/webapp01
   Size of logical volume webapp/webapp01 changed from 12.00 GiB (3072 extents) to 15.00 GiB (3840 extents).
   Logical volume webapp/webapp01 successfully resized.
 [root@centos7 ~ 15:14:18]# lvs /dev/webapp/webapp01 
   LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
   webapp01 webapp -wi-a----- 15.00g                                                   

2 .缩减逻辑卷(LV)

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

 # 给 webapp01 减少 2G 空间(总容量变回 10G)
 [root@centos7 ~ 15:14:32]# lvreduce -L -2G /dev/webapp/webapp01 
   WARNING: Reducing active logical volume to 13.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 15.00 GiB (3840 extents) to 13.00 GiB (3328 extents).
   Logical volume webapp/webapp01 successfully resized.
 ​
 # 验证 LV 大小
 [root@centos7 ~ 15:15:35]# lvs /dev/webapp/webapp01 
   LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
   webapp01 webapp -wi-a----- 13.00g     

2.4文件系统的扩展与缩减

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

2.4.1扩展 XFS 文件系统

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

1.环境准备
 # 1. 格式化 LV 为 XFS
 [root@centos7 ~ 15:20:28]# mkfs.xfs /dev/webapp/webapp01 
 meta-data=/dev/webapp/webapp01   isize=512    agcount=4, agsize=851968 blks
          =                       sectsz=512   attr=2, projid32bit=1
          =                       crc=1        finobt=0, sparse=0
 data     =                       bsize=4096   blocks=3407872, imaxpct=25
          =                       sunit=0      swidth=0 blks
 naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
 log      =internal log           bsize=4096   blocks=2560, version=2
          =                       sectsz=512   sunit=0 blks, lazy-count=1
 realtime =none                   extsz=4096   blocks=0, rtextents=0
 ​
 # 2. 创建挂载点并挂载
 [root@centos7 ~ 15:45:19]# mkdir /usr/share/nginx/html
 mkdir: cannot create directory ‘/usr/share/nginx/html’: File exists
 [root@centos7 ~ 15:46:06]# mount /dev/webapp/webapp01  /usr/share/nginx/html
 ​
 # 3. 写入测试数据
 [root@centos7 ~ 15:46:32]# cp /etc/host* /usr/share/nginx/html
 [root@centos7 ~ 15:46:56]# ls /usr/share/nginx/html
 host.conf  hostname  hosts  hosts.allow  hosts.deny
2.扩展操作
 # 第一步:扩展 LV 到 15G
 [root@centos7 ~ 15:47:09]# lvextend -L 15G /dev/webapp/webapp01 
   Size of logical volume webapp/webapp01 changed from 13.00 GiB (3328 extents) to 15.00 GiB (3840 extents).
   Logical volume webapp/webapp01 successfully resized.
 [root@centos7 ~ 15:47:44]# lvs /dev/webapp/webapp01 
   LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
   webapp01 webapp -wi-ao---- 15.00g                     
 ​
 # 第二步:扩展 XFS 文件系统(指定挂载点)
 [root@centos7 ~ 15:47:57]# xfs_growfs /usr/share/nginx/html
 meta-data=/dev/mapper/webapp-webapp01 isize=512    agcount=4, agsize=851968 blks
          =                       sectsz=512   attr=2, projid32bit=1
          =                       crc=1        finobt=0 spinodes=0
 data     =                       bsize=4096   blocks=3407872, imaxpct=25
          =                       sunit=0      swidth=0 blks
 naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
 log      =internal               bsize=4096   blocks=2560, version=2
          =                       sectsz=512   sunit=0 blks, lazy-count=1
 realtime =none                   extsz=4096   blocks=0, rtextents=0
 data blocks changed from 3407872 to 3932160
 ​
 # 验证文件系统大小(已扩展到15G,数据未丢失)
 [root@centos7 ~ 15:48:20]# df -h /usr/share/nginx/html
 Filesystem                   Size  Used Avail Use% Mounted on
 /dev/mapper/webapp-webapp01   15G   33M   15G   1% /usr/share/nginx/html
 [root@centos7 ~ 15:48:41]# ls /usr/share/nginx/html
 host.conf  hostname  hosts  hosts.allow  hosts.deny
 ​
 # 快捷方式:LV + 文件系统一键扩展(-r 参数自动调用 xfs_growfs)
 [root@centos7 ~ 15:49:30]# lvextend -rL 20G /dev/webapp/webapp01
   Size of logical volume webapp/webapp01 changed from 15.00 GiB (3840 extents) to 20.00 GiB (5120 extents).
   Logical volume webapp/webapp01 successfully resized.
 meta-data=/dev/mapper/webapp-webapp01 isize=512    agcount=5, agsize=851968 blks
          =                       sectsz=512   attr=2, projid32bit=1
          =                       crc=1        finobt=0 spinodes=0
 data     =                       bsize=4096   blocks=3932160, imaxpct=25
          =                       sunit=0      swidth=0 blks
 naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
 log      =internal               bsize=4096   blocks=2560, version=2
          =                       sectsz=512   sunit=0 blks, lazy-count=1
 realtime =none                   extsz=4096   blocks=0, rtextents=0
 data blocks changed from 3932160 to 5242880
 ​
 # 验证最终大小(20G)
 [root@centos7 ~ 15:49:46]# 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 ~ 15:49:56]# df -h /usr/share/nginx/html
 Filesystem                   Size  Used Avail Use% Mounted on
 /dev/mapper/webapp-webapp01   20G   33M   20G   1% /usr/share/nginx/html
 ​

2.4.2逻辑卷快照

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

 # 1. 创建快照(-s 表示快照,-n 快照名,-L 快照大小,指定原 LV)
 [root@centos7 ~ 16:01:19]# lvcreate -s -n webapp01-snap -L 10G /dev/webapp/webapp01
   Logical volume "webapp01-snap" created.
   
 # 2. 挂载快照(查看快照中的数据)
 # 快照的文件系统和原先逻辑卷的文件系统的uuid是一致的。 默认情况下,快照和原卷同一时刻只能挂载一个。
 # 一定要挂载,则需要修改uuid
 [root@centos7 ~ 16:12:28]# uuidgen
 d4642940-c3b1-4977-8e7c-8092bfa71669
 ​
 # 2-1. 修改xfs文件系统uuid命令使用xfs_admin
 [root@centos7 ~ 16:18:51]# xfs_admin -U d4642940-c3b1-4977-8e7c-8092bfa71669 /dev/webapp/webapp01-snap
 Clearing log and setting UUID
 writing all SBs
 new UUID = d4642940-c3b1-4977-8e7c-8092bfa71669
 ​
 # 2-2. 修改ext4文件系统uuid命令使用tune2fs
 [root@centos7 ~ 16:18:51]# tune2fs -U bcb510b4-6e18-4b47-849f-c0b4f79dcc33 /dev/webapp/webapp01-snap
 ​
 # 挂载测试
 [root@centos7 ~ 16:20:00]# mkdir -p /webapp/webapp01-snap
 [root@centos7 ~ 16:21:49]# mount /dev/webapp/webapp01-snap /webapp/webapp01-snap
 ​
 # 3. 验证快照数据(与原 LV 一致)
 [root@centos7 ~ 16:22:13]# ls /webapp/webapp01-snap
 host.conf  hostname  hosts  hosts.allow  hosts.deny
 ​
 # 4. 在快照 LV 中写入新数据(验证快照独立性)
 [root@centos7 ~ 16:22:20]# echo hello world > /webapp/webapp01-snap/hello.txt
 [root@centos7 ~ 16:22:53]# cat /webapp/webapp01-snap/hello.txt
 hello world
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐