LVM详解
LVM相关概念和机制
LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的。
lvm需要使用的软件包为lvm2,一般在CentOS发行版中都已经预安装了。
- PV(Physical Volume)即物理卷
硬盘分区后(还未格式化为文件系统)使用pvcreate命令可以将分区创建为pv,要求分区的system ID为8e,即为LVM格式的系统标识符。
- VG(Volume Group)即卷组
将多个PV组合起来,使用vgcreate命令创建成卷组,这样卷组包含了多个PV就比较大了,相当于重新整合了多个分区后得到的磁盘。虽然VG是整合多个PV的,但是创建VG时会将VG所有的空间根据指定的PE大小划分为多个PE,在LVM模式下的存储都以PE为单元,类似于文件系统的Block。
- PE(Physical Extend)
PE是VG中的存储单元。实际存储的数据都是存储在这里面的。
- LV(Logical Volume)
VG相当于整合过的硬盘,那么LV就相当于分区,只不过该分区是通过VG来划分的。VG中有很多PE单元,可以指定将多少个PE划分给一个LV,也可以直接指定大小(如多少兆)来划分。划分为LV之后就相当于划分了分区,只需再对LV进行格式化即可变成普通的文件系统。
通俗地讲,非LVM管理的分区步骤是将硬盘分区,然后将分区格式化为文件系统。而使用LVM,则是在硬盘分区为特定的LVM标识符的分区后将其转变为LVM可管理的PV,其实PV仍然类似于分区,然后将几个PV整合为类似于磁盘的VG,最后划分VG为LV,此时LV就成了LVM可管理的分区,只需再对其格式化即可成为文件系统。
- LE(logical extent)
PE是物理存储单元,而LE则是逻辑存储单元,也即为lv中的逻辑存储单元,和pe的大小是一样的。从vg中划分lv,实际上是从vg中划分vg中的pe,只不过划分lv后它不再称为pe,而是成为le。
LVM之所以能够伸缩容量,其实现的方法就是将LV里空闲的PE移出,或向LV中添加空闲的PE。
LVM的写入机制
LV是从VG中划分出来的,LV中的PE很可能来自于多个PV。在向LV存储数据时,有多种存储机制,其中两种是:
- 线性模式(linear):先写完来自于同一个PV的PE,再写来自于下一个PV的PE。
- 条带模式(striped):一份数据拆分成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0。
尽管striped读写性能较好也不建议使用该模式,因为lvm的着重点在于弹性容量扩展而非性能,要实现性能应该使用RAID来实现,而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。
LVM实现图解
LVM常用命令汇总
任务 |
PV阶段 |
VG阶段 |
LV阶段 |
查找(scan) |
pvscan |
vgscan |
lvscan |
新建(create) |
pvcreate |
vgcreate |
lvcreate |
显示(display) |
pvdisplay |
vgdisplay |
lvdisplay |
增加(extend) |
|
vgextend |
lvextend(lvresize) |
减少(reduce) |
|
vgreduce |
lvreduce(lvresize) |
删除(remove) |
pvremove |
vgremove |
lvremove |
改变容量(resize) |
|
|
lvresize |
改变属性(attribute) |
pvchange |
vgchange |
lvchange |
LVM的实现
1、准备物理磁盘。
[root@localhost ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x0005b35c 设备 Boot Start End Blocks Id System /dev/sda1 * 2048 616447 307200 83 Linux /dev/sda2 616448 41943039 20663296 8e Linux LVM 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/mapper/cl-root:20.1 GB, 20107493376 字节,39272448 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘 /dev/mapper/cl-swap:1048 MB, 1048576000 字节,2048000 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
我们从空的硬盘sdb上创建两个分区sdb1 5G,sdb2 5G为接下来做LVM做准备,注意的是我们在创建分区是需要设定分区的类型Linux LVM的分区类型为8e,并且这些分区要被内核识别,通过cat /proc/partions进行查看,若没有显示,则需要让内核重新进行探测
[root@localhost ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x4822aff9 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x4822aff9 设备 Boot Start End Blocks Id System 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1):1 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G 分区 1 已设置为 Linux 类型,大小设为 5 GiB 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x4822aff9 设备 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 83 Linux 命令(输入 m 获取帮助):t 已选择分区 1 Hex 代码(输入 L 列出所有代码):8e 已将分区“Linux”的类型更改为“Linux LVM” 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x4822aff9 设备 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM
命令(输入 m 获取帮助):n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p 分区号 (2-4,默认 2):2 起始 扇区 (10487808-41943039,默认为 10487808): 将使用默认值 10487808 Last 扇区, +扇区 or +size{K,M,G} (10487808-41943039,默认为 41943039):+5G 分区 2 已设置为 Linux 类型,大小设为 5 GiB 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x4822aff9 设备 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM /dev/sdb2 10487808 20973567 5242880 83 Linux 命令(输入 m 获取帮助):t 分区号 (1,2,默认 2):2 Hex 代码(输入 L 列出所有代码):8e 已将分区“Linux”的类型更改为“Linux LVM” 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x4822aff9 设备 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM /dev/sdb2 10487808 20973567 5242880 8e Linux LVM
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# fdisk -l /dev/sdb 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x4822aff9 设备 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 8e Linux LVM /dev/sdb2 10487808 20973567 5242880 8e Linux LVM [root@localhost ~]# cat /proc/pa pagetypeinfo partitions [root@localhost ~]# cat /proc/partitions major minor #blocks name 8 0 20971520 sda 8 1 307200 sda1 8 2 20663296 sda2 8 16 20971520 sdb 8 17 5242880 sdb1 8 18 5242880 sdb2 8 32 20971520 sdc 8 48 20971520 sdd 11 0 4277248 sr0 253 0 19636224 dm-0 253 1 1024000 dm-1
创建物理卷
将新创建的两个分区/dev/sdb1 /dev/sdb2创建成物理卷:所用的命令为pvcreate /dev/adb{1,2} 当然也可以分开进行设定
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2 Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 cl lvm2 a-- 19.70g 0 /dev/sdb1 lvm2 --- 5.00g 5.00g /dev/sdb2 lvm2 --- 5.00g 5.00g /dev/sdc lvm2 --- 20.00g 20.00g /dev/sdd lvm2 --- 20.00g 20.00g
通过pvs 和pvdisplay可以查看物理卷的信息,后面也可以指定特定的物理磁盘,查看某一个物理卷的信息
[root@localhost ~]# pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name cl PV Size 19.71 GiB / not usable 3.00 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 5044 Free PE 0 Allocated PE 5044 PV UUID uTbh7P-pmtL-KRqx-uAys-fxUA-PdUa-LIpvOX "/dev/sdb1" is a new physical volume of "5.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 5.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID UFLcKK-XrDv-1wZi-FYIL-FDSW-Bsn0-Xy1Era "/dev/sdc" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/sdc VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID gHJF8r-cqBO-EV3L-yxD9-3CaA-K3OR-jcFDtU "/dev/sdb2" is a new physical volume of "5.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 5.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 9Y3f1L-3M35-lAHU-27xd-XpvI-ptOT-bRekUW "/dev/sdd" is a new physical volume of "20.00 GiB" --- NEW Physical volume --- PV Name /dev/sdd VG Name PV Size 20.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID IKH97P-igyp-aaC7-bw2h-tQOF-gjXy-2pc9z0
创建卷组
物理卷pv创建好之后,才可以创建卷组,创建卷组则用命令vgcreate,并将刚才创建的两个物理卷加入该卷组,其中PE的默认大小为4MB,PE是卷组的最小存储单位,可以通过-s选项指定PE的大小,可以通过vgs或者vgdisplay来查看创建的卷组
[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2 Volume group "myvg" successfully created [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree cl 1 2 0 wz--n- 19.70g 0 myvg 2 0 0 wz--n- 9.99g 9.99g [root@localhost ~]# vgdisplay --- Volume group --- VG Name cl System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size 19.70 GiB PE Size 4.00 MiB Total PE 5044 Alloc PE / Size 5044 / 19.70 GiB Free PE / Size 0 / 0 VG UUID AbayDZ-NRTB-EILO-IjLH-kHji-Ixek-LI1Kdx --- Volume group --- VG Name myvg 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 9.99 GiB PE Size 4.00 MiB Total PE 2558 Alloc PE / Size 0 / 0 Free PE / Size 2558 / 9.99 GiB VG UUID bRctGj-xKXV-C2pw-hzqk-KSyI-h5mR-BATF9A
创建逻辑卷
卷组VG创建好之后,才可以创建逻辑卷LV,逻辑卷的创建命令为lvcreate,创建好之后可以通过lvs或者lvdisplay开查看创建的逻辑卷,需要说明的是在创建lv的时候需要指定其大小,选项为-L,逻辑卷的名字选项-n,也可以指定PE的个数选项-l
[root@localhost ~]# lvcreate -L 5G -n textlv myvg Logical volume "textlv" created. [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root cl -wi-ao---- 18.73g swap cl -wi-ao---- 1000.00m textlv myvg -wi-a----- 5.00g [root@localhost ~]# lvdisplay --- Logical volume --- LV Path /dev/cl/swap LV Name swap VG Name cl LV UUID Y06H4S-vcF7-GIAf-AV1U-0TlK-yR39-FiR7bD LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-12-08 20:41:35 +0800 LV Status available # open 2 LV Size 1000.00 MiB Current LE 250 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:1 --- Logical volume --- LV Path /dev/cl/root LV Name root VG Name cl LV UUID L9AAAm-gjjC-dF5S-fOyd-XOTG-fxBC-CI0j2Y LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-12-08 20:41:36 +0800 LV Status available # open 1 LV Size 18.73 GiB Current LE 4794 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:0 --- Logical volume --- LV Path /dev/myvg/textlv LV Name textlv VG Name myvg LV UUID LhE6yQ-t3cn-BmwW-css0-dvua-CvCO-pSf2pe LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-12-26 21:41:01 +0800 LV Status available # open 0 LV Size 5.00 GiB Current LE 1280 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:2
创建文件系统
逻辑卷textlv创建好之后,就可以在上面创建文件系统,以ext3文件系统为例,应该注意的是逻辑卷的引用需要逻辑卷的设备文件,逻辑卷的设备文件有两种书写方式
/dev/VG_NAME/LV_NAME
/dev/mapper/VG_NAME-LV_NAME
以我们做的为例逻辑卷的设备文件为
/dev/myvg/textlv或者是/dev/mapper/myvg-textlv
[root@localhost ~]# mkfs -t ext4 /dev/myvg/textlv mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
挂载
将创建好的文件系统/dev/myvg/textlv挂载到/mnt上,若实现以后服务器重启自动挂载,需要将创建好的文件系统挂载到配置文件/etc/fstab里面
[root@localhost ~]# mount /dev/myvg/textlv /mnt
[root@localhost ~]# mount |tail -1 /dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
[root@localhost ~]# vi /etc/fstab # # /etc/fstab # Created by anaconda on Sun Dec 8 20:41:38 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/cl-root / xfs defaults 0 0 UUID=d6e819c3-6d45-4b79-8179-746c005bf567 /boot xfs defaults 0 0 /dev/mapper/cl-swap swap swap defaults 0 0 /dev/myvg/textlv /mnt ext4 defaults 0 0
为了查看/etc/fstab/是否正确,可以先卸载逻辑卷textlv,然后使用mount –a是内核重新读取/etc/fstab,看是否能够自动挂载
[root@localhost ~]# umount /dev/myvg/textlv [root@localhost ~]# mount -a [root@localhost ~]# mount |tail -1 /dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?