LVM 简介
使用传统分区在进行分区完成后,一般情况下就不会再去调整了,如果要调整大小则会十分麻烦。但是,LVM 可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以进行弹性的管理逻辑卷的扩缩容,操作简单,而不损坏已存储的数据。可以随意将新的硬盘添加到 LVM,以直接扩展已经存在的逻辑卷。
简而言之就是:可随时按需修改逻辑卷大小 在介绍 LVM 之前,需要先了解下硬盘的几个分区
三大分区介绍
以 Linux 系统为例,学习下磁盘的分区,磁盘分区可以分为三类,分别为:
主分区:一块硬盘上可以被独立使用的一部分,一块硬盘最多可以有四个主分区 扩展分区:因为一块物理硬盘只能有四个分区,所以为了解决这个问题,引入了扩展分区,但扩展分区不能直接使用 逻辑分区:逻辑分区可以有任意多个,但不能单独存在,多个连续的逻辑分区可以组成一个扩展分区
因此,当我们部署系统时,需要对这三个分区做一个合理的规划,否则可能会浪费磁盘空间。
那么这三个分区之间的关系是什么呢?
简单来说就是,一个硬盘最多可划分四个主分区,如果想要更多的分区,则需要设置扩展分区,且只能有一个扩展分区,但是扩展分区不能直接使用,需要在扩展分区上设置逻辑分区,而逻辑分区可以划分多个。
既然是这种关系,那么可以有如下的关系图
P: 主分区
E: 扩展分区:因为一块物理硬盘只能有四个分区,所以为了解决这个问题,引入了扩展分区
L: 逻辑分区

要么分四个主分区,没有扩展分区
要么就是不超过三个主分区,一个扩展分区,至少一个逻辑分区
一个硬盘为什么只能划分四个主分区?
要解释这个问题,需要知道硬盘的第一个扇区Boot Sector
的组成:MBR
(Master Boot Recorder,主引导记录),DPT
(Disk Partition Table,主分区表), Boot Record ID
,由这三部分组成。
硬盘的第一个扇区一共只有 512 字节,而其中MBR
占用了前 446 个字节,主要是存放系统的主引导程序,负责从活动分区中装载并运行系统引导程序DPT
主分区表占用了 64 字节,记录了磁盘的基本分区信息,在主分区表里可以划分四个分区项,每一项占用 16 字节,这 16 字节记录的便是各个主分区的信息Boot Record ID
引导区标记,占用两个字节,这个标记用来判断引导区是否合法
到这是不是就明白了,为什么一块硬盘可以划分四个主分区了,就是因为容量有限,只能划分四个
那么知道了这些,当你在进行分区的时候,是不是就能知道分区时的编号是咋来的了吧
需要注意的是,前四个编号已经被占用了,只能给主分区使用,逻辑分区只能从编号 5 开始往下排。
LVM 的一些概念简介
PV (Physical Volume): 物理卷,是 LVM 中最底层的单元,可以是一个磁盘 /dev/vdb
,也可以是磁盘上的某个分区/dev/vdb1VG (Volume Group): 卷组,可以设置多个卷组,每个卷组都有不同的用途,例如可以对 SSD 磁盘划分一个卷组 LV (Logical Volume): 逻辑卷,LV 是建立在 VG 之上的,可以在 LV 上创建一个文件系统 PE (Physical Extent): PV 中可以分配的最小存储单元,大小可指定 LE (Logical Extent): LV 中可分配的最小存储单元
怎么来理解这几个概念呢?
LVM 是把硬盘的分区分成了更小的单元(PE),然后再把这些单元组合成了分区 PV,然后 PV 又组成了 VG,最后在 VG 上创建分区
实战
机器是阿里云的 ECS,添加了一块1T
的数据盘,下面给分区成 LVM
分区
# fdisk /dev/vdb #执行此命令,进行分区
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xdf09eb6a.
Command (m for help): p #在此输入p
Disk /dev/vdb: 1073.7 GB, 1073741824000 bytes, 2097152000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xdf09eb6a
Device Boot Start End Blocks Id System
Command (m for help): n #在此输入n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1 #在此输入1
First sector (2048-419430399, default 2048): #回车
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-419430399, default 419430399): #回车
Using default value 419430399
Partition 1 of type Linux and of size 200 GiB is set
Command (m for help): t #在此输入t
Selected partition 1
Hex code (type L to list all codes): L #在此输入L
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Hex code (type L to list all codes): 8e #输入lvm类型的hex代码
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p #在此输入p
Disk /dev/sdb: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xdf09eb6a
Device Boot Start End Blocks Id System
/dev/vdb1 2048 2097151999 1048574976 8e Linux LVM
Command (m for help): w #保存
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
创建 PV
pvcreate /dev/vdb1
创建好 PV 后,查看创建的 PV
# pvdisplay
--- Physical volume ---
PV Name /dev/vdb1
VG Name vgdata
PV Size <1000.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 255999
Free PE 255
Allocated PE 255744
PV UUID dejeTn-cVJc-qWXM-EWRw-gKge-znNc-1a6VGH
创建 VG
vgcreate vgdata /dev/vdb1
查看创建的 VG
# vgdisplay
--- Volume group ---
VG Name vgdata
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size <1000.00 GiB
PE Size 4.00 MiB
Total PE 255999
Alloc PE / Size 255744 / 999.00 GiB
Free PE / Size 255 / 1020.00 MiB
VG UUID R0tJm5-guE4-vy3Q-UgJX-jSkt-mLdo-T4bvxU
创建 LV
lvcreate -L 999G -n lvdata vgdata
上面这个命令是指定具体的大小,也可以指定所有的空间,比如我这里大小是 1000G,如果指定 1000G 然后去创建 LV 就会失败,正确的命令应该是:
lvcreate -l 100%FREE 0n lvdata vgdata
格式化
mkfs.ext4 /dev/vgdata/lvdata
创建目录并挂载 LV 到此目录
mkdir /data
mount /dev/vgdata/lvdata /data
查看挂载后的分区
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 493G 114G 354G 25% /
devtmpfs devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs tmpfs 7.8G 636K 7.8G 1% /run
tmpfs tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/1000
/dev/mapper/vgdata-lvdata ext4 984G 102G 832G 11% /data
设置开机自动挂载
vim /etc/fstab
/dev/vgdata/lvdata /data ext4 defaults 0 0 #添加到最后一行即可
简单介绍下每一列的含义:
第一列:要挂载的磁盘
第二列:挂载点
第三列:文件类型
第四列:挂载选项,详细参考man mount. 下面列出一些常用的选项:
auto: 系统自动挂载,fstab默认就是这个选项
ro: read-only
rw: read-write
defaults: rw, suid, dev, exec, auto, nouser, and async.
第五列:为dump选项,设置是否让备份程序dump备份文件系统,0为忽略,1为备份。
第六列:为fsck选项,告诉fsck程序以什么顺序检查文件系统,0为忽略。
以上简单介绍了 LVM 以及如何新增一个磁盘并分区成 LVM,以及介绍了为什么要用 LVM,还有一篇文章是介绍现有分区磁盘空间已经满了,如何通过 LVM 来动态的扩容,文章链接:lvm 添加硬盘并扩容至已有分区





