Linux LVM扩容

发布时间 2023-04-13 11:04:35作者: BigJor
  1. 逻辑卷LVM--(Logical Volume Manager(逻辑卷管理)的简写)
    1.1 LVM管理
    lvm概念:LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。

传统分区的缺点:
传统的文件系统是基于分区的,一个文件系统对应一个分区。这种方式比较直观,但不易改变。当一个分区空间已满时,无法对其扩充,只能采用重新分区/建立文件系统,非常麻烦;或把分区中的数据移到另一个更大的分区中。

当采用LVM时:

  1. 将硬盘的多个分区由LVM统一为卷组管理,可以方便的加入或移走分区以扩大或减小卷组的可用容量,充分利用硬盘空间;

  2. 文件系统建立在LVM上,可以跨分区,方便使用;

  3. 当系统空间不足而加入新的硬盘时,不必把用户的数据从原硬盘迁移到新硬盘,而只须把新的分区加入卷组并扩充逻辑卷即可。

使用LVM主要是方便管理、增加了系统的扩展性。可以跨分区,多个硬盘组合。

逻辑卷简介

  1. LVM是 Logical Volume Manager(逻辑卷管理),它是Linux环境下对磁盘分区进行管理的一种机制,优点是磁盘分区空间可以任意扩张大小。

  2. 基本概念
    (1)PV:物理卷(Physical volume):物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘。一块硬盘,或多块硬盘。

(2)VG:卷组(Volume Group):卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。一堆磁盘的统称。

(3)LV:逻辑卷(Logical Volume):逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。一个逻辑分区,一个分区。

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

(5)LE(Logical Extent):逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

LVM的制作

第一步:
做物理卷: pv ------- sdb1、sdb2 打pv的标记。

做PV,将原有的磁盘或分区转换成另一种存在形式。

第二步:
PV加入卷组: vg-------- 卷组里面包含:sdb1 sdb2,建立在PV之上。

VG卷组不能直接拿来使用,需要将VG卷组做成LV(逻辑卷)才能用,类似扩展分区。

第三步:
逻辑卷 lv ------- 逻辑卷是从卷组里面拿空间出来做成的逻辑卷,在起个名,建立在VG之上。

第四步:
制作文件系统------mkfs.xfs lvm路径。

第五步:
挂载 ------mount 使用lvm。

实战(创建LVM逻辑卷)

2.1 创建LVM
首先准备添加3块磁盘:可以是/dev/sdb这种没有分区的,也可以是/dev/sdb1这种已经分区了的。

注意:如果没有pv命令安装 #yum install -y lvm2

[root@linux-server ~]# ll      /dev/sd*
brw-rw----. 1 root disk 8,  0 Nov  9 12:59 /dev/sda
brw-rw----. 1 root disk 8,  1 Nov  9 12:59 /dev/sda1
brw-rw----. 1 root disk 8,  2 Nov  9 12:59 /dev/sda2
brw-rw----. 1 root disk 8, 16 Nov  9 12:59 /dev/sdb
brw-rw----. 1 root disk 8, 32 Nov  9 12:59 /dev/sdc
brw-rw----. 1 root disk 8, 48 Nov  9 14:04 /dev/sdd

2.2 创建pv

[root@linux-server ~]#       pvcreate /dev/sdb     #创建pv
Physical volume "/dev/sdb" successfully created.
[root@linux-server ~]#        pvs                           #查看pv
PV         VG     Fmt  Attr PSize   PFree 
/dev/sdb          lvm2 ---   10.00g 10.00g
[root@linux-server ~]#         pvscan                    #查看pv
PV /dev/sda2   VG centos          lvm2 [<19.00 GiB / 0    free]
PV /dev/sdb                       lvm2 [10.00 GiB]
Total: 2 [<29.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 1 [10.00 GiB]

2.3 创建vg

[root@linux-server ~]#         vgcreate      vg1       /dev/sdb       #创建vg
Volume group "vg1" successfully created

参数解释:
-s 16M 指的是在分区的时候指定vg的大小。

[root@linux-server ~]#                   vgs                                        #查看vg
VG     #PV #LV #SN Attr   VSize   VFree  
centos   1   2   0 wz--n- <19.00g      0 
vg1      1   0   0 wz--n- <10.00g <10.00g
[root@linux-server ~]#                   vgscan
Reading volume groups from cache.
Found volume group "centos" using metadata type lvm2
Found volume group "vg1" using metadata type lvm2
[root@linux-server ~]#                   vgdisplay                             #查看vg     查看剩余pe
--- Volume group ---
VG Name               vg1
System ID                     
Format                lvm2
Metadata Areas        1
Metadata Sequence No  2
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                1
Open LV               0
Max PV                0
Cur PV                1
Act PV                1
VG Size               <10.00 GiB
PE Size               4.00 MiB
Total PE              2559
Alloc PE / Size       0 / 0 MiB
Free  PE / Size       2559 / <10.00 GiB
VG UUID               bVvQxe-4M2A-mMuk-b3gJ-4Maj-0xDy-5QZDOp

2.4.创建lv

[root@linux-server ~]#        lvcreate   -L  150M (+150M)  -n   lv1   vg1           #创建lv
Rounding up size to full physical extent 152.00 MiB
Logical volume "lv1" created.
[root@linux-server ~]#        lvcreate   -l   20   -n   lv2   vg1             #采用PE方式在创建一个lv
Logical volume "lv2" created.

参数解释:
-L 指定lv的大小
-n 给创建的lv起一个名字
-l 20 指定PE

[root@linux-server ~]#               lvs          #查看lv
LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g                                                    
swap centos -wi-ao----   2.00g                                                    
lv1  vg1    -wi-a----- 152.00m                                                    
lv2  vg1    -wi-a-----  80.00m 

2.5.制作文件系统并挂载

[root@linux-server ~]#         mkfs.xfs        /dev/vg1/lv1
[root@linux-server ~]#         mkfs.ext4      /dev/vg1/lv2
[root@linux-server ~]#         mkdir            /mnt/lv{1..2}
[root@linux-server ~]#         mount          /dev/vg1/lv1          /mnt/lv1
[root@linux-server ~]#         mount          /dev/vg1/lv2          /mnt/lv2
[root@linux-server ~]#         df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1     xfs       149M  7.8M  141M   6% /mnt/lv1
/dev/mapper/vg1-lv2     ext4       74M  1.6M   67M   3% /mnt/lv2

LVM逻辑卷扩容
1.VG管理
#注意:如果lv所在的vg有空间直接lv扩容就ok了!如果没有空间则需要先对vg进行扩容。

1.1.扩大VG vgextend
1.创建pv

[root@linux-server ~]#         pvcreate      /dev/sdc 
  Physical volume "/dev/sdc" successfully created.

2.直接vgextend扩容

[root@linux-server ~]#        vgextend      vg1 /dev/sdc       #vg1卷组名字,将/dev/sdc扩展到vg1中
  Volume group "vg1" successfully extended

[root@linux-server ~]#        vgs
  VG     #PV #LV #SN Attr   VSize   VFree 
  centos   1   2   0 wz--n- <19.00g     0 
  vg1      2   2   0 wz--n-  19.99g 18.23g

1.2.实战lv扩容

[root@linux-server ~]#                  vgs            #查看vg
VG     #PV #LV #SN Attr   VSize   VFree 
centos   1   2   0 wz--n- <19.00g     0 
vg1      1   2   0 wz--n- <19.99g <9.77g
[root@linux-server ~]#                  lvextend -L 850M /dev/vg1/lv1   #扩展到850M
[root@linux-server ~]#                  lvextend -L +850M /dev/vg1/lv1   #在原有基础上加850M
[root@linux-server ~]#                  lvs            查看lv
LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g                                                    
swap centos -wi-ao----   2.00g                                                    
lv1  vg1    -wi-ao----   1.66g                                                    
lv2  vg1    -wi-ao----  80.00m 
[root@linux-server ~]#                  lvextend -l  +15    /dev/vg1/lv1 #在原有基础上加15个PE
[root@linux-server ~]#                  lvs
LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g                                                    
swap centos -wi-ao----   2.00g                                                    
lv1  vg1    -wi-ao----  <1.68g                                                    
lv2  vg1    -wi-ao----  80.00m

1.3.FS(file system)文件系统扩容

[root@linux-server ~]#                       df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1     xfs       149M  7.8M  141M   6% /mnt/lv1
/dev/mapper/vg1-lv2     ext4       74M  1.6M   67M   3% /mnt/lv2
[root@linux-server ~]#                    xfs_growfs /dev/vg1/lv1  #xfs扩容
[root@linux-server ~]#                    resize2fs /dev/vg1/lv2   #ext4扩容
[root@linux-server ~]#                    df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/vg1-lv1     xfs       1.7G  9.1M  1.7G   1% /mnt/lv1
/dev/mapper/vg1-lv2     ext4       74M  1.6M   67M   3% /mnt/lv2

命令汇总
image

基本磁盘管理对比LVM磁盘管理
image

lv移除

[root@localhost ~]#    lvremove            /dev/vg2/lv2
Do you really want to remove active logical volume vg2/lv2? [y/n]: y
Logical volume "lv2" successfully removed

#先移除lv

[root@localhost ~]#    vgremove      /dev/vg2
Volume group "vg2" successfully removed

#再移除vg

[root@localhost ~]# pvremove       /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.

#移除pv

lvextend 命令

用于逻辑卷在线扩容,也就是说lvextend扩容是不需要停机的,应用服务也不需要关闭,其语法格式如下:

lvextend  [参数] 	LogicalVolume[Path] [ PhysicalVolumePath... ]

常用参数:
-l + :指定逻辑卷的LE个数,如 -l +200
-L + :表示增加多少空间,如 -L +15G ,单位有bBsSkKmMgGtTpPeE
-l +100%FREE :表示增加vg的全部可用空间

注意:lvextend 扩展后只是扩展了lv的大小,而此时文件系统并未感知到,还需要使用xfs_growfs、resize2fs等命令来扩展文件系统,xfs_growf命令是扩展xfs文件系统,resize2fs是扩展ext4文件系统

使用方法一

[root@localhost ~]# lvextend -L +1G /dev/mysql/lv_data 		#逻辑卷扩容,增加1G的空间
  Size of logical volume mysql/lv_data changed from 6.00 GiB (1536 extents) to 7.00 GiB (1792 extents).
  Logical volume mysql/lv_data successfully resized.
[root@localhost ~]# lvs
  LV      VG      Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root    cl      -wi-ao---- 9.79g                                                    
  swap    cl      -wi-ao---- 1.20g                                                    
  lv_data mysql -wi-ao---- 7.00g    #发现lv_data其实增大到7G了                                              
[root@localhost ~]# df -Th	#发现/dev/mapper/mysql-lv_data逻辑卷还是6G,说明即使lv增大了但文件系统并未感知到lv增大了
Filesystem                  Type      Size  Used Avail Use% Mounted on
/dev/mapper/mysql-lv_data xfs       6.0G   33M  6.0G   1% /lv_data
[root@localhost ~]# 

#哎呀,df -Th 看到的怎么是/dev/mapper/mysql-lv_data,我们的逻辑卷文件明明是/dev/mysql/lv_data的呀,怎么回事?
#原来这是lvm的mapper机制决定的,当我们lvcreate一个逻辑卷的时候,Linux会新建两个软链接文件,
#如/dev/VGName/LVName和/dev/mapper/VGName-LVName,而这2个文件都是指向/dev/dm-X 块文件的,所有,当我们使用df -h看
#到的/dev/mapper/mysql-lv_data其实是和/dev/mysql/lv_data一样的,不管我们使用哪个都是可以的。

#查看你的逻辑卷是什么文件系统类型,如果是xfs文件系统,使用xfs_growfs命令扩展容量:
xfs_growfs /dev/mysql/lv_data
#查看你的逻辑卷是什么文件系统类型,如果是ext4文件系统,使用resize2fs命令扩展容量:
resize2fs /dev/root_vg/root
 
#使用xfs_growfs命令扩展xfs文件系统,如果是ext4文件系统,则使用resize2fs  /dev/mysql/lv_data 
[root@localhost mapper]# xfs_growfs /dev/mysql/lv_data			
meta-data=/dev/mapper/mysql-lv_data isize=512    agcount=4, agsize=393216 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1572864, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1572864 to 1835008
[root@localhost mapper]# df -Th				#检查
Filesystem                  Type      Size  Used Avail Use% Mounted on
/dev/mapper/cl-root         xfs       9.8G 1021M  8.8G  11% /
devtmpfs                    devtmpfs  1.9G     0  1.9G   0% /dev
tmpfs                       tmpfs     1.9G     0  1.9G   0% /dev/shm
tmpfs                       tmpfs     1.9G  8.6M  1.9G   1% /run
tmpfs                       tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1                   xfs      1014M  139M  876M  14% /boot
tmpfs                       tmpfs     378M     0  378M   0% /run/user/0
/dev/mapper/mysql-lv_data xfs       7.0G   33M  7.0G   1% /lv_data				#大小其实增大了1G了
[root@localhost mapper]#

使用方法二

[root@localhost mapper]# lvextend  -l +25 /dev/mysql/lv_data         #增加25个LE就是100M
  Size of logical volume mysql/lv_data changed from 7.00 GiB (1792 extents) to 7.10 GiB (1817 extents).
  Logical volume mysql/lv_data successfully resized.
[root@localhost mapper]# df
Filesystem                  1K-blocks    Used Available Use% Mounted on
/dev/mapper/cl-root          10258432 1045568   9212864  11% /
devtmpfs                      1921808       0   1921808   0% /dev
tmpfs                         1932776       0   1932776   0% /dev/shm
tmpfs                         1932776    8776   1924000   1% /run
tmpfs                         1932776       0   1932776   0% /sys/fs/cgroup
/dev/sda1                     1038336  141608    896728  14% /boot
tmpfs                          386556       0    386556   0% /run/user/0
/dev/mapper/mysql-lv_data   7329792   32980   7296812   1% /lv_data				#查看容量大小
[root@localhost mapper]# xfs_growfs  /dev/mysql/lv_data 							#扩展文件系统大小
meta-data=/dev/mapper/mysql-lv_data isize=512    agcount=5, agsize=393216 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1835008, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1835008 to 1860608											#显示块已经增大了
[root@localhost mapper]# df
Filesystem                  1K-blocks    Used Available Use% Mounted on
/dev/mapper/cl-root          10258432 1045568   9212864  11% /
devtmpfs                      1921808       0   1921808   0% /dev
tmpfs                         1932776       0   1932776   0% /dev/shm
tmpfs                         1932776    8776   1924000   1% /run
tmpfs                         1932776       0   1932776   0% /sys/fs/cgroup
/dev/sda1                     1038336  141608    896728  14% /boot
tmpfs                          386556       0    386556   0% /run/user/0
/dev/mapper/mysql-lv_data   7432192   32980   7399212   1% /lv_data				#空间增大了
[root@localhost mapper]# 

参考:

磁盘扩容(LVM)
lvextend 逻辑卷扩容(xfs_growfs、resize2fs配合扩展文件系统)