lvm管理的相关操作方法

Posted chendian0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lvm管理的相关操作方法相关的知识,希望对你有一定的参考价值。

 

如果发现文件系统的容量不足了,可以通过 LVM 轻松的进行扩展(当然也可以进行缩减操作)。本文将紧接前文中的 demo 详细的介绍扩展文件系统的操作过程。说明:本文的演示环境为 ubuntu 16.04。

警报:可用磁盘空间不足

当我们收到可用磁盘空间不足的警报时,就需要去诊断磁盘空间相关的问题了。一般的结果是:增加磁盘容量(简单有效,清理掉一些看似没用的文件是件风险极大的事情)!
df 命令可以帮助我们查看文件系统的容量:

技术图片

上图中的 LV nicklv00 的总容量为 15G,此时可用容量已经不足 1G了,我们接下来扩展这个 LV。

查看当前系统中磁盘的概况

在动手扩展文件系统的容量前,我们需要先搞清楚当前系统中磁盘的基本情况。lsblk 命令可以帮助我们查看系统上的所有块设备列表(下面命令中笔者通过 -e 选项排除了 loop 设备和光驱):

$ lsblk -e 7,11

技术图片

我们比较关注挂载点 /home/doc 对应的文件系统的情况:它的磁盘类型为 LVM,对应的 LV 名称为 nicklv00,LV 在名称为 nickvg 的 VG 中。其中磁盘的整个容量为 20G,而 LV 的容量只有 15G。我们先用 lvdisplay 命令来观察下 LV 的详细信息:

$ sudo lvdisplay nickvg/nicklv00

技术图片

这里比较重要的两点是 LV 的容量为 15G,它所属的 VG 名称为 nickvg。接下来用  vgdisplay 命令查看名称为 nickvg 的 VG 的详细信息:

$ sudo vgdisplay nickvg

技术图片

上图显示 VG 的容量为 19.97G,已经分配了 15G,还有 4.97G 是空闲的。如果我们的要求不高,可以直接把 VG 中空闲的 4.97G 分配给 LV nicklv00,但是我们希望给 nicklv00 多分些空间,比如 50G。所以我们需要继续查看 VG 的底层构成。
通过 pvs 可以查看 pv 与 vg 的组成关系:

$ sudo pvs

技术图片

VG nickvg 是由 PV /dev/sdd1 构成的,/dev/sdd1 的容量为 19.97G。要查看 PV 的详细信息,可以使用 pvdisplay 命令:

$ sudo pvdisplay /dev/sdd1

技术图片

至此我们已经搞清楚了系统当前的存储系统(忽略了我们不太关心的磁盘),总结一下:硬盘设备 /dev/sdd 的容量为 20G,其上创建了一个 20G 的硬盘分区 /dev/sdd1,硬盘分区 /dev/sdd1 被创建为 LVM 的物理卷(PV,PV 的名称依然是 /dev/sdd1),大小仍然为 20G。在物理卷 /dev/sdd1 上创建了容量为 20G 的卷组(VG) nickvg,在 nickvg 中有一个 15G大小的逻辑卷(LV) nickvg/nicklv00。文件系统就建立在 LV 上,挂载点为 /home/doc。

扩展方案

我们打算为 /home/doc 下挂载的文件系统增加 50G 的容量,因此仅仅利用 VG 中剩余的 4.97G 空间时不够的。简单起见,我们直接新增一块容量为 50G 的硬盘(此处为虚拟磁盘),通过 LVM 添加到 VG 中,然后扩展 LV,并最终完成扩展文件系统的任务。

添加磁盘并创建物理卷(PV)

在虚拟机中添加虚拟磁盘并非难事,这里不再细说,笔者添加的磁盘设备文件为 /dev/sde:

技术图片

接下来请参照前文《LVM : 简介》中的介绍创建磁盘分区,并用磁盘分区创建 LVM 物理卷(PV)。
笔者创建的磁盘分区为 /dev/sde1:
技术图片

创建的物理卷如下所示:

技术图片

扩展卷组(VG)

接下来我们需要通过 vgextend 命令扩展卷组。vgextend 命令可以把一个或多个物理卷(LV)加入到 VG 中:

$ sudo vgextend nickvg /dev/sde1

技术图片

检查 VG nickvg 的详细信息:

技术图片

此时 VG 的容量已经变成了 69.94G,可用的容量有 54.94G,扩展 VG 成功了!再看看 VG 与 PV 的关系:

技术图片

VG nickvg 由 /dev/sdd1 和 /dev/sde1 两个 PV 组成,当前总的可用空间为 4.97G + 49.97G。

扩展逻辑卷(LV)

LVM 最主要的功能就是能动态地调整分区的大小,其实也就是修改逻辑(LV)的容量。修改 LV 容量的命令有 lvextend(扩展逻辑卷)和 lvreduce(缩减逻辑卷),这两个命令的用法差不多,这里我们只介绍 lvextend 命令。lvextend 命令的格式如下:
lvextend [-L (+size) -l (+PE 数)] 逻辑卷名称
-L 选项表示为 LV 增加指定 size 的容量。
-l 选项表示为 LV 增加指定数目的 PE。
我们通过下面的命令来扩展 LV:

$ sudo lvextend -L 65G nickvg/nicklv00
或者:$ sudo lvextend -L 65G /dev/nickvg/nicklv00
或者:$ lvextend -l +100%FREE /dev/VolGroup/lv_root    将剩余空间全部分配给 /dev/VolGroup/lv_root

技术图片

然后检查下 LV 的详细信息:

技术图片

nickvg/nicklv00 逻辑卷的大小已经变成了 65G。再看看 PV 的信息:

技术图片

哈哈,居然不是直接用光 /dev/sde1 上的空间,而是先用光 /dev/sdd1 上的空间,然后从 /dev/sde1 上分配剩余的空间。

缩减逻辑卷的方式和扩展逻辑卷的方式差不多,只不过使用的是 lvreduce 命令。

扩展文件系统

resize2fs 命令用来扩展或收缩文件系统的容量,但是这个命令只支持 ext2、ext3、ext4 格式的文件系统。笔者的文件系统为 ext4,所以可以使用 resize2fs 命令进行扩展。这个命令还有一个特点,如果是扩展文件系统的容量,那么不管目标文件系统是否处于挂载状态都可以执行。如果是缩减文件系统的容量,则只能先卸载文件系统,缩减容量后再重新挂载文件系统。下面的命令把文件系统的容量扩展至 LV 的总容量:

$ sudo resize2fs /dev/nickvg/nicklv00

技术图片

再去查看下文件系统的信息:

技术图片

目标文件系统已经显示被扩展到了 64G(各种开销),至此我们完成了文件系统的扩容任务。

总结

使用 LVM 管理磁盘让文件系统的扩展/缩减变得非常容易,特别是可以自由的组合硬件磁盘为更大的容量单位(VG),使系统维护者的工作变得轻松不少。除此之外,LVM 还支持快照等特色功能,笔者将在接下来的文章中介绍如何使用 LVM 的快照。

 

 

============================================================================================================================

============================================================================================================================

 

 

有扩展就有缩减,我们在前文《LVM : 扩展文件系统的容量》中介绍了通过 LVM 扩展文件系统的方法,本文我们接着前文的 demo 介绍通过 LVM 缩减文件系统的方法。说明:本文的演示环境为 ubuntu 16.04。
前文中我们把文件系统 /dev/mapper/nickvg-nicklv00 的容量从 15G 扩充到了 65G(显示为 64G):

技术图片

接下来我们再把它重新缩减为 15G,并移除新添加的磁盘 /dev/sde。

卸载文件系统

与扩展文件系统的容量不同,如果是缩减文件系统的容量,需要卸载文件系统后再进行缩减操作。

技术图片

如果没有卸载文件系统,会有上图中的提示。卸载文件系统本身非常简单,使用 umount 命令就可以搞定,我们要卸载的文件系统的挂载点为 /home/doc:

$ sudo umount /home/doc

使用 resize2fs 命令缩减文件系统

卸载完文件系统就可以使用 resize2fs 命令来缩减其容量了,我们的目标是把它缩回 15G:

$ sudo resize2fs /dev/nickvg/nicklv00 15G

技术图片

提示先运行 e2fsck -f /dev/nickvg/nicklv00 命令。e2fsck 命令用于检查 ext2/ext3/ext4 文件系统的完整性,通过适当的选项可以尝试修复出现的错误。e2fsck 执行后的传回值及代表意义如下:

  • 0 没有任何错误发生。
  • 1 文件系统发生错误,并且已经修正。
  • 2 文件系统发生错误,并且已经修正。
  • 4 文件系统发生错误,但没有修正。
  • 8 运作时发生错误。
  • 16 使用的语法发生错误。
  • 128 共享的函数库发生错误。
$ sudo e2fsck -f /dev/nickvg/nicklv00

技术图片

-f 选项表示即使文件系统没有错误迹象,仍强制检查正确性。上图中的 0 表示我们的文件系统没有被检测出错误,我们重新执行 resize2fs 命令,这次就可以成功执行了:

技术图片

使用 lvreduce 命令缩减 LV

在缩减 LV 前先查看一下其基本信息:

$ sudo lvs nickvg/nicklv00

技术图片

上图显示 LV nickvg/nicklv00 的容量为 65G,而我们缩减后的文件系统只有 15G,所以我们是可以缩减这个 LV 的,我们直接把它缩减到 15G:

$ sudo lvreduce -L 15G nickvg/nicklv00
或
$ sudo lvreduce -L 15G /dev/nickvg/nicklv00

技术图片

查看下结果:

$ sudo lvdisplay nickvg/nicklv00

技术图片

LV 的容量变成了 15G,Current LE 的数量为 480。

从 VG 中移除 PV

检查名称为 nickvg 的 VG 的信息:

$ sudo vgdisplay nickvg

技术图片

结果显示 VG 的总容量为 69.94G,已经分配了 15G,还有 54.94G 空闲。接下来通过 pvs 命令来查看 PV 与 VG 的关系:

$ sudo pvs

技术图片

名称为 nickvg 的 VG 由 /dev/sdd1 和 /dev/sde1 两个 PV 组成,其中 /dev/sde1 完全空闲,我们可以把这个 PV 从 VG 中移除掉。vgreduce 命令可以从 VG 中移除 PV:

$ sudo vgreduce nickvg /dev/sde1

技术图片

从 VG 中移除 PV /dev/sde1 后再次查看 pv 的状态:

技术图片

此时 /dev/sde1 已经不属于任何 VG。

移除 PV

所谓的移除 PV,就是使用 pvremove 命令移除 PV 设备上的标签,让 LVM 无法识别该设备是一个 PV。下面我们就来移除 PV /dev/sde1:

$ sudo pvremove /dev/sde1

技术图片

在 pvremove 命令移除 /dev/sde1 后,pvs 命令输出的结果中就找不到名称为 /dev/sde1 的 PV 了。

删除磁盘分区并移除硬盘

查看设备文件:

$ ls /dev/sde*

技术图片

其中的 /dev/sde1 就是磁盘分区的设备文件,让我们先用 gdisk 命令查看这个分区的信息:

$ sudo gdisk /dev/sde

技术图片

然后再删除它:

技术图片

再去查看 sde 开头的设备文件,发现 /dev/sde1 已经不见了:

技术图片

最后关机移除硬盘就可以了。
如果没有设置开机自动挂载文件系统,还需要在开机后重新手动挂载文件系统 /dev/mapper/nickvg-nicklv00 到 /home/doc 目录。

总结

与扩展文件系统容量不同,在 Ubuntu 16.04 中使用 resize2fs 命令缩减文件系统的容量需要事先卸载文件系统。其实实际使用中缩减文件系统的时候并不多,大家往往宁愿牺牲一些存储空间也不愿看到折腾丢数据的情况。

 

==============================================================================================================================

==============================================================================================================================

 

挂载:(挂载新设备)
fdisk -l                                 (查看设备情况)
pvcreate /dev/sdb                             (将该设备创建为一个pv单元)
vgcreate app /dev/sdb -s 64M                     (创建一个名为app的vg;此处应当注意PE大小分配 eg:设置为64最大可分配4Tb,128最大分配8Tb)
lvcreate -L +99G -n app1 app                     (创建一个名为app1的lv逻辑卷,从app vg中分配99G给它)
mkdir /app                                 (创建挂载点)
echo /dev/mapper/app-app1 /app ext4 defaults 0 0 >> /etc/fstab(将逻辑卷挂载信息写入开机加载列表,开机自动识别 )
mkfs.ext4 /dev/mapper/app-app1                     (将逻辑卷app1 格式化为ext4文件系统)
mount -a                                  (挂载检测)
df -h                                     (挂载点显示大小为逻辑卷app1的大小,挂载成功)

扩容:(物理硬盘容量增加后) pvresize
/dev/sdb                         (重新识别pv的大小,完成之后pvs可以看到扩容后大小,随之对应的vg也同步扩大) lvextend -l +100%FREE /dev/mapper/app-app1         (将vg所有可用容量分配给该lv) resize2fs /dev/mapper/app-app1                 (将新加入的blocks格式化) df -h                              (容量增加,扩容成功)
扩容swap: lvextend
-L 2GB /dev/centos/swap (扩展swap lv的大小) sync                   (内存中缓冲数据写入硬盘) swapoff /dev/centos/swap               (卸载swap) mkswap /dev/centos/swap (重新调整lv为swap格式) swapon /dev/centos/swap (重新挂载swap) free -g (查看swap大小已增加)
扩容lvm根分区(xfs文件系统)
1.虚拟机操作直接扩容/dev/sda 2.fdisk /dev/sda 新添加 /dev/sda3分区 (重启机器) 3.pvcreate /dev/sda3 创建pv 4.vgextend centos /dev/sda3 扩展vg 5.lvextend -l +100%FREE /dev/mapper/centos-root 扩展lv 6.xfs_growfs /dev/centos/root 格式化新加入的硬盘位xfs 7. df -h 成功

 

 

下面为一个简单的 测试 

本人用虚拟机搭建 大数据开发环境,后来数据量上去了 发现磁盘不够用,折腾了一下新增磁盘的方法,一开始总是不对,后来知道了一个lvm的方法,很方便好用。特此记录下来


1查看目前磁盘分区情况,系统是安装在一块45G的虚拟磁盘上。安装系统时采用了LVM分区方式。其中/soft空间大小为11G

2 查看目前虚拟机的磁盘情况,目前虚拟机中有两块硬盘,/dev/sda 45G,/dev/sdb 55G

3 创建pv ,通过pvcreate命令将磁盘/dev/sdb创建为一个系统PV
# pvcreate /dev/sdb

4、将 PV /dev/sdb添加到卷组vg_openstack中。参考下图中标记的数据可知,磁盘已经添加到vg_openstack,而且卷组的空间增加了50G
# vgextend  vg_openstack  /dev/sdb

5、为/soft 添加30G的空间。图中标记的位置给出了/soft的大小,以及/soft的lv名称为 /dev/vg_openstack/LogVol04
    # lvextend -L +30G -n /dev/vg_openstack/LogVol04
或者 # lvextend -l +100%FREE /dev/VolGroup/lv_root      #  扩展整块硬盘空间     

6、逻辑卷扩展后并不会马上生效,需要使用“resize2fs”命令重新加载逻辑卷的大小,图中可知,/soft已经添加30G空间
# resize2fs  /dev/vg_openstack/LogVol04


参考操作  红色部分是重要步骤。可能需要根据环境变动

[[email protected] ~]# fdisk -l

Disk /dev/sda: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002a3e3

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64       13055   104344576   8e  Linux LVM

Disk /dev/sdb: 161.1 GB, 161061273600 bytes
255 heads, 63 sectors/track, 19581 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg_master-lv_root: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg_master-lv_swap: 5200 MB, 5200936960 bytes
255 heads, 63 sectors/track, 632 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg_master-lv_home: 48.0 GB, 47957671936 bytes
255 heads, 63 sectors/track, 5830 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

[[email protected] ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created
[[email protected] ~]# vgex   或者 vgextend 
vgexport  vgextend  
[[email protected] ~]# pvs
  PV         VG        Fmt  Attr PSize   PFree  
  /dev/sda2  vg_master lvm2 a--   99.51g      0 
  /dev/sdb             lvm2 a--  150.00g 150.00g
[[email protected] ~]# vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  vg_master   1   3   0 wz--n- 99.51g    0 
[[email protected] ~]# vgextend  vg_master /dev/sdb 
  Volume group "vg_master" successfully extended
[[email protected] ~]# vgs
  VG        #PV #LV #SN Attr   VSize   VFree  
  vg_master   2   3   0 wz--n- 249.50g 150.00g
[[email protected]
~]# df -h Filesystem                     Size  Used Avail Use% Mounted on /dev/mapper/vg_master-lv_root   50G   33G   14G  71% / tmpfs                          5.9G  8.0K  5.9G   1% /dev/shm /dev/sda1                      485M   39M  421M   9% /boot /dev/mapper/vg_master-lv_home   44G  561M   42G   2% /home cm_processes                   5.9G  1.9M  5.9G   1% /var/run/cloudera-scm-agent/process
[[email protected]
~]# lvextend -l +100%FREE /dev/mapper/vg_master-lv_root   Extending logical volume lv_root to 200.00 GiB   Logical volume lv_root successfully resized
[[email protected]
~]# resize2fs   /dev/mapper/vg_master-lv_root           resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/mapper/vg_master-lv_root is mounted on /; on-line resizing required old desc_blocks = 4, new_desc_blocks = 13 Performing an on-line resize of /dev/mapper/vg_master-lv_root to 52427776 (4k) blocks. The filesystem on /dev/mapper/vg_master-lv_root is now 52427776 blocks long. [[email protected] ~]# df -h Filesystem                     Size  Used Avail Use% Mounted on /dev/mapper/vg_master-lv_root  197G   34G  154G  18% / tmpfs                          5.9G  8.0K  5.9G   1% /dev/shm /dev/sda1                      485M   39M  421M   9% /boot /dev/mapper/vg_master-lv_home   44G  561M   42G   2% /home cm_processes                   5.9G  1.9M  5.9G   1% /var/run/cloudera-scm-agent/process [[email protected] ~]#

 

以上是关于lvm管理的相关操作方法的主要内容,如果未能解决你的问题,请参考以下文章

linux lvm的操作手册_pvcreate_vgcreate_lvcreate_相关

LVM逻辑卷管理的基本操作

Linux CentOS 8(LVM的配置与管理)

Linux CentOS 8(LVM的配置与管理)

linux基础--LVM管理

逻辑卷(LVM)配置