27.磁盘管理&--LVM

1|0一.LVM概述

1|11.为什么要用LVM

  • LVM是逻辑卷管理系统工具
  • 使用传统的分区方法, 分完后大小就固定死
  • 分区过大, 造成空间浪费; 分区过小, 导致空间不够用
  • 过小需要从新划分磁盘分区, 或者以软连接的方式将此分区的目录链接到另一个分区
  • 这样做可以临时解决问题, 但给管理带来了麻烦

1|22.什么是LVM

  • 逻辑卷管理系统工具
  • LVM可以创建和管理逻辑卷, 不是直接使用磁盘
  • 可以让管理员弹性的管理逻辑卷的扩大缩小, 操作简单不损坏已有数据
  • 可以随意将新磁盘添加到LVM中, 让其扩展已存在的逻辑卷
  • LVM不需要重启就可以让内核知道分区的存在

1|32.LVM名词含义

  • PV : 物理卷(physical volume) ,把常规的磁盘设备通过pvcreate命令对其进行初始化, 形成了物理卷 🔔面粉
  • VG : 卷组(volume group), 把多个物理卷组成一个逻辑的整体, 这样卷组的大小就是多个硬盘之和 🔔面团
  • LV : 逻辑卷(logical volume) , 从卷组中划分需要的空间大小出来, 用户仅需对其格式化然后即可挂载使用 🔔切成馒头
  • PE : 基本单元(physical extend), 分配的逻辑大小的最小单元, 默认为4MB的基本块 (假设分配100MB逻辑空间,则需要创建25个PE) 🔔小麦

1|43.LVM的优缺点

  • 优点
          1. 可以在系统运行的状态下动态的扩展文件系统的大小
          2. 文件系统可以跨多个磁盘, 因此文件系统大小不会受物理磁盘的限制
          3. 可以增加新的磁盘到 "LVM" 的储存池中
          4. 可以以镜像的方式冗余重要的数据到多个物理磁盘
          5. 可以方便的导出整个卷组到另一态机器
  • 缺点
        1. 因为加入了额外的操作, 存取性能受到影响
        2. 当卷组中一个磁盘损坏时, 整个卷组都会受到影响
       🔰解释: 因为一个"逻辑卷"可能是由多个不同"物理卷"里的"PE"组成的
       🔰解决: 底层使用"RAID"做, 上层使用"LVM", 既有了冗余又有了动态扩容

2|0二.LVM的使用

2|11.LVM基本使用命令

  • 先安装LVM : yum install lvm2 -y

  • 制作PV : pvcreate [设备名称]

  • 查看PV : pvs

  • 制作VG : vgcreate [vg名] [多个pv路径]

  • 查看VG : vgs

  • 制作LV : lvcreate -L [指定大小] -n [指定lv名字] [指定从哪个vg里分]

  • 查看LV : lvs

  • 扩容VG : vgextend [指定要扩容的vg] [指定要增加的新pv]

  • 扩容LV : lvextend -L [+"指定大小"] -n [指定要增加的那个pv路径]

  • 扩展后更新xfs文件系统 : xfs_growfs [扩容了哪个lv就更新哪个lv]

  • 删除PV : pvremove [要删除的pv]

  • 删除VG : vgremove [要删除的vg名]

  • 删除LV : lvremove [要删除的lv路径]

  • 创建LV快照 : lvcreate -L [指定快照大小] -s -n [快照名字] [需要做快照的那个lv路径]

  • 快照合并 : lvconvert --mergesnapshot [快照名字]

2|22.制作 PV, VG, LV 演示

  • 制作PV
🌞我们可以对一个分区做, 也可以对整个磁盘做, 我这先准备"sdc3, sde"两个设备
       [root@shawn ~]#pvcreate /dev/sdc3
       [root@shawn ~]#pvcreate /dev/sde
 
🌞使用"pvs"查看一下制作好的"pv"
       [root@shawn ~]#pvs
       PV          VG Fmt      Attr       PSize      PFree
      /dev/sdc3   lvm2       ---         100.00m   100.00m
      /dev/sde     lvm2       ---         5.00g        5.00g
 
 
  • 制作VG
🌞将两个"pv"合成一个"vg"
          [root@shawn ~]#vgcreate vg1 /dev/sdc3 /dev/sde
             Volume group "vg1" successfully created            # success代表成功
 
🌞查看 "vg"
          [root@shawn ~]#vgs
             VG    #PV #LV   #SN      Attr      VSize     VFree
             vg1    2       0      0          wz--n-  <5.09g   <5.09g
 
  • 制作LV
🌞制作一个"1G"的"lv", 一个"2G"的"lv"
      [root@shawn ~]#lvcreate -L 1G -n lv1_from_vg1 vg1
      [root@shawn ~]#lvcreate -L 2G -n lv2_from_vg1 vg1
 
 
🌞查看 "lv"
       [root@shawn ~]#lvs
           LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
           lv1_from_vg1 vg1 -wi-a----- 1.00g
           lv2_from_vg1 vg1 -wi-a----- 2.00g
 
 
 
  • 将其制作文件系统并挂载
🌞先创建两个文件
         [root@shawn ~]#mkdir /test3
         [root@shawn ~]#mkdir /test4
 
 
🌞将两个"lv"制作文件系统
        [root@shawn ~]#mkfs.xfs /dev/vg1/lv1_from_vg1
        [root@shawn ~]#mkfs.xfs /dev/vg1/lv2_from_vg1
 
🌞将其挂载
       [root@shawn ~]#mount /dev/vg1/lv1_from_vg1 /test3
       [root@shawn ~]#mount /dev/vg1/lv2_from_vg1 /test4
  • df -h命令查看一下

2|33.动态扩容演示

  • 演示场景
   🌞假设我们的"lv1"也就是"/test3"不够用了
   🌞我们可以从"vg1"里面动态的获取空间
   🌞那么假设"vg1"能提供的空间也不够了
   🌞那我们就只能加入新的"pv"
  • 新增 PV
🌞我们准备了一个新的分区"/dev/sdd1"
      [root@shawn ~]#pvcreate /dev/sdd1
 
 
🌞查看一下
     [root@shawn ~]#pvs
           PV               VG         Fmt      Attr    PSize      PFree
           /dev/sdc3    vg1         lvm2    a--     96.00m   96.00m
           /dev/sdd1                  lvm2    ---       5.00g      5.00g            #新增了这一块
            /dev/sde      vg1       lvm2    a--      <5.00g    <2.00g
  • 将 PV 加入到 vg1 中
🌞使用"vgcreate"
      [root@shawn ~]#vgextend    vg1    /dev/sdd1
 
 
 
🌞查看一下"vg1"的空间
      [root@shawn ~]#vgs
           VG      #PV      #LV    #SN   Attr      VSize       VFree
           vg1     3          2          0       wz--n-   <10.09g    <7.09g    #对比之前可以发现增加了"5G"
 
 
  • 将 lv1 扩充 4G的空间
🌞使用"lvextend"命令
        [root@shawn ~]#lvextend -L +4G -n /dev/vg1/lv1_from_vg1
 
🌞更新"xfs"系统文件
        [root@shawn ~]#xfs_growfs /dev/vg1/lv1_from_vg1
 
🌞查看一下"lv1"空间
       [root@shawn ~]#lvs
            LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
            lv1_from_vg1 vg1 -wi-ao---- 5.00g              #发现大了4G
            lv2_from_vg1 vg1 -wi-ao---- 2.00g

2|44.动态缩容和删除

  • 缩容
🌞提示: 企业一般不会缩容,而是直接删除,并且"xfs"文件系统不支持缩容
 
 
🌞命令: lvreduce -L [-]MGT /dev/VG_NAME/LV_NAME
 
 
 
  • 删除 LV
🌞删除之前需要先卸载挂载点
       [root@shawn ~]#umount /test4
       [root@shawn ~]#lvremove /dev/vg1/lv2_from_vg1
🌞后面有提示输入"y"
 
 
  • 删除 VG
      [root@shawn ~]#vgremove vg1
 
 
 
  • 删除 PV
🌞能删除的只能是不属于任何 "vg" 的 "pv"
        [root@shawn ~]#pvremove /dev/sde

2|55.快照演示

  • LVM提供了快照功能, 也就是给文件系统做一个备份

  • 采用的是写时复制, 就是创建时仅创建实际数据的inode的硬链接

  • 一旦改变了快照对应的原文件, 这时原始卷上将要改变的数据会在改变之前拷贝到快照里去

  • 快照实际上也是创建了一个逻辑卷, 只是该卷与普通逻辑卷属性有些不一样

  • LVM快照底层原理图

  • 强调点
     1. "VG"中需要存放快照本身的空间,不能被占满,快照一般设置与源"lv"大小相等
     2. 因为快照与源"LV"共享许多"PE",所以快照所在的 "VG" 必须与备份的 "LV"相同, 否则快照会失效
 
 
  • 制作快照并回复单个(少量)文件演示
🌞我们清理一下之前的环境,然后制作新的"PV,VG,LV",让实验看起来更明显
       [root@shawn ~]#pvs
          PV VG Fmt Attr PSize PFree
          /dev/sdc3 lvm2 --- 100.00m 100.00m
          /dev/sdd1 lvm2 --- 5.00g 5.00g
          /dev/sde lvm2 --- 5.00g 5.00g
 
🌞选"sdd1,sde"做"vg"
        [root@shawn ~]#vgcreate vg1 /dev/sde /dev/sdd1
        [root@shawn ~]#vgs
         VG    #PV      #LV     #SN    Attr        VSize    VFree
         vg1    2          0          0        wz--n-    9.99g    9.99g
 
🌞制作一个"lv1",并格式化与挂载,查看
         [root@shawn ~]#lvcreate -L 1G -n lv1_from_vg1 vg1
         [root@shawn ~]#mkfs.xfs /dev/vg1/lv1_from_vg1
         [root@shawn ~]#mount /dev/vg1/lv1_from_vg1 /test3
         [root@shawn ~]#df -h
          /dev/mapper/vg1-lv1_from_vg1 1014M 33M 982M 4% /test3
 
🌞在里面写一些文件,并查看
         [root@shawn ~]#echo 333 > /test3/1.txt
         [root@shawn ~]#echo 222 > /test3/2.txt
         [root@shawn ~]#echo 111 > /test3/3.txt
         [root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt
           333
           222
           111
 
🌞开始制作这时的一个快照(快照需要在同一个"vg"里面),并查看
        [root@shawn ~]#lvcreate -L 1G -s -n lv1_from_vg1_bak /dev/vg1/lv1_from_vg1
        [root@shawn ~]#lvs
         LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
         lv1_from_vg1 vg1 owi-aos--- 1.00g lv1_from_vg1_bak vg1 swi-a-s--- 1.00g
         lv1_from_vg1 0.00             #发现快照创建成功
 
 
🌞修改文件来模拟数据被篡改,并查看
        [root@shawn ~]#echo "This is change file" >> /test3/3.txt
        [root@shawn ~]#cat /test3/3.txt
          111
          This is change file
 
 
🌞恢复数据
        ⛅挂载快照: 快照在挂载的时候由于和原来的"LVM"是同一个"UUID"
        ⛅而"XFS"是不允许相同"UUID"的文件系统挂载,所以需要加选项"-0 nouuid"不使用uuid做识别]
        [root@shawn ~]#mount -o nouuid /dev/vg1/lv1_from_vg1_bak /test4
        [root@shawn ~]#ls /test4
        1.txt 2.txt 3.txt
        [root@shawn ~]#cat /test4/3.txt
        111            #确认是最初的那个亚子
 
 
🌞将其拷贝覆盖回去
        [root@shawn ~]#cp -rf /test4/3.txt /test3/3.txt
         cp:是否覆盖"/test3/3.txt"? y
        [root@shawn ~]#cat /test3/3.txt
          111 #回到了最初的亚子
  • 恢复文件的个数过多可以直接进行合并
🌞先查看原数据
         [root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt
         333
         222
         111
 
🌞创建快照"bak2",并查看
        [root@shawn ~]#lvcreate -L 1G -s -n lv1_from_vg1_bak2 /dev/vg1/lv1_from_vg1
        [root@shawn ~]#lvs
          LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
          lv1_from_vg1            vg1 owi-aos--- 1.00g
          lv1_from_vg1_bak    vg1 swi-aos--- 1.00g     lv1_from_vg1 0.20
          lv1_from_vg1_bak2  vg1 swi-a-s--- 1.00g      lv1_from_vg1 0.00
 
 
🌞修改原文件,并查看
        [root@shawn ~]#echo aaaaa >> /test3/1.txt
        [root@shawn ~]#echo aaaaa >> /test3/2.txt
        [root@shawn ~]#echo aaaaa >> /test3/3.txt
        [root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt
         333
          aaaaa
          222
          aaaaa
          111
          aaaaa
 
🌞先卸载原数据设备和快照,然后进行合并,快照会自动删除(一次性的合并)
          [root@shawn ~]#umount /test3
          [root@shawn ~]#umount /test4
          [root@shawn ~]#lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_bak2
          [root@shawn ~]#mount /dev/vg1/lv1_from_vg1 /test3
          [root@shawn ~]#ls /test3
            1.txt 2.txt 3.txt
          [root@shawn ~]#cat /test3/1.txt /test3/2.txt /test3/3.txt
            333
            222
            111     #发现回到了最初的亚子
 
🌞在看看"bak2"文件
           [root@shawn ~]#lvs LV VG Att LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
              lv1_from_vg1            vg1   owi-aos---    1.00g
              lv1_from_vg1_bak   vg1     swi-a-s---     1.00g     lv1_from_vg1 0.20                 #惊奇的发现2消失了

 


__EOF__

本文作者ଲ小何才露煎煎饺
本文链接https://www.cnblogs.com/zeny/articles/14443988.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ଲ小何才露煎煎饺  阅读(89)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示