1、管理逻辑卷
在对磁盘进行分区大小规划时,有时往往不能确定这个分区要使用的总空间大小。而用fdisk对磁盘进行分区后,每个分区的大小就已经固定了,如果分区设置的过大,会白白浪费磁盘空间;分区设置的过小,就会导致空间不够用的情况。这个时候,就可以用到LVM(Logical Volume Manager,逻辑卷管理)。
1.1、认识Linux逻辑卷
LVM是 Logical Volume Manager(逻辑卷管理)的简写,LVM将若干个磁盘或者磁盘分区连接为一个整块 的卷组,形成一个存储池。管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统。 管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和 分配。
- 假设有三块磁盘/dev/sdb、/dev/sdc和/dev/sdd用来划分逻辑卷,LVM模型如图所示:
- LVM基本概念
通过LVM技术,屏蔽了磁盘分区的底层差异,在逻辑上给文件系统提供了一个卷的概念,然后在这些卷 上建立相应的文件系统。在了解LVM之前,先熟悉LVM中几个常用的术语。
(1)物理存储设备(The physical media):指系统的存储设备文件,如:/dev/hda1、/dev/sda等 等。
(2)物理卷(physical volume):简称PV,物理卷可以是整个硬盘、硬盘分区或从逻辑上与磁盘分区 具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘 等)比较,却包含有与LVM相关的管理参数。
(3)卷组(Volume Group):简称VG,可以看成单独的逻辑磁盘,建立在PV之上,一个卷组中至少 要包括一个PV,在卷组建立之后可以动态的添加PV到卷组中。卷组的名称可以自定义。
(4)PE(physical extent)物理区域:物理区域是物理卷中可用于分配的最小存储单元,物理区域的 大小默认为4MB。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一 致。
(5)逻辑卷(logical volume):简称LV,相当于物理分区。逻辑卷建立在卷组之上,卷组中的未分配 空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态的扩展或缩小空间。系统中的多个逻辑卷,可以 属于同一个卷组,也可以属于不同的多个卷组。
(6)LE(logical extent)逻辑区域:逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大 小取决于逻辑卷所在卷组中的物理区域大小。LE的大小和PE的大小一样。
(7)VGDA(Volume Group Descriptor Area)卷组描述符区域:和非LVM系统将包含分区信息的 元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理 卷起始处的卷组描述符区域中。VGDA包括以下内容:PV描述符、VG描述符、LV描述符和一些PE描述 符。
1.2、部署逻辑卷
常用的LVM部署命令
功能/命令 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
扫描 | pvscan | vgscan | lvscan |
建立 | pvcreate | vgcreate | lvcreate |
显示 | pvdisplay | vgdisplay | lvdisplay |
删除 | pvremove | vgremove | lvremove |
扩展 | vgextend | lvextend | |
缩小 | vgreduce | lvreduce |
示例:
1、创建pv
可以使用磁盘或分区,本例使用分区
[root@kongd ~]# parted /dev/nvme0n2 print
Model: NVMe Device (nvme)
Disk /dev/nvme0n2: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 500MB 2146MB 1646MB extended lba
5 500MB 700MB 200MB logical
6 700MB 900MB 199MB logical
#创建pv
[root@kongd ~]# pvcreate /dev/nvme0n2p5 /dev/nvme0n2p6
Physical volume "/dev/nvme0n2p5" successfully created.
Physical volume "/dev/nvme0n2p6" successfully created.
#查看pv,详细查看使用pvdisplay
[root@kongd ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p2 rhel lvm2 a-- <19.00g 0
/dev/nvme0n2p5 lvm2 --- 190.57m 190.57m
/dev/nvme0n2p6 lvm2 --- 190.00m 190.00m
#更改分区类型(如果物理磁盘不需要用):
[root@kongd ~]# parted /dev/nvme0n2 set 5 lvm on
信息: You may need to update /etc/fstab.
[root@kongd ~]# parted /dev/nvme0n2 set 6 lvm on
信息: You may need to update /etc/fstab.
2.创建vg
[root@kongd ~]# vgcreate -s 4M RHCE /dev/nvme0n2p{5,6}
Volume group "RHCE" successfully created
# -s 指定PE大小
[root@kongd ~]# vgs
VG #PV #LV #SN Attr VSize VFree
RHCE 2 0 0 wz--n- 376.00m 376.00m
rhel 1 2 0 wz--n- <19.00g 0
3、创建lv
方法1:指定LV 的大小
[root@kongd ~]# lvcreate -n myvg1 -L 100M RHCE
Logical volume "myvg1" created.
-L 指定LV 的大小
-n: LV 的名字
RHCE: 你从哪个VG中创建的LV
[root@kongd ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
myvg1 RHCE -wi-a----- 100.00m
root rhel -wi-ao---- <17.00g
swap rhel -wi-ao---- 2.00g
方法2:指定LV的PE 数量
[root@kongd ~]# lvcreate -n myvg2 -l 50 RHCE
Logical volume "myvg2" created.
[root@kongd ~]# lvs /dev/RHCE/myvg2
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
myvg2 RHCE -wi-a----- 200.00m
4、格式化、挂载和基本存储空间格式化挂载一样
#lv设备文件路径
[root@kongd ~]# ll /dev/RHCE/myvg1 /dev/mapper/RHCE-myvg1 /dev/dm-2
brw-rw----. 1 root disk 253, 2 1月 3 23:37 /dev/dm-2
lrwxrwxrwx. 1 root root 7 1月 3 23:37 /dev/mapper/RHCE-myvg1 -> ../dm-2
lrwxrwxrwx. 1 root root 7 1月 3 23:37 /dev/RHCE/myvg1 -> ../dm-2
[root@kongd ~]# mkfs.xfs /dev/RHCE/myvg1
meta-data=/dev/RHCE/myvg1 isize=512 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=1368, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@kongd ~]# mkdir /mnt/data1
[root@kongd ~]# mount /dev/RHCE/myvg1 /mnt/data1/
1.3 调整逻辑卷大小
1、扩展卷组——添加/dev/nvme0n2p7物理卷到vg01中
[root@kongd ~]# parted /dev/nvme0n2 mkpart logical xfs 901M 1.2G
信息: You may need to update /etc/fstab.
[root@kongd ~]# pvcreate /dev/nvme0n2p7
Physical volume "/dev/nvme0n2p7" successfully created.
[root@kongd ~]# parted /dev/nvme0n2 set 7 lvm on
信息: You may need to update /etc/fstab.
扩展vg:
[root@kongd ~]# vgextend RHCE /dev/nvme0n2p7
Volume group "RHCE" successfully extended
[root@kongd ~]# vgs RHCE
VG #PV #LV #SN Attr VSize VFree
RHCE 3 2 0 wz--n- 660.00m 360.00m
2、逻辑卷的扩大与缩小
xfs文件系统类型的lvm的扩容
[root@kongd ~]# lvs /dev/RHCE/myvg1
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
myvg1 RHCE -wi-ao---- 100.00m
[root@kongd ~]# lvextend -L +100M /dev/RHCE/myvg1
Size of logical volume RHCE/myvg1 changed from 100.00 MiB (25 extents) to
200.00 MiB (50 extents).
Logical volume RHCE/myvg1 successfully resized.
[root@kongd ~]# lvs /dev/RHCE/myvg1
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
myvg1 RHCE -wi-ao---- 200.00m
注意:使用 -L +100M增加100M,如果增加到400M,使用-L 400M,比如
[root@kongd ~]# lvextend -L 400M /dev/RHCE/myvg1
Size of logical volume RHCE/myvg1 changed from 200.00 MiB (50 extents) to
400.00 MiB (100 extents).
Logical volume RHCE/myvg1 successfully resized.
[root@kongd ~]# lvs /dev/RHCE/myvg1
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
myvg1 RHCE -wi-ao---- 400.00m
但是目前文件系统并没有扩容:
[root@kongd ~]# df -h | grep /mnt/data1
/dev/mapper/RHCE-myvg1 95M 6.0M 89M 7% /mnt/data1
使用xfs_growfs文件系统扩容:
[root@kongd ~]# xfs_growfs /mnt/data1/
meta-data=/dev/mapper/RHCE-myvg1 isize=512 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=1368, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 25600 to 102400
[root@kongd ~]# df -h | grep /mnt/data1
/dev/mapper/RHCE-myvg1 395M 8.8M 386M 3% /mnt/data1
ext文件系统,既支持扩容(使用resize2fs文件系统扩容),也支持缩减
[root@localhost ~]# umount /logical/lv1/
[root@localhost ~]# e2fsck -f /dev/vg1/lv1 #检测文件系统,resize2fs之前会提示先要检
测文件系统
[root@localhost ~]# resize2fs /dev/vg1/lv1 3G #重置文件系统大小
[root@localhost ~]# lvreduce -L 3G /dev/vg1/lv1 或者[root@localhost ~]# lvresize
-L 3G /dev/vg1/lv1
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
说明:无论是xfs还是ext4的逻辑卷调整大小都可以用该命令lvresize -r -L 大小 -n lv设备名
2、管理交换分区
在Linux系统中,swap交换分区的作用类似于Windows系统中“虚拟内存”。当有程序被调入内存后,但 是该程序又不是常被CPU所取用时,那么这些不常被使用的程序将会被放到硬盘的swap交换分区当中, 而将速度较快的内存空间释放给真正需要的程序使用,以避免由于物理内存不足而造成的系统效能低的 问题。如果系统没有swap交换分区,或者现有交换分区的容量不够用时,可扩展swap交换分区。
扩展swap交换分区的方式有两种:
以磁盘分区的方式扩展swap交换分区
以镜像文件的方式扩展swap交换分区
命令 | 功能 |
---|---|
mkswap | 分区设备名 将指定的分区格式化为swap交换文件系统 |
swapon | 交换分区设备名 |
swapoff | 交换分区设备名 |
swapon -s | 查看交换分区的使用情况 |
free -m | 以兆字节为单位显示物理内存、交换分区的使用情况 |
新建分区扩展交换空间:
[root@localhost ~]# umount /logical/lv1/
[root@localhost ~]# e2fsck -f /dev/vg1/lv1 #检测文件系统,resize2fs之前会提示先要检
测文件系统
[root@localhost ~]# resize2fs /dev/vg1/lv1 3G #重置文件系统大小
[root@localhost ~]# lvreduce -L 3G /dev/vg1/lv1 或者[root@localhost ~]# lvresize
-L 3G /dev/vg1/lv1
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
#格式化交换空间
[root@localhost ~]#mkswap /dev/sda5
#激活当前的交换空间
[root@localhost ~]#swapon /dev/sda5
#禁用指定的交换分区
[root@localhost ~]#swapoff /dev/sdb1 关闭swap
#查看当前激活的swap分区
[root@localhost ~]#swapon -s
[root@localhost ~]# cat /proc/swaps
Filename Type Size Used Priority
/dev/nvme0n1p3 partition 2097148 0 -2
#写入/etc/fstab/,实现开机挂载
[root@localhost ~]# vim /etc/fstab
/dev/sda5 swap swap defaults 0 0
新建文件扩展交换空间:
[root@localhost ~]# dd if=/dev/zero of=/swap bs=1M count=1024
创建一个文件/swap,从无限零资源去读,每一块大小为1M,一共有1024块
不能用cat去查看,不然会卡死(块设备)
#格式化交换空间
[root@localhost ~]# mkswap /swap
[root@localhost ~]# swapon /swap
[root@localhost ~]# chmod 0600 /swap
[root@localhost ~]# swapon -s 查看当前的虚拟内存
#写入/etc/fstab/,实现开机挂载
[root@localhost ~]# vim /etc/fstab
/swap swap swap defaults 0 0
3、拓展阅读:实施高级存储功能
注:此部分内容不作要求,学有余力的同学可自行拓展阅读
3.1、Stratis 管理分层存储
Stratis 是一个卷管理文件系统volume-managing filesystem(VMF),类似于 ZFS 和 Btrfs。它使用了 存储“池”的核心思想,该思想被各种 VMF 和形如 LVM 的独立卷管理器采用。使用一个或多个硬盘(或分区)创建存储池,然后在存储池中创建卷volume。与使用 fdisk 或 GParted 执行的传统硬盘分区不同,存储池中的卷分布无需用户指定。
VMF 更进一步与文件系统层结合起来。用户无需在卷上部署选取的文件系统,因为文件系统和卷已经被合并在一起,成为一个概念上的文件树,文件数据位于存储池中,但文件大小仅受存储池整体容量限制。
通过Stratis,可以使用精简配置(thin provisioning),快照(snapshots)和基于池(pool-based ) 的管理和监控等高级存储功能。
stratis案例:新增两块5G硬盘
1、配置yum源,安装软件包
[root@kongd ~]# dnf install -y stratisd stratis-cli
2、启动stratisd服务
[root@kongd ~]# systemctl enable --now stratisd.service
[root@kongd ~]# systemctl is-enabled stratisd.service
enabled
3、创建池
[root@kongd ~]# stratis --version
1.0.0
[root@kongd ~]# stratis pool --help
usage: stratis pool [-h] {create,list,destroy,rename,add-data,add-cache} ...
optional arguments:
-h, --help show this help message and exit
subcommands:
{create,list,destroy,rename,add-data,add-cache}
create Create a pool #创建一个池
list List pools #列出池
destroy Destroy a pool #销毁一个池
rename Rename a pool #重命名
add-data Add one or more blockdevs to an existing pool for use
as data storage #增加物理设备
add-cache Add one or more blockdevs to an existing pool for use
as cache #增加缓存
[root@kongd ~]# stratis pool create redhat /dev/nvme0n2 #池的名字redhat,在池中
加入设备/dev/nvme0n2
[root@kongd ~]# stratis pool list
Name Total Physical Size Total Physical Used
redhat 5 GiB 52 MiB
4、构建文件系统
对于stratis管理的存储分层而言,文件系统是构建在池中的
[root@kongd ~]# stratis filesystem create redhat rhce
[root@kongd ~]# stratis filesystem list
Pool Name Name Used Created Device UUID
redhat rhce 546 MiB Jan 08 2020 00:15 /stratis/redhat/rhce
fe32e43bafa046d8b82210bcd7616ac1
5、挂载
[root@kongd ~]# mkdir /mnt/stratis
[root@kongd ~]# mount /stratis/redhat/rhce /mnt/stratis
[root@kongd ~]# df -hT | grep /mnt/stratis
#永久挂载
[root@kongd ~]# tail -1 /etc/fstab
/stratis/redhat/rhce /mnt/stratis xfs defaults,xsystemd.requires=stratisd.service
0 0
6、扩容
[root@kongd ~]# stratis pool add-data redhat /dev/nvme0n3
[root@kongd ~]# stratis pool list
Name Total Physical Size Total Physical Used
redhat 10 GiB 602 MiB
写入数据
[root@kongd ~]# dd if=/dev/zero of=/mnt/stratis/file bs=1G count=5
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 13.4471 s, 399 MB/s
7、快照
[root@kongd ~]# stratis filesystem snapshot redhat rhce snap01
[root@kongd ~]# stratis filesystem list
Pool Name Name Used Created Device UUID
redhat rhce 5.53 GiB Jan 08 2020 00:15 /stratis/redhat/rhce
fe32e43bafa046d8b82210bcd7616ac1
redhat snap01 5.53 GiB Jan 08 2020 00:23 /stratis/redhat/snap01
66e1027fcb41476786b88155593374ac
#挂载快照读取数据
[root@kongd ~]# mkdir /mnt/snap
[root@kongd ~]# mount /stratis/redhat/snap01 /mnt/snap/
[root@kongd ~]# du -sh /mnt/snap/file
5.0G /mnt/snap/file
8、一个池中可以构建多个文件系统
[root@kongd ~]# stratis filesystem create redhat rhce1
[root@kongd ~]# stratis filesystem list redhat
Pool Name Name Used Created Device UUID
redhat rhce 5.53 GiB Jan 08 2020 00:15 /stratis/redhat/rhce
fe32e43bafa046d8b82210bcd7616ac1
redhat snap01 5.53 GiB Jan 08 2020 00:23 /stratis/redhat/snap01
66e1027fcb41476786b88155593374ac
redhat rhce1 546 MiB Jan 08 2020 00:26 /stratis/redhat/rhce1
ec549c4e3bb84fa18f432109f435c520
9、文件系统删除
[root@kongd ~]# stratis filesystem destroy redhat rhce1
[root@kongd ~]# stratis filesystem destroy redhat snap01
Execution failure caused by:
ERROR: low-level ioctl error due to nix error: EBUSY: Device or resource busy
#注意:文件系统需要先卸载才能删除
[root@kongd ~]# umount /mnt/snap
[root@kongd ~]# stratis filesystem destroy redhat snap01
10、删除池
[root@kongd ~]# umount /mnt/snap
[root@kongd ~]# stratis filesystem destroy redhat snap01
[root@kongd ~]# stratis filesystem destroy redhat rhce
[root@kongd ~]# stratis pool destroy redhat
3.2、VDO压缩存储和删除重复数据
虚拟数据优化(Virtual Data Optimize,VDO)使用重复数据删除,压缩和精简配置的形式为Linux提供了内联数据缩减,即通过删除存储设备上的重复数据或者压缩数据来优化存储空间。设置VDO卷时,可以指定要在其上构造VDO卷的块设备以及计划提供的逻辑存储量。
1、安装VDO模块,需要的软件包是kmod-kvdo vdo
[root@kongd ~]# dnf install -y vdo kmod-kvdo
2、创建VDO卷
[root@kongd ~]# vdo create --name=vdo1 --device=/dev/nvme0n2 --
vdoLogicalSize=5G
Creating VDO vdo1
Starting VDO vdo1
Starting compression on VDO vdo1
VDO instance 0 volume is ready at /dev/mapper/vdo1
说明:这里我们指定了vdoLogicalSize,这个值可以比我们实际磁盘大许多。原因是我们将从重复数据删除
中得到很多空间。
例如:
当托管活动的虚拟机或容器时,红帽建议以10:1的逻辑与物理比率配置存储:即,如果您使用1TB的物理存储,则将其表示为10 TB的逻辑存储。
如果是日志文件和其他纯文本文件通常可以很好地进行重复数据删除,可能会得到10:1甚至更高的重复数据删除率。
但是如果是二进制文件,如视频、音频或压缩包,将远远低于3:1,甚至在某些情况下1:1。这种情况下不建议使用vdo卷。
3、分析一个VDO卷(deduplication删除重复数据 compression压缩)
[root@kongd ~]# vdo list
vdo1
[root@kongd ~]# vdo status --name vdo1
VDO status:
Date: '2020-01-08 01:08:30+08:00'
Node: kongd.com
Kernel module:
Loaded: true
Name: kvdo
Version information:
kvdo version: 6.2.0.293
Configuration:
File: /etc/vdoconf.yml
Last modified: '2020-01-08 01:06:34'
...
4、给vdo1一个xfs文件系统,之后挂载到/mnt/vdo1上
-K选项可防止立即丢弃文件系统中未使用的块,从而使命令返回更快
[root@kongd ~]# mkfs.xfs -K /dev/mapper/vdo1
meta-data=/dev/mapper/vdo1 isize=512 agcount=4, agsize=327680 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
#刷新存储设备
[root@kongd ~]# udevadm settle
[root@kongd ~]# mkdir /mnt/vdo1
[root@kongd ~]# mount /dev/mapper/vdo1 /mnt/vdo1
#设置开机自动挂载
[root@kongd ~]# tail -1 /etc/fstab
/stratis/redhat/rhce /mnt/stratis xfs defaults,x-systemd.requires=vdo.service
0 0
5、使用vdostats命令查看卷的初始统计信息和状态
[root@kongd ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 5.0G 3.0G 2.0G 60% 98%
可以看到我们还没有写任何数据,但是已经有3GB,60%的空间正在使用中了!这是因为“通用重复数据删除索引”已被写入磁盘。这基本上是一个数据库,用于记录slab指纹及其位置。这就是使重复数据删除成为可能的原因。
6、查看去重功能是否开启
[root@kongd ~]# vdo status --name=vdo1 | grep Deduplication
Deduplication: enabled
7、复制文件到挂载点查看
[root@kongd ~]# cp /media/cdrom/images/install.img /mnt/vdo1/
[root@kongd ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 5.0G 3.4G 1.6G 68% 2%
8、再次复制两个相同文件查
[root@kongd ~]# cp /media/cdrom/images/install.img /mnt/vdo1/install.img1
[root@kongd ~]# cp /media/cdrom/images/install.img /mnt/vdo1/install.img2
[root@kongd ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 5.0G 3.4G 1.6G 68% 64%
[root@kongd ~]# du -sh /mnt/vdo1/
1.4G /mnt/vdo1/
总结:会发现传一个相同的文件,但是占用磁盘空间并不会发生变化。