Centos7 逻辑卷管理(LVM)

Linux LVM

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

image.png

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)。

  2. 创建物理卷(PV)。如果你只有一个硬盘,那么你最好只创建一个分区一个物理卷;如果你有多个硬盘,你可以创建多个分区,在每个分区上分别创建一个物理卷。

  3. 创建卷组(VG),并把所有物理卷加进卷组。

  4. 在卷组上创建逻辑卷(LV)。

  5. 格式化逻辑卷(LV)。

  6. 创建挂载点儿,并挂载格式化后的 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
$ lvcreate -L 500M -n data1 VG_minio
$ 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 有总够多的容量。

基本流程是:

补充: pv 阶段
新增一个磁盘,可以直接对磁盘进行 pv 操作

[root@mysqlrouter1 ~]# pvcreate /dev/vdc
  Physical volume "/dev/vdc" successfully created.

若果是对已有 PV 对应的磁盘进行扩容

[root@mysqlrouter1 ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vdb           253:16   0  110G  0 disk
├─apps-app    252:1    0   60G  0 lvm  /apps
└─apps-docker 252:0    0   29G  0 lvm  /var/lib/docker
[root@mysqlrouter1 ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree
  /dev/vdb   apps lvm2 a--  <100.00g <11.00g

执行 pvresize 设备名 即可

[root@mysqlrouter1 ~]# pvresize /dev/vdb
  Physical volume "/dev/vdb" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

[root@mysqlrouter1 ~]# pvs
  PV         VG   Fmt  Attr PSize    PFree
  /dev/vdb   apps lvm2 a--  <110.00g <21.00g
  /dev/vdc        lvm2 ---    10.00g  10.00g

  1. VG 阶段:

    • VG 需要有剩余的容量,
    • 如果 VG 容量不足, 最简单的方法就是再加硬盘!然后将该硬盘使用上面讲过的 pvcreate 及 vgextend 增加到该 VG 内即可!
      若果之前扩容的 PV 是对一个已有的PV磁盘进行扩容,非新增磁盘,并且这个PV是被包含到需要扩容的 VG,PV扩容完成后,VG会自动扩容
[root@mysqlrouter1 ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  apps   1   2   0 wz--n- <110.00g <21.00g

如果是对新增磁盘进行新建的 PV,VG需要进行扩容操作。


image.png
[root@mysqlrouter1 ~]# vgs
  VG   #PV #LV #SN Attr   VSize    VFree
  apps   1   2   0 wz--n- <110.00g <21.00g
[root@mysqlrouter1 ~]# vgextend apps /dev/vdc
  Volume group "apps" successfully extended
[root@mysqlrouter1 ~]# vgs
  VG   #PV #LV #SN Attr   VSize   VFree
  apps   2   2   0 wz--n- 119.99g 30.99g

  1. LV 阶段

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

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

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

Ext2/Ext3/Ext4 的扩容实操

现在目标是对现有的 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

resize2fs 逻辑卷

$ 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 的扩容

xfs_growfs 逻辑卷

$ 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)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,753评论 0 5
  • LVM逻辑卷配置过程详解 LVM原理 要想理解好LVM的原理,我们必须首先要掌握4个基本的逻辑卷概念。 ①PE(P...
    济南打工人阅读 633评论 0 0
  • 在上一篇随笔里面Linux学习之CentOS(二十六)--Linux磁盘管理:LVM逻辑卷的创建及使用详细讲解了L...
    大福技术阅读 1,489评论 0 4
  • 我做了件很错很错的事。 我瞒着我男朋友来到了我前男友的学校与他见面。 ……… ———1——— 烈日炎炎,经过两个小...
    琪琪巫阅读 564评论 4 5
  • 孤独而灿烂的神祇啊 我作证 灯光是最后离开的 那时候影子倾斜得像比萨塔 猫的歌喉和某人滋滋的呼声交互 镜子里有偷窥...
    木晓安阅读 206评论 0 0