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)降低到最小。
快速操作指导步骤:
- 创建物理卷(PV)所在的分区,设置分区格式为'Linux LVM',对应的十六进制码为8e(MBR)或8e00(GPT)。
- 创建物理卷(PV)。如果你只有一个硬盘,那么你最好只创建一个分区一个物理卷;如果你有多个硬盘,你可以创建多个分区,在每个分区上分别创建一个物理卷。
- 创建卷组(VG),并把所有物理卷加进卷组。
- 在卷组上创建逻辑卷(LV)。
- 格式化逻辑卷(LV)。
- 创建挂载点儿,并挂账格式化后的 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
- 以 LV 的容量来创建一个大小为 500M 的 LV
$ sudo lvscan
ACTIVE '/dev/sharkVG/sharkLV1' [500.00 MiB] inherit
- 再以 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 的任何操作,使用都是它的设备名
文件系统阶段
- 先检查 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。
- 格式化、挂载、测试 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
- 查看设备的文件类型
$ 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 有总够多的容量。
基本流程是:
-
VG 阶段:
- VG 需要有剩余的容量,
- 如果 VG 容量不足, 最简单的方法就是再加硬盘!然后将该硬盘使用上面讲过的 pvcreate 及 vgextend 增加到该 VG 内即可!
-
LV 阶段
- 向一个现有的 LV 中增加更多的可用容量:如果 VG 的剩余容量足够了, 此时就可以利用 lvresize 这个指令来将剩余容量加入到所需要增加的 LV 设备内!
- 新创建一个 LV:保证 VG 容量足够,直接用 lvcreate 命令创建即可。
-
文件系统阶段的放大:
我们的 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
- 检查 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
- 增加现有 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 # 注意这里文件系统的容量并没有增加
- 把扩容的 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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论