Linux磁盘管理LVM使用手册

一、LVM简介

LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制.Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。

二、基本术语

  • 物理卷(Physical Volume,PV):指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元;
  • 卷组(Volume Group,VG):类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷);
  • 逻辑卷(Logical Volume,LV):类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。

从上面的定义我们可以了解到:逻辑卷(LV)是建立在卷组(VG)上的,而卷组(VG)则是建立在物理卷(PV)上的。
从中还可以作更深一层的理解:LVM的可伸缩性无非是建立在卷组(VG)和逻辑卷(LV)的可伸缩性的基础上的:
- 只要存在尚未使用的磁盘或者分区,就可以动态的扩展卷组(VG)的大小;
- 只要卷组(VG)中存在尚未分配的空间,就可以动态的扩展逻辑卷的大小。
从以上二点出发就可以达到动态调整分区大小的目的。

因为本文中很多的命令都是以上述术语的缩写开头,因此了解各个缩写对命令的记忆和使用是非常有帮助的。

三、基本命令

示例中的 vg1lv1 分别为物理卷组名逻辑卷名,可自行替换成任意名称。

分类 命令 说明 示例
PV pvcreate 创建物理卷 pvcreate /dev/sdb1
PV pvdisplay 显示已创建的物理卷的详细信息  
PV pvs 显示已创建的物理卷的汇总信息  
PV pvremove 删除物理卷 pvremove /dev/sdb1
VG vgcreate 创建卷组 pvcreate vg1 /dev/sdb1 /dev/sdb2 …
VG vgdisplay 显示已创建的卷组的详细信息  
VG vgs 显示已创建的卷组的汇总信息  
VG vgextend 扩展卷组 vgextend vg1 /dev/sdb3 …
VG vgreduce 收缩卷组 vgreduce vg1 /dev/sdb5
VG vgremove 删除卷组 vgremove vg1
LV lvcreate 创建逻辑卷 lvcreate -L 1000M -n lv1 vg1
LV lvdisplay 显示已创建的逻辑卷的详细信息  
LV lvs 显示已创建的逻辑卷的汇总信息  
LV lvresize 重设逻辑卷大小 lvresize -L 1000M /dev/vg1/lv1
LV resize2fs 更新逻辑卷信息(ext4) resize2fs /dev/vg1/lv1
LV lvremove 删除逻辑卷 lvremove /dev/vg1/lv1
LV xfs_growfs 更新逻辑卷信息(xfs) xfs_growfs /dev/vg1/lv1
LV e2fsck 检查逻辑卷错误(ext4) e2fsck -f /dev/vg1/lv1

四、实验的操作环境

  • 虚拟机:VirtualBox 5.6.2
  • 操作系统: 7.4
  • 磁盘:二块:一块安装操作系统(/dev/sda),容量为20GB; 另一块用于进行lvm分区操作(/dev/sdb),容量为10GB
  • 因为CentOS 7.4默认没有安装支持上述命令的软件包,因此需要提前安装lvm2软件包,具体命令为:yum install -y lvm2

五、创建LVM

在这里我带着大家从一块全新的磁盘开始,一步步创建LVM分区。

流程

先介绍一下流程,以便大家从总体上对创建LVM有一个了解。
1. 对新磁盘进行分区操作(fdisk);
2. 逐一变更分区类型为Linux LVM(Hex代码为:8e);
3. 针对每个分区创建物理卷(pvcreate);
4. 创建卷组(vgcreate);
5. 创建逻辑卷(lvcreate);
6. 格式化(mkfs.ext4/mkfs.xfs),并挂载(mount)。

(一)、磁盘分区及分区类型更改

使用命令fdisk对需要进行LVM操作的磁盘/dev/sdb进行分区

fdisk /dev/sdb
  • 1

输入n进行分区,一共分五个分区,前三个是主分区,后二个分区在扩展分区里,每个分区2GB。以下只列出第一个分区的操作:

命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
分区号 (2-4,默认 2):
起始 扇区 (4196352-20971519,默认为 4196352):
将使用默认值 4196352
Last 扇区, +扇区 or +size{K,M,G} (4196352-20971519,默认为 20971519):+2G
分区 2 已设置为 Linux 类型,大小设为 2 GiB

输入p打印分区完成后的情况:

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x231b271d

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352     8390655     2097152   83  Linux
/dev/sdb3         8390656    12584959     2097152   83  Linux
/dev/sdb4        12584960    20971519     4193280    5  Extended
/dev/sdb5        12587008    16781311     2097152   83  Linux
/dev/sdb6        16783360    20971519     2094080   83  Linux

分区完成后除了扩展分区(上图的Extended)外,需要变更所有分区的磁盘类型:原类型为Linux,变更后为Linux LVM。这里只列出针对第一个分区的操作:

命令(输入 m 获取帮助):t
分区号 (1-6,默认 6):1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

输入p打印分区类型变更后的情况:

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x231b271d

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   8e  Linux LVM
/dev/sdb2         4196352     8390655     2097152   8e  Linux LVM
/dev/sdb3         8390656    12584959     2097152   8e  Linux LVM
/dev/sdb4        12584960    20971519     4193280    5  Extended
/dev/sdb5        12587008    16781311     2097152   8e  Linux LVM
/dev/sdb6        16783360    20971519     2094080   8e  Linux LVM

以上操作完成后,输入w将操作写入磁盘,完成分区:

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
(二)、创建物理卷

针对新创建的分区创建物理卷,这是创建LVM的第一步。使用如下命令对每一个分区进行操作:

pvcreate /dev/sdb1
  • 1

其他分区的操作类似,这里就不逐一介绍了。
创建完物理卷后,有二种查看的方法:

1、详细信息:pvdisplay,这里只列出第一个分区的信息:

[root@localhost ~]# pvdisplay
  "/dev/sdb1" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               2.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               SCIOKN-i2fO-PylF-CJGI-T8Yw-e2dH-BYX0xq

2、汇总信息:pvs

[root@localhost ~]# pvs
  PV         VG Fmt  Attr PSize  PFree
  /dev/sdb1     lvm2 ---   2.00g  2.00g
  /dev/sdb2     lvm2 ---   2.00g  2.00g
  /dev/sdb3     lvm2 ---   2.00g  2.00g
  /dev/sdb5     lvm2 ---   2.00g  2.00g
  /dev/sdb6     lvm2 ---  <2.00g <2.00g
(三)、创建卷组

创建物理卷完成后,就需要将物理卷加入到特定的卷组。
下面的操作将前二个分区/dev/sdb1/dev/sdb2加入到名称为gv1的卷组中:

[root@localhost ~]# vgcreate vg1 /dev/sdb1 /dev/sdb2
  Volume group "vg1" successfully created
  • 1
  • 2

查看卷组也有二种方法进行查看:详细信息和汇总信息:

1、详细信息:

[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               vg1
  System ID
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               3.99 GiB
  PE Size               4.00 MiB
  Total PE              1022
  Alloc PE / Size       0 / 0
  Free  PE / Size       1022 / 3.99 GiB
  VG UUID               N2mK2P-tvev-bex2-LX4C-1DIs-nFci-Ay5e8H

2、汇总信息:

[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   2   0   0 wz--n- 3.99g 3.99g
(四)、创建逻辑卷

创建卷组完成后,我们就可以在卷组上创建逻辑卷。使用下面的命令,我们在卷组vg1上创建一个名称为lv1、大小为1GB的逻辑卷:

[root@localhost ~]# lvcreate -L 1G -n lv1 vg1
  Logical volume "lv1" created.

查看逻辑卷也有二种方法进行查看:详细信息和汇总信息:

1、详细信息:

[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg1/lv1
  LV Name                lv1
  VG Name                vg1
  LV UUID                LaLTid-eLAG-DNlq-h4fT-Xiia-PTDG-HnXL3i
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-11-08 09:27:21 +0800
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

2、汇总信息:

[root@localhost ~]# lvs
  LV   VG  Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1  vg1 -wi-a----- 1.00g
(五)、格式化逻辑卷并挂载

使用下面的命令,对逻辑卷lv1进行格式化:

[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1

格式化完成后,将该逻辑卷挂载到目录/mnt上:

[root@localhost ~]# mount /dev/vg1/lv1 /mnt

查看挂载后的情况:

[root@localhost ~]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/sda2             17G  1.5G   15G   10% /
devtmpfs             488M     0  488M    0% /dev
tmpfs                497M     0  497M    0% /dev/shm
tmpfs                497M  6.6M  490M    2% /run
tmpfs                497M     0  497M    0% /sys/fs/cgroup
/dev/sda1            976M  115M  795M   13% /boot
tmpfs                100M     0  100M    0% /run/user/0
/dev/mapper/vg1-lv1  976M  2.6M  907M    1% /mnt
(六)、设置开机自动挂载分区

1、查看逻辑卷的UUID:

[root@localhost ~]# blkid
/dev/sda1: UUID="ee8a3a12-cb3e-4890-b255-4b706a718600" TYPE="ext4"
/dev/sda2: UUID="5863f890-3eb8-41a5-8239-4f41f48299bd" TYPE="ext4"
/dev/sda3: UUID="f7c02dd9-73e9-4a26-8da7-a2ca29f58747" TYPE="swap"
/dev/sdb1: UUID="2l1Llw-yFjj-YwbF-TtiN-P0XI-i7W8-9Lq4CF" TYPE="LVM2_member"
/dev/sdb2: UUID="h3uEZx-gw1W-1PMM-PPVT-dAuQ-zf1i-3RZThD" TYPE="LVM2_member"
/dev/sdb3: UUID="aFBSn0-0hwb-Mklg-vCKU-nhmF-lk1k-0uP9Ns" TYPE="LVM2_member"
/dev/sdb5: UUID="5kT4gk-6TRC-2jCj-Sbb5-HAeo-P0CE-cJZzm8" TYPE="LVM2_member"
/dev/sdb6: UUID="57LR2H-Kaua-vY0v-QgbQ-9Eej-qHJe-zXsVvf" TYPE="LVM2_member"
/dev/mapper/vg1-lv1: UUID="11262806-d796-4f49-8f08-897181e8ec33" TYPE="ext4"

最后一行就是逻辑卷的信息,把该行的UUID复制出来,不含引号。

2、编辑fstab:
在最后添加一行,输入如下内容:

UUID=11262806-d796-4f49-8f08-897181e8ec33 /mnt                    ext4    defaults        0 0

然后保存退出(:wq),重启后查看结果,如果能正常挂载就没有问题了。

以上便完成的了LVM的创建和挂载的全部流程。

六、卷组扩容

我们上一节创建LVM中创建了五个分区,但只使得了其中二个分区,在这一节中,我们要把剩余的三个分区加入到卷组vg1中,对其进行扩容。下面的流程只针对新加入的磁盘或者分区,因此这里对流程1-3步的操作就不再做介绍了,具体的操作方法可参照创建LVM

流程
  1. 创建新的磁盘分区(fdisk);
  2. 变更分区类型为Linux LVM(Hex代码为:8e);
  3. 创建物理卷(pvcreate);
  4. 扩展卷组(vgextend);
扩展卷组

使用如下命令将剩余的三个分区加入到卷组vg1

[root@localhost ~]# vgextend vg1 /dev/sdb3 /dev/sdb5 /dev/sdb6
  Volume group "vg1" successfully extended

查看扩展后的卷组:

[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   5   1   0 wz--n- 9.98g 8.98g

已经完了卷组的扩容。

七、卷组缩容

如果想要对卷组缩容,实际上就是要把加入的卷组的物理卷从卷组中移除。
这时需要注意的是:如果要移除的物理卷,已经被使用的话,移除操作可能会对文件系统造成操作。因此移除操作应针对未被使用的物理卷。

(一)、确认物理卷使用情况
[root@localhost ~]# pvs
  PV         VG  Fmt  Attr PSize  PFree
  /dev/sdb1  vg1 lvm2 a--  <2.00g     0
  /dev/sdb2  vg1 lvm2 a--  <2.00g     0
  /dev/sdb3  vg1 lvm2 a--  <2.00g <1.99g
  /dev/sdb5  vg1 lvm2 a--  <2.00g <2.00g
  /dev/sdb6  vg1 lvm2 a--  <2.00g <2.00g

只有PFree等于PSize,也就是说没有被使用的物理卷,还能被列入考虑范围。根据上面命令的执行结果,只有/dev/sdb5/dev/sdb6二个可以被移除。
查看卷组的使用情况:

[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   5   0   0 wz--n- 5.99g 9.98g
(二)、卷组缩容


[root@localhost ~]# vgreduce vg1 /dev/sdb5 /dev/sdb6
Removed "/dev/sdb5" from volume group "vg1"
Removed "/dev/sdb6" from volume group "vg1"

查看结果:

[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 3 1 0 wz--n- <5.99g <1.99g

可以看到VFree的容量已经减少了,到此完成了卷组缩容

猜你喜欢

转载自www.linuxidc.com/Linux/2017-12/149610.htm