• LVM 逻辑卷学习


    一个执着于技术的公众号

    前言

    每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到 当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。因为如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬 盘、重新对硬盘分区,然后恢复数据到新分区。

    虽然现在有很多动态调整磁盘的工具可以使用,例如PartationMagic等等,但是它并不能完全解决问题,因为某个分区可能会再次被耗尽;另外一个方面这需要重新引导系统才能实现,对于很多关键的服务器,停机是不可接受的。而且对于添加新硬盘,希望一个能跨越多个硬盘驱动器的文件系统时,分区调整程序就不能解决问题。

    因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。幸运的是Linux提供的逻辑盘卷管理(LVM,LogicalVolumeManager)机制就是一个完美的解决方案。

    什么是LVM?

    LVM(Logical Volume Manager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的 分区加入其中,这样可以实现一种磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性,使用普通的磁盘分区,当一个磁盘的分区空间不够使用的时候,可能就会带来很大的麻烦。使用LVM在一定程度上就可以解决普通磁盘分区带来的问题。

    LVM基本术语

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

    「物理卷--PV(Physical Volume)」

    物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘。

    「卷组--VG(Volumne Group)」

    卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。

    「逻辑卷--LV(Logical Volume)」

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

    「物理区域--PE(Physical Extent)」

    物理区域是物理卷中可用于分配的最小存储单元,物理区域的大小可根据实际情况在建立物理卷时指定。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一致。

    「逻辑区域--LE(Logical Extent)」

    逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。

    「卷组描述区域--VGDA(Volume Group Descriptor Area)」

    卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中的逻辑卷及逻辑卷中物理区域的分配等所有信息,卷组描述区域是在使用pvcreate建立物理卷时建立的。


    下图是磁盘分区、卷组、逻辑卷和文件系统之间的逻辑关系的示意图:

    系统启动LVM时激活VG,并将VGDA加载至内存,来识别LV的实际物理存储位置。当系统进行I/O操作时,就会根据VGDA建立的映射机制来访问实际的物理位置。

    安装LVM

    首先确定系统中是否安装了lvm工具:

    如果命令结果输出rpm版本,那么说明系统已经安装了LVM管理工具;如果命令没有输出则说明没有安装LVM管理工具,则需要从网络或者光盘中安装LVM rpm工具。

    「注意」安装了LVM的RPM软件包以后,要使用LVM还需要配置内核支持LVM。RedHat默认内核是支持LVM的,如果需要重新编译内核,则需要在配置内核时,进入Multi-device Support (RAID and LVM)子菜单,选中以下两个选项:

    Multiple devices driver support (RAID and LVM)
    
    <*> Logical volume manager (LVM) Support
    

    然后重新编译内核,即可将LVM添加到新内核中。

    为了使用LVM,要确保在系统启动时激活LVM,幸运的是在RedHat7.0以后的版本,系统启动脚本已经具有对激活LVM的支持,在/etc/rc.d/rc.sysinit中有以下内容:

    # LVM initialization
    if [ -e /proc/lvm -a -x /sbin/vgchange -a -f /etc/lvmtab ]; then
    $"Setting up Logical Volume Management:" action /sbin/vgscan && /sbin/vgchange -a y
    fi
    

    其中关键是两个命令,vgscan命令实现扫描所有磁盘得到卷组信息,并创建文件卷组数据文件;/etc/lvmtab和/etc/lvmtab.d/*;vgchange -a y命令激活系统所有卷组。

    操作流程

    创建PV-->创建卷组-->创建逻辑卷-->格式化-->挂载

    1、磁盘分区

    注:创建分区时需要更改其文件类型为lvm(代码8e)

    注:一般情况在创建完分区后系统会自动生成相应的分区文件“/dev/sdbn”,但是当系统未自动生成时无法完成物理卷创建任务,需要执行命令 “「partprobe」” 生成相应文件再执行pvcreate命令。

    2、创建物理卷

    「pvdisplay命令&pvs命令」

    物理卷创建完成后可以使用命令pvdisplay或pvs进行查看:(在此只展示一个物理卷)

    3、创建卷组

    创建完成后同样可以使用vgdisplay命令和vgs命令进行查看:

    4、创建逻辑卷

    语法:lvcreate [选项] [物理卷组]

    选项:

    -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节

    -n:指定逻辑卷的名称

    创建完成后同样可以使用「lvdisplay」命令和「lvs」命令进行查看:

    5、格式化&挂载

    将我们刚刚创建的逻辑卷「lv1」格式化成ext4文件系统

    「lv1逻辑卷」格式化完成后挂载至 「/mnt」 下:

    写入/etc/fstab文件中

    扩容

    流程:

    更改逻辑卷信息(lvresize)-->检测磁盘错误(e2fsck -f)-->更新逻辑卷信息(resize2fs)

    先在/mnt/目录下写入一些东西,备用:

    开始扩容:

    「lvresize命令」

    lvresize命令(=logical volume resize)用于调整LVM逻辑卷的空间大小,可以增大空间和缩小空间。使用lvresize命令调整逻辑卷空间大小和缩小空间时需要谨慎,因为它有可能导致数据丢失。

    注:正常情况下该命令应该在卸载后再执行。

    语法:lvresize [选项] [逻辑卷]

    选项:-L:指定大小

    「e2fsck命令」

    检测磁盘错误(ext4执行)

    「resize2fs命令」

    更新逻辑卷信息(ext4执行)

    更新逻辑卷信息后新分区在挂载的时候才能被识别新的大小。

    「挂载」

    验证:系统扩容不会使文件丢失:

    缩容(xfs格式不支持)

    「流程」

    卸载(umount)-->检测(e2fsck -f)-->更新逻辑卷信息(大小)(resize2fs)-->重置逻辑卷大小(lvresize)

    最后我们再看下「xfs」文件系统类型的扩容方法

    首先将「逻辑卷lv1」格式化成「xfs」格式:

    进行扩容

    流程:

    更改逻辑卷信息(lvresize)-->更新逻辑卷信息(xfs_growfs)

    1、更改逻辑卷信息(lvresize)

    2、xfs_growfs命令(该命令必须在挂载状态执行)

    扩容卷组

    eg:将/dev/sdb3增加到vg1

    语法:vgextend [卷组名] [物理卷]

      往期精彩  

    ◆  手把手教你搭建一套OpenStack云平台

    ◆  带你体验一次原生OpenStack发放云主机的过程

    ◆  Linux运维工程师面试问答录

    ◆  干货 | Linux平台搭建网关服务器

    ◆  干货 | 理解正向代理与反向代理的区别

    ◆  硬核科普服务器硬盘组成与基本原理

    ◆  一文带你速懂虚拟化KVM和XEN

    ◆  实战 | Hadoo大数据集群搭建

    ◆  运维工程师心法:6大技能让你告别背锅

    如有收获,点个在看,诚挚感谢
    
    十年磨一剑
  • 相关阅读:
    两种unix网络编程线程池的设计方法
    僵尸进程处理方法
    僵尸进程概念
    fork()父子进程文件描述符的关系
    getsockname()和getpeername()
    linux文件系统总结
    deque时间复杂度和vector,list比较
    stl仿函数和适配器
    linux中断和异常睡眠问题
    umask码和文件权限
  • 原文地址:https://www.cnblogs.com/qinlulu/p/13204821.html
Copyright © 2020-2023  润新知