Linux LVM概念介绍及相关配置
LVM简介
LVM是Linux操作系统的逻辑卷管理器。 现在有两个Linux版本的LVM,分别是 LVM1,LVM2。LVM1是一种已经被认为稳定了几年的成熟产品,LVM2 是最新最好的LVM版本。 LVM2几乎完全向后兼容使用LVM1创建的卷,目前centos7以上版本默认都是使用的LVM2(ubuntu默认安装没有使用lvm这项技术)。
简单来说,就是操作系统把一组物理磁盘先组成卷组,然后在该卷组上划分逻辑卷,不同的逻辑卷可以格式化成不同的文件格式,从而使得操作系统可以统一操作所有的存储资源,屏蔽了不同存储硬件的差异,有点存储资源池化的意思。
LVM中的概念
物理存储介质(The physical media)
这里指系统的存储设备:硬盘,如:/dev/hda、/dev/sda等等,是存储系统最低层的存储单元。可以简单理解为:插在服务器上的一块硬盘设备。硬盘设备及硬盘分区可使用fdisk命令进行管理。
PV(physical volume)
物理卷在LVM管理系统最底层,基于整个物理硬盘或实际物理硬盘上的分区进行创建。可使用pvs命令查看pv信息。
VG(volume group)
卷组建立在物理卷上,一个卷组中至少要包括一个物理卷,卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。LVM卷组由一个或多个物理卷组成。通过卷组这个概念,可以方便的把不同的物理卷(对应到不同的物理磁盘)纳入到一个统一的卷组中进行管理。可使用vgs命令查看vg信息。
LV(logical volume)
逻辑卷建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间。在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。注意:xfs文件系统是不能缩减的,只能增加。可使用lvs命令查看lv信息。
PE(physical extent)
物理区域是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小。
LE(logical extent)
逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。卷组描述区域:卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中逻辑卷、逻辑卷中物理区域的分配等所有信息,它是在使用pvcreate建立物理卷时建立的。
使用LVM扩展逻辑卷
下面以在虚拟机中挂载一个新的磁盘设备sdb为例,来看看具体如何在操作系统中扩展逻辑卷。
1、查看当前目录下子目录占用容量(不是必须的,可以看下目前整体的磁盘使用情况)
[root@localhost ~]# du -lh --max-depth=1
8.0K ./.cache
4.0K ./.dbus
4.0K ./.config
4.0K ./.ssh
91M ./docker
2.0G ./kubernetes
4.0K ./.docker
0 ./.m2
11M ./apache-maven-3.5.4
213M ./localRepo
1.1M ./.basher
2.3M ./.kube
3.2M ./.helm
62M ./linux-amd64
185M ./alpinejre
108K ./auto-deploy-app
208M ./jre1.8.0_181
20K ./.oracle_jre_usage
163M ./springcloud
383M ./jdk1.8.0_191
69M ./.npm
0 ./.npm-global
371M ./node_modules
137M ./apache-skywalking-apm-incubating
333M ./jira
56K ./.java
11M ./maven3
0 ./.pki
4.7G .
2、查看当前的磁盘设备使用情况
[root@localhost ~]# fdisk -l
磁盘 /dev/sda:75.2 GB, 75161927680 字节,146800640 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000c0092
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 104857599 51915776 8e Linux LVM
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/rhel-root:51.0 GB, 50994348032 字节,99598336 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/rhel-swap:2164 MB, 2164260864 字节,4227072 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 70G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 49.5G 0 part
├─rhel-root 253:0 0 47.5G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 48G 45G 3.4G 94% /
devtmpfs devtmpfs 5.9G 0 5.9G 0% /dev
tmpfs tmpfs 5.9G 148K 5.9G 1% /dev/shm
tmpfs tmpfs 5.9G 18M 5.9G 1% /run
tmpfs tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 118M 379M 24% /boot
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- 49.51g 0
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
root rhel -wi-ao---- 47.49g
swap rhel -wi-ao---- 2.02g
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- 49.51g 0
这边我们先使用fdisk -l
命令查看当前的磁盘设备,可以看到有sda
和sdb
两块裸设备,容量分别为70G和100G,其中sda
分了两个分区sda1和sda2。使用lsblk
命令可以比较直观的看出其中的组织结构关系。系统中有一个名为/dev/sda2
的pv,容量为49.5G,有一个名为rhel
的vg卷组(目前只有/dev/sda2这个pv组成),rhel这个vg下有两个逻辑卷,分别是root和swap,其中/dev/mapper/rhel-root
这个逻辑卷的挂载点为根目录,即意味着除了/dev
、/run
、/boot
这些特殊目录,其他绝大部分的系统目录使用的都是rhel-root
这个逻辑卷,这个lv的文件格式为xfs。所以我们这边的任务就是扩展这个rhel-root
逻辑卷的容量
从上面的信息来分析,可以看到其实sda这个设备的磁盘容量并没有被充分使用,所以我们这边第一步任务是为sda设备先创建新的分区,并把这部分容量扩充到rhel-root
这个逻辑卷,第二步是把整个sdb设备加入rhel这个vg,并扩展到rhel-root
这个lv。
3、创建分区,扩展逻辑卷
[root@localhost ~]# fdisk /dev/sda //创建分区
n 新建分区
p 打印分区列表
t 修改分区格式,LVM=8e
w 保存分区信息到磁盘,退出
q 不保存分区信息到磁盘,退出
//先使用选项n创建一个名为/dev/sdb3的分区,都用默认选项就好。注意使用选项t修改分区格式,改为8e是lvm支持的格式
[root@localhost ~]# partprobe //发现新分区
[root@localhost ~]# lsblk //列出设备信息,可以看到有sda3这个分区了,容量为20G,即sda设备的剩余容量
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 70G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 49.5G 0 part
│ ├─rhel-root 253:0 0 47.5G 0 lvm /
│ └─rhel-swap 253:1 0 2G 0 lvm [SWAP]
└─sda3 8:3 0 20G 0 part
sdb 8:16 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
[root@localhost ~]# pvcreate /dev/sda3 //使用新分区创建pv
Physical volume "/dev/sda3" successfully created
[root@localhost ~]# vgextend rhel /dev/sda3 //将新的pv加入rhel这个vg
Volume group "rhel" successfully extended
[root@localhost ~]# lvextend -l +100%free /dev/rhel/root //按百分比扩展LV
#[root@localhost ~]# lvextend -L +1G /dev/rhel/root //按指定容量扩展LV
Extending logical volume root to 67.49 GiB
Logical volume root successfully resized
[root@localhost ~]# xfs_growfs /dev/mapper/rhel-root //扩展xfs文件系统
meta-data=/dev/mapper/rhel-root isize=256 agcount=4, agsize=3112448 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=12449792, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=6079, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 12449792 to 17691648
[root@localhost ~]# df -hT //这边看到,rhel-root这个逻辑卷的容量已经扩充为68G
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 68G 45G 24G 66% /
devtmpfs devtmpfs 5.9G 0 5.9G 0% /dev
tmpfs tmpfs 5.9G 148K 5.9G 1% /dev/shm
tmpfs tmpfs 5.9G 18M 5.9G 1% /run
tmpfs tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 118M 379M 24% /boot
4、如果是添加裸磁盘的话就更加方便,可以不分区,直接将整个设备创建为pv(pvcreate /dev/sdb),之后的操作是一样的,以下是将sdb设备加入进来后的最终情况。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 70G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 49.5G 0 part
│ ├─rhel-root 253:0 0 167.5G 0 lvm /
│ └─rhel-swap 253:1 0 2G 0 lvm [SWAP]
└─sda3 8:3 0 20G 0 part
└─rhel-root 253:0 0 167.5G 0 lvm /
sdb 8:16 0 100G 0 disk
└─rhel-root 253:0 0 167.5G 0 lvm /
sr0 11:0 1 1024M 0 rom
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- 49.51g 0
/dev/sda3 rhel lvm2 a-- 20.00g 0
/dev/sdb rhel lvm2 a-- 100.00g 0
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 3 2 0 wz--n- 169.50g 0
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
root rhel -wi-ao---- 167.48g
swap rhel -wi-ao---- 2.02g
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 168G 45G 124G 27% /
devtmpfs devtmpfs 5.9G 0 5.9G 0% /dev
tmpfs tmpfs 5.9G 148K 5.9G 1% /dev/shm
tmpfs tmpfs 5.9G 18M 5.9G 1% /run
tmpfs tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 118M 379M 24% /boot