生产工作环境中经常会遇到随着业务数据增长,原先磁盘分区挂载规划不能很好满足系统的长远发展,这就对前期系统磁盘规划有很高要求。但是即使你最初规划设计的在完美也无法改变磁盘空间满的那天。这时候就需要一种可动态可扩展的磁盘技术,于是就有了LVM(Logical Volume Manager)逻辑卷管理。如果你是运维linux服务器,LVM使用肯定是会接触到的。LVM的强大以及原理网上已经有很多文章介绍过,这里只做简单说明,主要记录下工作中实际的使用情况。
LVM组成基本概念
物理存储设备(Physical Media):指系统的存储设备文件,比如 /dev/sda、/dev/sdb 等。
物理卷PV (Physical Volume):一个可供存储LVM的块设备. 例如: 一块硬盘, 一个MBR或GPT分区, 一个回环文件, 一个被内核映射的设备 (例如 dm-crypt).它包含一个特殊的LVM头。
卷组 VG(Volume Group):物理卷的一个组,作为存放逻辑卷的容器。 PEs are allocated from a VG for a LV.
逻辑卷 LV(Logical Volume):”虚拟/逻辑卷”存放在一个卷组中并由物理块组成。是一个类似于物理设备的块设备,例如,你可以直接在它上面创建一个文件系统文件系统。
物理块 PE(Physical Extent):一个卷组中最小的连续区域(默认为4 MiB),多个物理块将被分配给一个逻辑卷。你可以把它看成物理卷的一部分,这部分可以被分配给一个逻辑卷。
逻辑块LE(Logical Extent):LV(逻辑卷)中可以分配的最小存储单元称为 LE,在同一个卷组中,LE 的大小和 PE 的大小是一样的,并且一一对应。
字面上可以简单理解是从物理存储设备上抽象出一层逻辑卷进行磁盘管理,这样做的好处是不用对磁盘进行直接的重新分区,从逻辑划分的层面便可动态管理磁盘。默认情况,以下操作都是在root账号权限下操作。
操作指引
从物理存储设备上创建物理卷PV,可以是一块或多块硬盘创建
创建卷组VG,把创建好的物理卷PV添加进来
在卷组VG基础上再划分创建逻辑卷LV
格式化逻辑卷LV
挂载逻辑卷LV
挂载信息写入文件系统管理表fstab
磁盘分区
对所要管理的磁盘进行分区,看需要使用LVM管理的是磁盘还是分区。例如:
# fdisk /dev/sda
创建物理卷PV
# pvcreate /dev/sda
把/dev/sda这块磁盘作为物理卷PV来使用
查看新创建的物理卷PV
# pvs
创建卷组VG
# vgcreate vg0 /dev/sda
创建一个名为vg0的卷组VG,并添加/dev/sda的物理卷PV进来
查看新创建的卷组VG
# vgs
创建逻辑卷LV
# lvcreate -L 10G -n lv_home vg0
说明:
-L 指定创建的LV 的大小
-l 指定创建的LV 的PE 数量
-n LV的名字
上面命令的意思是:创建一个名为lv_home的逻辑卷LV,并从vg0 中分出10G的空间给lv_home使用
查看逻辑卷LV
# lvs
格式化逻辑卷LV
# mkfs.ext4 /dev/vg0/lv_home
把新创建的逻辑卷lv_home格式化为ext4格式文件系统
挂载
# mount /dev/vg0/lv_home /home
新创建的逻辑卷lv_home挂载到/home
写入文件系统管理表fstab
避免重启系统后挂载信息失效,把新挂载的信息写入文件系统管理表fstab开机自动挂载,注意检查挂载路径信息,避免自动挂载失败。
案例场景
上面简单介绍了使用LVM的操作跟步骤,实际生产环境中还会用到扩/缩容。下面以最近生产环境中的扩容操作举例,场景是新接手了一套系统,做数据迁移搞数据库数据备份,原数据库所安装的磁盘空间不够进行数据库数据备份,恰好前期做系统安装的人使用了LVM进行磁盘分区,有一个200GB空间的磁盘没有挂载使用。数据库安装在/home用户的目录下,而/home目录并没有单独挂载,共享/根目录空间。解决思路是直接对/根目录进行扩容。
系统环境
- 操作系统:RHEL 7
- 磁盘1:50GB的/dev/sda
- 磁盘2:200GB的/dev/sdb
[root@test ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─rhel-root 253:0 0 47G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 200G 0 disk
sr0 11:0 1 4.2G 0 rom /mnt
先查看磁盘信息,可以看到一块空闲的sdb,空间是200G
[root@test ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
创建物理卷PV,使用的整块磁盘
[root@test ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- <49.00g 4.00m
/dev/sdb lvm2 --- 200.00g 200.00g
查看物理卷信息,看到已经创建了200G空间的物理卷PV
[root@test ~]# vgextend rhel /dev/sdb
Volume group "rhel" successfully extended
把新创建的物理卷/dev/sdb添加到卷组rhel
[root@test ~]# vgsVG #PV #LV #SN Attr VSize VFree
rhel 2 2 0 wz--n- 248.99g 200.00g
[root@test ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rhel -wi-ao---- 46.99g
swap rhel -wi-ao---- 2.00g
查看卷组根逻辑卷信息,可以看到卷组rhel现有剩余空间为200G,下面准备把卷组rhel里所有剩余空间扩容到root分区,为了准确利用全部剩余空间,可以选用剩余PE的方式来扩容。
[root@test ~]# vgdisplay
--- Volume group ---
VG Name rhel
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 248.99 GiB
PE Size 4.00 MiB
Total PE 63742
Alloc PE / Size 12542 / 48.99 GiB
Free PE / Size 51200 / 200.00 GiB
VG UUID qTPOGN-kmVL-F8pM-Xcah-6esm-7Zh6-gbkiiM
可以看到卷组rhel里面剩余的PE数为51200
[root@test ~]# lvextend -l +51200 /dev/rhel/root
Size of logical volume rhel/root changed from 46.99 GiB (12030 extents) to 246.99 GiB (63230 extents).
Logical volume rhel/root successfully resized.
[root@test ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rhel -wi-ao---- 246.99g
swap rhel -wi-ao---- 2.00g
再查看逻辑卷信息,可以看到root空间已经是增大了200G。
[root@test ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs 47G 22G 26G 45% /
devtmpfs devtmpfs 7.9G 0 7.9G 0% /dev
tmpfs tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs tmpfs 7.9G 36M 7.8G 1% /run
tmpfs tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 132M 883M 13% /boot
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/1000
/dev/sr0 iso9660 4.2G 4.2G 0 100% /mnt
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/1001
tmpfs tmpfs 1.6G 0 1.6G 0% /run/user/0
[root@test ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─rhel-root 253:0 0 247G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 200G 0 disk
└─rhel-root 253:0 0 247G 0 lvm /
sr0 11:0 1 4.2G 0 rom /mnt
这里查看磁盘空间大小,文件系统的/根分区没有变化,记得要要调整文件系统大小
[root@test ~]# resize2fs /dev/rhel/root
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/rhel/root
Couldn't find valid filesystem superblock.
这里用resize2fs调整文件系统大小报错,网上查看信息,我文件系统是XFS的,resize2fs不支持XFS文件系统,重新使用xfs_growfs执行调整大小。
[root@test ~]# xfs_growfs /dev/rhel/root
meta-data=/dev/mapper/rhel-root isize=512 agcount=4, agsize=3079680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=12318720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=6015, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 12318720 to 64747520
[root@test ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs 266G 23G 243G 9% /
devtmpfs devtmpfs 8.4G 0 8.4G 0% /dev
tmpfs tmpfs 8.5G 0 8.5G 0% /dev/shm
tmpfs tmpfs 8.5G 38M 8.4G 1% /run
tmpfs tmpfs 8.5G 0 8.5G 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 139M 926M 13% /boot
tmpfs tmpfs 1.7G 0 1.7G 0% /run/user/1000
/dev/sr0 iso9660 4.5G 4.5G 0 100% /mnt
tmpfs tmpfs 1.7G 0 1.7G 0% /run/user/1001
tmpfs tmpfs 1.7G 0 1.7G 0% /run/user/0
再次查看磁盘空间大小,/根分区已显示增大200G空间。至此LVM在线扩容磁盘完成,这里只举例了LVM的扩容操作,LVM还有其他更多强大管理操作,以后实际环境用到再做记录分享。
参考: