1、LVM基本概念
LVM: Logical Volume Manager(逻辑卷管理),Linux环境下对磁盘分区进行管理的一种机制。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。
2、LVM基本组成
2.1、物理存储介质(PhysicalStorageMedia)
指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
2.2、物理卷(Physical Volume,PV)
指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
2.3、卷组(Volume Group,VG)
类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
2.4、逻辑卷(Logical Volume,LV)
类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
2.5、物理块(Physical Extent,PE)
PE是物理卷PV的基本划分单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。
2.6、逻辑块(Logical Extent,LE)
逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
3、LVM优点
LVM通常用于装备大量磁盘的系统,但它同样适于仅有一、两块硬盘的小系统。
3.1、小系统使用LVM的益处
传统的文件系统是基于分区的,一个文件系统对应一个分区。这种方式比较直观,但不易改变:
1、不同的分区相对独立,无相互联系,各分区空间很易利用不平衡,空间不能充分利用。
2、当一个文件系统/分区已满时,无法对其扩充,只能采用重新分区/建立文件系统,非常麻烦;或把分区中的数据移到另一个更大的分区中;或采用符号连接的方式使用其它分区的空间。
3、如果要把硬盘上的多个分区合并在一起使用,只能采用再分区的方式,这个过程需要数据的备份与恢复。当采用LVM时,情况有所不同:
- 硬盘的多个分区由LVM统一为卷组管理,可以方便的加入或移走分区以扩大或减小卷组的可用容量,充分利用硬盘空间。
- 文件系统建立在逻辑卷上,而逻辑卷可根据需要改变大小(在卷组容量范围内)以满足要求。
- 文件系统建立在LVM上,可以跨分区,方便使用。
3.2、大系统使用LVM的益处
1、在使用很多硬盘的大系统中,使用LVM主要是方便管理、增加了系统的扩展性。
2、在一个有很多不同容量硬盘的大型系统中,对不同的用户的空间分配是一个技巧性的工作,要在用户需求与实际可用空间中寻求平衡。
3、用户/用户组的空间建立在LVM上,可以随时按要求增大,或根据使用情况对各逻辑卷进行调整。当系统空间不足而加入新的硬盘时,不必把用户的数据从原硬盘迁移到新硬盘,而只须把新的分区加入卷组并扩充逻辑卷即可。同样,使用LVM可以在不停服务的情况下。把用户数据从旧硬盘转移到新硬盘空间中去。
4、磁盘挂载
给虚拟机增加磁盘,这里以添加500G举例
4.1、查看磁盘信息
图中Disk /dev/vdb为新添加的磁盘
4.2、磁盘分区
4.2.1、划分小于2TB的分区--------可以使用fdisk和parted命令来划分。
- # 对指定磁盘进行初始化操作
- fdisk /dev/vdb
复制代码
“n”添加新分区
“p”创建为主分区,回车使用默认分区号,回车两次使用默认的起始扇区和最后扇区
这里可以看见设置的类型是Linux类型,大小实际上不足1GB。但是我的根分区是Linux LVM类型的,所以还需要一次转换。
继续输入“t”修改类型,如果不知道类型的16进制码,可以输入“L”查看,图中可看到Linux LVM的16进制编码为“8e”
输入16进制编码“8e”,将类型修改为LinuxLVM,Linux与LinuxLVM区别在于LVM可以动态调整分区大小
此时输入w保存退出
这个时候再输入fdisk -l,就可以看见创建的分区了。
4.2.2、划分大于2TB的分区--------只能使用parted命令来划分。
- # 使用parted对vdc进行分区(这里以新添加vdc 4TB举例)
- parted /dev/vdc
复制代码
- # 标志位GPT分区格式,设置分区类型为GPT
- mklabel gpt
复制代码
- # 建立主分区
- mkpart primary 0KB 100%
复制代码
4.3、创建PV(物理卷):
4.4、创建 VG(卷组)
图中 PV Name /dev/vda2 为系统物理卷并且在VG uos里,现在创建的新物理卷名字为/dev/vdb1但还没有分配VG所以接下来创建VG(卷组)。
- vgcreate vg_data /dev/vdb1
- # 输入vgcreate vg_data /dev/vdb1,意思是vgcreate vg名称 需要加入的PV
- # vg名称这里使用的是vg_你要挂载的目录,例如,我需要挂载/data目录下则为vg_data
复制代码
可以输入vgdisplay或者vgs查看卷组情况:
可以看到有两个VG,vg_data是自己创建,并且包含一个PV,说明操作成功,但是如果需要挂在到目录上使用还需要使用LV(逻辑卷)
4.5、创建LV(逻辑卷)
- lvcreate -l +100%FREE -n lv_data vg_data
- # lvcreate –n lv_名称 –l +100%FREE 表示将vg_data空间全部新建到lv_data上,后面加上所在的VG名称,便创建成功了。
复制代码
4.6、格式化LV
- # 接下来对LV进行格式化,格式化成需要的格式 这里以xfs演示
- mkfs.xfs /dev/vg_data/lv_data
- # mkfs.需要的格式 需要格式化的LV位置
复制代码
4.7、挂载
在格式化成功后需要挂载到指定目录,先创建目录 /data并挂载LV到/data目录,语法为 mount 指定的LV 需要挂载的目录
- mkdir /data
- mount /dev/vg_data/lv_data /data/
复制代码
在挂载继续查看文件系统情况输入:df –h 下图显示vg_data中的lv_data已经成功挂载到 /data 目录下
4.8、自动挂载
将挂载信息写入系统文件这样可以在系统启动时自动挂载
编辑/etc/fstab文件
vi /etc/fstab
先输入lv的路径 挂载的目录lv的格式加载时的特定参数选项默认defaults 0 0
- /dev/mapper/vg_data-lv_data /data xfs defaults 0 0
复制代码
5、磁盘扩容
5.1、初始化磁盘创建PV(磁盘分区已完成)
以扩容VG uos下的根目录扩容500G为例(详见挂载部分)
- # 初始化,创建PV
- pvcreate /dev/vdb1
复制代码
5.2、PV加入VG
将创建好的PV加入已有的VG即实现扩容
查看当前已有VG:vgs或vgdisplay
目前uos下有一个PV,使用vgextend命令进行扩容
vgextend uos /dev/vdb1
vgextend 扩容的VG名称 需要加入PV路径
再次使用查看已有VG:vgs
已经成功将PV加入VG uos
5.3、扩容LV
将加入的 PV 在 uos 中创建LV并格式化挂载对应目录即可(详见挂载部分)。
注意在创建 LV 时 –L 的值需要查看 VG 里的FreePE 的数值,因为 Free PE 才是后来加入进来的 PV。
- # 这里是将 FREE 中所有的剩余空间全部使用扩容到 /dev/mapper/uos-root 根目录下
- # 可以通过命令 df -h 查看挂载路径,或者在 /etc/fstab 目录下查看
- lvextend -L +100%FREE /dev/mapper/uos-root
- # 或者可以使用如下命令扩容大小
- lvextend -L +200G /dev/mapper/uos-root
- # 或者可以使用如下命令缩小容量
- lvreduce -L 80G /dev/mapper/uos-root
复制代码
5.4、格式化LV
- xfs_growfs /dev/mapper/uos-root
- 注:
- resize2fs命令 针对的是ext2、ext3、ext4文件系统
- xfs_growfs命令 针对的是xfs文件系统
复制代码
6、磁盘卸载
- # 停掉所有服务
- # 检查/data目录下运行的进程并kill
- fuser -mv /data/
- kill -9 81943
- kill -9 233159
复制代码
- # 卸载磁盘
- umount /data/
- umount /dev/vg_data/lv_data
复制代码- # 删除lv
- lvremove /dev/vg_data/lv_data
复制代码