参考文章: LVM逻辑卷管理器
1. 前言
linux在安装的时候就会涉及到分区的问题,可是如果分区太小了,后期要调整比较麻烦,lvm就是为了解决这种问题,可以实现动态扩容,不需要重新格式化磁盘进行分区了。
2. 注意事项
使用 resize2fs或xfs_growfs 对挂载目录在线扩容:
1. resize2fs 针对文件系统ext2 ext3 ext4
2. xfs_growfs 针对文件系统xfs
3. 示例
把/dev/centos/home下的50G变为8G:
1.增加
1.1 去掉挂载
umount /home
1.2 减小home,
lvreduce -L 8G /dev/centos/home 或 -42G
1.3 扩容/dev/centos/root
lvextend -L 42G /dev/centos/root
xfs_growfs /dev/centos/root
2.减小
xfs是不支持减少的,无法使用lvreduce,也无法使用resize2fs,
会报错:Couldn't find valid filesystem superblock。
意思是减少后的逻辑分区需要通过mkfs.xfs命令重新格式化一下。
4. LVM的工作原理
LVM(Logical Volume Manager)逻辑卷管理,是在硬盘分区和文件系统之间添加的一个逻辑层,为文件系统屏蔽下层硬盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统。管理员利用LVM可以在硬盘不用重新分区的情况下动态调整文件系统的大小,并且利用LVM管理的文件系统可以跨越物理硬盘。当服务器添加了新的硬盘后,管理员不必将原有的文件移动到新的硬盘上,而是通过LVM直接扩展文件系统来跨越物理硬盘。
LVM就是通过将底层的物理硬盘封装,然后以逻辑卷的方式呈现给上层应用。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。
5. 基础术语
- LV(logical volume)-逻辑卷:
类似于非LVM系统中的硬盘分区, 逻辑卷建立在卷组之上,在逻辑卷LV之上建立文件系统。
卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。
系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。
- VG(Volume Group)-卷组:
卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。
一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。
LVM卷组类似于非LVM系统中的物理硬盘,一个卷组VG由一个或多个物理卷PV组成。
可以在卷组VG上建立逻辑卷LV。
- PV(physical volume)-物理卷:
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,
也可以是整个物理硬盘,也可以是raid设备。
物理卷就是LVM的基本存储逻辑块,但和基本的物理存储介质比较却包含与LVM相关的管理参数,
创建物理卷可以用硬盘分区,也可以用硬盘本身。
- 物理存储介质(The physical media):
LVM存储介质,可以是硬盘分区、整个硬盘、raid阵列或SAN硬盘。
设备必须初始化为LVM物理卷,才能与LVM结合使用。
- PE(physical Extent)-物理块:
物理卷PV中可以分配的最小存储单元,PE的大小可以指定,默认为4MB
- LE(Logical Extent)-逻辑块:
逻辑卷LV中可以分配的最小存储单元,在同一卷组VG中LE的大小和PE是相同的,并且一一相对。
注意:PE大,读取速度快,但浪费空间。反之,读取速度慢,但节省空间。类似于socket;
总结:多个磁盘/分区/raid-->多个物理卷PV-->合成卷组VG-->从VG划分出逻辑卷LV-->格式化LV,挂载使用。
注意:老的Linux在创建PV时,需要将分区类型改为Linux LVM(8e)。但新的系统已经非常智能,即使默认的Linux分区(83),也可以创建PV。
6. LVM的优点
- 卷组VG可以使多个硬盘空间看起来像是一个大硬盘。
- 逻辑卷LV可以创建跨多个硬盘空间的分区。
- 在使用逻辑卷LV时,可以在空间不足时动态调整大小,不需要考虑逻辑卷LV在硬盘上的位置,不用担心没有可用的连续的空间。
- 可以在线对卷组VG、逻辑卷LV进行创建、删除、调整大小等操作。但LVM上的文件系统也需要重新调整大小。
- LVM允许创建快照,用来保存文件系统的备份。
注意:LVM是软件的卷管理方式,RAID是磁盘管理的方法。对于重要的数据块,用RAID保护物理硬盘不会因为故障而中断业务,再用LVM来实现对卷的良性管理,更好的利用硬盘资源。
LVM有两种写入机制:线性(写完一个PV再写下一个PV,默认)、条带(平均)
7. lvm常用的命令
功能 | 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 |
注意:查看命令有scan、display和s(pvs、vgs、lvs)。s是简单查看对应卷信息,display是详细查看对应卷信息。而scan是扫描所有的相关的对应卷。
8. 创建LVM--示例一
8.1 创建物理卷(分区或者整块磁盘都可以)
[root@bigdata01 ~]# pvcreate /dev/sda5 /dev/sda6
可以使用pvs或者pvdisplay查看创建结果
8.2 创建卷组
[root@bigdata01 ~]# vgcreate vg_linux /dev/sda5 /dev/sda6
增加分区到卷组可以用vgextend命令,用vgs或者vgdisplay查看结果
8.3 创建逻辑卷
[root@bigdata01 ~]#lvcreate -n centos6 -L 50G vg_linux
用lvs或者lvdisplay查看结果
8.4 如果需要扩大已有的逻辑卷
[root@bigdata01 ~]# lvextend -L +30G -n /dev/vg_linux/centos6
8.5 格式化逻辑卷
[root@bigdata01 ~]# mkfs.ext4 /dev/vg_linux/centos6
创建的逻辑卷都放到在 /dev/mapper目录中。
==================================================================================
一. 创建LVM--示例二
第一步:让两块硬盘支持LVM技术
[root@ken ~]# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
第二步:创建卷组
[root@ken ~]# vgcreate ken /dev/sdb /dev/sdc
Volume group "ken" successfully created
第三步:创建逻辑卷
# 切割出一个100M的逻辑卷设备
# 这里需要注意切割单位的问题。在对逻辑卷进行切割时有两种计量单位。
# 第一种是以容量为单位,所使用的参数为-L。
# 例如,使用-L 150M生成一个大小为150MB的逻辑卷。
# 第二种是以基本单元的个数为单位,所使用的参数为-l。每个基本单元的大小默认为4MB。
# 例如,使用-l 37可以生成一个大小为37×4MB=148MB的逻辑卷。
[root@ken ~]# lvcreate -n ken1 -L 100M ken
Logical volume "ken1" created.
第四步:把生成好的逻辑卷进行格式化
[root@ken ~]# mkfs.ext4 /dev/ken/ken1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
...
第五步:挂载使用
[root@ken ~]# mkdir /test1
[root@ken ~]# mount /dev/ken/ken1 /test1
[root@ken ~]# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/ken-ken1 93M 1.6M 85M 2% /test1
二. Linux扩容逻辑卷ext4格式
第一步:卸载
[root@ken ~]# umount /test1
第二步:把ken1逻辑卷扩展到300M
[root@ken ~]# umount /test1
[root@ken ~]# lvextend -L 300M /dev/ken/ken1
Size of logical volume ken/ken1 changed from 100.00 MiB (25 extents) to 300.00 MiB (75 extents).
Logical volume ken/ken1 successfully resized.
第三步:检查磁盘完整性
[root@ken ~]# e2fsck -f /dev/ken/ken1
e2fsck 1.42.9 (28-Dec-2013)
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/ken/ken1: 11/25688 files (9.1% non-contiguous), 8896/102400 blocks
第四步:重置硬盘容量
[root@ken ~]# resize2fs /dev/ken/ken1
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/ken/ken1 to 307200 (1k) blocks.
The filesystem on /dev/ken/ken1 is now 307200 blocks long.
第五步:重新挂载
可以发现现在已经是300M了
[root@ken ~]# mount /dev/ken/ken1 /test1
[root@ken ~]# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/ken-ken1 287M 2.0M 266M 1% /test1
三. Linux扩容逻辑卷xfs格式
- xfs格式只能扩容,不能减小!
- xfs格式无需卸载,支持在线扩容
第一步:创建一个逻辑卷并格式化为xfs格式
# 创建
[root@ken ~]# lvcreate -n lv_xfs -L 300M ken
Logical volume "lv_xfs" created.
# xfs格式化
[root@ken ~]# mkfs.xfs /dev/ken/lv_xfs
meta-data=/dev/ken/lv_xfs isize=512 agcount=4, agsize=19200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=76800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
第二步:挂载使用
[root@ken ~]# mount /dev/ken/lv_xfs /ken
[root@ken ~]# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/ken-lv_xfs 297M 16M 282M 6% /ken
第三步:在线扩容至600M
使用lvextend和xfs_growfs动态扩容
[root@ken ~]# lvextend -L 600M /dev/ken/lv_xfs
Size of logical volume ken/lv_xfs changed from 300.00 MiB (75 extents) to 600.00 MiB (150 extents).
Logical volume ken/lv_xfs successfully resized.
[root@ken ~]# xfs_growfs /dev/ken/lv_xfs
meta-data=/dev/mapper/ken-lv_xfs isize=512 agcount=4, agsize=19200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=76800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 76800 to 153600
第四步:查看磁盘信息
发现xfs格式的逻辑卷已经扩容至600M
[root@ken ~]# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/ken-lv_xfs 597M 16M 582M 3% /ken
四、Linux缩小逻辑卷
相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。
所以在生产环境中执行相应操作时,一定要提前备份好数据。另外Linux系统规定,
在对LVM逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。
在执行缩容操作前记得先把文件系统卸载掉。
第一步:卸载
[root@ken ~]# umount /test1/
第二步:检查系统完整性
[root@ken ~]# e2fsck -f /dev/ken/ken1
e2fsck 1.42.9 (28-Dec-2013)
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/ken/ken1: 11/75088 files (9.1% non-contiguous), 15637/307200 blocks
第三步:大小重置
[root@ken ~]# resize2fs /dev/ken/ken1 200M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/ken/ken1 to 204800 (1k) blocks.
The filesystem on /dev/ken/ken1 is now 204800 blocks long.
第四步:缩小到200M
[root@ken ~]# lvreduce -L 200M /dev/ken/ken1
WARNING: Reducing active logical volume to 200.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce ken/ken1? [y/n]: y
Size of logical volume ken/ken1 changed from 300.00 MiB (75 extents) to 200.00 MiB (50 extents).
Logical volume ken/ken1 successfully resized.
第五步:重新挂载使用
[root@ken ~]# mount /dev/ken/ken1 /test1/
[root@ken ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 1.2G 16G 7% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 7.7M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/ken-ken1 190M 1.6M 175M 1% /test1
五、Linux删除逻辑卷
第一步:取消挂载
[root@ken ~]# umount /test1/
第二步:删除逻辑卷设备
[root@ken ~]# lvremove /dev/ken/ken1
Do you really want to remove active logical volume ken/ken1? [y/n]: y
Logical volume "ken1" successfully removed
第三步:删除卷组
[root@ken ~]# vgremove ken
Volume group "ken" successfully removed
第四步:删除物理卷
[root@ken ~]# pvremove /dev/sdb /dev/sdc
Labels on physical volume "/dev/sdb" successfully wiped.
Labels on physical volume "/dev/sdc" successfully wiped.
六、卷组VG缩小
第一步:查看物理卷
卷组VG的缩小,要查看物理卷PV是否被使用,因为无法缩减一个正在使用的物理卷PV。如下:
[root@xuexi ~]# cp /etc/passwd /lv1/ //复制测试数据
[root@xuexi ~]# ls /lv1/
lost+found passwd
[root@xuexi ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 vg1 lvm2 a-- <2.00g <1.92g
/dev/sdb2 vg2 lvm2 a-- 1.98g 1.98g
/dev/sdb3 vg1 lvm2 a-- <2.00g <2.00g
/dev/sdb4 lvm2 --- 2.00g 2.00g
[root@xuexi ~]# vgreduce vg1 /dev/sdb1
Physical volume "/dev/sdb1" still in use
第二步:从卷组VG中移出物理卷PV
将/dev/sdb1移出vg1,可以使用pvmove命令移动数据,但必须有足够的空间,场景多用于更换旧硬盘。
[root@xuexi ~]# pvmove /dev/sdb1 /dev/sdb3
/dev/sdb1: Moved: 10.00%
/dev/sdb3: Moved: 100.00%
[root@xuexi ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 vg1 lvm2 a-- <2.00g <2.00g
/dev/sdb2 vg2 lvm2 a-- 1.98g 1.98g
/dev/sdb3 vg1 lvm2 a-- <2.00g <1.92g
/dev/sdb4 lvm2 --- 2.00g 2.00g
[root@xuexi ~]# vgreduce vg1 /dev/sdb1
Removed "/dev/sdb1" from volume group "vg1"
[root@xuexi ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- 2.00g 2.00g
/dev/sdb2 vg2 lvm2 a-- 1.98g 1.98g
/dev/sdb3 vg1 lvm2 a-- <2.00g <1.92g
/dev/sdb4 lvm2 --- 2.00g 2.00g
=============================================================================
4.1 通过lsblk查看新硬盘
[root@bigdata01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 200M 0 part /boot
├─sda2 8:2 0 4G 0 part [SWAP]
└─sda3 8:3 0 35.8G 0 part
└─centos-root 253:0 0 35.8G 0 lvm /
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part /data
sr0 11:0 1 1024M 0 rom
4.2 通过parted命令查看分区
[root@bigdata01 ~]# parted -l
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 211MB 210MB primary xfs boot
2 211MB 4506MB 4295MB primary linux-swap(v1)
3 4506MB 42.9GB 38.4GB primary lvm
4.3 创建逻辑卷组
[root@xuexi ~]# vgcreate vg1 /dev/sdb1
Volume group "vg1" successfully created