美文网首页存储
Centos7 逻辑卷管理(LVM)

Centos7 逻辑卷管理(LVM)

作者: Durant_fca1 | 来源:发表于2019-11-21 16:44 被阅读0次

    Linux LVM

    https://www.jianshu.com/p/7870b150d772

    LVM 的全名是 Logical Volume Manager,中文可以翻译作逻辑卷轴管理员。

    LVM基本组成

    • LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。 通过LVM,你可以实现存储空间的抽象化并在上面建立虚拟分区(virtual partitions),可以更简便地扩大和缩小分区,可以增删分区时无需担心某个硬盘上没有足够的连续空间
    • LVM是用来方便管理的,不会提供额外的安全保证。 However, it sits nicely with the other two technologies we are using.

    LVM的基本组成块(building blocks)如下:

    1. 物理卷Physical volume(PV):

    我们实际的 partition (或 Disk) 需要调整系统识别码 (system ID) 成为 8e (LVM 的识别码),然后再经过 pvcreate 的指令将他转成 LVM 最底层的实体卷轴 (PV) ,之后才能够将这些 PV 加以利用! 调整 system ID 的方是就是通过 gdisk/fdisk !

    2. 卷组Volume group (VG):

    所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG 的东西就是啦!所以 VG 就是 LVM 组合起来的大磁盘!这么想就好了。 那么这个大磁盘最大可以到多少容量呢?这与下面要说明的 PE 以及 LVM 的格式版本有关喔~在默认的情况下, 使用 32位的 Linux 系统时,基本上 LV 最大仅能支持到 65534 个 PE 而已,若使用默认的 PE 为 4MB 的情况下, 最大容量则仅能达到约 256GB 而已~不过,这个问题在 64位的 Linux 系统上面已经不存在了!LV 几乎没有啥容量限制了!

    3. 物理区域Physical extent (PE):

    LVM 默认使用 4MB 的 PE 区块,而 LVM 的 LV 在 32 位系统上最多仅能含有 65534 个 PE (lvm1 的格式),因此默认的 LVM 的 LV 会有 4M*65534/(1024M/G)=256G(限于lvm1版本)。这个 PE 就有点像文件系统里面的 block 的性质一样。
    在使用 lvm2 的版本中,以及系统转为 64 位,因此这个限制已经不存在了。

    4. 逻辑卷Logical volume (LV):

    虚拟分区,由物理区域(physical extents)组成。
    最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化使用的类似分区的东西了!那么 LV 是否可以随意指定大小呢? 当然不可以!既然 PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此 LV 内的 PE 总数有关。 为了方便使用者利用 LVM 来管理其系统,因此 LV 的设备文件名通常指定为“ /dev/vgname/lvname ”的样式!


    LVM 的优点

    比起正常的硬盘分区管理,LVM更富于弹性:

    - 使用卷组(VG),使众多硬盘空间看起来像一个大硬盘。
    - 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区。
    - 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小。
    - 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。
    - 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。
      LVM上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。
    - 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。
    - 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。
    
    

    快速操作指导步骤:

    1. 创建物理卷(PV)所在的分区,设置分区格式为'Linux LVM',对应的十六进制码为8e(MBR)或8e00(GPT)。
    1. 创建物理卷(PV)。如果你只有一个硬盘,那么你最好只创建一个分区一个物理卷;如果你有多个硬盘,你可以创建多个分区,在每个分区上分别创建一个物理卷。
    1. 创建卷组(VG),并把所有物理卷加进卷组。
    1. 在卷组上创建逻辑卷(LV)。
    1. 格式化逻辑卷(LV)。
    1. 创建挂载点儿,并挂账格式化后的 LV

    具体实施:

    磁盘阶段(准备 PV)

    PV 可以是整块物理磁盘、物理磁盘的一个分区或者是回环文件

    检查磁盘设备

    可通过以下命令列出可被用作物理卷的设备:

    $ sudo  lvmdiskscan
    
    

    警告: 请确认你对正确的设备进行操作,否则会导致文件丢失!

    使用分区工具把分区类型改为 8e 或者 8e00,假如是整块硬盘就不用了

    PV 阶段涉及到的命令

    • pvcreate :将实体 partition 创建成为 PV ;
    • pvscan : 搜寻目前系统里面任何具有 PV 的磁盘;
    • pvdisplay :显示出目前系统上面的 PV 状态;
    • pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性,变为普通分区。

    开始创建 PV

      $ sudo pvcreate /dev/sdd{1,2}   # 对磁盘的2个分区创建 PV 属性
      Physical volume "/dev/sdd1" successfully created
      Physical volume "/dev/sdd2" successfully created
      $ sudo pvscan  # 查看信息
      PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
      PV /dev/sdd1                   lvm2 [1.01 GiB]
      PV /dev/sdd2                   lvm2 [1011.91 MiB]
      Total: 3 [21.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 2 [2.00 GiB]
      $ sudo pvcreate /dev/sdc      # 对一整块磁盘创建 PV 属性
      Physical volume "/dev/sdc" successfully created
      $ sudo pvscan
      PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
      PV /dev/sdc                    lvm2 [2.00 GiB]
      PV /dev/sdd1                   lvm2 [1.01 GiB]
      PV /dev/sdd2                   lvm2 [1011.91 MiB]
      Total: 4 [23.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 3 [4.00 GiB]
    
    
    • 这就分别显示每个 PV 的信息与系统所有 PV 的信息。尤其最后一行,显示的是:

      整体 PV 的量 / 已经被使用到 VG 的 PV 量 / 剩余的 PV 量

    显示每个 PV 更详细的信息

      # pvdisplay /dev/sdc
      "/dev/sdc" is a new physical volume of "2.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdc   == 实际的磁盘设备名或者 分区 设备名
      VG Name                          == 逻辑卷组名 因为尚未分配出去,所以空白!     
      PV Size               2.00 GiB   == 整个 PV 容量大小
      Allocatable           NO         == 是否已被分配出去(分配给某一个 VG)
      PE Size               0          == 在此 PV 内的 PE 大小
      Total PE              0          == 共分区出几个 PE
      Free PE               0          == 没被 LV 用掉的 PE
      Allocated PE          0          == 尚可分配出去的 PE 数量
      PV UUID               gHCfy1-DpBw-89co-Vtja-w3R5-jnt1-gnwsR5
    
    
    • 由于 PE 是在创建 VG 时才给予的参数,因此在这里看到的 PV 里头的 PE 都会是 0
    • 而且也没有多余的 PE 可供分配 (allocatable)

    VG 阶段

    涉及到的命令

    • vgcreate :就是主要创建 VG 的指令!他的参数比较多,等一下介绍。
    • vgscan :搜寻系统上面是否有 VG 存在?
    • vgdisplay :显示目前系统上面的 VG 状态;
    • vgextend :在 VG 内增加额外的 PV ;
    • vgreduce :在 VG 内移除 PV;
    • vgchange :设置 VG 是否启动 (active),通常于当多个节点共享一个 VG 时,节点之间切换使用 VG;
    • vgremove :删除一个 VG !

    创建 VG

    # vgcreate [-s N[mgt]] VG名称 PV名称
    选项与参数:
    -s :后面接 PE 的大小 (size) ,N 是数字, 单位可以是 m, g, t (大小写均可)
    
    
    • VG 名称自定义,但不能太随便

    下面是将 PV /dev/sdd1 分配给名称为 sharkvg 的VG, 并且指定 PE 大小为 16 M

     $ sudo vgcreate -s 16M sharkVG /dev/sdd1
    
       Volume group "sharkVG" successfully created
    
    

    查看 VG

    $ sudo vgscan
    
      Reading all physical volumes.  This may take a while...
      Found volume group "sharkVG" using metadata type lvm2    == 我们刚才创建的
      Found volume group "vg_ansible" using metadata type lvm2 == 系统安装是创建的
    
    $ sudo pvscan
      PV /dev/sdd1   VG sharkVG      lvm2 [1.00 GiB / 1.00 GiB free]
      PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
      PV /dev/sdc                    lvm2 [2.00 GiB]
      PV /dev/sdd2                   lvm2 [1011.91 MiB]
      Total: 4 [23.50 GiB] / in use: 2 [20.51 GiB] / in no VG: 2 [2.99 GiB]
      == 总共 4 个 23.5 G     已用   2个 20.51G      没有在用的 2 个 2.99 G
    
    $ sudo vgdisplay
    
      --- Volume group ---
      VG Name               sharkVG         == VG 名称 
      System ID
      Format                lvm2            == LVM 版本
      Metadata Areas        1
      Metadata Sequence No  1
      VG Access             read/write      == 权限
      VG Status             resizable       == 状态 
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               1.00 GiB        == VG 总大小
      PE Size               16.00 MiB       == 当前 VG 中的 PE 大小
      Total PE              64              == 当前 VG 中 PE 的总数量
      Alloc PE / Size       0 / 0
      Free  PE / Size       64 / 1.00 GiB   == 可以分配给 LV 的 PE 数量/总容量
      VG UUID               9kqKy6-nA33-yznv-cRV9-2O0q-qZwi-jS2vmT
    
    

    向 VG 增加 PV

    把 PV /dev/sdd2 添加到 VG sharkVG 中

    $ sudo vgextend sharkVG /dev/sdd2
      Volume group "sharkVG" successfully extended
    $ sudo pvscan
      PV /dev/sdd1   VG sharkVG      lvm2 [1.00 GiB / 1.00 GiB free]
      PV /dev/sdd2   VG sharkVG      lvm2 [1008.00 MiB / 1008.00 MiB free]
      PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
      PV /dev/sdc                    lvm2 [2.00 GiB]
      Total: 4 [23.49 GiB] / in use: 3 [21.49 GiB] / in no VG: 1 [2.00 GiB]
    
    

    可以再次查看 sharkVG 的详细信息

    $ sudo  vgdisplay sharkVG
    --- Volume group ---
    VG Name               sharkVG
    System ID
    Format                lvm2
    Metadata Areas        2
    Metadata Sequence No  4
    VG Access             read/write
    VG Status             resizable
    MAX LV                0
    Cur LV                0
    Open LV               0
    Max PV                0
    Cur PV                2
    Act PV                2
    VG Size               1.98 GiB      == 容量有增加
    PE Size               16.00 MiB     
    Total PE              127           == PE 的数量也有增加
    Alloc PE / Size       0 / 0
    Free  PE / Size       127 / 1.98 GiB
    VG UUID               9kqKy6-nA33-yznv-cRV9-2O0q-qZwi-jS2vmT
    
    

    缩减 VG

    也就是从 VG 内移除某PV一个或多个 PV

    ==要首先保证被移出的 PV 中没有数据在使用,可以通过 pvs 查看 PV 的容量使用情况来判断是否有数据使用==

    ==假如有需要使用 pvmove 命令把数据移动到其他的 PV中==

    $ sudo vgreduce sharkVG /dev/sdd2
      Removed "/dev/sdd2" from volume group "sharkVG"
    $ sudo pvscan
      PV /dev/sdd1   VG sharkVG      lvm2 [1.00 GiB / 1.00 GiB free]
      PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
      PV /dev/sdc                    lvm2 [2.00 GiB]
      PV /dev/sdd2                   lvm2 [1011.91 MiB]
      Total: 4 [23.50 GiB] / in use: 2 [20.51 GiB] / in no VG: 2 [2.99 GiB]
    
    

    删除 VG

    $ sudo vgremove sharkVG
      Volume group "sharkVG" successfully removed
    $ sudo vgscan
      Reading all physical volumes.  This may take a while...
      Found volume group "vg_ansible" using metadata type lvm2 # 只剩余系统安装时创建的
    
    $ sudo pvscan
      PV /dev/sda2   VG vg_ansible   lvm2 [19.51 GiB / 0    free]
      PV /dev/sdc                    lvm2 [2.00 GiB]
      PV /dev/sdd1                   lvm2 [1.01 GiB]
      PV /dev/sdd2                   lvm2 [1011.91 MiB]
      Total: 4 [23.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 3 [4.00 GiB]
    
    
    • 删除 VG 时,即使 VG 有 PV 存在,只要此 VG 没有在使用,就可以删除,在此 VG 中的 PV 会自动恢复到没有被分配的状态。

    LV 阶段

    就是从 VG 这个大的虚拟磁盘中划逻辑卷轴 LV(也就是虚拟分区),对划分出来的 LV 进行格式化后再挂载,就可以想使用普通分区一样在上面存储数据了

    涉及到的命令:

    • lvcreate :创建 LV 啦!
    • lvscan :查询系统上面的 LV ;
    • lvdisplay :显示系统上面的 LV 状态啊!
    • lvextend :在 LV 里面增加容量!
    • lvreduce :在 LV 里面减少容量;
    • lvremove :删除一个 LV,就像删除一个分区!
    • lvresize :对 LV 进行容量大小的调整!
    • lvchange : 改变某一个 LV 的状态 (available/NOT available),通常用于多节点共享一个 LV 时,对 LV 的切换!
    $ sudo lvcreate [-L N[mgt]] [-n LV名称] VG名称
    $ sudo lvcreate [-l N] [-n LV名称] VG名称
    选项与参数:
    -L  :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为一个 PE 的大小,
          因此这个数量必须要是一个 PE 大小 的倍数,若不相符,系统会自行计算最相近的容量。
    -l  :后面可以接 PE 的“个数”,而不是容量。若要这么做,得要自行计算 PE 数。
    -n  :后面接的就是 LV 的名称!
    
    
    • 由于我们刚从删除了 VG,所以在创建 LV 之前,我们重新创建 VG, 并把 /dev/sdd1 和 /dev/sdd2 添加到 新创建的 VG 中
    $ sudo vgcreate sharkVG /dev/sdd{1,2}
      Volume group "sharkVG" successfully created
    
    

    创建 LV

    1. 以 LV 的容量来创建一个大小为 500M 的 LV
    $ sudo lvscan
      ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit
    
    
    1. 再以 LV 中 PE 的总个数来创建一个大小为 300M 的 LV
      由于这次重新创建 VG 时,并没有指定 PE 的大小,所以 PE 的大小是默认的 4M。 创建 300M 的 LV,需要利用 PE 的大小计算一下: 300 M / 4M = 75 个 PE
    $ sudo lvcreate -l 75  -n sharkLV2 sharkVG
      Logical volume "sharkLV2" created
    $ sudo lvscan
      ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit
      ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit  # 新增加的 300M 的 LV
    
    

    查看其中一个 LV 的详细信息

    
    $ sudo lvscan
      ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit
      ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit
      ACTIVE            '/dev/vg_ansible/lv_root' [17.57 GiB] inherit
      ACTIVE            '/dev/vg_ansible/lv_swap' [1.94 GiB] inherit
    $ sudo lvdisplay /dev/sharkVG/sharkLV1
      --- Logical volume ---
      LV Path                /dev/sharkVG/sharkLV1     == LV 的完整设备名
      LV Name                sharkLV1
      VG Name                sharkVG
      LV UUID                p1ViVB-EZ2w-7ELA-diU2-5RjP-xQjV-THAHQE
      LV Write Access        read/write
      LV Creation host, time ansible, 2017-09-23 23:34:02 +0800
      LV Status              available
      # open                 0
      LV Size                500.00 MiB                == 总容量
      Current LE             125
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:2
    
    
    • 接下来就可以对 LV 进行进一步的操作了, 指定注意的是,以后对 LV 的任何操作,使用都是它的设备名

    文件系统阶段

    1. 先检查 VG 的容量
    $ sudo  vgdisplay sharkVG
      --- Volume group ---
      VG Name               sharkVG
      System ID
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  3
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               0
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               1.99 GiB            == 总大小
      PE Size               4.00 MiB
      Total PE              510
      Alloc PE / Size       200 / 800.00 MiB
      Free  PE / Size       310 / 1.21 GiB      == 剩余 310 个 PE, 容量剩余 1.21 G
      VG UUID               ohgPcA-lBiK-JPXK-HLwg-CKRE-7ZnF-lugxkw
    
    
    • 从上面信息看到 VG 中的容量已经本占用了一部分了,可我们并没有去使用。原因是,当在 VG 中划分 LV 时,LVM 自身会使用一些空间来保存一下信息,用于记录和管理这个 VG 和 它下面的 LV。
    1. 格式化、挂载、测试 LV
    $ sudo mkfs.ext4 /dev/sharkVG/sharkLV1         == 注意是 LV 的设备名
    $ sudo mkdir -p /src/lvm
    $ sudo mount /dev/sharkVG/sharkLV1 /src/lvm    == 注意是 LV 的设备名
    $ sudo df -Th /src/lvm
    Filesystem           Type  Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkLV1
                         ext4  477M  2.3M  449M   1% /src/lvm
    $ sudo cp -a /etc  /src/lvm
    $ sudo df -Th /src/lvm
    Filesystem           Type  Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkLV1
                         ext4  477M   31M  421M   7% /src/lvm
    
    
    1. 查看设备的文件类型
    $ sudo blkid /dev/sharkVG/sharkLV1
    /dev/sharkVG/sharkLV1: UUID="94f5b2a2-eb69-470e-9a1a-2a46fade8c71" TYPE="ext4"
    
    

    blkid 命令可以查看一个设备的文件系统类型,不论是否挂载均可


    LVM 的扩容

    当需要更多的 LV,或是在一个 LV 中需要更多的容量时,就需要对 VG 或 LV 进行扩容

    由于 LV 的容量是从 VG 中划分出来的,所以不论是需要一个新的 LV, 还是需要对现有的 LV 进行扩容,都需要保证 VG 有总够多的容量。

    基本流程是:

    1. VG 阶段:

      • VG 需要有剩余的容量,
      • 如果 VG 容量不足, 最简单的方法就是再加硬盘!然后将该硬盘使用上面讲过的 pvcreate 及 vgextend 增加到该 VG 内即可!
    2. LV 阶段

      • 向一个现有的 LV 中增加更多的可用容量:如果 VG 的剩余容量足够了, 此时就可以利用 lvresize 这个指令来将剩余容量加入到所需要增加的 LV 设备内!
      • 新创建一个 LV:保证 VG 容量足够,直接用 lvcreate 命令创建即可。
    3. 文件系统阶段的放大:

      我们的 Linux 实际使用的其实不是 LV !而是 LV 这个设备内的文件系统!
      目前在 Linux 环境下,可以放大的文件系统有 XFS 以及 EXT 家族!
      至于缩小仅有 EXT 家族,目前 XFS 文件系统并不支持文件系统的容量缩小喔!要注意!要注意!XFS 放大文件系统通过简单的 xfs_growfs 指令即可!

      • ==其中最后一个步骤最重要! 整个文件系统在最初格式化的时候就创建了 inode/block/superblock 等信息,要改变这些信息是很难的! 不过因为文件系统格式化的时候创建的是多个 block group ,因此我们可以通过在文件系统当中增加 block group 的方式来增减文件系统的量!而增减 block group 就是利用 xfs_growfs 啰!所以最后一步是针对文件系统来处理的, 前面几步则是针对 LVM 的实际容量大小!==
      • ==因此,严格说起来,放大文件系统并不是没有进行“格式化”喔!放大文件系统时,格式化的位置在于该设备后来新增的部份,设备的前面已经存在的文件系统则没有变化。 而新增的格式化过的数据,再反馈回原本的 supberblock 这样而已!==

    实操

    现在目标是对现有的 LV /dev/sarkVG/sharkLV1 的容量增加 500M,使其总容量为 1000M

    1. 检查 LV,VG
    $ sudo lvscan
      ACTIVE            '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit  == 增加前共 500M
      ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit
      ACTIVE            '/dev/vg_ansible/lv_root' [17.57 GiB] inherit
      ACTIVE            '/dev/vg_ansible/lv_swap' [1.94 GiB] inherit
    $ sudo vgdisplay sharkVG
      --- Volume group ---
      VG Name               sharkVG
      System ID
      Format                lvm2
      Metadata Areas        2
      Metadata Sequence No  3
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               1
      Max PV                0
      Cur PV                2
      Act PV                2
      VG Size               1.99 GiB
      PE Size               4.00 MiB
      Total PE              510
      Alloc PE / Size       200 / 800.00 MiB
      Free  PE / Size       310 / 1.21 GiB      == 目前 VG 的确还有可用的空间 1.21 G
      VG UUID               ohgPcA-lBiK-JPXK-HLwg-CKRE-7ZnF-lugxkw
    
    
    1. 增加现有 LV 的容量
    $ sudo lvresize -L +-N[mgt] LV的设备名
    $ sudo  lvresize -l   +-PE个数     LV的设备名
    选项和参数:
    lvresize 的语法很简单,基本上 -l 或 -L 来增加,其他参数和 lvcreate 基本一样!
    若要增加则使用 + ,若要减少则使用 - !( + 是增加多少,不加 +/- 是结果为多少)
    详细的选项请参考 man lvresize
    
    

    开始扩容 LV

    $ sudo lvresize -L +500m /dev/sharkVG/sharkLV1
      Size of logical volume sharkVG/sharkLV1 changed from 500.00 MiB (125 extents) to 1000.00 MiB (250 extents).
      Logical volume sharkLV1 successfully resized
    
    $ sudo lvscan
      ACTIVE            '/dev/sharkVG/sharkLV1' [1000.00 MiB] inherit  == 总容量已增加
      ACTIVE            '/dev/sharkVG/sharkLV2' [300.00 MiB] inherit
      ACTIVE            '/dev/vg_ansible/lv_root' [17.57 GiB] inherit
      ACTIVE            '/dev/vg_ansible/lv_swap' [1.94 GiB] inherit
    $ sudo lvs
      LV       VG         Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      sharkLV1 sharkVG    -wi-ao---- 1000.00m   # 已增加到 1000M
      sharkLV2 sharkVG    -wi-a-----  300.00m
      lv_root  vg_ansible -wi-ao----   17.57g
      lv_swap  vg_ansible -wi-ao----    1.94g
    
    

    查看文件系统

    $ sudo df -lhT /src/lvm
    Filesystem           Type  Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkLV1
                         ext4  477M   30M  423M   7% /src/lvm  # 注意这里文件系统的容量并没有增加
    
    
    1. 把扩容的 LV 容量增加到实际的文件系统中

    EXT2,3,4

    $ sudo blkid /dev/sharkVG/sharkLV1
    /dev/sharkVG/sharkLV1: UUID="94f5b2a2-eb69-470e-9a1a-2a46fade8c71" TYPE="ext4"
    $ sudo resize2fs   /dev/sharkVG/sharkLV1                      == 扩展文件系统 
    resize2fs 1.41.12 (17-May-2010)
    Filesystem at /dev/sharkVG/sharkLV1 is mounted on /src/lvm; on-line resizing required
    old desc_blocks = 2, new_desc_blocks = 4
    Performing an on-line resize of /dev/sharkVG/sharkLV1 to 1024000 (1k) blocks.
    The filesystem on /dev/sharkVG/sharkLV1 is now 1024000 blocks long.
    
    $ sudo df -lh /src/lvm
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkLV1
                          961M   30M  882M   4% /src/lvm        == 扩展成功
    $ sudo tail -5 /src/lvm/etc/inittab                           == 文件系统正常
    #   4 - unused
    #   5 - X11
    #   6 - reboot (Do NOT set initdefault to this)
    #
    id:3:initdefault:
    
    

    XFS

    # 之前已经创建好 LV
    $ sudo mkfs.xfs /dev/sharkVG/sharkLV2                      == 格式化为 xfs 文件系统
    $ sudo blkid /dev/sharkVG/sharkLV2
    /dev/sharkVG/sharkLV2: UUID="8210f6ae-9af6-4576-8a3b-e08f2fdf0f24" TYPE="xfs"
    $ sudo mkdir /src/lvm/xfs
    $ sudo mount /dev/mapper/sharkVG-sharkLV2 /src/lvm/xfs
    $ sudo cp /etc/inittab /src/lvm/xfs
    $ sudo tail -3 /src/lvm/xfs/inittab
    #   6 - reboot (Do NOT set initdefault to this)
    #
    id:3:initdefault:
    $ sudo vgs
      VG         #PV #LV #SN Attr   VSize  VFree
      sharkVG      2   2   0 wz--n-  1.99g 740.00m
      vg_ansible   1   2   0 wz--n- 19.51g      0
    $ sudo lvs
      LV       VG         Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      sharkLV1 sharkVG    -wi-ao---- 1000.00m
      sharkLV2 sharkVG    -wi-ao----  300.00m
      lv_root  vg_ansible -wi-ao----   17.57g
      lv_swap  vg_ansible -wi-ao----    1.94g
    $ sudo lvextend -L 500M /dev/sharkVG/sharkLV2                    == 扩展 LV
      Size of logical volume sharkVG/sharkLV2 changed from 300.00 MiB (75 extents) to 500.00 MiB (125 extents).
      Logical volume sharkLV2 successfully resized
    $ sudo lvs
      LV       VG         Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      sharkLV1 sharkVG    -wi-ao---- 1000.00m
      sharkLV2 sharkVG    -wi-ao----  500.00m                     == 扩展 LV 成功
      lv_root  vg_ansible -wi-ao----   17.57g
      lv_swap  vg_ansible -wi-ao----    1.94g
    $ sudo df -lh /src/lvm/xfs
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkLV2
                          296M   16M  281M   6% /src/lvm/xfs
    $ sudo xfs_growfs /src/lvm/xfs                                    == 在线扩展文件系统
    meta-data=/dev/mapper/sharkVG-sharkLV2 isize=256    agcount=4, agsize=19200 blks
             =                       sectsz=512   attr=2, projid32bit=0
    data     =                       bsize=4096   blocks=76800, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0
    log      =internal               bsize=4096   blocks=1200, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    data blocks changed from 76800 to 128000
    $ sudo df -lh /src/lvm/xfs
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkLV2
                          496M   16M  481M   4% /src/lvm/xfs        == 扩展成功
    $ sudo tail -3 /src/lvm/xfs/inittab                               == 检查文件正常
    #   6 - reboot (Do NOT set initdefault to this)
    #
    id:3:initdefault:   
    
    

    LVM 的缩减

    • 注意:

      对逻辑卷缩减,是有分险的,必须做的话,应遵循以下原则

      ==1. 不能在线缩减,先卸载文件系统==

      ==2. 确保缩减后的容量,仍能存储下原有的所有数据==

      ==3. 在缩减之前需要先进行强制性文件系统检查,以保证文件系统处于一致性状态==

    基本流程和扩展相反

    1\. 卸载文件系统
    2\. 强制性检查文件系统
    3\. 缩减文件系统
    4\. 缩减 LV
    5\. 缩减 VG
    
    

    实操

    • 把 /src/lvm 缩减到 200M
       $ sudo df -lh
          Filesystem            Size  Used Avail Use% Mounted on
          /dev/mapper/vg_ansible-lv_root
                               18G  3.5G   13G  22% /
          tmpfs                 238M     0  238M   0% /dev/shm
          /dev/sda1             477M   29M  424M   7% /boot
          /dev/mapper/sharkVG-sharkLV1
                              961M   30M  882M   4% /src/lvm
       $ sudo umount /src/lvm
       $ sudo e2fsck -f /dev/sharkVG/sharkLV1
          e2fsck 1.41.12 (17-May-2010)
          Pass 1: Checking inodes, blocks, and sizes
          Pass 2: Checking directory structure
          Pass 3: Checking directory connectivity
          Pass 4: Checking reference counts
          Pass 5: Checking group summary information
          /dev/sharkVG/sharkLV1: 1895/254000 files (0.2% non-contiguous), 70365/1024000 blocks
       $ sudo lvreduce -L 200M /dev/sharkVG/sharkLV1
          WARNING: Reducing active logical volume to 200.00 MiB
          THIS MAY DESTROY YOUR DATA (filesystem etc.)
          Do you really want to reduce sharkLV1? [y/n]: y
          Size of logical volume sharkVG/sharkLV1 changed from 252.00 MiB (63 extents) to 200.00 MiB (50 extents).
          Logical volume sharkLV1 successfully resized
       $ sudo lvs
          LV       VG         Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
          sharkLV1 sharkVG    -wi-a----- 200.00m           ==  缩减容量为 200M
          sharkLV2 sharkVG    -wi-a----- 400.00m
          lv_root  vg_ansible -wi-ao----  17.57g
          lv_swap  vg_ansible -wi-ao----   1.94g
       $ sudo mount /dev/sharkVG/sharkLV1 /src/lvm
       $ sudo tail -3 /src/lvm/etc/inittab                  == 检查文件正常
        #   6 - reboot (Do NOT set initdefault to this)
        #
        id:3:initdefault:
    
    

    LVM 构建自动扩展的文件系统 (thin pool)

    最新的 LVM 版本支持写时复制技术,就是可以建一个 LV, 可以随意指定其容量的大小,但是并会不占用实际的存储空间,当程序向这个 LV 中写数据时,才会使用实际的存储空间,写入多少容量的数据,就占用多少实际的存储空间。也就是说可以创建一个比真实的磁盘空间要大的多的逻辑卷,就像网盘一样,说是给你了 2T 空间,而实际一定不会一次性,就给你实际的 2T 空间。
    这个 LV 被称为精简卷,精简卷是需要建立在一个存储池中的,也称为精简池。

    精简池在需要的时候可以动态的扩展其容量,在配置文件中定义相应的参数,可以实现相对应的阈值;比如可以定义精简池的容量使用达到 75% 时,就自动增加目前精简池容量的 20%。

    集群中的节点间不支持精简卷。该精简池及其所有精简卷只能以独占方式在一个集群节点中激活。
    
    

    创建精简池/精简卷

    现在从 VG 中创建一个精简池

    ➜  ~ vgs sharkVG
      VG      #PV #LV #SN Attr   VSize VFree
      sharkVG   2   3   0 wz--n- 1.99g 1.11g
    ➜  ~ lvcreate -L 500M -T sharkVG/sharkpool
      Logical volume "lvol0" created
      Logical volume "sharkpool" created
    ➜  ~
    
    

    ==创建 thin pool 时,用 -T 选项,此选项后面不用跟任何参数,他会自动判断你是要创建精简池,还是要从精简池中创建精简卷==

    观察精简池

    ➜  ~ lvdisplay   /dev/sharkVG/sharkpool
      --- Logical volume ---
      LV Name                sharkpool
      VG Name                sharkVG
      LV UUID                0T8vKJ-Ex3h-Rydx-Yd1W-VVYI-wMfQ-MHPhSa
      LV Write Access        read/write
      LV Creation host, time ansible, 2017-09-30 18:19:16 +0800
      LV Pool metadata       sharkpool_tmeta
      LV Pool data           sharkpool_tdata
      LV Status              available
      # open                 1
      LV Size                500.00 MiB                == 此 thin pool 总共可以分配的容量
      Allocated pool data    0.00%                     == 已经分配给精简卷的百分比
      Allocated metadata     0.88%                     == 已经分配出去的元数据的百分比
      Current LE             125
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:10
    ➜  ~ lvs /dev/sharkVG/sharkpool
      LV        VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      sharkpool sharkVG twi-a-tz-- 500.00m             0.00   0.88  
    
    

    在 精简池中创建一个精简卷,虚拟大小为 10G

    ➜  ~ lvcreate -V 10G -T sharkVG/sharkpool  -n sharkthin1
      Logical volume "sharkthin1" created
    ➜  ~ lvs /dev/sharkVG/sharkpool   /dev/sharkVG/sharkthin1
      LV         VG      Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
      sharkpool  sharkVG twi-a-tz-- 500.00m                  0.00   0.98
      sharkthin1 sharkVG Vwi-a-tz--  10.00g sharkpool        0.00
    
    

    创建文件系统

    ➜  ~ mkfs.xfs /dev/sharkVG/sharkthin1
    meta-data=/dev/sharkVG/sharkthin1 isize=256    agcount=16, agsize=163824 blks
             =                       sectsz=512   attr=2, projid32bit=0
    data     =                       bsize=4096   blocks=2621184, imaxpct=25
             =                       sunit=16     swidth=16 blks
    naming   =version 2              bsize=4096   ascii-ci=0
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=16 blks, lazy-count=1
    realtime =none
    ➜  ~ lvs /dev/sharkVG/sharkpool   /dev/sharkVG/sharkthin1
      LV         VG      Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
      sharkpool  sharkVG twi-a-tz-- 500.00m                  2.25   0.98
      sharkthin1 sharkVG Vwi-a-tz--  10.00g sharkpool        0.11
    ➜  ~ df -ThP /src/lvm/thin
    Filesystem                     Type  Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkthin1 xfs    10G   33M   10G   1% /src/lvm/thin  
    
    

    测试容量

    创建一个 200MB 的文件,来测试观察一下精简池和精简卷的容量使用变化。

    ➜  ~ df -ThP /src/lvm/thin
    Filesystem                     Type  Size  Used Avail Use% Mounted on
    /dev/mapper/sharkVG-sharkthin1 xfs    10G  233M  9.8G   3% /src/lvm/thin
    ➜  ~ lvs /dev/sharkVG/sharkpool   /dev/sharkVG/sharkthin1
      LV         VG      Attr       LSize   Pool      Origin Data%  Meta%  Move Log Cpy%Sync Convert
      sharkpool  sharkVG twi-a-tz-- 500.00m                  42.25  3.52
      sharkthin1 sharkVG Vwi-aotz--  10.00g sharkpool        2.06
    
    
    • 从上面的信息可以看出, 200M 是精简卷 10G 容量的 2% 左右, 但却是精简池实际容量 500M 的 40% 左右。
    • 这就是实际用多少,就分配实际的容量多少。

    当精简池的实际容量被使用到一定程度时,我们可以设置让其自动扩容,这样自然就会把精简卷的空间扩大。

    设置自动扩展精简池

    ==如何把有数据的一块物理硬盘从 lv 中移除,并把它还原为最初的状态?==

    [图片上传失败...(image-4900e6-1564804080066)]

    作者:千锋云计算好程序员shark
    链接:https://www.jianshu.com/p/7870b150d772
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

        本文标题:Centos7 逻辑卷管理(LVM)

        本文链接:https://www.haomeiwen.com/subject/dpmtwctx.html