侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(37)之LVM应用

zze
zze
2019-10-22 / 0 评论 / 0 点赞 / 603 阅读 / 13146 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

介绍

LVM 是 Logical Volume Manager(逻辑卷管理)的简写,它是 Linux 环境下对磁盘分区进行管理的一种机制,它由 Heinz Mauelshagen 在 Linux 2.4 内核上实现,目前最新版本为:稳定版 1.0.5,开发版 1.1.0-rc2,以及 LVM2 开发版。Linux 用户安装 Linux 操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着 Linux 的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。
LVM 与 软 RAID 相似,它的作用也是使用纯软件的方式来组织一个或多个底层硬件设备为一个抽象的逻辑设备,RAID 使用的是内核中的 md(multi devices) 模块,而 LVM 使用的是 dm(device mapper) 模块。

image.png

相关概念

逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,如图所示。它可以将几块磁盘(物理卷,PV,PhysicalVolume)组合起来形成一个存储池或者卷组(VG,VolumeGroup)。LVM 可以每次从卷组中划分出不同大小的逻辑卷(LogicalVolume)创建新的逻辑设备。底层的原始的磁盘不再由内核直接控制,而由 LVM 层来控制。对于上层应用来说卷组替代了磁盘块成为数据存储的基本单元。LVM 管理着所有物理卷的物理盘区,维持着逻辑盘区和物理盘区之间的映射。LVM 逻辑设备向上层应用提供了和物理磁盘相同的功能,如文件系统的创建和数据的访问等。但 LVM 逻辑设备不受物理约束的限制,逻辑卷不必是连续的空间,它可以跨越许多物理卷,并且可以在任何时候任意的调整大小。相比物理磁盘来说,更易于磁盘空间的管理。

image.png

基本术语

前面谈到,LVM 是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的存储卷,在存储卷上建立文件系统。首先我们讨论以下几个 LVM 术语:

物理存储介质(PhysicalStorageMedia)

指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda 等,是存储系统最底层的存储单元。

物理卷(Physical Volume,PV)

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

卷组(Volume Group,VG)

类似于非 LVM 系统中的物理磁盘,其由一个或多个物理卷 PV 组成。它也类似于扩展分区,要使用它必须在 VG 的基础上再次划分一个或多个空间,这些空间可以是卷组大小内的任意大小,称之为 LV(逻辑卷)。

逻辑卷(Logical Volume,LV)

类似于非 LVM 系统中的磁盘分区,逻辑卷建立在卷组 VG 之上。在逻辑卷 LV 之上可以建立文件系统(比如 /home 或者 /usr 等)。

物理块(Physical Extent,PE)

每一个物理卷 PV 被划分为称为 PE(Physical Extents)的基本单元,具有唯一编号的 PE 是可以被 LVM 寻址的最小单元。PE 的大小是可配置的,默认为 4MB,PE 的大小在 PV 整合为 VG 的时候就已经确定了。所以物理卷(PV)由大小等同的基本单元 PE 组成。

逻辑块(Logical Extent,LE)

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

和非 LVM 系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的 VGDA(卷组描述符区域)中。VGDA 包括以下内容:PV 描述符、VG 描述符、LV 描述符、和一些 PE 描述符。
系统启动 LVM 时激活 VG,并将 VGDA 加载至内存,来识别 LV 的实际物理存储位置。当系统进行 I/O 操作时,就会根据 VGDA 建立的映射机制来访问实际的物理位置。

基本使用

LVM 最终组织完成的逻辑卷的设备文件也是存放在 /dev 目录下,且对应的设备文件名称格式为 dm-#,在 /dev/mapper 下还有指向对应设备文件的软链接,命名格式为 VG_NAME-LV_NAMEVG_NAME为卷组名称,LV_NAME 为逻辑卷名称),为方便访问,一般还有命名为 /dev/VG_NAME/LV_NAME 的软连接指向对应的逻辑卷设备。

image.png

如上图,有一个名为 centos 的卷组,在该卷组上有两个逻辑卷分别名为 rootswap,而这两个逻辑卷实际对应的设备文件分别为 /dev/dm-0/dev/dm-1

管理命令

管理物理卷(PV)

物理卷的管理使用如下以 pv 开头的命令:

[root@localhost ~]# pv
pvchange   pvck       pvcreate   pvdisplay  pvmove     pvremove   pvresize   pvs        pvscan

几个常用命令如下:

  • pvcreate:创建物理卷;
  • pvdisplay:显示物理卷详细信息;
  • pvremove:删除物理卷;
  • pvmove:将 PV 上的占用的 PE 移动到其它物理卷中;
  • pvscan:扫描物理卷;
  • pvck:检测物理卷;
  • pvs:简要显示物理卷信息;

管理卷组(VG)

卷组的管理使用如下以 vg 开头的命令:

[root@localhost ~]# vg
vgcfgbackup    vgchange       vgconvert      vgdisplay      vgextend       vgimportclone  vgmknodes      vgremove       vgs            vgsplit        
vgcfgrestore   vgck           vgcreate       vgexport       vgimport       vgmerge        vgreduce       vgrename       vgscan

几个常用命令如下:

  • vgdisplay:显示卷组详细信息;
  • vgs:简要显示卷组信息;
  • vgcreate:创建卷组;
  • vgrename:重命名卷组;
  • vgremove:删除卷组;
  • vgextend:扩展卷组;
  • vgreduce:缩减卷组;
  • vgsplit:切割卷组;

管理逻辑卷(LV)

逻辑卷的管理使用如下以 lv 开头的命令:

[root@localhost ~]# lv
lvchange     lvcreate     lvextend     lvmconf      lvmdiskscan  lvmetad      lvmsadc      lvreduce     lvrename     lvs          
lvconvert    lvdisplay    lvm          lvmconfig    lvmdump      lvmpolld     lvmsar       lvremove     lvresize     lvscan

几个常用命令如下:

  • lvcreate:创建逻辑卷;
  • lvdisplay:显示逻辑卷详细信息;
  • lvs:简要显示逻辑卷信息;
  • lvextend:扩展逻辑卷;
  • lvreduce:缩减逻辑卷;
  • lvremove:删除逻辑卷;
  • lvresize:修改逻辑卷大小;
  • lvmconf:修改逻辑卷的配置文件;

示例

例:使用 LVM 将 3 个 10G 大小的设备创建为一个 30G 的逻辑设备。

创建物理卷

1、使用 fdisk 创建 3 个大小为 10G 的分区,在我这分别对应 /dev/sda{3,5,6},并将其设为 Linux LVM 类型,此时这 3 个分区就是待用的物理卷了。
2、使用 pvcreate 将 3 个分区创建为物理卷:

[root@localhost ~]# pvcreate /dev/sda{3,5,6}
  Physical volume "/dev/sda3" successfully created.
  Physical volume "/dev/sda5" successfully created.
  Physical volume "/dev/sda6" successfully created.

此时通过 pvs 可查看到新创建的物理卷信息:

[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sda2  centos lvm2 a--  <19.00g    0 
  /dev/sda3         lvm2 ---    10.00g 10.00g
  /dev/sda5         lvm2 ---    10.00g 10.00g
  /dev/sda6         lvm2 ---    10.00g 10.00g

创建物理卷时如果报 Device /dev/sda3 excluded by a filter. 错,可使用 parted 的子命令 mklabel msdos 创建卷标后再次创建物理卷。

创建卷组

3、使用 vgcreate/dev/sda{3,5,6} 3 个物理卷创建为一个名为 myvg 的卷组:

[root@localhost ~]# vgcreate myvg /dev/sda{3,5,6}
  Volume group "myvg" successfully created

此时可以通过 vgs 查看到新创建的卷组信息:

[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   2   0 wz--n- <19.00g      0 
  myvg     3   0   0 wz--n- <29.99g <29.99g

并且可以通过 vgdisplay 查看到新创建卷组的详细信息:

[root@localhost ~]# vgdisplay /dev/myvg
  --- Volume group ---
  VG Name               myvg
  System ID             
  Format                lvm2
  Metadata Areas        3
  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                3
  Act PV                3
  VG Size               <29.99 GiB
  PE Size               4.00 MiB
  Total PE              3837
  Alloc PE / Size       0 / 0   
  Free  PE / Size       3837 / <29.99 GiB
  VG UUID               xx2zg1-M5xs-TORr-z18P-sJgP-djyF-JvmjsQ

可以看到,默认的 PE 大小为 4M,PE 的大小在创建 VG 时就已经确定,如果需要重新指定 PE 大小,只能重新创建 VG,通过 -s 选项指定 PE 大小。

缩减卷组

4、演示一下缩减卷组,如果要将 /dev/sda3 从卷组中移除,需先使用 pvmove 将其中的数据移动到保留的 PV 中,然后再使用 vgreduce 缩减,如下:

[root@localhost ~]# pvmove /dev/sda3
  No data to move for myvg.
[root@localhost ~]# vgreduce myvg /dev/sda3
  Removed "/dev/sda3" from volume group "myvg"

扩展卷组

5、演示一下扩展卷组,如果要将 /dev/sda3 添加回卷组中,则可使用 vgextend 来扩展卷组,如下:

[root@localhost ~]# vgextend myvg /dev/sda3
  Volume group "myvg" successfully extended

创建使用逻辑卷

6、使用 lvcreate 基于 myvg 卷组创建一个 15G 的逻辑卷,可使用其 -L 选项来指定逻辑卷的大小,使用 -n 选项来指定逻辑卷的名称,如下:

[root@localhost ~]# lvcreate -L 15G -n 'mylv1' myvg
  Logical volume "mylv1" created.

7、接下来就可将创建的逻辑卷当作正常的分区格式化并挂载使用,如下:

[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv1
...
Writing superblocks and filesystem accounting information: 完成 
[root@localhost ~]# mount /dev/myvg/mylv1 /mydata/
[root@localhost ~]# cd /mydata/
[root@localhost mydata]# ls
lost+found

扩展逻辑卷

8、演示一下扩展逻辑卷,扩展的大小必须小于卷组的空闲大小,现把 /dev/myvg/mylv1 扩展 2G 大小:

[root@localhost ~]# lvextend -L +2G /dev/myvg/mylv1 
  Size of logical volume myvg/mylv1 changed from 15.00 GiB (3840 extents) to 17.00 GiB (4352 extents).
  Logical volume myvg/mylv1 successfully resized.
[root@localhost ~]# 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                                                    
  mylv1 myvg   -wi-a-----  17.00g

9、扩展后可以看到逻辑卷已经是 17G 大小,使用 df 来查看文件系统大小:

[root@localhost ~]# df -lh /dev/myvg/mylv1 
文件系统                容量  已用  可用 已用% 挂载点
/dev/mapper/myvg-mylv1   15G   41M   14G    1% /mydata

10、可以看到,经过扩展后的逻辑卷中的文件系统依旧是 15G 大小,并没有随逻辑卷的扩展而增大,要随之扩展文件系统的大小,只需要使用 resize2fs 扩展文件系统大小即可:

[root@localhost ~]# resize2fs /dev/myvg/mylv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv1 is mounted on /mydata; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/myvg/mylv1 is now 4456448 blocks long.

[root@localhost ~]# df /dev/myvg/mylv1 -lh
文件系统                容量  已用  可用 已用% 挂载点
/dev/mapper/myvg-mylv1   17G   44M   16G    1% /mydata

缩减逻辑卷

11、再演示一下缩减逻辑卷,缩减逻辑卷之前要先卸载并缩减逻辑卷内部文件系统大小到指定大小,并且在缩减文件系统大小之前最好要先检查一下文件系统:

[root@localhost ~]# umount /dev/myvg/mylv1 
[root@localhost ~]# e2fsck -f /dev/myvg/mylv1 
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/myvg/mylv1: 11/1114112 files (0.0% non-contiguous), 113975/4456448 blocks

接下来可以修改文件系统大小,以缩小文件系统为 15G 为例:

[root@localhost ~]# resize2fs /dev/myvg/mylv1 15G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv1 to 3932160 (4k) blocks.
The filesystem on /dev/myvg/mylv1 is now 3932160 blocks long.

最后缩减逻辑卷大小到 15 G:

[root@localhost ~]# lvreduce -L 15G /dev/myvg/mylv1 
  WARNING: Reducing active logical volume to 15.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv1? [y/n]: y
  Size of logical volume myvg/mylv1 changed from 17.00 GiB (4352 extents) to 15.00 GiB (3840 extents).
  Logical volume myvg/mylv1 successfully resized.

缩减完毕,重新挂载使用逻辑卷即可:

[root@localhost ~]# mount /dev/myvg/mylv1 /mydata/
[root@localhost ~]# df -lh /dev/myvg/mylv1 
文件系统                容量  已用  可用 已用% 挂载点
/dev/mapper/myvg-mylv1   15G   41M   14G    1% /mydata

注意,上述操作的部分命令只是对 ext 系列的文件系统可用。

快照

LVM 支持磁盘快照功能,通过快照功能将某刻的文件系统信息记录下来,以后该文件系统的数据变化的时候,我们可以利用快照将文件系统恢复至快照时的状态。

原理

给磁盘做快照其实类似于在某刻给磁盘加了个监视器并创建了一个空的快照区。
当监视到磁盘文件发生变化时,监视器会将该变化的文件备份到快照区,之后通过挂载点访问快照区时,如果访问的目标文件没有发生变化,则实际上访问的还是原来磁盘上的文件(此时可以把快照卷当作访问原卷的一个入口);如果访问的目标文件发生了变化,那么就通过快照记录访问变化之前(备份)的目标文件 ,实现了对某刻文件系统状态的记录。
所以一般快照区占用的空间不大,因为它仅保存了磁盘在某个时间点后变化了的文件内容,即快照卷占用的大小取决于磁盘在某个时间点后变化了的所有文件的总大小。

快照卷的使用

快照卷的创建依旧是使用 lvcreate 命令,需要指定 -s 选项来标识创建一个快照卷,除此之外,还有如下常用选项:

  • -n:指定创建的快照卷名称;
  • -L:指定创建快照卷的大小;
  • -p:指定快照卷的读写权限,可选值有 rrw 分别代表只读和读写(快照卷通常是只读的);

使用格式如下 :

lvcreate -s [OPTIONS...] -n <snapshot_lv_name> <original_lv_name>
    snapshot_lv_name:快照卷名称;
    original_lv_name:原卷设备文件;

创建完成后,在 /dev 目录下也会自动创建快照卷对应的设备文件,如果要删除快照卷,只需要执行 lvremove <快照卷设备文件> 即可。

练习

题1

创建一个至少有两个 PV 组成的大小为 20G 的名为 testvg 的 VG,要求 PE 大小为 16MB,而后在卷组中创建大小为 5G 的逻辑卷 testlv,并将其挂载至 /users 目录。

题2

新建用户 archlinux,要求其家目录为 /users/archlinux,而后 su 切换至 archlinux 用户,复制 /etc/pam.d 目录至自己的家目录。

题3

扩展 testlv 至 7G,要求 archlinux 用户的文件不能丢失。

题4

缩减 testlv 至 3G,要求 archlinux 用户的文件不能丢失。

题5

testlv 创建快照,并尝试基于快照备份数据,验证快照的功能。

0

评论区