存储

Centos7 逻辑卷管理(LVM)

2019-11-21  本文已影响0人  Durant_fca1

Linux LVM

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

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

LVM基本组成

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 阶段涉及到的命令

开始创建 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 更详细的信息

  # 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

VG 阶段

涉及到的命令

创建 VG

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

下面是将 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]


LV 阶段

就是从 VG 这个大的虚拟磁盘中划逻辑卷轴 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 的名称!

$ 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

文件系统阶段

  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

  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\. 缩减文件系统
4\. 缩减 LV
5\. 缩减 VG

实操

   $ 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

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

设置自动扩展精简池

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

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

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

上一篇下一篇

猜你喜欢

热点阅读