Linux中逻辑卷(LV)的创建、增大和减小

首先说一下在缩小逻辑卷的时候要注意的问题:第一步使用resize2fs命令更改文件系统的容量;第二步使用lvreduce命令减小逻辑卷的容量。这两个顺序千万不要搞反了,而且要保证缩减后的逻辑卷容量大于等于实际更改后的文件系统大小,否则你的逻辑卷就不能正常使用了

1 LVM体系结构

LVM(逻辑卷管理器),可以将几个物理分区(或磁盘)通过软件组合成为一个看起来独立的大磁盘,并且可以灵活的调整卷的大小。LVM是由VG(卷组)、PV(物理卷)、LV(逻辑卷)和PE(物理扩展块)组成。

1.1 物理存储介质(The Physical Media)

这里指系统的存储设备,如:/dev/sda、/dev/sdb等等,是存储系统最低层的存储单元。

1.2 物理卷(PV, Physical Volume)

物理卷就是指磁盘、磁盘分区或从逻辑上和磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有和LVM相关的管理参数。

1.3 卷组(VG, Volume Group)

LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。能在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。

1.4 逻辑卷(LV, Logical Volume)

LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上能建立文件系统(比如/home或/usr等)。

1.5 PE(physical extent)

每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是能被LVM寻址的最小单元。PE的大小是可设置的,默认为4MB。

1.6 LE(logical extent)

逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
下面是一个LVM的体系结构图

创建LV有两种方式,一种是基于磁盘的,另外一种是基于分区的,如果是基于分区的就必须先通过fdisk或parted方式划分好分区,但不要格式化来进行pvcreate创建处理卷;如果基于磁盘的就不需要创建分区了,直接就可以通过pvcreate来创建物理卷。因为只有创建好了物理卷之后才能添加到卷组,并在卷组里面创建逻辑卷,后格式化才能存放数据。
这里,我以基于磁盘的方式创建LV。

2 创建物理卷PV

假设我们的系统已经挂载了一块尚未使用的硬盘,通过fdisk -l命令可以看到系统中所有的硬盘

[root@node1 ~]# fdisk -l | grep sd
Disk /dev/sda: 21.5 GB, 21474836480 bytes
/dev/sda1   *           1          26      204800   83  Linux
/dev/sda2              26        2611    20765696   8e  Linux LVM
Disk /dev/sdb: 1073 MB, 1073741824 bytes
Disk /dev/sdc: 1073 MB, 1073741824 bytes
[root@node1 ~]# 

这里可以看到我的系统中有三块硬盘sda、sdb、sdc,其中sda已经被划分成2个分区。
现在我们来利用sdb、sdc这两块盘,创建两个PV

[root@node1 ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
[root@node1 ~]# 
[root@node1 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree   
  /dev/sda2  vg_node1 lvm2 a--    19.80g    3.14g
  /dev/sdb   vgtest   lvm2 a--  1020.00m 1020.00m
  /dev/sdc            lvm2 a--     1.00g    1.00g
[root@node1 ~]# pvscan
  PV /dev/sdb    VG vgtest          lvm2 [1020.00 MiB / 1020.00 MiB free]
  PV /dev/sda2   VG vg_node1        lvm2 [19.80 GiB / 3.14 GiB free]
  PV /dev/sdc                       lvm2 [1.00 GiB]
  Total: 3 [21.79 GiB] / in use: 2 [20.79 GiB] / in no VG: 1 [1.00 GiB]
[root@node1 ~]#

如上所示,使用pvcreate命令创建PV,然后使用pvspvscan可以查看系统中已有的PV。
到这里,物理卷就创建完成了,接下来我们用这两个PV来创建一个卷组。

3 创建卷组VG

我们先用其中一个PV来创建VG

[root@node1 ~]# vgcreate vgtest /dev/sdb
  Volume group "vgtest" successfully created
[root@node1 ~]#
[root@node1 ~]# vgs
  VG       #PV #LV #SN Attr   VSize    VFree   
  vg_node1   1   3   0 wz--n-   19.80g    3.14g
  vgtest     1   0   0 wz--n- 1020.00m 1020.00m
[root@node1 ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vgtest" using metadata type lvm2
  Found volume group "vg_node1" using metadata type lvm2
[root@node1 ~]#

这里,我们 vgcreate命令创建了一个名叫vgtest的卷组,然后使用vgsvgscan可以查看已创建的vg。
现在我们已经成功创建了一个卷组,接下来就可以根据需要来创建逻辑卷LV了

4 创建逻辑卷LV

[root@node1 ~]# lvcreate -L 1000M -n lvtest vgtest
  Logical volume "lvtest" created
[root@node1 ~]#

这里我们使用lvcreate命令创建了一个名叫lvtest的逻辑卷,大小为1000M
简单介绍一下lvcreate命令的参数

-L:指定逻辑卷的大小,单位为“kKmMgGtT”字节
-l:指定逻辑卷的大小(LE数)
-n: 指定逻辑卷的名字

逻辑卷创建后,还需要进行格式化操作,否则不能使用,使用mkfs命令来进行格式化,如下所示,我们把这个逻辑卷格式化为ext4文件系统

[root@node1 ~]# mkfs.ext4 /dev/mapper/vgtest-lvtest 
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65280 inodes, 261120 blocks
13056 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks: 
       32768, 98304, 163840, 229376

正在写入inode表: 完成                            
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@node1 ~]#

到此为止,逻辑卷建立完成,你可以把它挂载到一个空闲目录下(注意:如果挂载的非空闲目录下,原来目录中的内容会被隐藏,不是覆盖哦,但你取消挂载后,被隐藏的内容就会再次出现

[root@node1 ~]# mkdir /test/
[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_node1-lvroot  9.7G  3.4G  5.8G  37% /
tmpfs                        491M   72K  491M   1% /dev/shm
/dev/sda1                    194M   30M  155M  16% /boot
/dev/mapper/vg_node1-lvhome  4.9G  153M  4.5G   4% /home
/dev/mapper/vgtest-lvtest   1000M   18M  936M   2% /test
[root@node1 ~]# 

5 逻辑卷LV扩容

假如你的逻辑卷容量不够了,需要扩容,有两种情况:一是你的VG中还有剩余空间,那么可以直接使用VG中剩余的空间进行扩容;二是你的VG中没有空间或者是空间不足了,那你需要先扩容VG,在扩容LV。。第二种只是比第一种情况多了一步扩容VG的操作,所以这里我们以第二种情况为例进行介绍。
这里我们使用刚才未使用的另一块PV来扩容我们的卷组vgtest。

[root@node1 ~]# vgextend vgtest /dev/sdc
  Volume group "vgtest" successfully extended
[root@node1 ~]# vgs
  VG       #PV #LV #SN Attr   VSize  VFree   
  vg_node1   1   3   0 wz--n- 19.80g    3.14g
  vgtest     2   1   0 wz--n-  1.99g 1020.00m
[root@node1 ~]# 

使用vgextend命令扩容卷组,这里可以看到我们vgtest容量已经增加了一倍,接下来开始扩容逻辑卷

[root@node1 ~]# lvextend -L +500M /dev/mapper/vgtest-lvtest 
  Extending logical volume lvtest to 1.48 GiB
  Logical volume lvtest successfully resized
[root@node1 ~]# df -h /test
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 1004M   18M  936M   2% /test
[root@node1 ~]#

如上所示,我们使用lvextend命令将lvtest扩容到1.48G,但是为什么用df -h /test命令看到的lvtest空间并没有改变的,这里还需要一步操作才能使lvtest的空间改变生效

[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mapper/vgtest-lvtest to 389120 (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now 389120 blocks long.

[root@node1 ~]#

到此,我们的LV扩容已经成功了

6 缩小LV容量

介绍完LV的扩容,我们再来说说如何缩小LV容量。假设我们想缩小lvtest的容量,并将/dev/sdc从vgtest中抽离出去,我们需要这样进行:

#首先降低文件系统容量
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
On-line shrinking from 389120 to 230400 not supported.
#这里提示我们lvtest已经被挂载,不能在线缩小逻辑卷容量,所以要先取消挂载
[root@node1 ~]# umount /dev/mapper/vgtest-lvtest 
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
请先运行 'e2fsck -f /dev/mapper/vgtest-lvtest'.

#这里提示我们先运行e2fsck命令,按照提示操作即可
[root@node1 ~]# e2fsck -f /dev/mapper/vgtest-lvtest
e2fsck 1.41.12 (17-May-2010)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/mapper/vgtest-lvtest: 11/97920 files (0.0% non-contiguous), 10636/389120 blocks

[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/vgtest-lvtest to 230400 (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now 230400 blocks long.

#这里可以看到文件系统已经成功缩小了,接下来缩小逻辑卷的大小,请注意一定要保证缩小后的逻辑卷空间大于或等于resize2fs命令缩小后的文件系统大小,否则该逻辑卷就出错不能正常使用了(很不幸,我就是在这里踩雷了~)。我们可以先使用pvdisplay命令查看/dev/sdc的信息

[root@node1 ~]# pvdisplay /dev/sdc
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               vgtest
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              255
  Free PE               255
  Allocated PE          0
  PV UUID               l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
   
#可以看到PE块大小是4M,共有255个PE块,所以我们可以从lvtest中减小255个PE
[root@node1 ~]# lvreduce -l 255 /dev/mapper/vgtest-lvtest 
  WARNING: Reducing active logical volume to 1020.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lvtest? [y/n]: y
  Reducing logical volume lvtest to 1020.00 MiB
  Logical volume lvtest successfully resized
#上面会有告警信息,但是我们实际的数据量(900M)比1020M小,所以按y继续吧

[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h /test
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest  885M   34M  806M   5% /test
#重新挂载该逻辑卷,查看其大小,

# 接下来就是移除/dev/sdc了
[root@node1 ~]# pvdisplay /dev/sdb /dev/sdc
  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               vgtest
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              255
  Free PE               0
  Allocated PE          255
  PV UUID               RUQhfR-5XLv-Xhgg-mbFH-M2dp-Cust-myRojW
   
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               vgtest
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              255
  Free PE               255
  Allocated PE          0
  PV UUID               l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
# 使用pvdisplay命令查看/dev/sdb /dev/sdc的信息,可以看到/dev/sdc是完全空闲的,所以可以直接移除
[root@node1 ~]# vgreduce vgtest /dev/sdc
  Removed "/dev/sdc" from volume group "vgtest"
[root@node1 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree
  /dev/sda2  vg_node1 lvm2 a--    19.80g 3.14g
  /dev/sdb   vgtest   lvm2 a--  1020.00m    0 
  /dev/sdc            lvm2 a--     1.00g 1.00g
#可以看到/dev/sdc 已经不属于vgtest了

到此为止,lv的缩小就介绍完了,不过我们再小小的扩展一下,假设我们刚才对lvtest进行缩减后,发现/dev/sdc的PE还有被使用的,那这是就不能直接移除sdc了,需要先进行PE的转移,将/dev/sdc中的已使用PE全部转移到其他空间充足的PV中,比如说执行pvmove /dev/sdc /dev/sdb,然后就可以从vgtest中移除/dev/sdc。

原文地址:https://www.cnblogs.com/leekeggs/p/9347273.html