对于普通的分区,扩展度不高,一旦分区格式化完成,很难灵活的再增加或者减少分区大小,一旦系统分区不够用就可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要。为了解决这个问题,可以使用LVM(逻辑卷),实现动态调整Linux分区容量。
LVM是linux操作系统中对磁盘分区进行管理的一种逻辑机制,它是建立在硬盘和分区之上,文件系统之下的一个逻辑层,在建立文件系统时屏蔽了下层的磁盘分区布局,因此能够在保持现有数据不变的情况下动态调整磁盘容量,从而增强磁盘管理的灵活性。
需要注意:/boot 分区用于存放引导文件,不能基于 LVM 创建
-----------------------------------------
PV (Physical Volume) 物理卷是LVM的基本存储设备,通常对应为一个使用fdisk等工具建立的普通分区或整个硬盘,创建物理卷时,会在分区或硬盘的头部创建一个保留区块,用于记录LVM的属性,并把存储空间分割成默认大小为4MB的基本单元(physical extent,PE),从而构成物理卷。 对用于转换成物理卷的普通分区,建议使用fdisk工具将分区类型的ID标记号改成8e。若是整块硬盘,可以将所有磁盘空间划分为一个主分区后再做相应的调整。
VG (Volume Group) 一个或多个物理卷(PV)组合而成的整体,即成为卷组(VG),在卷组中可以动态的添加或移除物理卷,卷组的名称由用户自行定义。
LV(Logical Volume)逻辑卷(LV)建立在卷组(VG)之上,把VG切割成一块一块小空间,这一块块小空间就是逻辑卷LV。PE 是整个 LVM 的最小储存单位,那么 LV的大小就与在此 LV 内的 PE 总数有关。
逻辑卷常用管理命令:
功能 | pv | vg | lv |
scan 扫描 | pvscan | vgscan | lvscan |
create 创建 | pvcreate | vgcreate | lvcreate |
display 显示 | pvdisplay | vgdisplay | lvdisplay |
remove 删除 | pvremove | vgremove | lvremove |
extend 扩容 | vgextend | lvextend | |
reduce 缩容 | vgreduce | lvreduce |
lsblk:查看分区
1、创建LVM分区
创建分区,并将分区类型转换为Linux LVM格式:
- MBR格式:83 Linux 、8e Linux LVM
- GPT格式:8300 Linux filesystem 、8e00 Linux LVM
2、创建 PV
a. pvcreate
# 创建 sdb1,2,,5,6,7,8物理卷
pvcreate /dev/sdb[125678]
b. pvscan
# 列出当前系统的pv
pvs | pvscan
c. pvdisplay
# 查看 /dev/sdb1 PV 的详细信息
pvdisplay /dev/sdb1
d. pvremove
# 删除 /dev/sdb1 PV
pvremove /dev/sdb1
3、创建 VG
a. vgcreate
# 用 sdb1,sdb2 创建 vg01卷组
vgcreate vg01 /dev/sdb[12]
b. vgscan
# 列出当前系统的 卷组
vgs | vgscan
c. vgdisplay
# 查看 vg01 的详细信息
vgdisplay vg01
d. vgextend
注意:若事先没有把sdb5转化为pv,而是直接添加到vg里面,他会自动初始化成pv
# 给 vg01 扩容
vgextend vg01 /dev/sdb5
# 查看扩容之后的 vg01 的信息
vsdispaly vg01
e. vgreduce
实际生产环境中不建议缩容,并且xfs⼲脆不⽀持缩容
# 缩容:将 /dev/sdb5 去除
vgreduce vg01 /dev/sdb5
f. vgremove
# 删除 vg01
vgremove vg01
4、创建 LVM
a. lvcreate
- 描述:创建逻辑卷
- 语法:lvcreate -L 逻辑卷容量 -n 逻辑卷容量 卷组名称
-s 创建逻辑卷的快照
# 从 vg01 卷组中创建名字叫 lv01的lv
lvcreate -L 100M -n lv01 vg01
b. lvscan
# 查看 lv01 的详细信息
lvscan | lvs
c. lvdisplay
# 查看 lv01 的详细信息
lvdisplay /dev/vg01/lv01
d. lvextend
给逻辑卷扩容,需要查看逻辑卷所使用的卷组剩余的容量,根据卷组剩余的容量给卷组扩容
# 查看 vg01 的剩余容量
vgdisplay vg01
# 给 lv01 扩容 1G
lvextend -L +1G /dev/vg01/lv01
# 查看 lv01 容量
lvs
e. xfs_growfs
逻辑卷的文件系统仍然是100M没有改变,我们还需要使用xfs_growfs来扩大XFS文件系统,也可以直接用resize2fs来处理设备
XFS系统只能增长,不能减少!因此如果需要减少LVM的话,分区只能使用ext4
# 刷新挂载节点
xfs_growfs /mnt/mbr
f. xfs_dump & xfsrestore
# 备份数据
xfsdump -f /root/lvm.img /mnt/mbr
# 恢复数据
xfsrestore -f /root/lvm.img /mnt/mbr/
g. lvreduce
实际生产环境中不建议缩容,并且xfs⼲脆不⽀持缩容
# 将 lv01 缩容500M
lvreduce -L -500M /dev/vg01/lv01
# 查看 lv01 容量大小
lvs
5、格式化并挂载
# 格式化 lv01
mkfs.xfs /dev/vg01/lv01
# 挂载 lv01
mount /dev/vg01/lv01 /mnt/mbr
# 创建文件并写入数据
echo "hello lvm" > /mnt/mbr/hello.txt
6、LVM 快照
通过lvm快照给lvm真实卷拍个照片,当 lv真实卷发送改变时:
- lvm 快照把 lvm 真实卷改变之前的内容存放在快照上,
- 这样在 lvm 快照有效的这段时间内,我们看到的lvm快照上的内容始终是lvm真实卷在创建 lvm 快照时内容,
- 通过备份lvm快照即可达到在线备份 lvm 真身的目的
需要注意的是,当lvm 快照比 lvm 真身小时,若lvm 真身发生的改变小于 lvm 快照,则 lvm 快照将变得无法读取而失效 ; 若 lvm 快照大于等于 lvm 真身,则不会发生前面的情况
VG中需要预留存放快照本身的空间,不能全部被占满。
快照所在的VG 必须与被备份的 LV 相同,否则创建快照会失败
a. 创建快照
lvcreate 的 -s选项 是创建快照、-n指定快照名称
# 创建 lv01的快照 lv01.bak
lvcreate -s -L 500M -n lv01.bak /dev/vg01/lv01
# 查看 lv01.bak 快照
lvs | lvscan
b. 删除数据模拟数据损坏
# 删除 lv01 中的数据
rm -rf /mnt/mbr/*
c. 卸载lvm,挂载lvm快照
如果逻辑卷中的数据损坏,我们也已经备份好数据。那么我们可以这样操作:
- 第一步:先将逻辑卷卸载,挂在上lvm快照,将数据备份到其他位置上
- 第二步:卸载逻辑卷快照,挂载逻辑卷,将备份数据剪切到逻辑卷中
- 第三步:删除原来的快照,再创建新的快照
# 卸载逻辑卷
umount /mnt/mbr
# 挂载逻辑卷快照
mount /dev/vg01/lv01.bak /mnt/mbr
# 将数据暂时备份到别的地方
mv /mnt/mbr/* /opt/lv01.bak/
# 卸载逻辑卷快照
umount /mnt/mbr
# 挂载 lv01
mount /dev/vg01/lv01 /mnt/mbr
# 将备份文件剪切至lv01中
mv /opt/lv01.bak/* /mnt/mbr/
# 删除之前的快照,创建新的快照
lvremove /dev/vg01/lv01.bak
……
7、LVM删除流程
卸载文件系统 -> 删除逻辑卷 -> 删除卷组 -> 删除物理卷 -> 删除分区
# 卸载文件系统
umount /mnt/mbr
# 删除逻辑卷
lvremove /dev/vg01/lv01
# 删除卷组
vgremove vg01
# 删除逻辑卷
pvremove /dev/sdb[125678]
# 删除分区
fdisk /dev/sdb
……