LVM(Logical Volume Manager),逻辑卷管理。它是Linux中对磁盘分区的一种管理机制。相信大家会有疑问,为什么要有这样一个管理机制?那是因为:
很多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,分得太大,会浪费硬盘空间;分得太小,又会面临不够使用的情况。一旦系统分区不够用时,我们就不得不备份、删除相关数据,甚至被迫重新规划存储方案并重装操作系统,以满足应用系统的需要。
基于这样的需求,LVM就为我们提供了一种动态管理存储的机制。
LVM 为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念。了解LVM原理,我们首先得了解几种基本的LVM术语。
名 称 | 意 义 |
---|---|
PV(Physical Volume) | 物理卷,真实的物理硬盘或分区 |
VG(Volume Group) | 卷组,多个物理卷组成的一块大的逻辑硬盘 |
LV(Logical Volume) | 逻辑卷,卷组划分的多个可以使用的分区 |
PE(Physical Extend) | 物理扩展块,物理卷中可用于分配的最小存储单元,默认为4MB |
LE(Logical Extend) | 逻辑扩展块,逻辑卷中可用于分配的最小存储单元,在同一个卷组中,LE的大小和PE是相同的,并且一一对应 |
紧接着我们来看看LVM的工作原理是什么呢?结合这张图来为大家解释!
LVM是在硬盘分区之上建立一个逻辑层,这个逻辑层让多个硬盘或分区看起来像一块逻辑硬盘,然后将这块逻辑硬盘分成逻辑卷之后使用,从而大大提高了分区的灵活性。
① 建立物理卷
pvcreate命令语法:vgcreate 设备文件名
[root@localhost ~]# yum install -y lvm2 //安装LVM2(LVM的管理工具)
[root@localhost ~]# pvcreate /dev/sdb{1,2,3,4} //将分区建立成为物理卷
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdb3" successfully created
Physical volume "/dev/sdb4" successfully created
② 删除物理卷
pvremove命令语法:vgcreate 物理卷名
//删除物理卷时,物理卷必须不属于任何卷组
[root@localhost ~]# pvmove /dev/sdb4 //转移数据到其他PV
[root@localhost ~]# pvremove /dev/sdb4 //删除物理卷sdb4
Labels on physical volume "/dev/sdb4" successfully wiped
③ 查看物理卷
[root@localhost ~]# pvs //查看物理卷的概要信息
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a--u 108.00m 8.00m
/dev/sdb2 myvg lvm2 a--u 108.00m 108.00m
/dev/sdb3 myvg lvm2 a--u 108.00m 108.00m
[root@localhost ~]# pvdisplay //查看物理卷的详细信息
--- Physical volume ---
PV Name /dev/sdb1
VG Name myvg
PV Size 109.79 MiB / not usable 1.79 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 27
Free PE 2
Allocated PE 25
PV UUID PXC8sh-tCv4-KQ5S-Hwo4-FrT1-erxf-0QtmZ8
... //省略/dev/sdb{2,3}的详细信息
[root@localhost ~]# pvscan //扫描所有硬盘上的物理卷
PV /dev/sdb1 VG myvg lvm2 [108.00 MiB / 8.00 MiB free]
PV /dev/sdb2 VG myvg lvm2 [108.00 MiB / 108.00 MiB free]
PV /dev/sdb3 VG myvg lvm2 [108.00 MiB / 108.00 MiB free]
Total: 3 [324.00 MiB] / in use: 3 [324.00 MiB] / in no VG: 0 [0 ]
① 建立卷组
vgcreate命令语法:vgcreate [-s PE 大小] 卷组名 物理卷名
其中,-s用来指定PE的大小,单位可以是 MB、GB、TB 等,默认为4MB。
[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2 //将物理卷sdb{1,2}加入卷组myvg
Volume group "myvg" successfully created
② 增加卷组容量
vgextend命令语法:vgextend 卷组名 物理卷名
[root@localhost ~]# vgextend myvg /dev/sdb3 //将物理卷sdb3加入卷组myvg
Volume group "myvg" successfully extended
③ 减少卷组容量
vgreduce命令语法:vgreduce 卷组名 物理卷名
[root@localhost ~]# vgreduce myvg /dev/sdb3 //将物理卷sdb3从卷组myvg中移除
Removed "/dev/sdb3" from volume group "myvg"
④ 删除卷组
vgremove命令语法:vgremove 卷组名
//删除卷组时,卷组中必须没有任何逻辑卷
[root@localhost ~]# vgcreate myvg1 /dev/sdb3 //建立测试卷组myvg1
Volume group "myvg1" successfully created
[root@localhost ~]# vgremove myvg1 //删除测试卷组myvg1
Volume group "myvg1" successfully removed
⑤ 查看卷组
[root@localhost ~]# vgs //查看卷组的概要信息
VG #PV #LV #SN Attr VSize VFree
myvg 2 1 0 wz--n- 216.00m 64.00m
[root@localhost ~]# vgdisplay //查看卷组的详细信息
--- Volume group ---
VG Name myvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 216.00 MiB
PE Size 4.00 MiB
Total PE 54
Alloc PE / Size 38 / 152.00 MiB
Free PE / Size 16 / 64.00 MiB
VG UUID jSVIZS-MLeY-fOox-pAJZ-hLLd-vtM3-YaK2Hu
[root@localhost ~]# vgscan //扫描所有硬盘上的卷组
Reading all physical volumes. This may take a while...
Found volume group "myvg" using metadata type lvm2
① 建立逻辑卷
lvcreate命令语法:lvcreate [选项] [-n 逻辑卷名] 卷组名
其中,常用选项:
-n 逻辑卷名:指定逻辑卷名称;
-L 大小:指定逻辑卷大小,直接指定容量大小,单位可以是 MB、GB、TB 等;
-l 数量:指定逻辑卷大小,通过指定PE数量来决定逻辑卷大小;
-s:创建快照;
[root@localhost ~]# lvcreate -L 100M -n mylv myvg //使用卷组myvg建立大小为100M的逻辑卷mylv
Logical volume "mylv" created.
② 增加逻辑卷容量
lvresize命令语法:lvresize [选项] 逻辑卷的设备文件名
其中,常用选项:
-L 大小:调整逻辑卷大小,直接指定容量大小;
-l 数量:调整逻辑卷大小,通过指定PE数量来决定逻辑卷大小;
它们都可以使用绝对和相对两种方式来设置:
#:表示调整为 # 大小或 # 个PE大小的容量;
+/- #:表示增加/减少 # 大小或增加/减少 # 个PE大小的容量。
有足够大的VG就可以增加LV容量。
[root@localhost ~]# lvresize -L +50M /dev/myvg/mylv //增加逻辑卷mylv的大小到150M
Rounding size to boundary between physical extents: 52.00 MiB.
Size of logical volume myvg/mylv changed from 100.00 MiB (25 extents) to 152.00 MiB (38 extents).
Logical volume mylv successfully resized.
[root@localhost ~]# df -h /dev/myvg/mylv //查看硬盘信息
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg-mylv
93M 1.6M 87M 2% /mnt/mylv //mylv分区的大小并未改变
//逻辑卷的大小虽然改变了,但是挂载磁盘大小依然是100M,如果要让分区使用这个新的逻辑卷,必须给新增的LV创建文件系统。
[root@localhost ~]# resize2fs /dev/myvg/mylv //调整文件系统大小
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/myvg/mylv is mounted on /mnt/mylv; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/myvg/mylv to 155648 (1k) blocks.
The filesystem on /dev/myvg/mylv is now 155648 blocks long.
[root@localhost ~]# df -h /dev/myvg/mylv
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg-mylv
144M 1.6M 135M 2% /mnt/mylv
③ 减少逻辑卷容量
减少LV容量是一个比较危险的操作,所以一般并不推荐减少逻辑卷的容量,因为这有可能导致数据丟失。需要按照以下步骤减少LV容量:
① 卸载逻辑卷;
② 使用 e2fsck 命令强制检测逻辑卷剩余空间;
③ 使用 resize2fs 命令减小文件系统;
④ 使用 lvresize 命令减小逻辑卷容量;
⑤ 挂载使用。
[root@localhost ~]# umount /dev/myvg/mylv //卸载逻辑卷mylv
umount: /dev/myvg/mylv: not mounted
[root@localhost ~]# e2fsck -f /dev/myvg/mylv //强制检测逻辑卷剩余空间
e2fsck 1.41.12 (17-May-2010)
/dev/myvg/mylv: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/myvg/mylv: ***** FILE SYSTEM WAS MODIFIED *****
/dev/myvg/mylv: 11/37544 files (9.1% non-contiguous), 10390/155648 blocks
[root@localhost ~]# resize2fs /dev/myvg/mylv 100M //减少逻辑卷文件系统大小
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/myvg/mylv to 102400 (1k) blocks.
The filesystem on /dev/myvg/mylv is now 102400 blocks long.
[root@localhost ~]# lvresize -L -50M /dev/myvg/mylv //减少逻辑卷容量
Rounding size to boundary between physical extents: 48.00 MiB.
WARNING: Reducing active logical volume to 108.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv? [y/n]: y
Size of logical volume myvg/mylv changed from 156.00 MiB (39 extents) to 108.00 MiB (27 extents).
Logical volume mylv successfully resized.
[root@localhost ~]# mount /dev/myvg/mylv /mnt/mylv/ //挂载
[root@localhost ~]# df -h /dev/myvg/mylv //查看硬盘信息
/dev/mapper/myvg-mylv
93M 1.6M 87M 2% /mnt/mylv
tips:文件系统大小和逻辑卷大小一定要保持一致才行。如果逻辑卷大于文件系统,就会由于部分区域未格式化成文件系统从而造成空间的浪费;如果逻辑卷小于文件系统,那么数据就会出现问题。
④ 删除逻辑卷
删除逻辑卷,其中的所有数据就会丢失。需要按照以下步骤删除LV:
① 卸载逻辑卷;
② 如果/etc/fstab中有逻辑卷的挂载信息(如果之前并未添加可以不用理会),需要先删除,否则系统有可能不能启动;
③ 使用lvremove命令删除逻辑卷。
lvremove命令语法:lvremove 逻辑卷名
[root@localhost ~]# umount /dev/myvg/mylv //卸载逻辑卷mylv
[root@localhost ~]# lvremove /dev/myvg/mylv //删除逻辑卷mylv
Do you really want to remove active logical volume mylv? [y/n]: y
Logical volume "mylv" successfully removed
⑤ 查看逻辑卷
[root@localhost ~]# lvs //查看逻辑卷的概要信息
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-ao---- 108.00m
[root@localhost ~]# lvdisplay //查看逻辑卷的详细信息
--- Logical volume ---
LV Path /dev/myvg/mylv
LV Name mylv
VG Name myvg
LV UUID 7xpEK7-ODNn-DnSX-Eshz-zo4I-zitd-2h1aSM
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2020-04-03 04:36:05 +0800
LV Status available
# open 1
LV Size 108.00 MiB
Current LE 27
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
[root@localhost ~]# lvscan //扫描所有硬盘上的逻辑卷
ACTIVE '/dev/myvg/mylv' [108.00 MiB] inherit
需要按照以下步骤建立LVM:
① 把物理硬盘分成分区;
② 把物理分区建立为物理卷(PV);
③ 把物理卷整合为卷组(VG),卷组可以动态地调整大小,把物理分区加入卷组或从卷组中删除;
④ 把卷组再划分为逻辑卷(LV),逻辑卷也可以直接调整大小。
⑤ 逻辑卷可以想象为分区,所以也需要格式化和挂载。
[root@localhost ~]# fdisk /dev/sdb //在/dev/sdb硬盘中新建两个分区,每个分区大小为100M
Command (m for help): n //创建分区
Command action
e extended
p primary partition (1-4)
p //分区类型选择主分区
Partition number (1-4): 1 //设置分区号为1
First cylinder (1-130, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): +100M //设置100M大小
... //剩下一个分区创建过程省略
Command (m for help): t //更改分区格式
Partition number (1-4): 1 //选择分区1
Hex code (type L to list codes): 8e //8e为Linux LVM格式
Changed system type of partition 1 to 8e (Linux LVM)
... //剩下一个分区格式修改过程省略
Command (m for help): p //查询创建结果
Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 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: 0x2d354121
Device Boot Start End Blocks Id System
/dev/sdb1 1 14 112423+ 8e Linux LVM
/dev/sdb2 15 28 112455 8e Linux LVM
Command (m for help): w //保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partx -a /dev/sdb //重读磁盘分区表信息
[root@localhost ~]# pvcreate /dev/sdb{1,2} //将分区建立成为物理卷
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
[root@localhost ~]# pvs //查看物理卷信息
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a--u 108.00m 108.00m
/dev/sdb2 myvg lvm2 a--u 108.00m 108.00m
[root@localhost ~]# vgcreate myvg /dev/sdb{1,2} //将物理卷sdb{1,2}加入卷组myvg
Volume group "myvg" successfully created
[root@localhost ~]# vgs //查看卷组信息
VG #PV #LV #SN Attr VSize VFree
myvg 2 0 0 wz--n- 216.00m 216.00m
[root@localhost ~]# lvcreate -L 200M -n mylv myvg //使用卷组myvg建立大小为200M的逻辑卷mylv
Logical volume "mylv" created.
[root@localhost ~]# lvs //查看逻辑卷信息
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv myvg -wi-a----- 200.00m
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv //格式化
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
51200 inodes, 204800 blocks
10240 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]# mkdir /mnt/mylv //创建挂载点
[root@localhost ~]# mount /dev/myvg/mylv /mnt/mylv/ //挂载
[root@localhost ~]# df -Th //查看硬盘信息
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 9.8G 814M 8.5G 9% /
tmpfs tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 ext4 190M 31M 150M 17% /boot
/dev/sr0 iso9660 3.7G 3.7G 0 100% /media
`/dev/mapper/myvg-mylv
ext4 190M 1.6M 179M 1% /mnt/mylv`