LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现。LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。
与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它使系统管理员可以更方便的为应用与用户分配存储空间。在LVM管理下的存储卷可以按需要随时改变大小与移除(可能需对文件系统工具进行升级)。LVM也允许按用户组对存储卷进行管理,允许管理员用更直观的名称(如"sales’、 ‘development’)代替物理磁盘名(如’sda’、‘sdb’)来标识存储卷。
前面谈到,LVM是在磁盘分区和文件系统之前添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上创建文件系统。首先我们先谈论一下几个LVM术语:
这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最底层的存储单元。
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数.
LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统。
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
简单来说就是:
PV:是物理的磁盘分区
VG:LVM中的物理磁盘分区,也就是PV必须加入VG,可以将VG理解为一个仓库或者几个大的硬盘
LV:也就是从VG中划分的逻辑分区
比起传统的硬盘分区管理方式,LVM更富有灵活性
要创建LVM系统,一般需要经过一下步骤:
1、首先确认系统中是否安装了lvm工具:
[root@www root]# rpm –qa|grep lvm
lvm2-2.02.130-5.el7.x86_64
如果命令结果输入类似于上例,那么说明系统已经安装了LVM管理工具;如果命令没有输出则说明没有安装LVM管理工具,则需要从网络下载或者从光盘装LVM rpm工具包。
2、创建分区
使用分区工具(如:fdisk等)创建LVM分区,方法和创建其他一般分区的方式是一样的,区别仅仅是LVM的分区类型为8e。
[root@localhost ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): e
已选择分区 4
起始 扇区 (45467648-83886079,默认为 45467648):
将使用默认值 45467648
Last 扇区, +扇区 or +size{K,M,G} (45467648-83886079,默认为 83886079):
将使用默认值 83886079
分区 4 已设置为 Extended 类型,大小设为 18.3 GiB
命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区 5
起始 扇区 (45469696-83886079,默认为 45469696):
将使用默认值 45469696
Last 扇区, +扇区 or +size{K,M,G} (45469696-83886079,默认为 83886079):+2G
分区 5 已设置为 Linux 类型,大小设为 2 GiB
命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区 6
起始 扇区 (49666048-83886079,默认为 49666048):
将使用默认值 49666048
Last 扇区, +扇区 or +size{K,M,G} (49666048-83886079,默认为 83886079):+2G
分区 6 已设置为 Linux 类型,大小设为 2 GiB
命令(输入 m 获取帮助):t
分区号 (1-6,默认 6):5
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):t
分区号 (1-6,默认 6):
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。
[root@localhost ~]# partprobe
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
将新创建的两个分区/dev/sda5,/dev/sda6转化成物理卷,主要是添加LVM属性信息并划分PE存储单元。
[root@localhost ~]# pvcreate /dev/sda5 /dev/sda6
Physical volume "/dev/sda5" successfully created
WARNING: swap signature detected on /dev/sda6 at offset 4086. Wipe it? [y/n]: y
Wiping swap signature on /dev/sda6.
Physical volume "/dev/sda6" successfully created
创建卷组 vgdata,并将刚才创建好的两个物理卷加入该卷组,可以看出默认PE大小为4MB,PE是卷组的最小存储单元,可以通过-s来修改大小。
[root@localhost ~]# vgcreate vgdata /dev/sda5 /dev/sda6
Volume group "vgdata" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vgdata 2 0 0 wz--n- 3.99g 3.99g
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name vgdata
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 3.99 GiB
PE Size 4.00 MiB
Total PE 1022
Alloc PE / Size 0 / 0
Free PE / Size 1022 / 3.99 GiB
VG UUID gbmuvk-zeBX-YodK-Wf1S-7OV9-kdpF-myD1It
从物理卷vgdata上分割1G给新的逻辑卷lvdata1
[root@localhost ~]# lvcreate -L 9G -n lvdata1 vgdata
WARNING: xfs signature detected on /dev/vgdata/lvdata1 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/vgdata/lvdata1.
Logical volume "lvdata1" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lvdata1 vgdata -wi-a----- 1.00g
使用mkfs.ext4命令在逻辑卷lvdata1上创建ext4文件系统
[root@localhost ~]# mkfs.ext4 /dev/vgdata/lvdata1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
将创建好的文件系统挂载到/data1上
[root@localhost ~]# mkdir /data1
[root@localhost ~]# mount /dev/vgdata/lvdata1 /data1
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 20G 6.6G 13G 34% /
devtmpfs 899M 0 899M 0% /dev
tmpfs 913M 88K 913M 1% /dev/shm
tmpfs 913M 9.0M 904M 1% /run
tmpfs 913M 0 913M 0% /sys/fs/cgroup
/dev/sda1 197M 139M 59M 71% /boot
tmpfs 183M 12K 183M 1% /run/user/0
/dev/sr0 3.8G 3.8G 0 100% /run/media/root/RHEL-7.2 Server.x86_64
/dev/mapper/vgdata-lvdata1 976M 2.6M 907M 1% /data1
便于以后服务器重启自动挂载,需要将创建好的文件系统挂载信息添加到/etc/fstab里面,UUID可以通过blkid命令来查询。
[root@localhost ~]# vim /etc/fstab
UUID="084af02e-fd5e-4b61-bffd-16655ba04602" /data1 ext4 defaults 0 0
给逻辑卷添加空间不会影响以前空间的使用,所以无需卸载文件系统,直接通过命令lvextend -L +500M /dev/vgdata/lvdata1 或者lvextend -l 2.5G /dev/vgdata/lvdata1 给lvdata1增加500M空间(lvadta1目前是2G空间)设置完成后,记得使用resize2fs命令来同步文件系统
[root@localhost ~]# lvextend -L +500M /dev/vgdata/lvdata1
Size of logical volume vgdata/lvdata1 changed from 1.00 GiB (256 extents) to 1.49 GiB (381 extents).
Logical volume lvdata1 successfully resized.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lvdata1 vgdata -wi-ao---- 1.49g
[root@localhost ~]# resize2fs /dev/vgdata/lvdata1 ----------------------------ext4
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vgdata/lvdata1 is mounted on /data1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vgdata/lvdata1 is now 390144 blocks long.
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 20G 6.6G 14G 34% /
devtmpfs 899M 0 899M 0% /dev
tmpfs 913M 88K 913M 1% /dev/shm
tmpfs 913M 9.0M 904M 1% /run
tmpfs 913M 0 913M 0% /sys/fs/cgroup
/dev/sda1 197M 139M 59M 71% /boot
tmpfs 183M 12K 183M 1% /run/user/0
/dev/sr0 3.8G 3.8G 0 100% /run/media/root/RHEL-7.2 Server.x86_64
/dev/mapper/vgdata-lvdata1 1.5G 3.0M 1.4G 1% /data1
重新从第二块硬盘上创建一个分区sda7,具体操作步骤省略,并将创建好的分区加入到已存在的卷组vgdata中,通过pvs命令查看是否成功
[root@localhost ~]# vgextend vgdata /dev/sda7
Physical volume "/dev/sda7" successfully created
Volume group "vgdata" successfully extended
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda5 vgdata lvm2 a-- 2.00g 520.00m
/dev/sda6 vgdata lvm2 a-- 2.00g 2.00g
/dev/sda7 vgdata lvm2 a-- 2.00g 2.00g
减少逻辑卷空间,步骤如下:
注意:文件系统大小和逻辑卷大小一定要保持一致才行。如果逻辑卷大于文件系统,由于部分区域未格式化成文件系统会造成空间的浪费。如果逻辑卷小于文件系统,那数据就出问题了。
[root@localhost ~]# umount /data1
[root@localhost ~]# e2fsck -f /dev/mapper/vgdata-lvdata1
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/mapper/vgdata-lvdata1: 11/98304 files (0.0% non-contiguous), 15140/390144 blocks
[root@localhost ~]# resize2fs /dev/mapper/vgdata-lvdata1 700M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/mapper/vgdata-lvdata1 to 179200 (4k) blocks.
The filesystem on /dev/mapper/vgdata-lvdata1 is now 179200 blocks long.
[root@localhost ~]# lvreduce -L 700M /dev/vgdata/lvdata1
WARNING: Reducing active logical volume to 700.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lvdata1? [y/n]: y
Size of logical volume vgdata/lvdata1 changed from 1.49 GiB (381 extents) to 700.00 MiB (175 extents).
Logical volume lvdata1 successfully resized.
完成之后,就可以通过mount命令挂载重新使用了
[root@localhost ~]# mount /dev/vgdata/lvdata1 /data1
[root@localhost ~]# mount | grep data1
/dev/mapper/vgdata-lvdata1 on /data1 type ext4 (rw,relatime,seclabel,data=ordered)
1、通过pvmove命令转移空间数据
2、通过vgreduce命令将即将坏的磁盘或者分区从卷组vgdata里面移除除去。
3、通过pvremove命令将即将坏的磁盘或者分区从系统中删除掉。
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda5 vgdata lvm2 a-- 2.00g 2.00g
/dev/sda6 vgdata lvm2 a-- 2.00g 1.31g
/dev/sda7 vgdata lvm2 a-- 2.00g 2.00g
[root@localhost ~]# pvmove /dev/sda6 /dev/sda7
/dev/sda6: Moved: 4.6%
/dev/sda6: Moved: 100.0%
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda5 vgdata lvm2 a-- 2.00g 2.00g
/dev/sda6 vgdata lvm2 a-- 2.00g 2.00g
/dev/sda7 vgdata lvm2 a-- 2.00g 1.31g
[root@localhost ~]# vgreduce vgdata /dev/sda6
Removed "/dev/sda6" from volume group "vgdata"
[root@localhost ~]# pvremove /dev/sda6
Labels on physical volume "/dev/sda6" successfully wiped
4、手工拆除硬盘或者通过一些工具修复分区。
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda5 vgdata lvm2 a-- 2.00g 2.00g
/dev/sda7 vgdata lvm2 a-- 2.00g 1.31g
1、先通过umount命令卸载掉逻辑卷lvdata1
2、修改/etc/fstab里面逻辑卷的挂载信息,否则系统有可能启动不起来。
3、通过lvremove 删除逻辑卷lvdata1
4、通过vgremove 删除卷组vgdata
5、通过pvremove 将物理卷转化成普通分区。
[root@localhost ~]# umount /dev/mapper/vgdata-lvdata1
[root@localhost ~]# lvremove /dev/vgdata/lvdata1
Do you really want to remove active logical volume lvdata1? [y/n]: y
Logical volume "lvdata1" successfully removed
[root@localhost ~]# vgremove vgdata
Volume group "vgdata" successfully removed
[root@localhost ~]# pvremove /dev/sda5 /dev/sda6
Labels on physical volume "/dev/sda5" successfully wiped
No PV label found on /dev/sda6.
删除完了,别忘了修改分区的id标识。修改成普通Linux分区即可。
总结:LVM逻辑卷是Linux里面一个很棒的空间使用机制,因为分区在没有格式化的情况下是没有办法加大或者放小的。通过LVM可以将你的磁盘空间做到灵活自如。
最后,我们可以用一张图,再来理解下LVM