背景
今天这篇文章还是来记录一下linux的基础类容,前面跟大家介绍过,作者目前所在的公司是做国产操作系统的,因此呢我们平时的办公电脑都是我们公司的系统,今天临近下班前,企业微信上一位产品经理发来消息:“哈喽,我的办公电脑用的我们公司的专业版系统,现在数据盘满了,刚刚新加了一块盘,我怎么扩容我的数据盘呀!看你的企微名片是运维,所以来咨询下”。头上一百个问号,为啥这些事前也找到运维头上来了呢?哎!不过出于礼貌,在加上该位产品是个小姐姐,所以咱们得帮他看看。(......省略若干步骤),分区不是逻辑卷,没办法扩容,我也无能为力了。
跟大家闲聊了半天,现在回归正题,说说我们今天的主角---逻辑卷LVM!
介绍
1. 什么是逻辑卷?
LVM是 Logical Volume Manager(逻辑卷管理)的简写,LVM将若干个磁盘或者磁盘分区连接为一个整块的卷组,形成一个存储池。管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。
2. 基本组成
2.1 物理卷---PV(Physical Volume):
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘;它是LVM的基本存储逻辑块,但和基本的物理分区相比,逻辑卷包含LVM相关的管理参数。
2.2 卷组--------VG(Volumne Group):
它可以看成单独的逻辑磁盘,建立在PV之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。
2.3 逻辑卷-----LV(Logical Volume):
逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷要以属于同一个卷组,也可以属于不同的多个卷组。
2.4 物理区域--PE(Physical Extent):
物理区域是物理卷中可用于分配的最小存储单元,物理区域的大小可根据实际情况在建立物理卷时指定。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一致。
2.5、 逻辑区域―LE(Logical Extent):
逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。
3. 逻辑卷的优点
3.1 可以将多块硬盘逻辑上划分为一块大的硬盘(实际生产中我们是通过Raid将多块硬盘组合在一起);
3.2 可动态调整逻辑卷的大小,物理是扩展还是收缩;
3.3 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。
实验操作
这里使用的是我们公司的国产服务器操作系统,实际上就是Debian的内核,操作命令与Ubuntu没有任何区别。
记住创建lvm的步骤:物理硬盘/分区--->物理卷(PV)--->卷组(VG)--->逻辑卷(LVM)--->格式化成文件系统
创建LVM
1. 环境准备:
1.1 开启一个虚拟机,添加三块为使用的硬盘。
root@uso-PC:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 70G 0 disk
├─sda1 8:1 0 512M 0 part /boot
├─sda2 8:2 0 1K 0 part
├─sda3 8:3 0 21G 0 part /recovery
├─sda4 8:4 0 11G 0 part [SWAP]
├─sda5 8:5 0 20G 0 part /
└─sda6 8:6 0 17.5G 0 part /deepin/userdata
sdb 8:16 0 10G 0 disk
sdc 8:32 0 10G 0 disk
sdd 8:48 0 10G 0 disk
sr0 11:0 1 3.5G 0 rom1.2 将一块盘正常分区,另外两块盘不分区,在这里验证上面所说的物理卷(PV)可以是实际物理硬盘上的分区,也可以是整个物理硬盘。
root@uso-PC:~# fdisk
fdisk: bad usage
Try 'fdisk --help' for more information.
root@uso-PC:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 70G 0 disk
├─sda1 8:1 0 512M 0 part /boot
├─sda2 8:2 0 1K 0 part
├─sda3 8:3 0 21G 0 part /recovery
├─sda4 8:4 0 11G 0 part [SWAP]
├─sda5 8:5 0 20G 0 part /
└─sda6 8:6 0 17.5G 0 part /deepin/userdata
sdb 8:16 0 10G 0 disk
└─sdb1 8:17 0 10G 0 part
sdc 8:32 0 10G 0 disk
sdd 8:48 0 10G 0 disk
sr0 11:0 1 3.5G 0 rom 2. 创建PV
将/dev/sdb1,/dev/sdc,/dev/sdd创建为物理卷PV
##创建物理卷pv
root@uso-PC:~# pvcreate /dev/sdb1 /dev/sdc
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc" successfully created.
root@uso-PC:~#
root@uso-PC:~# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created.
##查看创建的物理卷PV
root@uso-PC:~# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- <10.00g <10.00g
/dev/sdc lvm2 --- 10.00g 10.00g
/dev/sdd lvm2 --- 10.00g 10.00g
3. 创建卷组(VG)
将/dev/sdb1和/dev/sdc添加到一个卷组中,将/dev/sdd添加到另外一个卷组中
#创建vg 语法:
vgcreate vg_name /dev/disk ...
# 创建vg
vgcreate vg1 /dev/sdb1 /dev/sdc
或者在创建vg1的时候添加一个物理卷,然后通过vgextend追加一个物理卷到vg中
root@uso-PC:~# vgcreate vg1 /dev/sdb1
Volume group "vg1" successfully created
root@uso-PC:~# vgextend vg1 /dev/sdc
Volume group "vg1" successfully extended
root@uso-PC:~# vgcreate vg2 /dev/sdd
Volume group "vg2" successfully created
##查看创建的VG
root@uso-PC:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 2 0 0 wz--n- 19.99g 19.99g
vg2 1 0 0 wz--n- <10.00g <10.00g
## 通过vgdisplay查看vg的详细信息
4. 创建逻辑卷(LVM)
## 创建LVM
root@uso-PC:~# lvcreate -L 15G -n lv1 vg1
Logical volume "lv1" created.
root@uso-PC:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 vg1 -wi-a----- 15.00g
root@uso-PC:~#
root@uso-PC:~#
root@uso-PC:~# lvcreate -L 9.9G -n lv2 vg2
Rounding up size to full physical extent 9.90 GiB
Logical volume "lv2" created.
root@uso-PC:~# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 vg1 -wi-a----- 15.00g
lv2 vg2 -wi-a----- 9.90g 5. 格式化LVM并挂载
## 格式化类型任意选择,跟格式化硬盘一样
root@uso-PC:~# mkfs.ext4 /dev/vg1/lv1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 3932160 4k blocks and 983040 inodes
Filesystem UUID: 2c104e35-30db-4efd-a0eb-e14ba970fc1e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@uso-PC:~#
root@uso-PC:~# mount /dev/vg1/lv1 /data1/
root@uso-PC:~# df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 3.9G 0 3.9G 0% /dev
tmpfs 796M 1.4M 795M 1% /run
/dev/sda5 20G 7.7G 13G 39% /
tmpfs 3.9G 5.9M 3.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda3 21G 8.5G 11G 44% /recovery
/dev/sda1 488M 119M 335M 27% /boot
/dev/sda6 18G 1.7G 16G 10% /deepin/userdata
tmpfs 796M 4.0K 796M 1% /run/user/106
tmpfs 796M 0 796M 0% /run/user/0
/dev/mapper/vg1-lv1 15G 41M 14G 1% /data1
## 持久化存储一样的通过blkid /dev/mapper/vg1-lv1 ;获取uuid后写入到/ets/fstab中
动态扩容lvm
扩容前先梳理一下步骤:
1. 确认需要扩容的lvm所在哪个vg组;
2. 确认该vg是否有足够的空间可以去扩容lvm;
2.1 当该vg中空间充足时,直接执行第三步扩容LVM
2.2 当该vg中空间不足时,先通过vgextend向该vg中添加pv物理卷,确保空间足够。
3. lvextend命令扩容lvm;
4. 将新加的lvm空间格式化到lvm中。
(3,4步合并一起才算是扩容lvm)
1. 查看到VG1的空间还有4.99G
root@uso-PC:/data1# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 2 1 0 wz--n- 19.99g 4.99g
vg2 1 1 0 wz--n- <10.00g 96.00m
2. 直接扩容LVM
## 扩容钱vg1的剩余空间为4.99G
root@uso-PC:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 2 1 0 wz--n- 19.99g 4.99g
vg2 2 1 0 wz--n- 19.99g 96.00m
root@uso-PC:~#
## 扩容vg1下面的lv1
root@uso-PC:~# lvextend -L +4G /dev/vg1/lv1
Size of logical volume vg1/lv1 changed from 15.00 GiB (3840 extents) to 19.00 GiB (4864 extents).
Logical volume vg1/lv1 successfully resized.
root@uso-PC:~#
## 扩容后vg1下的剩余空间
root@uso-PC:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 2 1 0 wz--n- 19.99g 1016.00m
vg2 2 1 0 wz--n- 19.99g 96.00m
root@uso-PC:~#3. lvm扩容之后,再将扩容的增加的空间格式化。
使用 resize2fs或xfs_growfs 对挂载目录在线扩容 resize2fs 针对文件系统ext2 ext3 ext4
xfs_growfs 针对文件系统xfs
## 查看lv1的文件系统类型为ext4
root@uso-PC:~# blkid /dev/mapper/vg1-lv1
/dev/mapper/vg1-lv1: UUID="2c104e35-30db-4efd-a0eb-e14ba970fc1e" TYPE="ext4"
root@uso-PC:~#
## 扩容格式化化前,挂载目录的空间
root@uso-PC:~# df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 3.9G 0 3.9G 0% /dev
tmpfs 796M 1.4M 795M 1% /run
/dev/sda5 20G 7.7G 13G 39% /
tmpfs 3.9G 5.9M 3.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda3 21G 8.5G 11G 44% /recovery
/dev/sda1 488M 119M 335M 27% /boot
/dev/sda6 18G 1.7G 16G 10% /deepin/userdata
tmpfs 796M 4.0K 796M 1% /run/user/106
tmpfs 796M 0 796M 0% /run/user/0
/dev/mapper/vg1-lv1 15G 41M 14G 1% /data1 <==============
/dev/mapper/vg2-lv2 20G 56M 20G 1% /data2
# 格式化扩容
root@uso-PC:~# resize2fs /dev/mapper/vg1-lv1
resize2fs 1.44.5 (15-Dec-2018)
Filesystem at /dev/mapper/vg1-lv1 is mounted on /data1; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/mapper/vg1-lv1 is now 4980736 (4k) blocks long.
root@uso-PC:~#
## 扩容后挂载目录的空间
root@uso-PC:~# df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 3.9G 0 3.9G 0% /dev
tmpfs 796M 1.4M 795M 1% /run
/dev/sda5 20G 7.7G 13G 39% /
tmpfs 3.9G 5.9M 3.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda3 21G 8.5G 11G 44% /recovery
/dev/sda1 488M 119M 335M 27% /boot
/dev/sda6 18G 1.7G 16G 10% /deepin/userdata
tmpfs 796M 4.0K 796M 1% /run/user/106
tmpfs 796M 0 796M 0% /run/user/0
/dev/mapper/vg1-lv1 19G 44M 18G 1% /data1 <=================
/dev/mapper/vg2-lv2 20G 56M 20G 1% /data2
至此扩容结束......
裁剪LVM大小
逻辑卷裁剪不支持在线裁剪,必须先取消挂载
1. 裁剪前检查文件系统大小和vg大小
## 裁剪前文件系统大小
root@uso-PC:~# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
udev devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 796M 1.4M 795M 1% /run
/dev/sda5 xfs 20G 7.7G 13G 39% /
tmpfs tmpfs 3.9G 5.9M 3.9G 1% /dev/shm
tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda3 ext4 21G 8.5G 11G 44% /recovery
/dev/sda1 ext4 488M 119M 335M 27% /boot
/dev/sda6 xfs 18G 1.7G 16G 10% /deepin/userdata
tmpfs tmpfs 796M 4.0K 796M 1% /run/user/106
tmpfs tmpfs 796M 0 796M 0% /run/user/0
/dev/mapper/vg1-lv1 ext4 19G 44M 18G 1% /data1 <========
/dev/mapper/vg2-lv2 xfs 20G 56M 20G 1% /data2
## 裁剪前vg剩余大小
root@uso-PC:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 2 1 0 wz--n- 19.99g 1016.00m <====================
vg2 2 1 0 wz--n- 19.99g 96.00m
## 取消挂载
root@uso-PC:~# umount /data1
2. 校验文件系统
##校验文件系统
root@uso-PC:~# e2fsck -f /dev/vg1/lv1
e2fsck 1.44.5 (15-Dec-2018)
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/vg1/lv1: 12/1245184 files (0.0% non-contiguous), 105815/4980736 blocks
root@uso-PC:~#3. 裁剪文件系统
# 裁剪文件系统
root@uso-PC:~# resize2fs /dev/vg1/lv1 10G
resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/vg1/lv1 to 2621440 (4k) blocks.
The filesystem on /dev/vg1/lv1 is now 2621440 (4k) blocks long.
root@uso-PC:~# 4. 裁剪lvm大小
# 裁剪lvm
root@uso-PC:~# lvreduce -L 10G /dev/vg1/lv1
WARNING: Reducing active logical volume to 10.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg1/lv1? [y/n]: y
Size of logical volume vg1/lv1 changed from 19.00 GiB (4864 extents) to 10.00 GiB (2560 extents).
Logical volume vg1/lv1 successfully resized.
root@uso-PC:~#
5. 校验大小
# 裁剪后的文件系统大小
root@uso-PC:~# df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 3.9G 0 3.9G 0% /dev
tmpfs 796M 1.4M 795M 1% /run
/dev/sda5 20G 7.7G 13G 39% /
tmpfs 3.9G 5.9M 3.9G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda3 21G 8.5G 11G 44% /recovery
/dev/sda1 488M 119M 335M 27% /boot
/dev/sda6 18G 1.7G 16G 10% /deepin/userdata
tmpfs 796M 4.0K 796M 1% /run/user/106
tmpfs 796M 0 796M 0% /run/user/0
/dev/mapper/vg2-lv2 20G 56M 20G 1% /data2
/dev/mapper/vg1-lv1 9.8G 37M 9.3G 1% /data1 <=====
root@uso-PC:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 2 1 0 wz--n- 19.99g 9.99g <============
vg2 2 1 0 wz--n- 19.99g 96.00m
root@uso-PC:~#