实操Linux磁盘管理 【下】(SWAP、LVM、RAID)

序言

  在上一篇博客中阐述了分区、格式化、挂载这几个概念以及它们的具体操作,可以基本胜任从一块未分区的磁盘到分区后的创建文件系统,再到后面的磁盘挂载,这一系列的操作;虽然成功挂载了,但它是一次性的,一旦分区后进行挂载了,那么就代表你这个分区将很难进行容量的增加或者减少,别抬杠哟,其实也可以调整,就是太麻烦;

  下面我将带大家重点介绍交换分区(swap)、逻辑卷(LVM)、磁盘阵列(RAID) 等;其中LVM就可以很方便地解决磁盘的容量的升降。

一:交换分区(swap)

(一):基本介绍

  swap指的是一块专门用于内存置换(也称为虚拟内存)的空间,通常是硬盘上的一段空间。当系统中的物理内存不足以容纳所需要运行的进程时,Linux会把一些进程使用的内存数据保存到swap空间中,以借助物理内存供其它进程使用。当这些进程需要访问虚拟内存数据时,系统会从swap中读取数据,并将其写回到物理内存中。需要注意:由于硬盘的读写速度相对于内存而言较慢,使用swap空间可能会导致系统性能下降。

  其实针对现在的计算机来说,虚拟内存已经用不着了,因为现在的个人电脑动不动就16G左右,所以个人电脑就不建议设置了;若电脑的内存实在不足的话就升级一下内存,若不升级内存反而用虚拟内存,当用到swap时,你的主机磁盘灯就会开始闪个不停(这样时间久了会废磁盘的或SSD的哟);

  对于服务器来说的话,这个swap就会显得尤为重要;服务器的2G内存和4G内存及以上的配置费用都是要花比自己买内存条的费用高的高,其实价格是一方面;还有一方面就是由于后期的服务器会运行一些处理网络的请求程序,所以我们不知道哪个时候会有大量的用户请求,所以预留一些swap来缓冲一下系统的内存用量,这样至少不会说由于内存不足而导致程序的反应慢或系统的崩盘!

总结一句就是说:“个人电脑无需设置swap,服务器或工作站电脑需要预留swap”

参照Oracle官方文档设定的标准创建swap应这样配置:

  • 4G以内的物理内存:SWAP设置为内存的2倍。
  • 4G~8G的物理内存:SWAP等于内存大小。
  • 8G~64G的物理内存:SWAP设置为8G。
  • 64G-256G的物理内存:SWAP设置为16G。

下面需要用到的命令基本说明: \color{#f69}{下面需要用到的命令基本说明:} 下面需要用到的命令基本说明:

内存查询命令:free

free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
语法:
    free [-bkmotV][-s 间隔秒数]
参数说明:
    -b、-k、-m、-g:显示的方式(以Byte、KB、MB、GB方式来显示内存使用情况)
    -t:显示内存的总和列(就是把列表里面的物理内存和交换内存数据汇总放在最后一列)
    -s 间隔秒数:按照给出的秒数间隔持续观察内存使用状况。(循环输出)
    -h:以合适的单位显示内存使用情况,最大为三位数,自动计算对应的单位值。单位有:
        B = bytes、K = kilos、M = megas、G = gigas、T = teras
举例:
    》》 free -th
               total    used     free    shared  buff/cache   available
        内存:  3.3Gi    206Mi    2.7Gi    2.0Mi    455Mi       2.9Gi
        交换:     0B       0B       0B
        总量:  3.3Gi    206Mi    2.7Gi
列表说明:
    total:      显示系统总的可用物理内存和交换空间大小。
    used:       显示已经被使用的物理内存和交换空间。
    free:       显示还有多少物理内存和交换空间可用使用。
    shared:     显示被共享使用的物理内存大小。
    buff/cache: 列显示被buffer和cache使用的物理内存大小。
    available:  显示还可以被应用程序使用的物理内存大小。

(二):使用实体分区创建swap

建立swap分区主要有如下几个步骤:

  1. 分区:使用fdisk(MBR)gdisk(GPT)命令在磁盘中分出一个分区给系统作为swap。
  2. 格式化:使用建立swap格式的命令mkswap 设备文件名就能够格式化该分区槽成为swap格式。
  3. 使用:将该swap设备启动,使用命令swapon 设备文件名
  4. 观察:通过freeswapon-s这个指令来观察一下内存的用量。

使用实体分区创建swap:

配置说明:
    我的物理磁盘总量为4G空间,按照正常规范需要创建和内存同等大小的交换空间(swap空间);
    我的服务器上有个10G的/dev/vdb磁盘设备空间,我下面都会围绕这个设备展开。
'1:创建一个4G大小的swap分区(我使用的是fdisk命令分区)'
    >> fdisk /dev/vdb
        命令(输入 m 获取帮助): n    #### 创建分区
        分区类型
           p   主分区 (0 primary, 0 extended, 4 free)
           e   扩展分区 (逻辑分区容器)
        选择 (默认 p): p
        分区号 (1-4, 默认  1): 1
        第一个扇区 (2048-20971519, 默认 2048): 2048
        Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, 默认 20971519): +4G
        创建了一个新分区 1,类型为“Linux”,大小为 4 GiB。
        命令(输入 m 获取帮助): t        #### 修改分区类型
        已选择分区 1
        Hex code or alias (type L to list all): 82      #### 82代表swap分区
        已将分区“Empty”的类型更改为“Linux swap / Solaris”。
        命令(输入 m 获取帮助): p    #### 查看创建的分区
        ......(省略部分)......
        设备       启动  起点    末尾    扇区 大小 Id 类型
        /dev/vdb1        2048 8390655 8388608   4G 82 Linux swap / Solaris
        命令(输入 m 获取帮助): w    #### 保存退出
    >> partprobe -s      ### 更新Linux内核分区表信息(磁盘使用中担心系统出问题,所以分区表还没及时被更新)
        /dev/vdb: msdos partitions 1        ### 代表这个分区已经有一个分区在分区表中了
        /dev/sr0: msdos partitions
        /dev/vda: gpt partitions 1 2
    >> lsblk /dev/vdb    ### 查看分区
        NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
        vdb    252:16   0  10G  0 disk
        └─vdb1 252:17   0   4G  0 part
'2:创建swap格式'
    说明:因为swap狭义上是一种Linux文件系统的类型!(就像xfs、ext2、ext3、ext4等)
    既然狭义上是文件系统的类型,那么就需要格式化(一般格式化就是创建文件系统的过程)
    >> blkid /dev/vdb1      ### 查看分区详细信息
        /dev/vdb1: PARTUUID="709ab220-01"
    >> mkswap /dev/vdb1     ### 格式化Swap分区
        正在设置交换空间版本 1,大小 = 4 GiB (4294963200  个字节)
        无标签, UUID=cdc319db-decb-4878-aaf8-579b5356a96b
    >> blkid /dev/vdb1      ### 查看分区详细信息,这里已经是swap类型文件系统了
        /dev/vdb1: UUID="cdc31..省略..a96b" TYPE="swap" PARTUUID="709ab220-01"
'3:观察内存和启用交换分区'
    >> free -th     ### 查看内存使用情况,可以看出交换空间并没有设置
              total   used    free   shared  buff/cache   available
       内存:  3.3Gi   229Mi   2.6Gi   2.0Mi    515Mi       2.9Gi
       交换:     0B      0B      0B
       总量:  3.3Gi   229Mi   2.6Gi
    >> swapon /dev/vdb1     ### 加载并启动swap空间(这里选择swap的分区/dev/vdb1)
    >> free -th
              total   used    free    shared  buff/cache   available
       内存:  3.3Gi   235Mi   2.6Gi   2.0Mi     516Mi       2.9Gi
       交换:  4.0Gi      0B   4.0Gi
       总量:  7.3Gi   235Mi   6.6Gi
    >> swapon -s     ### 列出目前使用的swap设备有哪些
        Filename    Type        Size        Used    Priority
        /dev/vdb1   partition   4194300     0       -2
'4:写入/etc/fstab配置文件,防止重启后设置的交换空间没了'
    因为swap不是确切的文件系统,所以也就没有挂载点,挂载点一列写 swap 即可;
    >> vim /etc/fstab   ### UUID通过blkid进行查询得出
        UUID="cdc319db-decb-4878-aaf8-579b5356a96b"  swap  swap  default  0  0
'5:关闭交换空间的使用'
    >> swapoff /dev/vdb1

(三):使用文件创建swap

  如果当前系统的磁盘早已经分区完成了,并且未预留swap空间,这时就无法再创建一个swap类型的分区了;此时我们可以使用loop设备的方式(比如ISO也是使用loop哟);它与实体分区槽不一样,这个方法只是利用dd去创建一个足够大的空文件而已。提前打住,可不能使用touch命令来创建文件哟,因为touch命令创建出来的文件是没有大小的;下面我就创建一个4G大小空间的空文件。
关于dd命令请点击这里
使用文件创建swap:

'1:使用dd命令来新增一个4G的文件在/tmp目录下'
    >> dd if=/dev/zero of=/tmp/swap bs=1M count=4096
        记录了4096+0 的读入
        记录了4096+0 的写出
        4294967296字节(4.3 GB,4.0 GiB)已复制,26.4327 s,162 MB/s
    >>  ls -lh /tmp/swap    ### 查看创建的文件(正好4G)
            -rw-r--r-- 1 root root 4.0G  124 23:34 /tmp/swap
    >>  od /tmp/swap    ### 查看文件存了啥(部分,其实都是00000...)
            0000000 000000 000000 000000 000000 000000 000000 000000 000000...
'2:使用mkswap将/tmp/swap这个文件格式化为swap文件格式'
    >> mkswap /tmp/swap     ### 注意看准路径,写错了可能系统都得挂掉
        mkswap /tmp/swap
        mkswap: /tmp/swap: insecure permissions 0644, fix with: chmod 0600 /tmp/swap
        正在设置交换空间版本 1,大小 = 4 GiB (4294963200  个字节)
        无标签, UUID=5c3587aa-07b8-4648-af84-ea064b988fa9
'3:使用swapon将/tmp/swap加载和启动'
    >> swapon /tmp/swap
        swapon: /tmp/swap:不安全的权限 0644,建议使用 0600。(有的Linux发行版可能会不显示)
            -- 若出现建议0600则修改这个文件权限即可:chmod 0600 /tmp/swap
    >> free -th
              total   used    free   shared  buff/cache   available
       内存:  3.3Gi   231Mi   113Mi   2.0Mi     3.0Gi      2.8Gi
       交换:  4.0Gi      0B   4.0Gi
       总量:  7.3Gi   231Mi   4.1Gi
'4:设置自动启用文件的swap'
    >> vim /etc/fstab       ### 这里使用的是文件,没有分区,所以也没有UUID哟
        /tmp/swap  swap  swap  default  0  0
'5:使用swapoff关掉swap的file文件'
    >> swapoff /tmp/swap    ### 关闭,若多个则空格分割

二:逻辑卷管理(LVM)

(一):基本说明

  有个我们会遇到的现象,就是说当初划分磁盘分区时给/home目录下挂载50G的文件系统空间,但是随着时间的推移,里面的用户数据在不断累加,导致50G的文件系统空间已经不够使用了;按照之前的解决办法就是再添加一个全新的磁盘并进行分区和格式化文件系统,然后将/home的数据完整的复制到新的磁盘分区内,复制完以后再将那个原先的/home目录下的磁盘文件系统卸载并重新挂载最新的磁盘文件系统;这一来二去发现好麻烦,假设后面新挂载的磁盘容量又不够了,那么上面的操作又得重新来一遍。所以使用LVM逻辑卷管理就可以很好地解决上面的空间不足问题。

  LVM(逻辑卷管理器,Logical Volume Manager)是一种高级磁盘分区技术,它可以将多个硬盘分区或物理卷合并成一个逻辑卷组(Volume Group),并在其中创建若干个逻辑卷(Logical Volume)。逻辑卷可以动态调整大小,而无需重新分区或重建文件系统,从而提供了更灵活的存储管理方式。

L V M 主要用途: \color{#0000CD}{LVM主要用途:} LVM主要用途:

  1. 存储池管理:LVM可以将多个物理卷合并成一个逻辑卷组,形成一个统一的存储池。这样,管理员可以更灵活地分配和管理存储资源,无需关心底层硬件的细节。
  2. 动态调整存储空间: LVM允许对逻辑卷进行动态调整,包括扩容和缩减。管理员可以根据需要增加或减少逻辑卷的大小,而无需重新分区或格式化。这使得系统的存储容量管理更加灵活和高效。
  3. 数据保护和备份: LVM提供了快照功能,可以创建逻辑卷的快照副本,用于数据备份、恢复和测试等场景。快照一个逻辑卷的只读镜像,能够保留某个时间点的数据状态,且不会影响原始逻辑卷的写操作。
  4. 管理多个文件系统: 通过LVM管理员可以在单个逻辑卷组中创建多个逻辑卷,并将它们格式化为不同的文件系统,如ext4、XFS等。这样可以在同一个存储池中管理不同类型和大小的文件系统,提供更高级别的存储管理和数据组织。

L V M 主要组成部分: \color{#0000CD}{LVM主要组成部分:} LVM主要组成部分:

'物理卷(Physical Volume,PV):'
    那些系统标识符为8e(LVM的标识符)的磁盘或者磁盘内的分区通过LVM划分为一个个物理卷;
    物理卷是LVM的基本存储单元,我们可以通过fdisk或者gdisk进行分区和调整分区的系统标识符。
'物理卷组(Volume Group,VG):'
    所谓的LVM大逻辑磁盘就是将许多的PV物理卷整合成一个VG物理卷组,所以VG就是由一个个小的PV组合而成;
    但是这个VG物理卷组最大可组成多大的容量呢?这与下面说的PE和LVM格式版本挂钩,在默认的情况下,使用32
    位的Linux系统时,基本上VG内可存放最多256GB的LV;
'物理扩展(Physical Extent,PE):'
    LVM预设使用4MB的PE区块,而LVM的LV在32位系统上最多仅能含有65534个PE(lvm1的格式),因此预设的LVM
    的LV会有4M×65534/(1024M/G)≈256G。这个PE就是LVM里最小的储存区块,也就是说我们的文件资料都是基于
    写入PE来处理的。简单说这个PE就有点像文件系统里面的block大小啦。所以调整PE会影响到LVM的最大容量喔!
    不过现在基本上都是直接使用lvm2的各项格式功能,以及系统转为64位,因此这个限制已经不存在了。
'逻辑卷(Logical Volume,LV):'
    最终的VG物理卷组会被切成若干个LV物理卷,LV最后可以被格式化为文件系统并挂载到指定目录下;还要注意的是
    'LV逻辑卷是无法随意增加或者减少容量大小的!'既然PE才是整改LVM最小的存储单位,那LV的大小改变是与PE总
    数有关。为了方便用户利用LVM来管理系统,因此LV的设备文件名通常指定为/dev/vgname/lvname的样式!
    上面说到LVM是可弹性的变更文件系统的容量,其实是通过交换PE来进行数据转换,将原本LV内的PE移转到其它设
    备中以降低LV容量,若想增加指定LV容量的话,那就可以从其它地方转移一些未被使用的PE到当前的LV下即可。

L V M 逻辑关系图解: \color{#0000CD}{LVM逻辑关系图解:} LVM逻辑关系图解:

image.png

  创建LVM逻辑卷以及挂载使用顺序:插入磁盘(Disk) -> 创建分区(Partitions) -> 创建物理卷(PV) -> 创建物理卷组(VG) -> 创建逻辑卷(LV) -> 创建文件系统(fs) -> 挂载(mount)

(二):LVM常见命令讲解

"关于物理卷的一些命令(PV):"
    pvcreate:将文件系统类型为8e的磁盘或者磁盘分区创建成为物理卷;
        示例:
            pvcreate /dev/vdb1      ## 把/dev/vdb1创建成物理卷
            pvcreate /dev/vdb{1,2}  ## 把/dev/vdb1和/dev/vdb2创建同时创建成物理卷
            pvcreate /dev/vdb{1,2} /dev/vdc1  ## 把vdb1、vdb2、vdc1同时创建成物理卷
    pvdisplay:显示指定物理卷的详细信息,列出物理卷的名称、容量、分配情况、元数据等;
        示例:
            pvdisplay /dev/sdb1       ## 查看sdb1的详细信息
            pvdisplay /dev/sdb{1,2}   ## 查看sdb1和sdb2的详细信息
    pvscan、pvs:扫描系统中的所有物理卷,并显示它们各个物理卷的信息(如名称、容量、状态等)
    pvremove:移除指定物理卷,将物理卷从LVM中移除;(注意:执行该命令会导致物理卷上的数据被删除)
    pvmove:将一个物理卷迁移到另一个物理卷上,而无需中断正在使用该逻辑卷的服务或应用程序;
        示例:
            # 将物理卷/dev/sdb1移动到其它物理卷上(自动找到当前卷组里可以迁移的一个或多个物理卷)
            # 若迁移的物理卷太大,那么系统就会将当前卷组的几个物理卷组合起来分担/dev/sdb1物理卷
                pvmove /dev/sdb1
            # 将物理卷/dev/sdb1迁移到物理卷/dev/sdc1
                pvmove /dev/sdb1 /dev/sdc1
                
====================================================================================

"关于物理卷组的一些命令(VG):"
    vgcreate:创建一个新的卷组,它需要指定卷组的名称和物理卷(就是PV创建出的物理卷);
        语法:vgcreate  [-s size[mgt]]  VG名称  PV名称
        参数:
            -s: 后面接PE的大小(size),单位可以是m、g、t(大小写均可)
        示例:
            vgcreate -s 8M lvmDiskDemo /dev/sdb{1,2}
                # 创建一个卷组,并且指定它的PE大小为8M,卷组内包含的物理卷有sdb1和sdb2
    vgdisplay:显示指定卷组的详细信息(卷组名称、物理卷列表、逻辑卷列表、卷组大小、空闲空间等)
        语法:vgdisplay [卷组名称]
    vgscan、vgs:扫描系统中的所有卷组;
    vgremove:删除指定的卷组;
    vgextend:往卷组中添加新的物理卷,此命令可以扩展卷组的容量,增加可用空间;
        语法:vgextend 卷组名称 物理卷名称
        示例:vgextend lvmDiskDemo /dev/sdb2
    vgreduce:从卷组中删除指定的物理卷,此命令可以缩减卷组的容量;(注:删除后物理卷上的数据将会丢失)
        语法:vgreduce 卷组名称 物理卷名称
        示例:vgreduce /dev/sdb2
    vgchange:修改卷组的属性,此命令可以开启或关闭卷组的可扩展性、只读模式等属性;

====================================================================================

"关于逻辑卷的一些命令(LV):"
    lvcreate:创建一个新的逻辑卷,它需要指定逻辑卷的名称、所属卷组、大小等信息;
        语法:
            lvcreate [-L size[mgt]] [-n 自定义LV逻辑卷名称] VG名称
            lvcreate [-l size] [-n 自定义LV逻辑卷名称] VG名称
        参数(具体可以执行man lvcreate查阅详情):
            -L:后面接容量,容量的单位可以是M,G,T等,要注意的是,最小单位为PE,
                所以这个数量必须要是PE的倍数,若不相符,系统会自行计算最相近的容量。
            -l:后面可以接PE的个数,PE的个数需要自己计算
                假设一个PE大小4M,那么想分出4G的空间则需要1024个PE数量
            -n:自定义的逻辑卷名称
        示例:
            lvcreate -L 5G -n lvMysqlLog lvmDiskDemo
    lvscan、lvs:扫描系统中的所有逻辑卷;
    lvdisplay:显示指定逻辑卷的详细信息(逻辑卷名称、所属卷组、大小、路径、状态等)
    lvremove:删除指定的逻辑卷(此命令会将逻辑卷上的数据完全删除,请谨慎使用)
    lvextend:扩展指定的逻辑卷,此命令可以增加逻辑卷的大小,但需要确保卷组有足够的可用空间;
        示例(不推荐使用):
             lvextend -L +5G /dev/mapper/vlmDiskName-MySqlLog
                # 直接在原先的逻辑卷容量上增加5G空间
             lvextend -L 18G /dev/mapper/vlmDiskName-MySqlLog
                # 直接把逻辑卷的容量变为18G
    lvreduce:缩减指定的逻辑卷,该命令可以减小逻辑卷的大小,但需要注意是缩减的空间将会丢失;
        示例(不推荐使用):
            lvreduce -L -5G /dev/mapper/vlmDiskName-MySqlLog
                # 直接在原先的逻辑卷容量上减少5G空间
            lvreduce -L 18G /dev/mapper/vlmDiskName-MySqlLog
                # 直接把逻辑卷的容量变为18G
    lvresize:用于调整逻辑卷的大小,它可以增加或减少逻辑卷的空间(类似lvextend和lvreduce复合命令)
        语法:
            lvresize [选项] <逻辑卷路径>
        参数:
            -l:[+|-]逻辑区块数(PE数量),指定要增加或减少的逻辑区块数
            -L:[+|-]指定要增加或减少的容量大小。单位可以是M,G,T等;它和lvcreate的-L一样;
        示例:
            lvresize -L +500M /dev/lvmDiskDemo/lvMySQLLog (增加500M的空间容量)
            lvresize -L 20G /dev/lvmDiskDemo/lvMySQLLog (直接变为20G空间容量)

====================================================================================
强调说明:
    1:pvremove、vgremove、lvremove不可随便使用,一旦删除,数据也就没了
'大概分类(命令不全,具体看上面):'
    功能              物理卷管理        卷组管理        逻辑卷管理
    Scan    扫描      pvscan          vgscan         lvscan
    Create  建立      pvcreate        vgcreate       lvcreate
    Display 显示      pvdisplay       vgdisplay      lvdisplay
    Remove  删除      pvremove        vgremove       lvremove
    Extend  扩展                      vgextend       lvextend

(三):实战LVM基本操作流程

下面将和大家一起从一个全新的磁盘一步一步创建出一个LVM逻辑磁盘
在正式操作前请下载lvm2命令:

  Ubuntu下载: apt install lvm2

  Centos下载: yum install lvm2

1:disk磁盘阶段

  首先就是创建实体分区了,分区的类型必须为8e(fdisk下是8e、gdisk下是8e00);话说回来没有设定成为8e也没关系,不过某些LVM的侦测指令可能会侦测不到该分区;具体分区命令请参考上篇。下面将实战创建LVM分区:
disk磁盘阶段操作:

"Ⅰ:查看当前的Linux系统中有哪些磁盘"
    >> lsblk
        ...(省略)...
        sdb  8:16  0  50G  0 disk
        sdc  8:32  0  30G  0 disk
        ...(省略)...
        ## 可以发现我当前linux中有sdb(50G)和sdc(30G);下面就拿这两个盘进行开刀;
"Ⅱ:对sdb磁盘分出来一个20G和一个5G的LVM类型的分区,对sdc磁盘分出来一个10G的LVM类型的分区"
    ## 具体的分区请参考上篇
    >> fdisk /dev/sdb   # 对sdb磁盘设备分区
    >> fdisk /dev/sdc   # 对sdc磁盘设备分区
    >> fdisk -l /dev/sdb
        ...(省略)...
            设备    启动  起点        末尾     扇区    大小 Id    类型
        /dev/sdb1       2048     41945087 41943040   20G  8e  Linux LVM
        /dev/sdb2       41945088 52430847 10485760   5G   8e  Linux LVM
    >> disk -l /dev/sdc
        ...(省略)...
            设备    启动  起点   末尾     扇区       大小 Id    类型
        /dev/sdc1       2048 20973567 20971520  10G 8e Linux LVM
        ## 从上面的分区可以得出sdb还剩25G,sdc还剩20G,这剩余空间我后面可以进行扩容哟!暂时不用;

2:PV物理卷阶段

  开头介绍了PV的一些命令的使用,它就是把类型为LVM的分区创建成物理卷(PV),下面将实战创建PV:
PV物理卷阶段操作:

"Ⅰ:检查当前系统是否存在物理卷:"
    >> pvscan
            No matching physical volumes found(解释:找不到匹配的物理卷)
"Ⅱ:把我们之前创建的分区类型为8e的/dev/sdb1、/dev/sdb2、/dev/sdc1三个分区创建成物理卷:"
    >> pvcreate /dev/sdb{1,2} /dev/sdc1
            Physical volume "/dev/sdb1" successfully created.
            Physical volume "/dev/sdb2" successfully created.
            Physical volume "/dev/sdc1" successfully created.
"Ⅲ:查看当前系统创建的物理卷:"
    >> pvscan
            PV /dev/sdb1                      lvm2 [20.00 GiB]
            PV /dev/sdb2                      lvm2 [5.00 GiB]
            PV /dev/sdc1                      lvm2 [10.00 GiB]
            Total: 3 [35.00 GiB] / in use: 0 [0   ] / in no VG: 3 [35.00 GiB]
            # 显示每个PV的信息与系统所有汇总PV的信息;
            # 最后一行显示的意思是:整体PV的容量/已经被使用到VG的PV容量量/剩余的PV容量
"Ⅳ:详细查看指定的PV信息:"
    >>  pvdisplay /dev/sdb1
            "/dev/sdb1" is a new physical volume of "20.00 GiB"
            --- NEW Physical volume ---
            PV Name               /dev/sdb1    《= 实际的分区名称
            VG Name                            《= 显示归属与哪个VG,因为尚未分配出去,所以空白!
            PV Size               20.00 GiB    《= 就是总容量说明
            Allocatable           NO           《= 是否已被分配,结果是NO,若yes则被分配使用
            PE Size               0= 在此PV内的PE大小
            Total PE              0= 共分区出几个PE
            Free PE               0= 没被LV用掉的PE
            Allocated PE          0= 尚可分配出去的PE数量
            PV UUID               ZOaQf4-Xz9l-v53c-xeok-DbLV-wAzh-a8E6BK
            # 由于PE是在建立VG时才给予的参数,因此在这里看到的PV里头的PE都会是0
            # 而且也没有多余的PE可供分配(Allocatable)

3:VG物理卷组阶段

  上面已经给出了VG的命令解释;其实与PV不同的是,VG的名称是自定义的!我们知道PV的名称其实就是分区设备的文件名,但是这个VG名称则可以随便取,下面的例子中我将使用lvmDiskDemo来当卷组名称,下面就是实战演示:
VG物理卷组阶段操作:

"Ⅰ:把之前创建的物理卷全部汇集组成一个名为lvmDiskDemo的卷组,卷组的PE大小为16M:"
    >> vgcreate -s 16M lvmDiskDemo /dev/sdb{1,2} /dev/sdc1
            Volume group "lvmDiskDemo" successfully created
"Ⅱ:查看系统中的所有卷组"
    >> vgscan
            Found volume group "lvmDiskDemo" using metadata type lvm2
"Ⅲ:查看指定的一个卷组信息"
    >> vgdisplay lvmDiskDemo
          --- Volume group ---
          VG Name               lvmDiskDemo         《= 卷组名称
          System ID
          Format                lvm2                《= 卷组的格式,lvm2是逻辑管理器第二版
          Metadata Areas        3= 元数据区数量
          Metadata Sequence No  1= 元数据序列号
          VG Access             read/write          《= 当前VG的读写权限
          VG Status             resizable           《= 卷组的状态,"resizable"表示可以调整大小
          MAX LV                0= 最大逻辑卷数量,0表示没有限制
          Cur LV                0= 当前逻辑卷数量,0表示还没有逻辑卷
          Open LV               0= 当前打开的逻辑卷数量
          Max PV                0= 最大物理卷数量,0表示没有限制
          Cur PV                3= 当前卷组由几个物理卷组成
          Act PV                3= 活动的物理卷数量
          VG Size               34.95 GiB           《= 当前卷组的总容量大小
          PE Size               16.00 MiB           《= 每个PE的大小(我们设置的16M,默认4M)
          Total PE              2237= 当前卷组里的PE数量(计算:VGsize/PEsize)
          Alloc PE / Size       0 / 0= 已分配的物理区域数量和大小
          Free  PE / Size       2237 / 34.95 GiB    《= 尚可配置给LV的PE数量/总容量有这么多
          VG UUID               e3l9kt-evG7-3NyW-uP3q-RwJh-Ojex-LduKXg
"Ⅳ:再次查看系统中的物理卷信息"
    >> pvscan
            PV /dev/sdb1   VG lvmDiskDemo     lvm2 [19.98 GiB / 19.98 GiB free]
            PV /dev/sdb2   VG lvmDiskDemo     lvm2 [4.98 GiB / 4.98 GiB free]
            PV /dev/sdc1   VG lvmDiskDemo     lvm2 [9.98 GiB / 9.98 GiB free]
            Total: 3 [34.95 GiB] / in use: 3 [34.95 GiB] / in no VG: 0 [0   ]
            # 可以发现上面的3个物理卷都寄托在了lvmDiskDemo卷组下,其中free代表可用空间
"Ⅴ:再次查看系统中指定的一个物理卷信息"
    >> pvdisplay /dev/sdb1
            --- Physical volume ---
            PV Name               /dev/sdb1
            VG Name               lvmDiskDemo       《= 当前这个物理卷寄托在了lvmDiskDemo卷组里
            PV Size               20.00 GiB / not usable 16.00 MiB  《= 可以空间/已被使用的空间
            Allocatable           yes
            PE Size               16.00 MiB         《= 当前这个卷组的PE大小
            Total PE              1279= 共分区出几个PE
            Free PE               1279= 没被LV用掉的PE
            Allocated PE          0= 尚可分配出去的PE数量
            PV UUID               ZOaQf4-Xz9l-v53c-xeok-DbLV-wAzh-a8E6BK
"Ⅵ:测试删除当前lvmDiskDemo卷组中/dev/sdb2的物理卷"
    >> vgreduce /dev/sdb2
            Removed "/dev/sdb2" from volume group "lvmDiskDemo"
    >> vgdisplay lvmDiskDemo
            --- Volume group ---
            VG Name               lvmDiskDemo
            ...(部分省略)...
            Cur PV                2
            Act PV                2
            VG Size               〈29.97 GiB
            PE Size               16.00 MiB
            Total PE              1918
            Alloc PE / Size       0 / 0
            Free  PE / Size       1918 / 〈29.97 GiB
            VG UUID               e3l9kt-evG7-3NyW-uP3q-RwJh-Ojex-LduKXg
    >> pvscan
            PV /dev/sdb1   VG lvmDiskDemo     lvm2 [19.98 GiB / 19.98 GiB free]
            PV /dev/sdc1   VG lvmDiskDemo     lvm2 [9.98 GiB / 9.98 GiB free]
            PV /dev/sdb2                      lvm2 [5.00 GiB]   ## 这个未被卷组使用
            Total: 3 [〈34.97 GiB] / in use: 2 [〈29.97 GiB] / in no VG: 1 [5.00 GiB]
"Ⅶ:把之前的/dev/sdb2添加到lvmDiskDemo卷组中"
    >> vgextend lvmDiskDemo /dev/sdb2
            Volume group "lvmDiskDemo" successfully extended
    >> pvscan
            PV /dev/sdb1   VG lvmDiskDemo     lvm2 [19.98 GiB / 19.98 GiB free]
            PV /dev/sdc1   VG lvmDiskDemo     lvm2 [9.98 GiB / 9.98 GiB free]
            PV /dev/sdb2   VG lvmDiskDemo     lvm2 [4.98 GiB / 4.98 GiB free]
            Total: 3 [34.95 GiB] / in use: 3 [34.95 GiB] / in no VG: 0 [0   ]

4:LV逻辑卷阶段

  开头介绍了LV的一些命令的基本使用;其实我们上面已经创建出了lvmDiskDemo的卷组VG信息,卷组是无法直接使用的,只有使用了关于LV的一些命令把卷组分区成一个个逻辑卷才可使用;下面将这个卷组分成lvMySQLLog和lvRedisLog两个逻辑卷,每个逻辑卷占用15G和12G的空间容量,下面实践操作:
LV逻辑卷阶段操作:

"Ⅰ:从lvmDiskDemo卷组里分出来两个逻辑卷(lvMySQLLog、lvRedisLog),分别指定15G和12G的空间容量"
    >> lvcreate -L 15G -n lvMySQLLog lvmDiskDemo
            Logical volume "lvMySQLLog" created.
    >> lvcreate -L 12G -n lvRedisLog lvmDiskDemo
            Logical volume "lvRedisLog" created.
"Ⅱ:扫描系统中的所有逻辑卷"
    >> lvscan
            ACTIVE      '/dev/lvmDiskDemo/lvMySQLLog' [15.00 GiB] inherit
            ACTIVE      '/dev/lvmDiskDemo/lvRedisLog' [12.00 GiB] inherit
            ## 可以发现我们成功创建了两个逻辑卷信息
"Ⅲ:查看设备表目录/dev信息是否存在(必定存在哟!)"
    >> tree /dev/lvmDiskDemo
            /dev/lvmDiskDemo
            ├── lvMySQLLog -> ../dm-0
            └── lvRedisLog -> ../dm-1
            ## 创建的逻辑卷都会存在与卷组目录下
"Ⅲ:查询指定的逻辑卷信息"
    >> lvdisplay /dev/lvmDiskDemo/lvRedisLog
              --- Logical volume ---
              LV Path                /dev/lvmDiskDemo/lvMySQLLog   《= 逻辑卷的路径,即设备文件名
              LV Name                lvMySQLLog                    《= 逻辑卷的名称
              VG Name                lvmDiskDemo                   《= 逻辑卷所属的卷组
              LV UUID                sNUMAZ-ruyr-nni9-63uw-1oMV-ESvH-VjH82L
              LV Write Access        read/write                    《= 逻辑卷读写权限信息
              LV Creation host, time tom-None, 2024-01-29 15:48:02 +0800
              LV Status              available      《= 逻辑卷的状态,available表示可用
              # open                 0
              LV Size                15.00 GiB      《= 逻辑卷的大小
              Current LE             960= 逻辑卷当前使用的物理区块(PE)数
              Segments               1= 逻辑卷的段数;(这个逻辑卷跨越了卷组内的几个物理卷)
              Allocation             inherit        《= 逻辑卷的分配策略,inherit表示继承自卷组
              Read ahead sectors     auto           《= 预读扇区数,auto表示自动设置
              - currently set to     256= 当前设置的预读扇区数
              Block device           252:0          《= 逻辑卷的块设备号
'注:LV的后续操作名称必须使用全名,如/dev/lvmDiskDemo/lvRedisLog'

5:文件系统阶段

  上面我们创建了物理卷、卷组、逻辑卷,通过上面的步骤我们已经得到了逻辑卷分区;这个逻辑卷分区就和我们之前对磁盘直接分出来的分区类似,我们可以直接通过创建文件系统的方式来直接操作,下面我就将lvMysqlLog和lvRedisLog这两个创建文件系统并挂载使用,关于创建文件系统和挂载的操作请参考上篇,下面就直接实战操作:
文件系统阶段操作:

"Ⅰ:查看当前系统设备的磁盘分区情况"
    >> lsblk
            ....(部分省略)....
            sdb                          8:16   0    50G  0 disk
            ├─sdb1                       8:17   0    20G  0 part
            │ ├─lvmDiskDemo-lvMySQLLog 252:0    0    15G  0 lvm
            │ └─lvmDiskDemo-lvRedisLog 252:1    0    12G  0 lvm
            └─sdb2                       8:18   0     5G  0 part
            sdc                          8:32   0    30G  0 disk
            └─sdc1                       8:33   0    10G  0 part
              └─lvmDiskDemo-lvRedisLog 252:1    0    12G  0 lvm
            # 可以看出lvMySQLLog用的是sdb1的物理卷容量15G;而lvRedisLog用的是sdc1和sdb1物理卷,
            # sdc1用完了10G和sdb1用2G,加起来正好12G
"2:对两个逻辑卷设备进行格式化,分别格式化为ext3和ext4文件系统"
    >> mkfs.ext3 /dev/lvmDiskDemo/lvMySQLLog
            mke2fs 1.47.0 (5-Feb-2023)
            创建含有 3932160 个块(每块 4k)和 983040 个 inode 的文件系统
            文件系统 UUID:ac67b406-2e18-48e9-9cca-af7fdd6436ba
            超级块的备份存储于下列块:
                    32768, 98304, ...(省略).... 884736, 1605632, 2654208
            正在分配组表: 完成
            正在写入 inode表: 完成
            创建日志(16384 个块): 完成
            写入超级块和文件系统账户统计信息: 已完成
    >> mkfs.ext4 /dev/lvmDiskDemo/lvRedisLog
            mke2fs 1.47.0 (5-Feb-2023)
            创建含有 3145728 个块(每块 4k)和 786432 个 inode 的文件系统
            文件系统 UUID:9e8133b7-dcf4-4309-acae-401bba75c77f
            超级块的备份存储于下列块:
                    32768, 98304, ...(省略).... 884736, 1605632, 2654208
            正在分配组表: 完成
            正在写入 inode表: 完成
            创建日志(16384 个块): 完成
            写入超级块和文件系统账户统计信息: 已完成
"Ⅲ:查看创建的文件系统状况"
    >> blkid | grep '/dev/mapper*'
            /dev/mapper/lvmDiskDemo-lvRedisLog: UUID=".." BLOCK_SIZE="4096" TYPE="ext4"
            /dev/mapper/lvmDiskDemo-lvMySQLLog: UUID=".." BLOCK_SIZE="4096" TYPE="ext3"
"Ⅳ:将上面两个逻辑文件系统进行挂载(挂载的目录文件夹一定要存在)"
    >> mount -t ext3 /dev/lvmDiskDemo/lvMySQLLog /mnt/mysqlLog/
    >> mount -t ext4 /dev/lvmDiskDemo/lvRedisLog /mnt/redisLog/
    >> df -h
            文件系统                            大小  已用  可用 已用% 挂载点
            ...(省略)...
            /dev/mapper/lvmDiskDemo-lvMySQLLog   15G   92K   14G    1% /mnt/mysqlLog
            /dev/mapper/lvmDiskDemo-lvRedisLog   12G   24K   12G    1% /mnt/redisLog</code></pre></details>

## (四):卷组中移除指定的物理卷
&emsp;&emsp;移除卷组中的物理卷其它很简单,若我们移除的物理卷是未被逻辑卷使用的(比如上文的/dev/sdb2未被使用),那么可以直接进行移除,但是若当前的物理卷已经被逻辑卷引用了,那么我们就无法随意移除,我们可以将当前正在被使用的空间释放到卷组中的其它物理卷上,使之当前需要移除的物理卷未被其它逻辑卷使用即可,下面开始实践操作:
<details><summary>点开看详情:卷组中移除指定的物理卷操作</summary><pre>
<code class="language-bash">"查看当前物理卷的使用情况"
    >> pvscan
            PV /dev/sdb1   VG lvmDiskDemo   lvm2 [19.98 GiB / 〈2.97 GiB  free]
            PV /dev/sdb2   VG lvmDiskDemo   lvm2 [4.98 GiB  / 4.98 GiB   free]
            PV /dev/sdc1   VG lvmDiskDemo   lvm2 [9.98 GiB  / 0          free]
            Total: 3 [34.95 GiB] / in use: 3 [34.95 GiB] / in no VG: 0 [0   ]
            # 上面可以看出就/dev/sdb2未被引用了
'#### 对未使用的物理卷PV进行移除'
"Ⅰ:解除未被使用的物理卷,并再次增加上"
    >> vgreduce lvmDiskDemo /dev/sdb2
            Removed "/dev/sdb2" from volume group "lvmDiskDemo"
    >> pvscan
            PV /dev/sdb1   VG lvmDiskDemo   lvm2 [19.98 GiB / 〈2.97 GiB free]
            PV /dev/sdc1   VG lvmDiskDemo   lvm2 [9.98 GiB / 0    free]
            PV /dev/sdb2                    lvm2 [5.00 GiB]
    >> vgextend lvmDiskDemo /dev/sdb2
            Volume group "lvmDiskDemo" successfully extended
    >> pvscan
            PV /dev/sdb1   VG lvmDiskDemo   lvm2 [19.98 GiB / 〈2.97 GiB free]
            PV /dev/sdc1   VG lvmDiskDemo   lvm2 [9.98 GiB  / 0         free]
            PV /dev/sdb2   VG lvmDiskDemo   lvm2 [4.98 GiB  / 4.98 GiB  free]
            Total: 3 [34.95 GiB] / in use: 3 [34.95 GiB] / in no VG: 0 [0   ]
'#### 对已经使用的物理卷PV进行移除(下面将已使用的/dev/sdc1进行移除)'
"Ⅰ:判断当前移除的物理卷的容量是否可以释放到当前卷组的其它物理卷中"
    # 上面的/dev/sdc1已经无法把容量释放到其它物理卷上了,直接添加一块物理卷
    >> fdisk /dev/sdb   # 通过这个命令创建出一个大小为15G的8e类型的/dev/sdb3
    >> pvcreate /dev/sdb3
    >> vgextend lvmDiskDemo /dev/sdb3
    >> pvs
            PV         VG          Fmt  Attr PSize  PFree
            /dev/sdb1  lvmDiskDemo lvm2 a--  19.98g 〈2.97g
            /dev/sdb2  lvmDiskDemo lvm2 a--   4.98g  4.98g
            /dev/sdb3  lvmDiskDemo lvm2 a--  14.98g 14.98g
            /dev/sdc1  lvmDiskDemo lvm2 a--   9.98g     0
            # 这里已经成功将一个大小为15G的/dev/sdb3增加到了lvmDiskDemo卷组下
"Ⅱ:移除物理卷中已被使用的/dev/sdc1物理卷"
    >> vgreduce lvmDiskDemo /dev/sdc1   # 直接强行移除会报:物理卷被使用中
            Physical volume "/dev/sdc1" still in use
    # 上面我已经增加一块物理卷了,把数据迁过去(迁移无需解除之前的挂载)
    >> pvmove /dev/sdc1 /dev/sdb3
            /dev/sdc1: Moved: 0.00%
            /dev/sdc1: Moved: 40.06%
            /dev/sdc1: Moved: 61.50%
            /dev/sdc1: Moved: 83.10%
            /dev/sdc1: Moved: 100.00%
    >> pvs
            PV         VG          Fmt  Attr PSize  PFree
            /dev/sdb1  lvmDiskDemo lvm2 a--  19.98g 〈2.97g
            /dev/sdb2  lvmDiskDemo lvm2 a--   4.98g  4.98g
            /dev/sdb3  lvmDiskDemo lvm2 a--  14.98g  5.00g
            /dev/sdc1  lvmDiskDemo lvm2 a--   9.98g  9.98g
            # 现在/dev/sdc1容量未被使用,被空余出来了,就可以直接解除了
    >> vgreduce lvmDiskDemo /dev/sdc1
        Removed "/dev/sdc1" from volume group "lvmDiskDemo"
    # 为了后面的示例,我还是加上去
    >> vgextend lvmDiskDemo /dev/sdc1

(五):增加逻辑卷LV容量

  • VG阶段需要有剩余的空间:因为需要增加文件系统容量,所以需要先增加LV逻辑卷容量,若那个VG卷组中没有多余的容量,那么更上层的LV与文件系统就无法被增加。因此你得要用尽各种方法来产生多的VG容量才行。一般VG容量不足,最简单的方法就是再加硬盘!然后将该硬盘使用上面说过的pvcreate及vgextend增加到该VG内即可。
  • LV阶段产生更多的可用容量:如果VG的剩余容量足够,此时就可以利用lvresize这个指令来将剩余容量加入到所需要增加的LV逻辑卷内。
  • 文件系统阶段的增加:我们的Linux实际使用的其实不是LV,而是LV这个逻辑设备内的文件系统,所以一切最终还是要以文件系统为主;需要注意的是:可以增加文件系统容量的有xfs和ext这类的文件系统,至于减少容量只有ext这类文件系统支持;

  最后说明:整个文件系统在最初格式化的时候就建立了inode/block/superblock等信息,要改变这些信息是很难的;不过文件系统格式化的时候是建置了多个block group,因此我们可以通过在文件系统当中增加block group的方式来增减文件系统的容量;在Ext文件系统下增减block group使用resize2fs,而在xfs文件系统下增加block group则使用的是xfs_growfs,xfs并没有缩减容量哟;所以完成了LVM的容量增减后一定要针对文件系统来增减block group;

"必读:增加逻辑卷容量步骤:"
    1:排查当前的VG卷组有足够的空间进行增加(不够的话添加硬盘并通过pvcreate、vgextend添加到卷组中);
    2:卸载需要扩展的文件系统;不能在线调整容量;(解除挂载)
    3:增加逻辑卷容量,通过lvresize或者lvextend;
    4:强制进行文件系统检查(e2fsck命令);
    5:运行resize2fs命令来调整逻辑卷上的文件系统大小;
    6:重新挂载。

增加逻辑卷容量操作:

"Ⅰ:查看VG卷组容量"
    >> vgdisplay lvmDiskDemo
            --- Volume group ---
            VG Name               lvmDiskDemo
            ...(部分省略)...
            VG Size               〈49.94 GiB
            PE Size               16.00 MiB
            Total PE              3196
            Alloc PE / Size       1728 / 27.00 GiB   《= 卷组已分配容量
            Free  PE / Size       1468 / 〈22.94 GiB  《= 卷组未分配容量
            # 发现它还有22.94GB的空间,那我就拿出4G的空间进行分配增加容量
"Ⅱ:查看逻辑卷信息和挂载逻辑卷的信息"
    >> lvscan
            ACTIVE    '/dev/lvmDiskDemo/lvMySQLLog' [15.00 GiB] inherit
            ACTIVE    '/dev/lvmDiskDemo/lvRedisLog' [12.00 GiB] inherit
    >> df -h
        文件系统                              大小  已用    可用  已用%  挂载点
        ...(省略部分)...
        /dev/mapper/lvmDiskDemo-lvMySQLLog   15G  568K   14G    1% /mnt/mysqlLog
        /dev/mapper/lvmDiskDemo-lvRedisLog   12G   40M   12G    1% /mnt/redisLog
        # 假设lvRedisLog的逻辑12G空间不够用,需要扩展到18G空间
"Ⅲ:增加lvRedisLog逻辑卷容量,使其达到17GB的容量空间"
    >> lvresize -L +6G /dev/lvmDiskDemo/lvRedisLog
             Size of logical volume lvmDiskDemo/lvRedisLog changed from
                12.00 GiB (768 extents) to 18.00 GiB (1152 extents).
             Logical volume lvmDiskDemo/lvRedisLog successfully resized.
            # 这样就增加了LV的容量,我们可用通过+或者-来控制容量
    >> lvscan
              ACTIVE    '/dev/lvmDiskDemo/lvMySQLLog' [15.00 GiB] inherit
              ACTIVE    '/dev/lvmDiskDemo/lvRedisLog' [18.00 GiB] inherit
            # 可以看到LV的容量到达18GB(可不是文件系统的容量增加到了18G哟)
"Ⅳ:查看文件系统的容量(不会直接把容量添加到文件系统)"
    >> df -Th
        文件系统                             类型    大小  已用  可用    已用%   挂载点
        ...(省略部分)...
        /dev/mapper/lvmDiskDemo-lvMySQLLog ext3    15G   56M   14G    1% /mnt/mysqlLog
        /dev/mapper/lvmDiskDemo-lvRedisLog ext4    12G   43M   12G    1% /mnt/redisLog
        # 发现文件系统的容量并未从12G扩容到17G,这就证明LV逻辑卷和文件系统是分开的
"Ⅴ:若这个文件系统被挂载了,则需要先进行解除挂载,再进行文件系统的处理(一定要先卸除挂载哟)"
    >> umount /dev/lvmDiskDemo/lvRedisLog
"Ⅵ:强制进行文件系统检查"
    >> e2fsck -f /dev/lvmDiskDemo/lvRedisLog
        e2fsck 1.47.0 (5-Feb-2023)1 遍:检查 inode、块,和大小
        第 2 遍:检查目录结构
        第 3 遍:检查目录连接性
        第 4 遍:检查引用计数
        第 5 遍:检查组概要信息
        /dev/lvmDiskDemo/lvRedisLog: 14/786432 文件(7.1% 不连续),86099/3145728 块
"Ⅶ:运行resize2fs命令来调整逻辑卷上的文件系统大小"
    ## 后面需要扩容多少就填多少,不写默认全部用完,但最大只能填写LV的总容量(也是默认的)
    >> resize2fs /dev/lvmDiskDemo/lvRedisLog 18G
            resize2fs 1.47.0 (5-Feb-2023)
            将 /dev/lvmDiskDemo/lvRedisLog 上的文件系统调整为 4718592 个块(每块 4k)。
            /dev/lvmDiskDemo/lvRedisLog 上的文件系统大小已经调整为 4718592 个块(每块 4k)。
    "# 说明:若是xfs系统则请执行如下命令"
    ">> xfs_growfs /dev/lvmDiskDemo/lvRedisLog"
"Ⅷ:再次挂载"
    >> mount /dev/lvmDiskDemo/lvRedisLog /mnt/redisLog
    >>  df -h
        文件系统                              大小   已用   可用  已用%   挂载点
         ...(省略部分)...
        /dev/mapper/lvmDiskDemo-lvMySQLLog   15G  568K   14G    1% /mnt/mysqlLog
        /dev/mapper/lvmDiskDemo-lvRedisLog   18G   40M   17G    1% /mnt/redisLog

(六):减少逻辑卷LV容量

  减少逻辑卷容量的话其实相对简单一点,但强调的是:缩减后的空间大小一定要能够存储原来的数据,其并且是先缩减文件系统的容量,再缩减LV逻辑卷的容量即可;提醒的是xfs无法缩减,但Ext可以进行文件系统的缩减,下面将直接进行实操:

"必读:减少逻辑卷容量的步骤:"
    1:查看当前要缩减的逻辑卷最多能减少多少(再怎么缩减也得保证原来的数据有容量存储吧)
    2:卸载需要扩展的文件系统;不能在线调整容量;得提前解除挂载;
    3:强制进行文件系统检查(e2fsck命令);
    4:运行resize2fs命令来调整逻辑卷上的文件系统大小;('先调整文件系统容量'5:缩减逻辑卷容量,通过lvresize或者lvreduce;('缩减LV逻辑卷容量,一定要在调整文件系统容量后'6:重新挂载。

减少逻辑卷容量操作:

"Ⅰ:查看需要缩减的逻辑文件系统的空间大小和剩余空间(我需要缩减逻辑卷lvRedisLog的空间)"
    >> df -h
            文件系统                            大小  已用  可用 已用% 挂载点
             ... (省略部分)...
            /dev/mapper/lvmDiskDemo-lvMySQLLog   15G  568K   14G    1% /mnt/mysqlLog
            /dev/mapper/lvmDiskDemo-lvRedisLog   18G   40M   17G    1% /mnt/redisLog
            # 发现lvRedisLog还剩17G的空间,但是再怎么缩减,也得需要留40M多点的空间存原本数据!
"Ⅱ:查看逻辑卷信息"
    >> lvscan
            ACTIVE      '/dev/lvmDiskDemo/lvMySQLLog' [15.00 GiB] inherit
            ACTIVE      '/dev/lvmDiskDemo/lvRedisLog' [18.00 GiB] inherit
"Ⅲ:若这个文件系统被挂载了,则需要先进行解除挂载,再进行文件系统的处理(一定要先卸除挂载哟)"
    >> umount /dev/lvmDiskDemo/lvRedisLog
"Ⅳ:强制进行文件系统检查"
    >> e2fsck -f /dev/lvmDiskDemo/lvRedisLog
        e2fsck 1.47.0 (5-Feb-2023)1 遍:检查 inode、块,和大小
        第 2 遍:检查目录结构
        第 3 遍:检查目录连接性
        第 4 遍:检查引用计数
        第 5 遍:检查组概要信息
        /dev/lvmDiskDemo/lvRedisLog: 14/1179648 文件(7.1% 不连续),109471/4718592 块
"Ⅴ:运行resize2fs命令来调整逻辑卷上的文件系统大小(调整为2G的空间)"
    ## 后面需要扩容多少就填多少,不写默认全部用完,但最大只能填写LV的总容量(也是默认的)
    >> resize2fs /dev/lvmDiskDemo/lvRedisLog 2G
            resize2fs 1.47.0 (5-Feb-2023)
            将 /dev/lvmDiskDemo/lvRedisLog 上的文件系统调整为 524288 个块(每块 4k)。
            /dev/lvmDiskDemo/lvRedisLog 上的文件系统大小已经调整为 524288 个块(每块 4k)。
            # 到这里如果把这个文件系统挂载后会发现是2G的容量,
"Ⅵ:缩减lvRedisLog逻辑卷容量,使其达到2GB的容量空间"
    >> lvresize -L 2G /dev/lvmDiskDemo/lvRedisLog
            WARNING: Reducing active and open logical volume to 2.00 GiB.
              THIS MAY DESTROY YOUR DATA (filesystem etc.)
            Do you really want to reduce lvmDiskDemo/lvRedisLog? [y/n]: y
              Size of logical volume lvmDiskDemo/lvRedisLog changed from 18.00 GiB
               (1152 extents) to 2.00 GiB (128 extents).
              Logical volume lvmDiskDemo/lvRedisLog successfully resized.
            # 这样就减少了LV的容量,我们可用通过+或者-来控制容量,或者直接写要达到的容量
    >> lvscan
            ACTIVE      '/dev/lvmDiskDemo/lvMySQLLog' [15.00 GiB] inherit
            ACTIVE      '/dev/lvmDiskDemo/lvRedisLog' [2.00 GiB] inherit
            # 可以看到LV的容量缩减到了2G
"Ⅶ:挂载查看最终的容量信息"
    >> mount /dev/lvmDiskDemo/lvRedisLog  /mnt/redisLog/
    >> df -h
            文件系统                            大小  已用  可用 已用% 挂载点
            ...(省略部分)...
            /dev/mapper/lvmDiskDemo-lvMySQLLog   15G  568K   14G    1% /mnt/mysqlLog
            /dev/mapper/lvmDiskDemo-lvRedisLog  1.9G   42M  1.8G    3% /mnt/redisLog

(七):LVM动态调整磁盘使用率

  LVM动态调整磁盘使用率其实就是LVM thin volume,它在LVM上创建逻辑卷,但是创建的这个逻辑卷使用了Thin Provisioning技术,可以为未使用的块保留空间,从而实现更有效的磁盘利用。与传统的LVM逻辑卷不同,Thin Volume只分配实际需要的存储空间。当您在Thin Volume上创建文件系统时,Thin Volume仅为文件分配所需的空间,
而不是预先分配整个逻辑卷的容量。这样可以避免浪费存储资源和大量预分配空间所带来的管理复杂性。Thin Volume还支持Thin Pool,它是一个存储池,用于存储多个Thin Volume上的数据。Thin Pool可以动态地分配空间给Thin Volume,并根据需要自动增加存储池的大小。

  说白了就是我创建了一个指定大小的存储空间的逻辑卷(使用了Thin Provisioning技术);这个指定大小空间的逻辑卷就相当于一个磁盘容量存储池(thin pool),我可以基于这个磁盘存储池去产生一个或多个固定容量大小的LV逻辑卷;其实最有趣的就是这些基于thin pool创建出的一些固定容量的LV逻辑卷,这些LV逻辑卷的固定容量是我可以任意设置,虽然说可以任意设置,但是这些基于thin pool创建出的固定容量的逻辑卷实际存储的文件容量不可以超过thin pool的容量,一旦这些固定容量的逻辑卷存储的文件总容量超过了thin pool,那么就会导致数据的丢失。

  比如我创建了一个10G存储空间thin pool,基于这个thin pool创建出了3个固定容量且每个容量为30G的逻辑卷,也就是说这3个30G固定容量的逻辑卷数据加起来不能超过thin pool的容量。

  这个技术主要就是用于磁盘容量的预先分配,我们可以想一个场景,假设这台服务器明确需要10T的磁盘空间,但是现在服务器上只有2T的磁盘空间,我们短时间内无法搞到这剩余的8T磁盘,所以就先预分配10T的LV逻辑卷,等后面搞到了8T的磁盘后插到服务器并配置到thin pool上即可,得注意的是,别等文件存储了2T以上还没有把那个8T的磁盘容量存储池空间补上,这样就会出现大问题啦,因为容量爆了。

  唠叨一句,这个不推荐使用,最好直接分配物理空间,万不得已时再使用预分配。

LVM动态调整磁盘使用率操作:

"由于之前lvmDiskDemo卷组还是有剩余空间的,我就在这个卷组内进行操作"
"Ⅰ:查看卷组信息(这里就那这个卷组开涮)"
    >> vgdisplay lvmDiskDemo
            --- Volume group ---
            VG Name               lvmDiskDemo
              ...(省略部分)...
            VG Size               〈49.94 GiB
            PE Size               16.00 MiB
            Total PE              3196
            Alloc PE / Size       1088 / 17.00 GiB    《= 已使用空间
            Free  PE / Size       2108 / 〈32.94 GiB  《= 剩余未使用空间
"Ⅱ:创建磁盘容量存储池(thin pool)"
    >> lvcreate -L 1G -T lvmDiskDemo/vbThinPoolDemo
        Thin pool volume with chunk size 64.00 KiB can address at most 〈15.88 TiB of data.
        Logical volume "vbThinPoolDemo" created.
        # 这就代表创建成功了一个名为vbThinPoolDemo的thin pool
"Ⅲ:查看创建出来的磁盘容量存储池(thin pool)"
    >> lvdisplay /dev/lvmDiskDemo/vbThinPoolDemo
        --- Logical volume ---
        LV Name                vbThinPoolDemo  《= 当前逻辑卷的名称
        VG Name                lvmDiskDemo     《= 归属于哪个卷组下
        LV UUID                tizt8f-rZWZ-SwyH-rn9i-zD29-gkYb-AbNXr8
        LV Write Access        read/write
        LV Creation host, time tom-None, 2024-01-30 21:48:15 +0800
        LV Pool metadata       vbThinPoolDemo_tmeta    《= 逻辑卷所在的池的元数据名称;
        LV Pool data           vbThinPoolDemo_tdata    《= 逻辑卷所在的池的数据名称;
        LV Status              available
        # open                 0
        LV Size                1.00 GiB    《= 逻辑卷的大小,总共可以分配出去的容量
        Allocated pool data    0.00%       《= 当前磁盘容量存储池已经分配出去的容量百分比
        Allocated metadata     10.23%      《= 分配给逻辑卷的元数据的大小百分比
        Current LE             64
        Segments               1
        Allocation             inherit
        Read ahead sectors     auto
        - currently set to     256
        Block device           252:4
        # 从这里可以看出LV逻辑卷居然还可以再分配;可以认定带Allocated pool data都为磁盘容量存储池
"Ⅳ:查看卷组中的LV逻辑卷信息(可以使用lvscan,但是这里推荐使用lvs)"
    # 语法:lvs [卷组名称|卷组路径|逻辑卷路径]
    >> lvs /dev/lvmDiskDemo
        LV             VG          Attr       LSize  Pool Origin Data%  Meta% ..
        lvMySQLLog     lvmDiskDemo -wi-ao---- 15.00g
        lvRedisLog     lvmDiskDemo -wi-ao----  2.00g
        vbThinPoolDemo lvmDiskDemo twi-a-tz--  1.00g             0.00   10.23
        # 可以得出vbThinPoolDemo就是一个thin pool
        # 具体选项说明:
            LV:         是逻辑卷的名称列;
            VG:         是所属的卷组名称列;
            Attr:       是逻辑卷的属性,
            LSize:      是逻辑卷的大小;
            Pool:       列表示逻辑卷所在的池名称;
            Origin:     是逻辑卷的原始设备名称;
            Data%:      当前磁盘容量存储池已经分配出去的容量百分比(非thin pool没有此值)
            Meta%:      分配给逻辑卷的元数据的大小百分比(非thin pool没有此值)
            Move:       列显示逻辑卷是否正在迁移;
            Log:        列显示逻辑卷是否有日志设备;
            Cpy%Sync:   表示逻辑卷同步复制的进度百分比;
            Convert:    表示逻辑卷转换状态。
"Ⅴ:基于thin pool创建一个固定容量的LV逻辑卷"
    >>lvcreate -V 10G -T /dev/lvmDiskDemo/vbThinPoolDemo -n vbExam1
        WARNING: Sum of all thin volume sizes (10.00 GiB) exceeds the s...
        WARNING: You have not turned on protection against thin pools r...
        WARNING: Set activation/thin_pool_autoextend_threshold below 10...
        Logical volume "vbExam1" created.
        # 创建成功了,但是警告说我创建的LV逻辑超出池子空间了,并且未开启超出池子保护啥的
    >> lvs /dev/lvmDiskDemo
        LV             VG          Attr       LSize  Pool           Origin Data%  Meta% ..
        lvMySQLLog     lvmDiskDemo -wi-ao---- 15.00g
        lvRedisLog     lvmDiskDemo -wi-ao----  2.00g
        vbExam1        lvmDiskDemo Vwi-a-tz-- 10.00g vbThinPoolDemo        0.00
        vbThinPoolDemo lvmDiskDemo twi-aotz--  1.00g                       0.00   10.25
        # 可以看出vbExam1的逻辑卷的容量超出了thin pool空间,但是它也是可以创建的
"Ⅵ:创建文件系统并挂载"
    >> mkfs.ext4 /dev/lvmDiskDemo/vbExam1
    >> mount /dev/lvmDiskDemo/vbExam1 /mnt/thinTest/   (这个/mnt/thinTest/ 路径得提前创建)
    >> df -h
        文件系统                            大小  已用  可用 已用% 挂载点
        ...(部分省略)...
        /dev/mapper/lvmDiskDemo-vbExam1     9.8G   24K  9.3G    1% /mnt/thinTest
        ## 可以看出10G的空间挂载上了(得尽快给thin pool填充到10G的空间哟)
"Ⅶ:添加文件"
    ## 往指定目录下创建一个500M大小的文件
    >> dd if=/dev/zero of=/mnt/thinTest/test.img bs=1M count=500
        输入了 500+0 块记录
        输出了 500+0 块记录
        524288000 字节 (524 MB, 500 MiB) 已复制,3.83071 s,137 MB/s
    >>  lvs /dev/lvmDiskDemo
        LV             VG          Attr       LSize  Pool           Origin Data%  Meta%..
        lvMySQLLog     lvmDiskDemo -wi-ao---- 15.00g
        lvRedisLog     lvmDiskDemo -wi-ao----  2.00g
        vbExam1        lvmDiskDemo Vwi-aotz-- 10.00g vbThinPoolDemo        7.12
        vbThinPoolDemo lvmDiskDemo twi-aotz--  1.00g                       71.20  11.84
        # 直接用去thin pool的71%空间(其它元数据也占用空间)
"注意:创建出的固定LV逻辑卷可以使用正常的LV命令来进行管理,而thin pool可以使用VG命令来管理"

(八):LVM的LV磁盘快照

  LV磁盘快照(snapshot)就是将当时的系统信息记录下来,就好像照相记录一样,未来若有任何的文件数据变动,则原始文件信息会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享。创建快照实际上也是创建了⼀个逻辑卷,只不过该卷的属性与普通逻辑卷的属性有些不一样。下图就是解释快照的示意图:

  左图为最初创建的快照数据卷状况,LVM会预留⼀个区域 (⽐如左图的左侧三个 PE 区块) 作为数据存放处。此时快照数据卷内并没有任何数据,⽽快照数据卷与源数据卷共享所有的PE数据,因此你会看到快照数据卷的内容与源数据卷中的内容是⼀模⼀样的。等到系统运⾏⼀阵⼦后,假设A区域的数据被更新了(下⾯右图所示),则更新前系统会将该区域的数据移动到快照数据卷中,所以在右图的快照数据卷中被占⽤了⼀块PE成为A,⽽其他B到I的区块则还是与源数据卷共享!由于快照区与原本的LV共享很多PE区块,因此快照区与被快照的LV必须要在同⼀个VG上头。
image.png
注意:

  1:VG中需要预留存放快照本身的空间,不能全部被占满。

  2:快照所在的 VG 必须与被备份的 LV 相同,否则创建快照会失败。

创建LVM磁盘快照操作:

"Ⅰ:查看需要创建快照表的文件系统已经当前文件系统的记录信息"
    >> df -h
        文件系统                            大小  已用  可用 已用% 挂载点
        ...(部分省略)...
        /dev/mapper/lvmDiskDemo-lvMySQLLog   15G  568K   14G    1% /mnt/mysqlLog
        /dev/mapper/lvmDiskDemo-lvRedisLog  1.9G   42M  1.8G    3% /mnt/redisLog
        /dev/mapper/lvmDiskDemo-vbExam1     9.8G  501M  8.8G    6% /mnt/thinTest
        ## 下面我就对lvRedisLog的这个逻辑卷创建快照吧
    >> ls /mnt/redisLog
        hello.txt  lost+found  MyBooks
    >> cat /mnt/redisLog/hello.txt
        Hello Tom
"Ⅱ:开始对lvRedisLog的这个逻辑卷创建快照"
    # 语法说明:-L 快照卷大小、-n快照卷名称、-s为快照、-p权限 [r只读|rw读写]
    >> lvcreate -s -p r -L 2G -n lvRedisLog_snapshot /dev/lvmDiskDemo/lvRedisLog
        Logical volume "lvRedisLog_snapshot" created.
"Ⅲ:查看快照创建情况并挂载"
    >> lvdisplay /dev/lvmDiskDemo/lvRedisLog_snapshot
        --- Logical volume ---
        LV Path                /dev/lvmDiskDemo/lvRedisLog_snapshot
        LV Name                lvRedisLog_snapshot
        VG Name                lvmDiskDemo
        LV UUID                Br6mxz-Unps-JOL6-SnxC-5pf7-8Xey-nDnCPJ
        LV Write Access        read only    《= 快照卷的读写权限
        LV Creation host, time tom-None, 2024-01-30 23:46:02 +0800
        LV snapshot status     active destination for lvRedisLog
        LV Status              available
        # open                 0
        LV Size                2.00 GiB     《= 源逻辑卷(lvRedisLog)的容量
        Current LE             128
        COW-table size         2.00 GiB     《= 快照卷的最大容量
        COW-table LE           128
        Allocated to snapshot  0.01%        《= 这个快照卷已被使用的情况
        Snapshot chunk size    4.00 KiB
        Segments               1
        Allocation             inherit
        Read ahead sectors     auto
        - currently set to     256
        Block device           252:9
        # 说明快照卷的最大容量按照实际应用设置,假设源逻辑卷的每个文件都发生改变,那么快照卷就得设置和
        # 源逻辑卷的空间一样,正常设置个源逻辑卷的三分之一即可;
    >> blkid
        ...(省略部分)...
        /dev/mapper/lvmDiskDemo-lvRedisLog_snapshot: UUID=...
        # 发现创建出来的快照逻辑卷的文件系统是和源逻辑卷一样
    >> mkdir /mnt/snapshotTest
    >> mount /dev/mapper/lvmDiskDemo-lvRedisLog_snapshot /mnt/snapshotTest/
        mount: /mnt/snapshotTest: WARNING: source write-protected, mounted read-only.
        # 已经成功挂载了,因为我们这个lvRedisLog_snapshot是可读的,所以弹出警告
    >> df -h
        文件系统                                       大小 已用 可用 已用% 挂载点
        ...(部分省略)...
        /dev/mapper/lvmDiskDemo-lvRedisLog           1.9G 32K 1.8G 1% /mnt/redisLog
        /dev/mapper/lvmDiskDemo-lvRedisLog_snapshot  1.9G 32K 1.8G 1% /mnt/snapshotTest
"Ⅳ:验证是否被创建了快照"
    # 快照卷和源逻辑卷存储的数据都是一样的
    >> ls /mnt/snapshotTest
            hello.txt  lost+found  MyBooks
    >> ls /mnt/redisLog
            hello.txt  lost+found  MyBooks
    >> cat /mnt/redisLog/hello.txt
            Hello Tom
    >> cat /mnt/snapshotTest/hello.txt
            Hello Tom
    # 修改源逻辑卷数据(快照卷数据还是原来的)
    >> echo "lala" >> /mnt/redisLog/hello.txt
    >> cat /mnt/redisLog/hello.txt
        Hello Tom
        lala
    >> cat /mnt/snapshotTest/hello.txt
        Hello Tom
    ## 不管是更新文件名、文件内容、删除文件都是会被快照卷记录
    ## 若新增文件则不会被快照卷记录
"注:关于恢复的话就是删除源逻辑卷的全部数据,并把快照卷的数据拷贝过来"

三:磁盘阵列(RAID)

  日常在单块磁盘中进行数据读写时,由于寻址和读写时间的消耗,导致I/O性能非常低,且存储容量还会受到限制。而且单块磁盘容易出现物理故障,导致数据的丢失。因此大家就在想,有没有一种办法将多块独立的磁盘结合在一起组成一个技术方案,来提高数据的可靠性和I/O性能呢?所以磁盘阵列就应运而生了。

  磁盘阵列(Redundant Arrays of Independent Disks,[RAID]) 是通过技术(软件RAID或者硬件RAID)将多个较小的磁盘整合成为一个较大的磁盘设备;组合出来的磁盘可不止有着大容量存储空间,它还具有数据保护和提高读写性能的功能;整个RAID由于选择的等级(Level)不同,而使得整合后的磁盘也具有不同的功能。下面就介绍一些常见的Level如 RAID0、1、5、6、10、50、60:

补充:硬件RAID和软件RAID

  • 硬件RAID使用专用的RAID适配器、硬盘控制器或存储处理器。RAID控制器有自己的处理器,I/O处理芯片,和内存,用来提高资源利用率和数据传输速度。RAID控制器管理路由、缓冲区,控制主机与RAID间数据流。硬件RAID通常在服务器中使用。
    image.png
  • 软件实现的RAID没有它自己的处理器或I/O处理芯片,而是完全依赖于主机处理器。因此低速CPU不能满足RAID实施的要求。软件RAID通常在企业级存储设备上使用。

(一):常见的RAID级别

1:RAID-0(条带化)

  在RAID-0模式下使用相同型号与容量的磁盘来组成时效果较佳,这种模式的RAID会将磁盘先切出等量的区块(名为chunk,一般可设定4K~1M之间);后期当一个文件要写入RAID时,该文件就会被切割成一个个和chunk一样的大小文件,之后再依次放到各个磁盘里面去;由于每个磁盘会交错的存放数据,因此当你的数据要写入RAID时,数据会被等量的放置在各个磁盘上面。假设有2个磁盘组成RAID-0,当你有100MB的数据要写入时,每个磁盘会各被分配到50MB的储存量。RAID-0的示意图如下所示:

image.png

  上图组成的是RAID-0,每颗磁盘都会先被分割成小区块(chunk)。图中划出了一个个Blick当有数据要写入RAID时,文件会先被切割成符合chunk的大小,然后再依次放置到不同的磁盘去。由于数据已经先被切割并且依序放置到不同的磁盘上面,因此每颗磁盘所负责的数据量都降低了!照这样的情况来看,越多的磁盘组成RAID-0性能会越好,因为每个磁盘负责的数据量降低了!这表示我的文件可以分散让多个磁盘来储存,当然性能会变的更好,而且磁盘总容量也变大了,因为每颗磁盘的容量最终会汇总成为RAID-0的总容量。

  RAID-0虽好,若某一个磁盘损毁了,那么文件数据将缺一块,此时这个文件就损毁了。由于每个文件都是这样存放的,因此RAID-0只要有任何一颗磁盘损毁,在RAID上面的所有数据都会无法读取。如果使用不同容量的磁盘来组成RAID-0时,由于数据是一直等量的依次放置到不同磁盘中,当小容量磁盘的区块被用完了,那么所有的数据都将被写入到最大的那颗磁盘去。举例来说,我用200G与500G组成RAID-0,那么最初的400GB数据可同时写入两颗磁盘(各消耗200G的容量),后来再加入的数据就只能写入500G的那颗磁盘中了。此时的效率就变差了,因为只剩下一颗可以存放数据了!

优点:提供了数据的条带化和并行读写,从而获得更高的读写性能;

缺点:没有冗余,如果任意一个磁盘故障,所有数据都会丢失。

2:RAID-1(镜像)

  在RAID-1模式下使用相同型号与容量的磁盘来组成时效果最佳,如果是不同容量的磁盘组成RAID-1时,那么总容量将以最小的那块磁盘为主(木桶效应);这种模式主要是让同一份数据完整的保存在两块磁盘上。假设我有一个100MB的文件,且我仅有两块磁盘组成RAID-1时,那么这时会同步写入这100M的文件数据到这两块磁盘上,因此整体RAID的容量少了50%。由于两块磁盘内容一样,所以也称它镜像模式。

image.png

  如上图所示,一份数据传送到RAID-1之后会被分为两股,并分别写入到各个磁盘里。因为同一份数据会被分别写入到其它不同磁盘,所以要写入100MB的文件时,数据传送到I/O总线后会被复制多份到各个磁盘,结果就是数据量感觉变大了!因此在大量写入RAID-1的情况下,写入的效能可能会变地非常差。如果你使用的是硬件RAID (磁盘阵列卡)时,磁盘阵列卡会主动的复制一份而不使用系统的I/O总线,性能方面则还可以。如果使用软件磁盘阵列,可能性能就不好了。由于两颗磁盘内的数据一模一样,所以任何一块硬盘损毁时,那些文件还是可以完整的被保留下来,所以RAID-1最大的优点就是数据的备份!不过由于磁盘容量有一半用在备份,因此总容量会是全部磁盘容量的一半。 虽然RAID-1的写入性能差,但是读取数据的性能可以,这是因为数据有两份在不同的磁盘上面,假设服务器读取同一个文件时,RAID会自动寻找性能最佳且利用率低的磁盘进行读取。

优点:提供了数据的镜像备份,即使一个磁盘故障,数据仍然可用;

缺点:有效存储容量只有总容量的一半,相对于其他 RAID 级别,存储效率较低。

3:RAID-5(分布式奇偶校验)

  RAID-5最少需要三块以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似RAID-0,不过每个循环的写入过程中(striping),在每块磁盘中还加入一个同位检查数据(Parity), 这个数据会记录其它磁盘的备份数据,用于当有磁盘损毁时的救援。

image.png

  如上图所示,每个循环写入时,都会有部分的同位检查码(parity)被记录起来,并且记录的同位检查码每次都记录在不同的磁盘(按照特定规律依次出现在每个磁盘上),因此任何一块磁盘损坏时都能够由其它磁盘的检查码来重建原本磁盘内的数据,不过需要注意的是,由于有同位检查码,因此RAID-5的总容量会是整体磁盘数量减一块磁盘(三分之一)。以上图为例,原本的3块磁盘只会剩下(3-1)=2块磁盘的容量。而且当损毁的磁盘数量大于等于两块时,这整组RAID-5的文件就损坏了。因为RAID-5预设仅能支持一块磁盘的损坏的情况。

  在读写性能比较中,读取的性能还不错,与RAID-0有的比,不过写的性能就不是太快了!这是因为要写入RAID-5的数据时还得要经过计算同位检查码(parity)的关系。由于加上这个计算的动作,所以写入的性能与系统的硬件关系较大!尤其当使用软件磁盘阵列时,同位检查码是通过CPU去计算而非专业的磁盘阵列卡,因此性能方面还需要评估。另外,由于RAID-5仅能支持一颗磁盘的损坏,因此就发展出了RAID-6,这个RAID-6则使用两颗磁盘的容量作为parity的储存,因此整体的磁盘容量就会少两块,但是允许出错的磁盘数量就可以达到两块了!也就是在RAID-6的情况下,同时两块磁盘损坏时,数据还是可以救回来。

优点:通过条带化和奇偶校验分布在不同磁盘上,提供更高的读取性能和一定程度的容错能力;

缺点:写入性能相对较低,当一个磁盘故障时,重建数据可能较慢。

4:RAID-6(双分布式奇偶校验)

  RAID-6是RAID-5的升级,它通过在数据块中引入两个校验码(P+Q)来提供更高的容错能力。相比于其它RAID级别,RAID-6允许同时发生两个磁盘故障而不会导致数据丢失。这使得RAID6成为对数据可靠性要求较高的存储解决方案。在RAID-6磁盘阵列中至少需要四个磁盘驱动器来构建阵列,其中两个或更多用于存储数据,而其余两块磁盘用于存储奇偶校验信息。相比于RAID-5,RAID-6多了一个奇偶校验信息磁盘,因此可以容纳两个磁盘的故障。

  当进行写操作时,数据被分成多个块,然后通过条带化的方式分布到不同的磁盘上。同时,对应的奇偶校验信息也被计算并存储在其它磁盘上。这样,在发生磁盘故障时,可以利用奇偶校验信息重新计算出丢失的数据,从而实现数据的恢复。

image.png

优点:提供了比 RAID-5 更高的容错能力,可以同时容忍两个磁盘故障;

缺点:写入性能相对较低,与 RAID-5 相比,需要更多的磁盘容量用于奇偶校验。

5:RAID-10(镜像加条带化)

  RAID-0性能高但数据不安全,RAID-1数据安全但是性能差,那我们就考虑将RAID-0和RAID-1组合起来,那么就变为RAID-10或者RAID-01;所谓RAID-10就是先让两块磁盘组成RAID-1,并且这样的设定最少两组(两组就耗费4块磁盘),然后将这两组RAID-1再组成RAID-0,这就是RAID-10的由来;反过来说RAID-01就是先组成RAID-0再组成RAID-1的意思。

image.png

  如上图,磁盘A+磁盘B组成第一组RAID-1,磁盘C+磁盘D组成第二组RAID-1,然后这两组再整合成为一组RAID-0。如果我有100MB的数据要写入,则由于RAID-0的关系,两组RAID-1都会写入50MB,又由于RAID-1的关系,因此每块磁盘就会写入50MB。如此一来不论哪一组RAID-1的磁盘损毁一块,由于是RAID-1的镜像数据,因此就不会有任何问题发生了(除非磁盘AB都损坏或者磁盘DC都损坏才导致数据彻底丢失)!这也是目前储存设备厂商最推荐的方式。

  其实推荐RAID-10是有原因的,想象你有20颗磁盘组成的系统,每两颗组成一个RAID-1,因此你就有总共10组可以自己复原的系统了,然后这10组再组成一个新的RAID-0,速度立刻拉升10倍了,但注意:因为每组RAID-1是个别独立存在的,因此任何一颗磁盘损毁,数据都是从另一颗磁盘直接复制过来重建,并不像RAID-5/RAID-6必须要整组RAID的磁盘共同重建一颗独立的磁盘系统,性能上差非常多!而且RAID-1与RAID-0是不需要经过计算的(striping)!而且读写性能也比其它的RAID等级好太多了!唯一缺点就是太浪费空间了,一共10组,每组里面都有个备份盘,那么就是有10块磁盘在做备份,相当于舍弃50%的容量来备份。

优点:结合了 RAID-1 和 RAID-0 的优点,提供了较高的读写性能和冗余能力;

缺点:需要至少四个磁盘,并且有效存储容量只有总容量的一半。

6:RAID-50(分布式奇偶校验加条带化)

优点:结合了 RAID-5 和 RAID-0 的优点,提供了更高的读写性能和容错能力;

缺点:需要至少六个磁盘,并且在一个 RAID-0 组失效的情况下,整个阵列的性能会受到影响。

7:RAID-60(双分布式奇偶校验加条带化)

优点:结合了 RAID-6 和 RAID-0 的优点,提供了更高的读写性能和双重容错能力;

缺点:需要至少八个磁盘,并且写入性能相对较低。

(二):磁盘阵列优点及汇总

磁盘阵列优点:

  1. 数据安全与可靠性:指的并非网络信息安全,而是当硬件(指磁盘)损毁时,数据是否还能够安全的救援;
  2. 读写效能:例如RAID-0可以加强读写效能,让你的系统I/O部分得以改善;
  3. 容量:可以让多块磁盘组合起来,故单一文件系统可以有相当大的容量。

磁盘阵列缺点:

  1. 浪费大量的磁盘空间

假设有n块磁盘组成的RAID设定:
image.png

  保证数据安全和性能就 推荐使用RAID-10 ,因为提供了更高地读/写性能,数据可以同时从多个驱动器中读取或写入,而且还具有较高的容错能力,由于数据被镜像,即使其中一个驱动器发生故障,其它镜像驱动器仍然可以快速提供数据。我个人并 不推荐使用RAID-5、RAID-6 ,因为这两种不适用频繁的写入环境(如数据库操作)、性能差的服务器、性能差的磁盘阵列(读写都需要经过parity的计算校验码),而且RAID-5、RAID-6有磁盘坏了以后重建数据恢复慢,而且家用盘的话恢复成功率也不是百分百。

(三):软件磁盘阵列设定

  这里就不说硬件RAID了,那种是需要花钱的,几百的家用或几万的服务器磁盘阵列搞不起;下面主要就是利用mdadm命令创建软件RAID。并且详细讲述RAID0、1、5、10的几种模式的创建。

  注意:组成RAID推荐使用多块磁盘,这样可以有多个磁盘驱动器一起进行读写;也可以使用一个磁盘下创建多个分区,通过多个分区来创建RAID,但是不推荐,在测试时可以使用此方式,但是在生产模式下不可使用这种方式,因为这种就是伪RAID,所以的读写频率都在一个盘上,无法提高性能。

"环境准备:(操作系统:Ubuntu 23.10)、(磁盘数:sdb、sdc、sdd、sde)"
注:fdisk分区下的RAID类型为fd
注:gdisk分区下的RAID类型为fd00
下载mdadm命令:
    Ubuntu:apt install mdadm
    Centos:yum install mdadm

1:mdadm命令基本说明

  mdadm(Multiple devices admin) 是Linux下的一款标准的软件RAID管理工具,mdadm可以诊断、监控和收集详细的阵列信息;在linux系统中目前以MD(Multiple Devices))虚拟块设备的方式实现软件RAID,利用多个底层的块设备虚拟出一个新的虚拟设备,并且利用条带化(stripping)技术将数据块均匀分布到多个磁盘上来提高虚拟设备的读写性能,利用数据冗余的方式保护用户数据不会因为某个块设备的故障而完全丢失,而且还能在设备被替换后将丢失的数据恢复到新的设备上;目前MD支持linear、multipath、raid0(stripping)、raid1(mirror)、raid4、raid5、raid6、raid10等不同的冗余级别和集成方式,当然也能支持多个RAID陈列的层叠组成raid-10,raid-51等类型的陈列。

mdadm基本语法:
    》》 mdadm 选项 设备名
    选项说明:
        -C、--create:
            创建一个新的磁盘阵列
        -D、--detail:
            显示一个阵列的详细信息
        -S、--stop:
            停止阵列。被停止的阵列需要重新组装后才能使用(若阵列不要了,执行这个也行)。
        -r、--remove:
            从阵列中移除指定设备; 如(mdadm -r /dev/md0 /dev/sd{b,c},移除md0中的sdb和sdc)
        -f、--fail:
            手动将指定的磁盘标记为坏盘(faulty)
        -A、--assemble:
            组装阵列。当阵列被停止后,或重启设备时,如要继续使用该阵列,此要将该阵列组装起来。

        -a、--auto{=no,yes,md,mdp,part,p}:
            通知mdadm是否创建设备文件,并分配一个未使用的次设备号。
            备注:
                --auto=no:将不会创建设备文件,如果不存在指定的设备文件,将不能创建阵列。
                --auto=md:创建一个不可以分区的阵列。
                --auto=mdp/part/p:创建一个可以分区的阵列。
                --auto=yes:(默认)需要md设备的设备文件名有一个标准格式,根据这个设备文件名的格式来
                    指定RAID是否可分区以及该RAID的次设备号。
                    不可分区阵列:/dev/mdNN、/dev/md/NN
                        如指定设备文件名为/dev/md0,则该RAID是一个不可分区的,且次设备号为0。
                    可分区阵列:/dev/md/dNN和/dev/md_dNN
        -l、--level:
            设置RAID级别
            可选值:如linear,raid0,0,stripe,raid1,1,raid5,5,raid6,6,raid10,10...
        -n、--raid-devices:
            指定阵列中成员盘个数。成员盘个数可通过--grow参数来修改,只有RAID-{1、5、6}阵列支持。
        -s、--scan:
            监控/proc/mdstat文件中列出的所有设备
        -c、--chunk:
            指定阵列的chunk(小区块)大小,单位KB,具体值可参考下面规律:
            可选值如:4、8、16、32、64、128、256、1024、2048、4096、8192、16384、32768...
        -x、--spare-devices:
            指定阵列中热备盘个数,当主盘发生故障时,备份盘立马顶上去。
            举例:mdadm -C /dev/md0 -l5 -n2 /dev/sd{b,c}1 -x1 /dev/sdd
        -a、--add:
            将指定设备添加到指定阵列中,一般可以替换磁盘阵列中的坏盘。
            举例:mdadm --add /dev/md5 /dev/sde1
        --re-add:
            增加一个刚刚从阵列中移除不久的设备。
            举例:mdadm -r /dev/md0 /dev/sdb --re-add /dev/sdb
        -N、--name:
            阵列名称。创建阵列时,superblock采用1.0版本,该参数才生效。
            示例:mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sd{b,c}1 -N test1_Raid0
            查询:ARRAY /dev/md0 metadata=1.2 name=tom-None:test1_Raid0 UUID=8...89
'示例:'
Ⅰ:创建一个设备为/dev/md0的RAID-0磁盘阵列,并且通过/dev/sd{b,c}1这两个磁盘设备创建。
    简写:mdadm -C /dev/md0 -a yes -l0 -n2 /dev/sd{b,c}1
    详写:mdadm --create /dev/md0 --auto=yes --level=0 --raid-devices=2 dev/sd{b,c}1
Ⅱ:创建一个RAID-5的磁盘阵列,并设置个备份盘1个
    mdadm -C /dev/md0 -a yes -l5 -n3 /dev/sd{b,c,d}1 -x1 /dev/sde1
Ⅳ:创建一个RAID-0的磁盘阵列,并指定磁盘阵列的区块大小
    mdadm -C /dev/md0 -a yes -c1024 -l0 -n2 /dev/sd{b,c}1
Ⅳ:查看磁盘阵列状态和详细情况
    cat /proc/mdstat
    mdadm -D /dev/md1
Ⅴ:停止磁盘阵列
    mdadm -S /dev/md0
Ⅵ:重组磁盘阵列(只适用于之前被停止的盘,若新盘需要创建磁盘阵列)
    mdadm -A /dev/md1 /dev/sd{b,c}1
Ⅶ:手动设置磁盘损坏
    mdadm /dev/md0 -f /dev/sdb1
Ⅷ:移除磁盘阵列的一块磁盘
    mdadm -r /dev/md3 /dev/sdb1
Ⅸ:添加一块新的磁盘到磁盘队列里
    mdadm --add /dev/md3 /dev/sde1

具体命令可以参考这篇博客

2:软RAID-0创建

  实操:针对sdb和sdc两块磁盘使用了fdisk命令分出来了2个大小为10G空间的fd类型分区(sdb1、sdc1);然后针对这两个分区组成RAID-0磁盘阵列模式。

'Ⅰ:创建分区sdb1、sdc1,并将分区类型设置为fd(Linux raid autodetect),这两个分区都是10G空间;'
    >> fdisk -l | grep raid
        /dev/sdb1        2048 20973567 20971520  10G fd Linux raid 自动检测
        /dev/sdc1        2048 20973567 20971520  10G fd Linux raid 自动检测
'Ⅱ:创建RAID-0磁盘阵列;'
    >> mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sd{b,c}1
        mdadm: Defaulting to version 1.2 metadata
        mdadm: array /dev/md0 started.
'Ⅲ:查看创建的磁盘阵列信息;'
    >> mdadm -D /dev/md0
        /dev/md0:
                   Version : 1.2
             Creation Time : Sun Feb  4 15:13:35 2024   《 创建时间
                Raid Level : raid0                      《 RAID级别
                Array Size : 20953088 (19.98 GiB 21.46 GB) 《 设备当前总容量
              Raid Devices : 2  《 RAID设备中的磁盘数量
             Total Devices : 2  《 参与RAID操作的总磁盘数量
               Persistence : Superblock is persistent
               Update Time : Sun Feb  4 15:13:35 2024 《 RAID设备的更新时间
                     State : clean              《 RAID设备的状态,clean表示所有磁盘处于正常状态
            Active Devices : 2                  《 当前活动的RAID设备数量
           Working Devices : 2                  《 正常工作的RAID设备数量
            Failed Devices : 0                  《 失败的RAID设备数量
             Spare Devices : 0                  《 备用的RAID设备数量
                    Layout : -unknown-          《 RAID设备的布局信息
                Chunk Size : 512K               《 RAID会把数据切成块,这里是块大小
        Consistency Policy : none               《 一致性策略(none表示没有启用一致性策略)
                      Name : tom-None:0  (local to host tom-None)   《 设备的名称
                      UUID : 68d30583:e682259a:e01feda1:6b6f8cab
                    Events : 0                                      《 RAID设备的事件计数器
            Number   Major   Minor   RaidDevice State
               0       8       17        0      active sync   /dev/sdb1
               1       8       33        1      active sync   /dev/sdc1
        Number:     磁盘在RAID设备中的编号。
        Major:      磁盘的主要设备号。
        Minor:      磁盘的次要设备号。
        RaidDevice: 磁盘在RAID设备中的编号。
        State:      磁盘的状态。下面是一些选项:
            active sync(活动同步):表示磁盘正常工作并与其他磁盘同步。
            active (spare)(活动备用):表示磁盘正常工作,但被配置为备用设备,尚未参与数据读写操作。
            faulty(故障):表示磁盘存在故障,并且无法正常工作。
            removed(已移除):表示磁盘已从RAID设备中移除。
            inactive(非活动):表示磁盘非活动状态,可能因为故障或其他原因暂时不可用。
    >> lsblk
        ...(省略部分)...
        sdb       8:16   0    50G  0 disk
        └─sdb1    8:17   0    10G  0 part
          └─md0   9:0    0    20G  0 raid0
        sdc       8:32   0    50G  0 disk
        └─sdc1    8:33   0    10G  0 part
          └─md0   9:0    0    20G  0 raid0
'Ⅳ:格式化文件系统,并挂载;'
    >> mkfs.ext4 /dev/md0
    >> mkdir /mnt/raid0FileSystem
    >> mount /dev/md0 /mnt/raid0FileSystem/
    >> df -h
        ...(部分省略)...
        /dev/md0    20G   24K   19G    1% /mnt/raid0FileSystem
        可以发现此目录下挂载了20G的存储空间
'Ⅴ:查看创建的磁盘阵列状态;'
    >> cat /proc/mdstat
        Personalities : [raid0]                     《 RAID级别
        md0 : active raid0 sdc1[1] sdb1[0]          《 活动的磁盘
             20953088 blocks super 1.2 512k chunks  《 写入磁盘小区块大小
        unused devices: <none>

3:软RAID-1创建

  实操:针对sdb和sdc两块磁盘使用了fdisk命令分出来了2个大小为10G空间的fd类型分区(sdb1、sdc1);然后针对这两个分区组成RAID-1磁盘阵列模式。

'Ⅰ:创建分区sdb1、sdc1,并将分区类型设置为fd(Linux raid autodetect),这两个分区都是10G空间;'
    >> fdisk -l | grep raid
        /dev/sdb1        2048 20973567 20971520  10G fd Linux raid 自动检测
        /dev/sdc1        2048 20973567 20971520  10G fd Linux raid 自动检测
'Ⅱ:创建RAID-1磁盘阵列;'
    >> mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sd{b,c}1
        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? y
        mdadm: Defaulting to version 1.2 metadata
        mdadm: array /dev/md1 started.
'Ⅲ:查看创建的磁盘阵列信息;'
    >> mdadm -D /dev/md1
        /dev/md1:
                   Version : 1.2
             Creation Time : Sun Feb  4 17:11:13 2024
                Raid Level : raid1  《 磁盘阵列为raid1(镜像模式)
                Array Size : 10476544 (9.99 GiB 10.73 GB) 《 设备当前总容量
             Used Dev Size : 10476544 (9.99 GiB 10.73 GB) 
              Raid Devices : 2
             Total Devices : 2
               Persistence : Superblock is persistent
               Update Time : Sun Feb  4 17:11:52 2024
                     State : clean, resyncing
            Active Devices : 2
           Working Devices : 2
            Failed Devices : 0
             Spare Devices : 0
        Consistency Policy : resync         《 镜像模式
             Resync Status : 80% complete   《 创建后直接查询会显示两个磁盘的同步情况
                      Name : tom-None:1  (local to host tom-None)
                      UUID : 72c4894f:e8a3fc6d:eeee456c:ff61e9cf
                    Events : 12
            Number   Major   Minor   RaidDevice State
               0       8       17        0      active sync   /dev/sdb1
               1       8       33        1      active sync   /dev/sdc1
'Ⅳ:查看创建的磁盘阵列状态;'
    >> cat /proc/mdstat
        Personalities:[raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10]
        md1 : active raid1 sdc1[1] sdb1[0]
              10476544 blocks super 1.2 [2/2] [UU]
        unused devices: <none>
'Ⅴ:停止/dev/md1的RAID-1级别设备'
    >> lsblk
        sdb       8:16   0    50G  0 disk
        └─sdb1    8:17   0    10G  0 part
          └─md1   9:1    0    10G  0 raid1
        sdc       8:32   0    50G  0 disk
        └─sdc1    8:33   0    10G  0 part
          └─md1   9:1    0    10G  0 raid1
    >> mdadm -S /dev/md1
        mdadm: stopped /dev/md1
    >> lsblk
        sdb      8:16   0    50G  0 disk
        └─sdb1   8:17   0    10G  0 part
        sdc      8:32   0    50G  0 disk
        └─sdc1   8:33   0    10G  0 part
'Ⅵ:创建的设备一旦停止或者重启以后,我们需要重新组装该阵列;'
    >> mdadm -A /dev/md1 /dev/sd{b,c}1
        mdadm: /dev/md1 has been started with 2 drives.
        # 这样就重组了磁盘阵列,这样太麻烦了,后面有开机自动重组磁盘阵列
        # /dev/sd{b,c}1这个是我们之前创建的用于RAID-1的磁盘

4:软RAID-5创建

  实操:针对sdb、sdc、sdd三块磁盘使用了fdisk命令分出来了3个大小为10G空间的fd类型分区(sdb1、sdc1、sdd1);然后针对这两个分区组成RAID-5磁盘阵列模式。

'Ⅰ:创建分区sdb1、sdc1、sdd1,并将分区类型设置为fd(Linux raid autodetect),这三个分区都是10G空间;'
    >> fdisk -l | grep raid
        /dev/sdb1        2048 20973567 20971520  10G fd Linux raid 自动检测
        /dev/sdc1        2048 20973567 20971520  10G fd Linux raid 自动检测
        /dev/sdd1        2048 20973567 20971520  10G fd Linux raid 自动检测
'Ⅱ:创建RAID-5磁盘阵列'
    >> mdadm -C /dev/md3 -a yes -l5 -n3 -c1024 /dev/sd{b,c,d}1
        mdadm: Defaulting to version 1.2 metadata
        mdadm: array /dev/md3 started.
        # 创建我的第三块磁盘阵列md3;使用了3块磁盘当此磁盘阵列
'Ⅲ:查看磁盘阵列/dev/md3的创建状态'
    >> mdadm -D /dev/md3
        /dev/md3:
                   Version : 1.2
             Creation Time : Sun Feb  4 22:02:42 2024
                Raid Level : raid5                         《 磁盘阵列等级
                Array Size : 20953088 (19.98 GiB 21.46 GB) 《 总容量大小
             Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
              Raid Devices : 3          《 RAID设备中的磁盘数量
             Total Devices : 3          《 参与RAID操作的总磁盘数量
               Persistence : Superblock is persistent
               Update Time : Sun Feb  4 22:03:34 2024
                     State : clean     《 RAID设备的状态,clean表示所有磁盘处于正常状态
            Active Devices : 3         《 当前活动的RAID设备数量
           Working Devices : 3         《 正常工作的RAID设备数量
            Failed Devices : 0         《 失败的RAID设备数量
             Spare Devices : 0         《 备用的RAID设备数量
                    Layout : left-symmetric
                Chunk Size : 1024K     《 RAID会把数据切成块,这里是块大小
        Consistency Policy : resync
                      Name : jack-None:3  (local to host jack-None)
                      UUID : 69081278:ea884c0c:01780d53:6d9e406e
                    Events : 18
            Number   Major   Minor   RaidDevice State
               0       8       17        0      active sync   /dev/sdb1
               1       8       33        1      active sync   /dev/sdc1
               3       8       49        2      active sync   /dev/sdd1
'Ⅳ:创建文件系统并挂载上'
    >> mkfs.ext4 /dev/md3
    >> mkdir /mnt/raid5FileSystem
    >> mount /dev/md0 /mnt/raid5FileSystem/
    >> df -h
        ...(部分省略)...
        /dev/md3         20G   24K   19G    1% /mnt/raid5FileSystem
        # 可以看出已经被挂载了,并且容量有20G,因为RAID-5有个盘存放校验码

'Ⅴ:停止刚才创建的/dev/md3设备(RAID-5);'
    >> umount /dev/md3      # 必须先解除挂载
    >> cat /proc/mdstat
        Personalities:[linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4][raid10]
        md3: active raid5 sdd1[3] sdc1[1] sdb1[0]
              20953088 blocks super 1.2 level 5, 1024k chunk, algorithm 2 [3/3] [UUU]
        unused devices: <none>
        # 查看当前的RAID-5是在线状态
    >> mdadm -S /dev/md3
        mdadm: stopped /dev/md3
    >> cat /proc/mdstat
        Personalities:[linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
        unused devices: <none>
        # 再次查看这个RAID-5就没有了

'Ⅵ:重新装载刚才被停止的阵列;'
    >> mdadm -A /dev/md3 /dev/sd{b,c,d}1
        mdadm: /dev/md3 has been started with 3 drives.
        # 这时候查看装载就是在线状态,包括/dev/md3设备文件也是存在的

'Ⅶ:重新挂载并测试坏一个盘是否可以继续使用;'
    >> mount /dev/md3 /mnt/raid5FileSystem/
    >> echo "HelloWorld" > /mnt/raid5FileSystem/aaa.txt
    >> mdadm /dev/md3 -f /dev/sdb1
        mdadm: set /dev/sdb1 faulty in /dev/md3
        # 将sdb1设备为坏盘
    >>  mdadm -D /dev/md3
        /dev/md3:
                   Version : 1.2
             Creation Time : Sun Feb  4 22:02:42 2024
                Raid Level : raid5
                Array Size : 20953088 (19.98 GiB 21.46 GB)
             Used Dev Size : 10476544 (9.99 GiB 10.73 GB)
              Raid Devices : 3      《 RAID设备中的磁盘数量
             Total Devices : 3      《 参与RAID操作的总磁盘数量
               Persistence : Superblock is persistent
               Update Time : Sun Feb  4 22:31:19 2024
                     State : clean, degraded  《 clean代表可正常工作,degraded代表至少一个设备故障
            Active Devices : 2      《 当前活动的RAID设备数量
           Working Devices : 2      《 正常工作的RAID设备数量
            Failed Devices : 1      《 可以看到有一个坏盘
             Spare Devices : 0
                    Layout : left-symmetric
                Chunk Size : 1024K
        Consistency Policy : resync
                      Name : jack-None:3  (local to host jack-None)
                      UUID : 69081278:ea884c0c:01780d53:6d9e406e
                    Events : 20
            Number   Major   Minor   RaidDevice State
               -       0        0        0      removed
               1       8       33        1      active sync   /dev/sdc1
               3       8       49        2      active sync   /dev/sdd1
               0       8       17        -      faulty   /dev/sdb1
               # 这里的/dev/sdb1为坏盘
    # 测试文件是否可修改读取
    >> cat /mnt/raid5FileSystem/aaa.txt
        HelloWorld
    >> echo "HelloWorld11" >> /mnt/raid5FileSystem/aaa.txt
    >> cat /mnt/raid5FileSystem/aaa.txt
        HelloWorld
        HelloWorld11

'Ⅷ:移除坏盘,并添加一块全新的/dev/sde1磁盘'
    >> mdadm -r /dev/md3 /dev/sdb1
        mdadm: hot removed /dev/sdb1 from /dev/md3
    >> mdadm -D /dev/md3
        ...(部分省略)...
        Raid Devices : 3    》 总共有3块
        Total Devices : 2   》 现在还有2块
        Active Devices : 2  》 当前活动的RAID设备数量
        Working Devices : 2 》 正常工作的RAID设备数量
        Failed Devices : 0  》 坏牌被我移除了,所以没有了
        ...(部分省略)...
    >> fdisk /dev/sde   # 创建一块新盘,分区类型为fd
        ...(部分省略)
        /dev/sde1        2048 20973567 20971520  10G fd Linux raid 自动检测
    >> mdadm --add /dev/md3 /dev/sde1
        mdadm: added /dev/sde1
        # 添加完设备后,若立即查看设备则可能还在互相备份中
    >>  mdadm -D /dev/md3
        ...(部分省略)...
            unused devices: <none>
            Active Devices : 2
            Working Devices : 3
            Failed Devices : 0
            Spare Devices : 1       》 备份盘(在这其实是还没重建完就查询了)
            Layout : left-symmetric
            Chunk Size : 1024K
            Consistency Policy : resync
            Rebuild Status : 9% complete    》 重建百分比
                  Name : jack-None:3  (local to host jack-None)
                  UUID : 69081278:ea884c0c:01780d53:6d9e406e
                Events : 34
        Number   Major   Minor   RaidDevice State
           4       8       65        0      spare rebuilding   /dev/sde1
           1       8       33        1      active sync   /dev/sdc1
           3       8       49        2      active sync   /dev/sdd1
        # 重建完在查询则会正常状态
        >> cat /proc/mdstat
            Personalities:[linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4][raid10]
            md3 : active raid5 sde1[4] sdd1[3] sdc1[1]
                  20953088 blocks super 1.2 level 5, 1024k chunk, algorithm 2 [3/2] [_UU]
                  [======>..............]  recovery = 30.5% (3205120/10476544) .../sec
                  # 还在重建中,重建完成后则正常

'补充:关于mdadm -D查询出的State选项介绍:'
    Clean:
        表示RAID设备没有发生故障或错误。所有设备都正常工作并与其他设备同步数据。
    Degraded:
        表示RAID设备中至少有一个设备发生了故障或错误。RAID设备仍然可用,但容错能力受到了影响。
    Inactive:
        表示RAID设备当前处于非活动状态。这可能是因为用户手动禁用了RAID设备或出现了某种配置错误。
    Resyncing:
        表示RAID设备正在进行数据同步或重新同步过程。
        在此状态下,RAID设备正在将数据从一个设备复制到其他设备以恢复冗余性。
    Recovering:
        表示RAID设备正在进行数据恢复过程,以修复一个或多个故障设备。
    Rebuilding:
        表示RAID设备正在重建一个或多个故障设备。这意味着RAID设备正在使用备用设备或新设备来替换故障设备。
    Faulty:
        表示RAID设备中的一个或多个设备处于故障状态。这可能需要替换故障设备才能恢复正常运行。

5:软RAID-10创建

  我们有了上面的RAID-0和RAID-1创建基础,下面我们就可以直接创建RAID-10,也是特别简单,组合一下就行了。

'Ⅰ:创建分区sd{b,c,d,e}1,并将分区类型设置为fd(Linux raid autodetect),这四个分区都是10G空间;'
    >> fdisk -l | grep raid
        /dev/sdb1        2048 20973567 20971520  10G fd Linux raid 自动检测
        /dev/sdc1        2048 20973567 20971520  10G fd Linux raid 自动检测
        /dev/sdd1        2048 20973567 20971520  10G fd Linux raid 自动检测
        /dev/sde1        2048 20973567 20971520  10G fd Linux raid 自动检测
    >> lsblk
        ...(部分省略)...
        sdb      8:16   0    50G  0 disk
        └─sdb1   8:17   0    10G  0 part
        sdc      8:32   0    50G  0 disk
        └─sdc1   8:33   0    10G  0 part
        sdd      8:48   0    50G  0 disk
        └─sdd1   8:49   0    10G  0 part
        sde      8:64   0    50G  0 disk
        └─sde1   8:65   0    10G  0 part

'Ⅱ:将sdb1和sdc1这两块设备组成RAID-1;将sdb1和sdc1这两块设备组成RAID-1(创建两组RAID-1)'
    >> mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sd{b,c}1 -N test0_Raid1
    >> mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sd{d,e}1 -N test1_Raid1
    >>  cat /proc/mdstat  # 查看状态
        Personalities:[raid1] [linear] [multipath] [raid0] [raid6] [raid5][raid4][raid10]
        md1 : active raid1 sde1[1] sdd1[0]
              10476544 blocks super 1.2 [2/2] [UU]
              [======>..............]  resync = 32.5% (3413952/10476544) f....0K/sec
        md0 : active raid1 sdc1[1] sdb1[0]
              10476544 blocks super 1.2 [2/2] [UU]
              [=========>...........]  resync = 47.7% (5001216/10476544) f....4K/sec
        # 两个磁盘阵列已经被创建,只不过它们在备份状态(等执行完了,也就正式创建好了)
        # 执行完成是如下情况:
            md1 : active raid1 sde1[1] sdd1[0]
                  10476544 blocks super 1.2 [2/2] [UU]
            md0 : active raid1 sdc1[1] sdb1[0]
                  10476544 blocks super 1.2 [2/2] [UU]
    >> lsblk
        sdb       8:16   0    50G  0 disk
        └─sdb1    8:17   0    10G  0 part
          └─md0   9:0    0    10G  0 raid1
        sdc       8:32   0    50G  0 disk
        └─sdc1    8:33   0    10G  0 part
          └─md0   9:0    0    10G  0 raid1
        sdd       8:48   0    50G  0 disk
        └─sdd1    8:49   0    10G  0 part
          └─md1   9:1    0    10G  0 raid1
        sde       8:64   0    50G  0 disk
        └─sde1    8:65   0    10G  0 part
          └─md1   9:1    0    10G  0 raid1
        # 可以看出哪些磁盘下被组装了阵列

'Ⅲ:针对前面创建成功的/dev/md{0,1}磁盘阵列,现在将其组合成RAID-0的磁盘阵列'
    >> mdadm -C /dev/md2 -a yes -l0 -n2 /dev/md{0,1} -N test0_Raid10
        mdadm: /dev/md0 appears to contain an ext2fs file system
               size=20953088K  mtime=Sun Feb  4 16:57:25 2024
        mdadm: /dev/md1 appears to contain an ext2fs file system
               size=20953088K  mtime=Sun Feb  4 16:57:25 2024
        Continue creating array? y
        mdadm: Defaulting to version 1.2 metadata
        mdadm: array /dev/md2 started.
        
'Ⅳ:查看磁盘阵列创建信息'
    >> cat /proc/mdstat
        ...(省略部分)...
        md2 : active raid0 md1[1] md0[0]
              20934656 blocks super 1.2 512k chunks
        md1 : active raid1 sde1[1] sdd1[0]
              10476544 blocks super 1.2 [2/2] [UU]
        md0 : active raid1 sdc1[1] sdb1[0]
              10476544 blocks super 1.2 [2/2] [UU]
    >> lsblk
        sdb         8:16   0    50G  0 disk
        └─sdb1      8:17   0    10G  0 part
          └─md0     9:0    0    10G  0 raid1
            └─md2   9:2    0    20G  0 raid0
        sdc         8:32   0    50G  0 disk
        └─sdc1      8:33   0    10G  0 part
          └─md0     9:0    0    10G  0 raid1
            └─md2   9:2    0    20G  0 raid0
        sdd         8:48   0    50G  0 disk
        └─sdd1      8:49   0    10G  0 part
          └─md1     9:1    0    10G  0 raid1
            └─md2   9:2    0    20G  0 raid0
        sde         8:64   0    50G  0 disk
        └─sde1      8:65   0    10G  0 part
          └─md1     9:1    0    10G  0 raid1
            └─md2   9:2    0    20G  0 raid0
        # 可以清楚看出哪创建了磁盘阵列,并且是RAID几

'Ⅴ:查看刚才创建的RAID-10信息'
    >> mdadm -D /dev/md2
        /dev/md2:
                   Version : 1.2
             Creation Time : Mon Feb  5 10:45:21 2024
                Raid Level : raid0  《 RAID-0
                Array Size : 20934656 (19.96 GiB 21.44 GB)
              Raid Devices : 2
             Total Devices : 2
               Persistence : Superblock is persistent
               Update Time : Mon Feb  5 10:45:21 2024
                     State : clean
            Active Devices : 2
           Working Devices : 2
            Failed Devices : 0
             Spare Devices : 0
                    Layout : -unknown-
                Chunk Size : 512K
        Consistency Policy : none
                      Name : tom-None:test0_Raid10  (local to host tom-None)
                      UUID : e5be0026:f24cf4c4:8a38a27b:6401302c
                    Events : 0
            Number   Major   Minor   RaidDevice State
               0       9        0        0      active sync   /dev/md0
               1       9        1        1      active sync   /dev/md1
        # 可不是RAID-10哟,md2只是组合两个RAID-1,实质上它是RAID-0,只是个组合
        
'Ⅵ:创建文件系统并进行挂载测试'
    >> mkfs.ext4 /dev/md2
    >> mkdir /mnt/raid10Test
    >> mount /dev/md2 /mnt/raid10Test
    >>  df -h
        文件系统        大小  已用  可用 已用% 挂载点
         ...(部分省略)...
        /dev/md2         20G   24K   19G    1% /mnt/raid10Test
        
'Ⅶ:设置开机自动装配'
    >> 参考下面 ↓ ↓ ↓ ↓
    
'注:开机完成以后需要重新挂载磁盘'
'总结:其实创建RAID-10,就是先创建两个RAID-1,然后将这两个RAID-1的磁盘阵列当成两个盘在创建RAID-0'

6:设置开机自动装配

让系统重启后时自动识别RAID设备:
    # Ubuntu系统下执行
        >> mdadm --detail --scan > /etc/mdadm/mdadm.conf
    # Centos系统下执行
        >> mdadm --detail --scan > /etc/mdadm.conf
说明:
    "问题:关于组建RAID重启系统一直出现 md0 变成 md127 解决:"
        执行 mdadm --detail --scan 会发现如下信息:
            ARRAY /dev/md0 metadata=1.2 name=tom-None:0 UUID=3b2a...(省略部分)...d3b0
        需要修改vim /etc/mdadm/mdadm.conf将ARRAY的信息简化:
            ARRAY /dev/md0 UUID=3b2a5285:9b6e4d5c:4c22e4a5:1758d3b0
        更新initramfs以应用新的配置文件:
            sudo update-initramfs -u
  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值