lvm是一种基于逻辑的磁盘管理机制,将多个硬盘或者硬盘分区标记为独立的物理卷,并将这些物理卷进行分组为不同的卷组,最终从卷组中取出一定的空间创建一个逻辑卷。它通过特定算法机制将不连续的磁盘空间变得连续且容量巨大,让存储容量管理可以自由扩展与缩减,极大限度的提升了硬盘空间的使用率。
lvm逻辑卷的突出优势是方便扩展空间、扩展某一个挂载的空间,如果用分区的方式,对根的扩展是非常麻烦的,磁盘满了,我们是无法扩展的,即使还有空间,那也是不能动的。分区一旦确定,就不可以修改。逻辑卷就是为了解决这个困扰二诞生的。
Physical Volume(物理卷)的创建
逻辑卷支持将完整磁盘或者磁盘分区创建为物理卷,为了同时展示磁盘与分区两种使用情景。自然使用如下图的sdb1分区、sdc硬盘作为演示。
硬盘分区我们需要预先处理一下,我们按照常规操作创建好硬盘分区后,还需要将硬盘分区系统id修改为8e。
Hex code (type L to list codes): L 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 41 PPC PReP Boot 85 Linux extended c7 Syrinx 5 Extended 42 SFS 86 NTFS volume set da Non-FS data 6 FAT16 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility 8 AIX 4f QNX4.x 3rd part 8e Linux LVM df BootIt 9 AIX bootable 50 OnTrack DM 93 Amoeba e1 DOS access a OS/2 Boot Manag 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O b W95 FAT32 52 CP/M 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 54 OnTrackDM6 a5 FreeBSD ee GPT f W95 Ext'd (LBA) 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 5c Priam Edisk a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 61 SpeedStor a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary 16 Hidden FAT16 64 Novell Netware af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 65 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 70 DiskSecure Mult b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 75 PC/IX bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 80 Old Minix be Solaris boot ff BBT 1e Hidden W95 FAT1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 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: 0x33720a7a Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10490413+ 8e Linux LVM
自然使用pvcreate命令把/dev/sdb1 和/dev/sdc创建为Physical Volume(物理卷),并使用pvs和pvdisplay查看当前物理卷与物理卷详细信息
Volume Group(卷组)的创建
通过pvdisplay命令我们查看到了物理卷的相关信息,可以看见VG Name一栏为空,这表示当前物理卷没有加入任何卷组。
自然使用vgcreate命令创建一个名为vg0的卷组,并将/dev/sdb1 和/dev/sdc加入到vg0这个卷组当中,并查看卷组vg0的相关信息。
我们可以看到vg0的大小VG Size:30GiB=sdb1(10G)+sdc(20GB),说明两个物理卷已经成功加入到了卷组vg0。
后期其他物理卷加入可用命令行:vgextend vg0 /dev/sda3
Magical Volume(逻辑卷)的创建
我们已经将分区sdb1和硬盘sdc创建为物理卷并成功将他们加入了卷组vg0当中,这是他们已经组成了一个相对巨大且连续的”大硬盘”。那么我们接下来就是使用他们,现在我们来常见逻辑卷,你可以简单地将之理解为”给这个大硬盘分区”。
这里自然使用lvcreate命令,在卷组vg0中创建了一个名为lv_mysql,大小为5G的逻辑卷,并使用pvdisplay命令查看这个逻辑卷的相关信息。
Magical Volume(逻辑卷)的使用
通过lsblk命令我们可以看见,已经创建了一个别名为vg0-lv_mysql(dm-0)的逻辑卷分区,我们要如何使用它呢?既然他现在是一个分区,那么我们按照平时创建分区的思路(分区、格式化文件系统、挂载)操作即可。
使用mkfs.ext4命令将/dev/vg0/lv_mysql格式化ext4格式的文件系统
自然将/dev/vg0/lv_mysql挂载到/mysql这个文件夹上面,并使用df命令进行查看。通过途中可以看见/dev/vg0/lv_mysql被以ext4的格式挂载到了/mysql下面。
Magical Volume(逻辑卷)的扩展
我们只分配了5G的容量给lv_mysql这个逻辑卷。如果是传统分区方式,我们只能是暂停服务后把数据转移到一个容量更大的硬盘分区当中,再重启服务。
lvm逻辑卷的方式可以让我们在不暂停服务的情况下动态扩展分区的大小。通过vgdisplay命令打印的信息,我们可以看到卷重vg0已经分配了5G的容量,还有25GB的闲置容量。
自然使用lvextend命令为lv_mysql增加了10GB空间,从图中可以看出lv_mysql的容量从5.00GiB改变为15.00GiB。我们对lvm分区lv_mysql的空间的扩展那操作已经完成。我们还需要对文件系统进行扩展,我们的文件系统为etx4格式,所以我们使用resize2fs命令对lv_mysql的文件系统进行动态扩展。
centos7默认文件系统为xfs,使用xfs_growfs命令进行文件系统扩容
利用df命令,我们可以看见/mysql的容量已经成功扩展到了15GB。
Magical Volume(逻辑卷)的缩减
利用lvm逻辑卷的机制,我们可以对容量进行扩展,相对的我们也可以对容量进行缩减。我们先利用mount命令将/mysql进行卸载,并查看逻辑卷lv_mysql的最新信息。
使用e2fsck命令检查文件系统完整性,再使用resize2fs命令把逻辑卷lv_mysql的文件系统压缩至10GB。
对文件系统进行压缩一定要慎重,这个操作可能会造成文件的丢失。举例:已经存在30GB的数据,你要将文件系统压缩至10GB,那么必然会造成数据的丢失
文件系统压缩完成后,我们使用lvreduce命令对lv_mysql分区进行压缩,执行过程中会给你一个警告,问你是否确定缩减分区大小。
缩减完成后,使用mount命令把lv_mysql挂载会/mysql目录。然后使用df命令再次查看挂载状态。如图所示,我们已经将名为lv_mysql的lvm逻辑卷从15GB缩减至10GB的容量。
Magical Volume(逻辑卷)的迁移
通过pvdisplay命令我们发现卷组中,sdc这块硬盘并没有被使用。本着能少干货就少干货的原则,我们只需要迁移sdb这一块硬盘就足够了,那我们首先需要把sdc这块硬盘移出卷组。
PS:如果都使用了,那你还是老实的全部迁移吧!!!
我们使用vgreduce把硬盘sdc移出vg0这个卷组,并使用pvdisplay再次查看物理卷的信息,可以看见sdc已经不属于vg0这个卷组了。
使用umount命令将文件系统进行卸载。为了保障当前服务器上的lv和vg和目标服务器的lv和vg重名,我们需要将当前vg或目标服务器vg进行重命名。这里我们将当前vg重命名为newvg0。
为了保证我们在迁移的过程中,其他用户没有在使用,保证数据安全。我们还需要使用vgchange命令把卷组设置为不可用状态,通过lvdisplay命令可以看见LV状态已经变成了NOT available。
下面我们将逻辑卷设置为导出状态,使用vgexport命令把newvgo设置为导出状态,并用vgdisplay命令再次确认当前卷组状态。
下面我们就可以拆卸硬盘了,前部不要拆错了。我们将sdb这块硬盘安装到目标服务器上。
到了新服务器,我们可以看见原来服务器上的sdb硬盘,在这里是sdf硬盘。
通过vgscan扫描当前系统中lvm卷组,使用vgchange命令将卷组newvg0下的逻辑卷设置为激活状态。
使用lvdisplay命令,可以看见我们从原服务器上迁移过来的逻辑卷newvg0的状态已经为激活状态
最后,就是挂载文件系统。至此,lvm逻辑卷的迁移就完成了。
LVM逻辑卷快照
lvm快照的原理是将当前文件系统的文件时间戳进行记录,当文件发生改变时,将旧版本的文件推送到快照中。快照回滚时,只是将快照与当前逻辑卷进行合并,完成合并后删除快照。
Lvm快照只是记录当前时间文件的变化,并不会进行完整的文件备份,所以它的速度非常的快;快照只保留制作快照的时间,最原始的文件版本
快照是存储在当前卷组之中,所以要确保当然卷组拥有足够的空间。
快照的大小,永远小于等于快照时间时逻辑卷的大小,所以不需要分配太多的空间。
使用lvcreate命令为lv_mysql创建一个大小为1G名为lv_mysql_snap的快照。
通过lvdisplay命令可以看到快照lv_mysql_snap的相关信息,从快照状态一栏可以看到lv_mysql_snap的快照目标是lv_mysql。
现在我们对lv_mysql下的文件文件进行一些修改,下面两张图片时内容修改前后的对比。
LVM快照的恢复
在上面的内容中,我们已经完成了快照的制作。并且对文件进行了一定修改,那么下面我们利用快照对文件进行恢复操作。
恢复记得对挂载关系进行取消。取消挂载后使用lvconvert命令对快照进行恢复,最后检查文件已经被恢复到了快照的时间点上。
快照恢复后它的使命就已经结束了,它会自动将自己删除。
总结
centos默认的安装方式就是采用lvm逻辑卷的机制划分硬盘,这将有利于我们以后扩展根目录的容量。以上操作前记得备份你的数据,对于数据的操作都要万分小心。尤其是卷的缩减和文件系统的缩减需要更加细心。可能你的一个回车键,让你哭到不行。