深度剖析Linux磁盘分区 | LVM逻辑卷 | VDO卷 | AutoFS存储自动挂载
- 前言说明
- 1. 安装操作系统分区配置
- 2. 大磁盘分区管理
- 3. LVM逻辑卷管理
- 3.1. 创建LVM逻辑卷
- 3.1.1. 创建物理卷PV
- 3.1.2. 创建卷组VG
- 3.1.3. 创建逻辑卷LV
- 3.1.4. 创建并挂载文件系统
- 3.1.5. 配置开机自动挂载
- 3.2. 逻辑卷的扩缩容
- 3.3. 卷组缩容
- 3.4. 删除逻辑卷、卷组和物理卷
- 4. VDO(虚拟数据优化)卷管理
- 4.1. VDO简介
- 4.2. 部署VDO
- 4.3. VDO维护
- 4.3.1. 管理VDO卷的空闲空间
- 4.3.2. 启动或停止VDO卷
- 4.3.3. 选择VDO写入模式
- 4.3.4. VDO卷恢复与重建
- 4.3.5. 在VDO中启用或禁用压缩
- 4.3.6. 增大VDO卷的大小
- 4.3.7. 删除VDO卷
- 4.4. 测试VDO空间节省
- 4.4.1. 测试VDO重删功能
- 4.4.2. 测试VDO读写性能
- 4.4.3. 清理VDO测试卷
- 4.5. 丢弃未使用块
- 4.5.1. 块丢弃操作的类型
- 4.5.2. 执行批块丢弃
- 4.5.3. 启用在线块丢弃
- 4.5.4. 启用定期块丢弃
- 4.6. 使用Web控制台管理VDO卷
- 4.6.1. 安装并启用Web控制台
- 4.6.2. 在Web控制台中创建VDO卷
- 4.6.3. 在Web控制台中格式化VDO卷
- 4.6.4. 在Web控制台中扩展VDO卷
- 5. AutoFS自动挂载服务
前言说明
要注意这些技术和工具在不同Linux发行版中的使用可能会有所不同,需要查看您正在使用的特定发行版的文档和指南,以获取更多详细信息和操作说明。
1. 安装操作系统分区配置
创建/boot
分区(大小50MB):
/boot/efi
分区设置为200MB即可
Swap
交换分区的大小设置为物理内存大小的2倍:
剩余空间全部留给/
分区,当然也可以将根分区设置为50GB或者100GB,然后将剩余空间划分给/home
分区和/var
分区
2. 大磁盘分区管理
[root@localhost ~]# fdisk -l
Disk /dev/sda: 8393.0 GB, 8392996290560 bytes, 16392570880 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 1048576 bytes
可以看到/dev/sda
的总空间是8T左右,直接进行分区格式化操作:
[root@localhost ~]# fdisk /dev/sda
[root@localhost ~]# mkfs.xfs /dev/sda1
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 63G 0 63G 0% /dev
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 63G 11M 63G 1% /run
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 2.0G 49G 4% /
/dev/sdb2 1014M 151M 864M 15% /boot
/dev/sdb1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 838G 34M 838G 1% /home
tmpfs 13G 0 13G 0% /run/user/0
/dev/sda1 2.0T 34M 2.0T 1% /data
磁盘空间却只有2T大小。原因是因为fdisk最大只能创建2T分区的盘,超过2T使用parted
删除上述使用fdisk创建的磁盘分区:
[root@localhost ~]# fdisk /dev/sda
Command (m for help): p
Command (m for help): d
Selected partition 1
Partition 1 is deleted
Command (m for help): w
接下来使用parted工具进行分区创建:
[root@localhost ~]# parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: BROADCOM MR9560-16i (scsi)
Disk /dev/sda: 8393GB # 磁盘空间最大8393GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y
(parted) mkpart
Partition name? []? sda1
File system type? [ext2]? ext4
Start? 0
End?
End? 8393GB
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
(parted) p
Model: BROADCOM MR9560-16i (scsi)
Disk /dev/sda: 8393GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 8393GB 8393GB sda1
(parted) quit
Information: You may need to update /etc/fstab.
[root@localhost ~]# fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Disk /dev/sda: 8393.0 GB, 8392996290560 bytes, 16392570880 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 1048576 bytes
Disk label type: gpt
Disk identifier: E43B9D7C-0D7E-470D-8BBA-FC6A7238D6C3
# Start End Size Type Name
1 34 16392570846 7.6T Microsoft basic sda1
[root@localhost ~]# mkfs.ext4 /dev/sda1
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount /dev/sda1 /data
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 63G 0 63G 0% /dev
tmpfs 63G 0 63G 0% /dev/shm
tmpfs 63G 11M 63G 1% /run
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 2.0G 49G 4% /
/dev/sdb2 1014M 151M 864M 15% /boot
/dev/sdb1 200M 12M 189M 6% /boot/efi
/dev/mapper/centos-home 838G 34M 838G 1% /home
tmpfs 13G 0 13G 0% /run/user/0
/dev/sda1 7.6T 93M 7.2T 1% /data
查看磁盘的UUID:
blkid
/dev/mapper/centos-root: UUID="6daff923-488c-4dd8-80ee-fb5faed8cca9" TYPE="xfs"
/dev/sdb3: UUID="JW1wdc-hst2-omzt-QegM-XS5a-tShf-OeUu1a" TYPE="LVM2_member" PARTUUID="6d3d61ff-6f12-4537-8abc-e59075d23291"
/dev/sda1: UUID="bcde2c04-0944-4ec3-9d16-cdfbff7f38ea" TYPE="ext4" PARTLABEL="sda1" PARTUUID="1a4db326-aa94-4c44-99b5-21d96388334a"
/dev/sdb1: SEC_TYPE="msdos" UUID="B09B-3EEA" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6f8129b9-3eae-4234-98b8-7cde65820c0c"
/dev/sdb2: UUID="dc45cf08-fdca-4c5c-9ef5-94396644c548" TYPE="xfs" PARTUUID="54c0bb37-f49e-4f87-aaa3-96201d717bb7"
/dev/mapper/centos-swap: UUID="1ca6f4e8-c154-4ec0-9200-74bf2d7c8e87" TYPE="swap"
/dev/mapper/centos-home: UUID="a8c37d6a-51e1-44ec-b506-29614f931ad1" TYPE="xfs"
[root@localhost ~]# vim /etc/fstab
UUID=bcde2c04-0944-4ec3-9d16-cdfbff7f38ea /data xfs defaults 0 0
测试下磁盘的读写性能:
[root@localhost ~]# dumpe2fs /dev/sda1|grep -i "block Size"
dumpe2fs 1.42.9 (28-Dec-2013)
Block size: 4096
测试写性能:
[root@localhost ~]# cd /data/
[root@localhost data]# time dd if=/dev/zero of=/testio bs=4k count=100000 oflag=direct oflag=sync
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 9.6584 s, 42.4 MB/s
real 0m9.732s
user 0m0.103s
sys 0m4.798s
[root@localhost data]# dd if=/dev/zero of=/testio2 bs=4k count=100000 oflag=direct
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 3.71845 s, 110 MB/s
# 添加oflag=direct将跳过内存缓存,添加oflag=sync将跳过hdd缓存
测试读性能:
[root@localhost data]# time dd if=/dev/sda1 of=/dev/null bs=4k
^C4775424+0 records in
4775423+0 records out
19560132608 bytes (20 GB) copied, 12.6906 s, 1.5 GB/s
real 0m12.693s
user 0m0.804s
sys 0m10.713s
3. LVM逻辑卷管理
LVM(Logical Volume Manager)是Linux系统下的一种管理硬盘分区机制,在磁盘和分区之上建立一个逻辑层,可以灵活、高效地管理磁盘分区,简化了磁盘管理操作。逻辑卷的大小可以动态调整,而且不会丢失现有数据;即使新增了磁盘,也不会改变现有的逻辑卷。
3.1. 创建LVM逻辑卷
3.1.1. 创建物理卷PV
yum install -y lvm2
查看主机上的所有硬盘:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 2.2T 0 disk
sdb 8:16 0 893.1G 0 disk
├─sdb1 8:17 0 190M 0 part /boot/efi
├─sdb2 8:18 0 976M 0 part /boot
├─sdb3 8:19 0 128G 0 part [SWAP]
└─sdb4 8:20 0 764G 0 part /
sdc 8:32 0 1.1T 0 disk
sdd 8:48 0 1.1T 0 disk
sde 8:64 0 2.2T 0 disk
选择使用sda和sde创建物理卷,多个设备之间用空格间隔:
pvcreate /dev/sda /dev/sde
3.1.2. 创建卷组VG
vgcreate <卷组名称> <物理卷名称> …… <物理卷名称>
例如创建vg_01卷组,并添加/dev/sda、/dev/sde这2块物理卷:
vgcreate vg_01 /dev/sda /dev/sde
如果需要在卷组中添加新的物理卷,运行以下命令添加其他已创建的物理卷:
vgextend <卷组名称> <物理卷名称> …… <物理卷名称>
查看卷组信息:
vgs
VG #PV #LV #SN Attr VSize VFree
vg_01 2 0 0 wz--n- 4.36t 4.36t
3.1.3. 创建逻辑卷LV
创建逻辑卷:
lvcreate -L <逻辑卷大小> -n <逻辑卷名称> <卷组名称>
# 逻辑卷大小:逻辑卷的大小应小于卷组剩余可用空间。
# 逻辑卷名称:由您自定义,例如lv01。
# 卷组名称:创建卷组已经创建的卷组的名称,例如vg_01
lvcreate -L 10g -n lv01 vg_01
3.1.4. 创建并挂载文件系统
获取逻辑卷路径、名称、所属卷组等信息,后续操作步骤需使用
lvdisplay
--- Logical volume ---
LV Path /dev/vg_01/lv01
LV Name lv01
VG Name vg_01
LV UUID 4fx5f3-BA2H-yCcE-2mys-p0FW-umQS-0ur97v
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-07-13 23:25:53 -0400
LV Status available
# open 0
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
# LV Path:逻辑卷路径,例如/dev/vg_01/lv01
# LV Name:逻辑卷的名称,例如lv01
# VG Name:逻辑卷所属的卷组名称,例如vg_01
# LV Size:逻辑卷的大小,图示信息为10 GiB
在逻辑卷上创建文件系统:
mkfs.<文件系统格式> <逻辑卷路径>
以逻辑卷路径为/dev/vg_01/lv01、文件系统为ext4为例进行格式化:
mkfs.ext4 /dev/vg_01/lv01
创建新挂载点,例如/media/lv01,并将文件系统挂载至挂载点:
mkdir /media/lv01
mount /dev/vg_01/lv01 /media/lv01
查看逻辑卷的挂载结果:
df -h
Filesystem Size Used Avail Use% Mounted on
......
/dev/mapper/vg_01-lv01 9.8G 37M 9.2G 1% /media/lv01
3.1.5. 配置开机自动挂载
如果需要设置开机自动挂载逻辑卷,需要在/etc/fstab中添加该逻辑卷的挂载信息,实现系统开机重启时自动挂载该逻辑卷。
运行以下命令备份etc/fstab文件
cp /etc/fstab /etc/fstab.bak
在/etc/fstab文件中添加目标逻辑卷的挂载信息:
echo `blkid <逻辑卷路径> | awk '{print $2}' | sed 's/\"//g'` <逻辑卷挂载点> <逻辑卷的文件系统类型> defaults 0 0 >> /etc/fstab
在开机重启时自动将逻辑卷(路径为/dev/vg_01/lv01)挂载至/media/lv01目录下,文件系统类型为ext4:
echo `blkid /dev/vg_01/lv01 | awk '{print $2}' | sed 's/\"//g'` /media/lv01 ext4 defaults 0 0 >> /etc/fstab
查询逻辑卷的挂载信息是否添加成功:
cat /etc/fstab
......
UUID=2b1a3a54-2ab8-48f4-a321-3d5bfed63482 /media/lv01 ext4 defaults 0 0
验证自动挂载功能是否生效
重新挂载/etc/fstab配置的文件系统。如果无报错输出,说明逻辑卷已经成功挂载到指定的挂载点
mount -a
3.2. 逻辑卷的扩缩容
扩容逻辑卷:
通过LVM(Logical Volume Manager)扩容一个逻辑卷LV(Logical Volume)
使用其他物理磁盘创建物理卷:
pvcreate <云盘设备名称>
pvcreate /dev/sdc
查看卷组信息,运行以下命令,扩容卷组:
vgs
VG #PV #LV #SN Attr VSize VFree
vg_01 2 1 0 wz--n- 4.36t 4.35t
vgextend <卷组名称> <物理卷名称>
将物理卷/dev/sdc添加至卷组vg_01中:
vgextend vg_01 /dev/sdc
查看卷组信息:
vgs
VG #PV #LV #SN Attr VSize VFree
vg_01 3 1 0 wz--n- 5.45t 5.44t
扩容逻辑卷和文件系统:
获取逻辑卷路径、名称、所属卷组等信息,后续操作步骤需使用
lvdisplay
--- Logical volume ---
LV Path /dev/vg_01/lv01
LV Name lv01
VG Name vg_01
LV UUID 4fx5f3-BA2H-yCcE-2mys-p0FW-umQS-0ur97v
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-07-13 23:25:53 -0400
LV Status available
# open 1
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
扩容逻辑卷:
lvextend -L <增/减逻辑卷容量> <逻辑卷路径>
为逻辑卷(路径为/dev/vg_01/lv01)新增5GiB容量:
lvextend -L +5G /dev/vg_01/lv01
或者:
lvextend -L 15G /dev/vg_01/lv01
扩容逻辑卷文件系统:
resize2fs <逻辑卷路径>
以扩容逻辑卷lv01(路径为/dev/vg_01/lv01)为例:
resize2fs /dev/vg_01/lv01
df -h
Filesystem Size Used Avail Use% Mounted on
......
/dev/mapper/vg_01-lv01 15G 41M 14G 1% /media/lv01
缩减逻辑卷:
先卸载逻辑卷/dev/mapper/vg_01-lv01
:
umount /media/lv01
umount: /media/lv01: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
fuser -m /media/lv01
/media/lv01: 9141c
ps -ef | grep 9141
root 9141 9137 0 Jul13 pts/2 00:00:00 -bash
root 39546 39449 0 02:18 pts/0 00:00:00 grep --color=auto 9141
kill -9 9141
umount /media/lv01
通过e2fsck命令检测逻辑卷上空余的空间:
e2fsck -f /dev/mapper/vg_01-lv01
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/mapper/vg_01-lv01: 12/983040 files (0.0% non-contiguous), 104724/3932160 blocks
使用resize2fs将文件系统减少到3G
resize2fs /dev/mapper/vg_01-lv01 3G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/mapper/vg_01-lv01 to 786432 (4k) blocks.
The filesystem on /dev/mapper/vg_01-lv01 is now 786432 blocks long.
使用lvreduce命令将逻辑卷减少到3G:
lvreduce -L 3G /dev/mapper/vg_01-lv01
WARNING: Reducing active logical volume to 3.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg_01/lv01? [y/n]: y
Size of logical volume vg_01/lv01 changed from 15.00 GiB (3840 extents) to 3.00 GiB (768 extents).
Logical volume vg_01/lv01 successfully resized.
mount -a
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_01-lv01 2.9G 25M 2.7G 1% /media/lv01
3.3. 卷组缩容
首先要确定移除的物理卷,将此物理卷上的数据转移至其他的物理卷,然后从卷组中将此物理卷移除
pvmove /dev/sdc
No data to move for vg_01.
当 pvmove命令完成后,再次使用 pvs 命令检查物理卷是否有空闲
pvs -o+pv_used
PV VG Fmt Attr PSize PFree Used
/dev/sda vg_01 lvm2 a-- 2.18t <2.18t 3.00g
/dev/sdc lvm2 --- 1.09t 1.09t 0
/dev/sde vg_01 lvm2 a-- 2.18t 2.18t 0
如果它是空闲的,使用vgreduce命令从卷组中删除物理卷 /dev/sdc
vgreduce vg_01 /dev/sdc
Removed "/dev/sdc" from volume group "vg_01"
最后运行pvremove命令从LVM配置中删除磁盘:
pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.
3.4. 删除逻辑卷、卷组和物理卷
umount /media/lv01
lvremove /dev/mapper/vg_01-lv01
Do you really want to remove active logical volume vg_01/lv01? [y/n]: y
Logical volume "lv01" successfully removed
vgremove vg_01
Volume group "vg_01" successfully removed
lvs # 执行结果为空
vgs # 执行结果为空
pvs
PV VG Fmt Attr PSize PFree
/dev/sda lvm2 --- 2.18t 2.18t
/dev/sde lvm2 --- 2.18t 2.18t
pvremove /dev/sda
Labels on physical volume "/dev/sda" successfully wiped.
pvremove /dev/sde
Labels on physical volume "/dev/sde" successfully wiped.
4. VDO(虚拟数据优化)卷管理
4.1. VDO简介
VDO(Virtual Data Optimize)是RHEL8/Centos8上新推出的一个存储相关技术(最早在7.5测试版中开始测试),是Redhat收购的Permabit公司的技术。
VDO的主要作用是节省磁盘空间,比如让1T的磁盘能装下1.5T的数据,从而降低数据中心的成本。
VDO的关键实现原理主要是重删和压缩,重删就是硬盘里拷贝来相同的数据,以前要占多份空间,现在只需要1份空间就可以了。类似我们在百度网盘中上传一个大型软件安装包,能实现秒传,其实历史记录就已经存在,所以无需再传一份相同的文件,也无需再占百度一份空间。另一方面是数据压缩,类似于压缩软件的算法,也可以更加节省磁盘空间。
VDO(Virtual Data Optimizer)是一种存储软件,可用作本地文件系统、iSCSI 或者 Ceph 存储下的添加存储层。VDO以重复数据删除、压缩和精简配置的形式为Linux提供内联数据缩减。当设置VDO卷时,可以指定一个块设备来构建VDO卷以及设置逻辑存储量。
● 当为虚拟机或容器使用时,建议按10:1的逻辑与物理比例配置存储:也就是说,如果使用1TB的物理存储,则将其显示为10TB 的逻辑存储。
● 对于对象存储,如Ceph提供的类型,建议使用3:1的逻辑与物理比例:1TB的物理存储将显示为3TB的逻辑存储
在这两种情况下,只需将文件系统放在VDO提供的逻辑设备之上,然后直接使用它,或将其作为分布式云存储架构的一部分。
由于 VDO是迅速置备的,所以文件系统和应用程序只会看到使用中的逻辑空间,且不知道可用的实际物理空间。使用脚本来监控实际的可用空间,并在使用超过阈值时产生一个报警:例如当VDO卷已满80% 时。
VDO部署场景:
KVM:
可以在配置了直接附加存储的 KVM 服务器上部署VDO
文件系统:
可以在VDO上创建文件系统,并通过NFS服务器或Samba将其公开给NFS或CIFS用户。
在iSCSI上放置 VDO:
可以将整个 VDO 存储目标作为 iSCSI 目标导出到远程 iSCSI 启动器
在iSCSI上创建VDO卷时,您可以将VDO卷放在 iSCSI 层之上或之下。
当将VDO卷放在 iSCSI 层下方的 iSCSI 服务器(目标)上时:
● VDO 卷对启动器是透明的,与其他 iSCSI LUN 类似。对客户端隐藏精简配置和节省空间后,更易于监控和维护 LUN 。
● 网络流量会减少,因为没有对 VDO 元数据的读或写,并且在网络上不会发生对去除重复建议的读验证。
● 在 iSCSI 目标上使用的内存和 CPU 资源可以带来更好的性能。例如,能够托管越来越多的 hypervisor ,因为在 iSCSI 目标上发生了卷减少。
● 如果客户端在启动器上实现了加密,且在目标下面有一个 VDO 卷,则不会实现任何空间节省。
当将 VDO 卷放在 iSCSI 层上面的 iSCSI 客户端(启动器)上时:
● 如果要取得较高的空间节省率,则异步模式下的网络流量可能会降低。
● 可以直接查看和控制空间节省,并监控使用情况。
● 如果要加密数据,例如使用dm-crypt
,您可以在加密之上实现 VDO,并充分利用空间效率。
LVM:
在下图中,VDO 目标被注册为一个物理卷,这样它可以由 LVM 来管理。从去除重复数据的存储池中创建多个逻辑卷(LV1到 LV4)。这样 VDO 便可支持多协议统一块或者对底层的去除重复数据的存储池的文件进行访问
4.2. 部署VDO
安装VDO软件:
yum install lvm2 kmod-kvdo vdo
创建VDO卷:
接下来在块设备中创建VDO卷,在以下步骤中将vdo-name
替换为要用于VDO卷的标识符,例如vdo1
。必须为系统中的每个 VDO实例使用不同的名称和设备。如果使用非持久性设备名称,则如果设备名称改变了,VDO 将来可能无法正常启动。
vdo create \
--name=vdo-name \
--device=block-device \
--vdoLogicalSize=logical-size
# --name后面跟vdo卷的名称,随便写,好认即可
# --device后面跟真实的物理磁盘
# --vdoLogicalSize后面跟vdo卷的容量,这里按真实物理空间的1.5倍
vdo create \
--name=vdo-name \
--device=/dev/sdc \
--vdoLogicalSize=50G
Creating VDO vdo-name
Starting VDO vdo-name
Starting compression on VDO vdo-name
VDO instance 0 volume is ready at /dev/mapper/vdo-name
如果物理块设备大于 16TiB,请添加 --vdoSlabSize=32G 选项,将卷上的 slab 大小增加到 32GiB
mkfs.xfs /dev/mapper/vdo-name
挂载VDO:
mount /dev/mapper/vdo-name /vodvolume/
启用定期块丢弃:
可以启用systemd
计时器来定期丢弃所有支持的文件系统中未使用的块
启用并启动systemd
计时器:
systemctl enable --now fstrim.timer
验证计时器的状态:
systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Fri 2023-07-14 04:33:38 EDT; 5s ago
Docs: man:fstrim
Jul 14 04:33:38 localhost.localdomain systemd[1]: Started Discard unused blocks once a week.
监控VDO:
使用vdostats
工具来获取有关 VDO 卷的信息:
vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo-name 1.1T 5.4G 1.1T 0% 99%
vdostats是用来看真实物理空间的大小,以及剩余空间
4.3. VDO维护
4.3.1. 管理VDO卷的空闲空间
4.3.2. 启动或停止VDO卷
在系统引导过程中,vdo
和systemd
单元会自动 启动 所有配置为激活的 VDO设备。安装vdo
软件包时,默认会安装并启用vdo
systemd
单元。此单元会在系统启动时自动运行vdo start --all
命令来启动所有激活的 VDO 卷。
还可以通过在vdo create
命令中添加--activate=disabled
选项来创建不自动启动的 VDO 卷
启动顺序:
有些系统可能会将LVM卷放在VDO卷之上,或VDO卷之下。在这些系统中,需要以正确顺序启动服务:
● 必须首先启动 LVM 的下层。在大多数系统中,当安装 LVM 软件包时会自动启动这个层。
● 然后,vdo
systemd
单元必须启动。
● 最后,必须运行其他脚本以启动正在运行的 VDO 卷上的 LVM 卷或其他服务。
停止卷所需的时间:
停止 VDO 卷需要根据存储设备速度以及卷需要写入的数据量而有所不同:
● 卷总是为每 1GiB UDS 索引写入大约 1GiB。
● 卷还写入与块映射缓存大小相等的数据量,再加上每个 slab 最多 8MiB。
● 卷必须完成处理所有未完成的 IO 请求。
要启动给定的 VDO 卷,请使用:
vdo start --name=vdo-name
Starting VDO vdo-name
VDO instance 0 volume is ready at /dev/mapper/vdo-name
要启动所有VDO 卷,请使用:
vdo start --all
激活VDO卷(激活VDO卷使其自动启动):
激活一个特定卷:
vdo activate --name=vdo-name
vdo-name already activated
激活所有卷:
vdo activate --all
vdo-name already activated
取消激活一个特定卷:
vdo deactivate --name=vdo-name
取消激活所有卷:
vdo deactivate --all
4.3.3. 选择VDO写入模式
sync模式:
当VDO处于sync模式时,上层认为写入命令写入数据到持久化存储。这样的结果就是对于文件系统或应用不需要处理严重故障点的数据保留,比如出发FLUSH或者force unit access(FUA)请求来保留数据(也就是不需要刷缓存将数据从缓存写到持久存储中,上层认为写入命令直接写到了持久存储,并没有写到缓存中)。当底层存储可以保证写入命令完成时数据一定写入持久化存储,VDO必须设置成sync模式。也就是说,该存储设备没有易失性写高速缓存,或有直写高速缓存。
async模式:
当VDO处于async模式时,VDO不保证一个写入命令完成时数据写入持久化存储。文件系统或应用必须在每次交互时触发FLUSH或FUA请求来保证数据在严重故障时被持久存储。如果底层存储不能保证命令完成时数据持久化,VDO必须设置为async模式。也就是存储设备具有易失性写高速缓存。
auto模式:
auto模式会根据设备属性自动选择sync模式或async模式
VDO写入模式的内部处理过程:
当kvdo内核模块以同步模式运行时:
● 首先它将请求的数据临时写入分配的块,然后确认该请求。
● 确认完成后,将尝试通过计算块数据的hash签名对块进行重复数据删除,然后将其发送到VDO索引。
● 如果VDO索引包含具有相同签名的块,则kvdo读取找到的块并对两个块进行逐字节比较,以验证他们是否相同。
● 如果他们确实相同,那么kvdo将更新其块映射,以使逻辑块指向相应的物理块并释放分配的临时物理块
● 如果VDO索引不包含要写入的块的签名,或者指向的块实际上不包含相同的数据,则kvdo将更新其块映射以使临时物理块永久化。
当kvdo内核模块以异步模式运行时:
● 它会立即确认该请求,而不是写入数据
● 然后它将尝试以与上述相同的方式对数据块进行检查
● 如果该块证明是重复块,则kvdo更新其映射并释放分配的块。否则,它将请求中的数据写入分配的块,并更新块映射以使物理块永久化。
查看 VDO 卷使用的写入模式:
vdo status --name=vdo-name | grep "write policy"
Configured write policy: auto
write policy: sync
# 配置的写入策略: 会有sync、async或auto选项
# 写入策略:是VDO应用的特定的写模式,即sync或async
检查易变的缓存:
可以通过查看/sys/block/block-device/device/scsi_disk/identifier/cache_type
文件检查易失性缓存
cat /sys/block/sda/device/scsi_disk/7:0:0:0/cache_type
write back
cat /sys/block/sdb/device/scsi_disk/1:2:0:0/cache_type
None
cat /sys/block/sdc/device/scsi_disk/0\:3\:109\:0/cache_type
write through
● 设备sda
表示它有 一个回写缓存。对其使用async
模式
● 设备sdb
表示 它没有 一个回写缓存。对其使用sync
模式
如果 cache_type 的值是None 或 write through,应该将 VDO配置为使用sync写模式
设置VDO写入模式:
为VDO卷设置写模式,可以是对现有卷,也可以是在创建新卷时设置
使用不正确的写模式可能会在电源故障、系统崩溃或与磁盘意外失去联系后导致数据丢失
要修改现有的VDO卷,请使用:
vdo changeWritePolicy --writePolicy=sync|async|async-unsafe|auto \
--name=vdo-name
要在创建VDO卷时指定写模式,请在vdo create
命令中添加 --writePolicy=sync|async|async-unsafe|auto
选项
4.3.4. VDO卷恢复与重建
VDO卷恢复:
VDO卷的重建操作是自动完成的无需人工干预,VDO会根据当前的写入模式重建不同的写入规则,当VDO卷在异常关机后启动时,VDO会验证卷上的元数据的一致性,如果需要修复会重建一部分元数据。
sync:
如果 VDO 在同步存储上运行,且写策略被设为sync
,则写到卷的所有数据都可以被完全恢复。
async:
如果写策略是async
的,如果一些写不是持久化的,则它们可能无法被恢复。这可以通过发送VDO FLUSH
命令或带有 FUA(强制单元访问)标记的写 I/O 来实现。您可以通过调用fsync
、fdatasync
、sync
或 umount
等数据完整性操作来在用户模式下实现这一点。
在任何一种模式下,某些未被确认或未刷新的写也可能被重新构建
自动和手动恢复:
当VDO卷进入到recovering操作模式时,VDO会在其重新上线后自动重建不干净的VDO卷。这叫做在线恢复。
如果VDO无法成功恢复VDO卷,它会将卷置于只读操作模式下,该模式在卷重新启动时仍然有效。您需要强制重新构建来手动解决这个问题。
VDO运行模式:
可以通过下面的方式查看VDO卷是否在正常运行或者正在从错误中恢复的模式
vdostats --verbose vdo-name | grep mode
operating mode : normal
normal:
这是默认的操作模式。VDO卷始终处于normal
模式,除非以下其中一种状态强制使用不同的模式。新创建的 VDO 卷以normal
模式启动。
recovering:
当VDO卷在关闭前没有保存其所有元数据时,它会在下次启动时自动进入recovering
模式。进入这个模式的典型原因是电源丢失或者基础存储设备出现问题。
在recovering
模式下,VDO 将修复设备上每个物理块的引用数。恢复通常不需要非常长。时间取决于 VDO 卷的大小、基础存储设备的速度以及其它请求 VDO 同时处理的速度。VDO 卷通常具有以下例外:
● 最初,在卷中写入请求的空间量可能会有所限制。当恢复了更多元数据后,更多的可用空间就会可用。
● 如果数据位于尚未恢复的卷的一部分中,则在 VDO 卷恢复过程中的数据写入可能对崩溃前写入的数据不能去除重复数据。VDO 可在恢复卷时压缩数据。您仍然可以读取或覆盖压缩的块。
● 在在线恢复过程中,某些统计数据不可用:例如,blocks in use 和 blocks free。重建完成后就可使用这些统计数据。
● 由于正在进行恢复工作,读取和写入的响应时间可能比通常要慢
可以在recovering
模式下安全地关闭 VDO 卷。如果恢复在关闭前没有完成,则设备将在下一次启动时再次进入 recovering 模式。
当VDO卷修复了所有引用数时,VDO 卷会自动退出recovering
模式,并进入到normal
模式。不需要管理员操作。
在线恢复VDO卷:
在线恢复VDO卷可以使用如下命令:
vdo start --name=vdo-name
不需要额外的步骤。恢复在后台运行
强制VDO卷元数据离线重建:
将VDO卷元数据执行强制离线重新构建,以便在不正常的关闭后进行恢复。先决条件必须是已启动VDO卷。
此过程可能会导致卷的数据丢失
检查卷是否处于只读模式:
vdo status --name=vdo-name | grep mode
operating mode: normal
如果卷不处于只读模式,则不需要强制离线重建。执行在线恢复
如果卷正在运行,请停止它:
vdo stop --name=vdo-name
使用--forceRebuild
选项重启卷:
vdo start --name=vdo-name --forceRebuild
删除失败创建的VDO卷:
此过程清理处于中间状态的 VDO 卷。如果在创建卷时发生故障,则卷处于中间状态。这可能会在以下情况发生,例如:
● 系统崩溃
● 电源失败
● 管理员中断了运行的vdo create
命令
要进行清理,请使用--force
选项删除创建失败的卷:
vdo remove --force --name=vdo-name
需要--force
选项,由于卷创建失败,管理员可能会由于更改了系统配置而导致冲突。如果没有--force
选项,vdo remove
命令会失败
4.3.5. 在VDO中启用或禁用压缩
VDO提供数据压缩,启用它可增加空间节省,VDO卷压缩默认是on
当VDO首次看到唯一数据时,它会压缩数据。已存储的数据的后续副本会复制,而无需额外的压缩步骤。
在VDO 卷中启用压缩(默认启用压缩):
vdo enableCompression --name=vdo-name
禁用VDO卷上的压缩:
要停止在现有VDO卷中压缩,请使用以下命令:
vdo disableCompression --name=vdo-name
另外在创建新卷时,您可以在vdo create
命令中添加--compression=disabled
选项来禁用压缩
4.3.6. 增大VDO卷的大小
可以增加VDO卷的物理大小,以利用更多的底层存储容量,或者增加逻辑大小以在卷上提供更多的容量。
物理大小:
底层块设备的大小。VDO使用这个存储用于:
● 用户数据,这些数据可能会进行重复数据删除和压缩
● VDO 元数据,如 UDS 索引
可用物理大小:
这是VDO可用于用户数据的物理大小的一部分
它等同于物理大小减去元数据的大小,再减去将卷根据指定的 slab 的大小分为 slab 后剩余的值。
逻辑大小:
这是VDO卷在应用程序中的置备大小。它通常大于可用的物理大小。如果没有指定--vdoLogicalSize
选项,则逻辑卷的调配现在被配置为1:1
的比率。例如如果将 VDO 卷放在 20GB 块设备之上,则为 UDS 索引保留 2.5 GB(如果使用默认索引大小)。剩余的 17.5 GB 为 VDO 元数据和用户数据提供。因此,要消耗的可用存储不超过 17.5 GB,且可能会因为组成实际 VDO 卷的元数据而减少。
VDO 目前支持任意逻辑卷大小最多为物理卷的 254 倍,但不能超过 4PB
VDO磁盘结构:
增大VDO卷的逻辑卷大小:
这个过程会增加给定VDO卷的逻辑大小。可以先创建具有逻辑大小足够小的VDO卷,使其安全而无法耗尽空间。一段时间后,可以评估实际的数据减少率,如果足够的话,可以增大 VDO 卷的逻辑大小以利用节省的空间。
不可能缩小 VDO 卷的逻辑卷大小
要增大逻辑大小,请使用:
# 原VDO卷大小
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 1.1T 0 disk
└─vdo-name 253:0 0 50G 0 vdo /vodvolume
vdo growLogical --name=vdo-name \
--vdoLogicalSize=100G
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 0 1.1T 0 disk
└─vdo-name 253:0 0 100G 0 vdo /vodvolume
增加VDO卷的物理大小:
可以增加VDO卷可以使用的物理存储量,不可以以这种方式缩小VDO卷使用的物理存储量。首先底层块设备的容量要大于VDO卷的当前物理大小
为VDO卷添加新物理存储空间:
vdo growPhysical --name=my-vdo
4.3.7. 删除VDO卷
删除一个有效的VDO卷:
● 卸载文件系统并停止使用VDO卷中的存储的应用程序。
● 要从您的系统中删除VDO卷,请使用:
vdo remove --name=vdo-name
删除失败创建的VDO卷:
清理处于中间状态的VDO卷。如果在创建卷时发生故障,则卷处于中间状态。这可能会在以下情况发生,例如:
● 系统崩溃
● 电源失败
● 管理员中断了运行的vdo create
命令
要进行清理,请使用--force
选项删除创建失败的卷:
vdo remove --force --name=vdo-name
需要--force
选项,由于卷创建失败,管理员可能会由于更改了系统配置而导致冲突。如果没有--force
选项,vdo remove
命令会失败
4.4. 测试VDO空间节省
4.4.1. 测试VDO重删功能
首先创建一个VDO测试卷:
在1.1TB的物理卷中创建了大小为2TiB 的VDO卷,用于测试目的。
vdo create --name=vdo-test \
--device=/dev/sdd \
--vdoLogicalSize=2T \
--writePolicy=sync \
--verbose
● 要在异步存储之上测试 VDO async 模式,请使用--writePolicy=async
选项创建一个异步卷
● 要在同步存储之上测试 VDO sync 模式,请使用--writePolicy=sync
选项创建一个同步卷
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd 8:48 0 1.1T 0 disk
└─vdo-test 253:1 0 2T 0 vdo
使用 XFS 或者 ext4 文件系统格式化新卷:
mkfs.xfs -K /dev/mapper/vdo-test
挂载格式化的卷:
mkdir /mnt/vdo-test
mount /dev/mapper/vdo-test /mnt/vdo-test && \
chmod a+rwx /mnt/vdo-test
4.4.2. 测试VDO读写性能
将随机数据的32 GiB写入VDO 卷:
dd if=/dev/urandom of=/mnt/vdo-test/testfile bs=4096 count=8388608
8388608+0 records in
8388608+0 records out
34359738368 bytes (34 GB) copied, 165.781 s, 207 MB/s
从VDO卷中读取数据并将其写入另一个卷:
dd if=/mnt/vdo-test/testfile of=/tmp/testfile bs=4096
8388608+0 records in
8388608+0 records out
34359738368 bytes (34 GB) copied, 27.7768 s, 1.2 GB/s
比较这两个文件:
diff --report-identical-files /mnt/vdo-test/testfile /tmp/testfile
Files /mnt/vdo-test/testfile and /tmp/testfile are identical
命令应该报告这些文件是相同的
4.4.3. 清理VDO测试卷
卸载在VDO卷中创建的文件系统:
umount /mnt/vdo-test
从系统中删除VDO测试卷:
vdo remove --name=vdo-test
Removing VDO vdo-test
Stopping VDO vdo-test
验证卷是否已被删除:
vdo list --all | grep vdo-test
4.5. 丢弃未使用块
4.5.1. 块丢弃操作的类型
如果/sys/block/<device>/queue/discard_max_bytes
文件中的值不为零,则支持物理丢弃操作。
cat /sys/block/sdc/queue/discard_max_bytes
0
可以使用不同方法运行丢弃块操作:
批量丢弃:
由用户明确触发,并丢弃所选文件系统中所有未使用的块。
在线丢弃:
在挂载时指定,并在无需用户干预的情况下实时指定触发器。在线丢弃操作只丢弃从已使用
到空闲状态的块。
定期丢弃:
是systemd
服务定期运行的批处理操作
4.5.2. 执行批块丢弃
先决条件:挂载文件系统、文件系统底层的块设备支持物理忽略操作
在所选文件系统中执行丢弃:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vdo-name 50G 33M 50G 1% /vodvolume
fstrim /vodvolume
要在所有挂载的文件系统中执行丢弃,请使用:
fstrim --all
如果在不支持丢弃操作的设备,或者由多个设备组成的逻辑设备(LVM 或者 MD),其中任意设备不支持丢弃操作:
fstrim /mnt/non_discard
fstrim: /mnt/non_discard: the discard operation is not supported
4.5.3. 启用在线块丢弃
可以执行在线块丢弃操作,以便在所有支持的文件系统中自动丢弃未使用的块
在挂载时启用在线丢弃,请添加-o discard
挂载选项:
mount -o discard device mount-point
永久挂载文件系统时,请将discard
选项添加到/etc/fstab
文件中的挂载条目中
4.5.4. 启用定期块丢弃
可以启用systemd
计时器来定期丢弃所有支持的文件系统中未使用的块
启用并启动systemd
计时器:
systemctl enable --now fstrim.timer
验证计时器的状态:
systemctl status fstrim.timer
● fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Fri 2023-07-14 04:33:38 EDT; 1 day 5h ago
Docs: man:fstrim
Jul 14 04:33:38 localhost.localdomain systemd[1]: Started Discard unused blocks once a week.
4.6. 使用Web控制台管理VDO卷
4.6.1. 安装并启用Web控制台
cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)
yum install cockpit
systemctl enable cockpit.socket --now
systemctl status cockpit.socket
firewall-cmd --permanent --add-service=cockpit
firewall-cmd --reload
ss -tnlp | grep 9090
LISTEN 0 128 *:9090 *:* users:(("systemd",pid=1,fd=28))
登录到 Web 控制台:
填写服务器的root账号和密码即可
4.6.2. 在Web控制台中创建VDO卷
可参考官方指引,此处基本上就是按键操作
4.6.3. 在Web控制台中格式化VDO卷
可参考官方指引,此处基本上就是按键操作
4.6.4. 在Web控制台中扩展VDO卷
可参考官方指引,此处基本上就是按键操作
5. AutoFS自动挂载服务
我们在使用Linux时,如果要访问硬件资源,则需要使用mount命令进行挂载,将硬件资源与一个目录进行对应,然后才可以访问使用该存储介质。如果使用samba或者是NFS服务,也需要对远程存储设备进行挂载。mount挂载是使用外部存储介质或者文件系统所必须的一步操作,但是如果挂载的资源过多,则会给网络资源和服务器资源造成一定的负载,从而降低服务器性能。
为了解决这一问题,我们可以使用autofs服务,autofs是一种系统守护进程,我们可以把挂载信息写入其配置文件中,如果用户不访问其他存储介质的,则系统不会进行挂载,如果用户尝试访问该存储介质,则autofs会自动进行挂载操作,上述所有操作对用户而言是透明的,这样一来,autofs服务节省了服务器的网络和硬件资源。AutoFS是一个用于自动挂载文件系统的工具,通常用于NFS(网络文件系统)挂载。
操作步骤如下:
首先在serverb服务器中安装NFS服务端,创建一个共享目录作为servera的共享存储
[root@serverb ~]# mkdir -p /rhome/ldapuser0
[root@serverb ~]# chmod 777 /rhome/ldapuser0/
[root@serverb ~]# vim /etc/exports
/rhome/ldapuser0 *(rw)
[root@serverb ~]# systemctl restart nfs-server.service
[root@serverb ~]# systemctl enable nfs-server.service
[root@serverb ~]# firewall-cmd --permanent --add-service=nfs
[root@serverb ~]# firewall-cmd --permanent --add-service=mountd
[root@serverb ~]# firewall-cmd --permanent --add-service=rpc-bind
[root@serverb ~]# firewall-cmd --reload
接下来在servera中安装autofs,创建一个ldapuser0用户,ldapuser0用户登录系统后可以自动挂载NFS共享目录
[root@servera ~]# showmount -e serverb.lab.example.com
Export list for serverb.lab.example.com:
/rhome/ldapuser0 *
[root@servera ~]# useradd ldapuser0
[root@servera ~]# vim /etc/passwd
ldapuser0:x:1002:1002::/rhome/ldapuser0:/bin/bash
autofs服务的主配置文件为/etc/auto.master,打开后需要在主配置文件中写入格式:
[root@servera ~]# yum install autofs.x86_64
[root@servera ~]# vim /etc/auto.master
/rhome /etc/auto.nfs
[root@servera ~]# vim /etc/auto.nfs
ldapuser0 -rw serverb.lab.example.com:/rhome/ldapuser0
[root@servera ~]# systemctl enable autofs.service --now
[root@servera ~]# systemctl restart autofs.service
验证效果:登录ldapuser0用户后,查看挂载的文件已经自动挂载serverb的NFS共享文件。
[root@servera ~]# su - ldapuser0
Last login: Fri Sep 29 00:40:22 CST 2023 on pts/0
[ldapuser0@servera ~]$
[ldapuser0@servera ~]$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 887M 0 887M 0% /dev
tmpfs tmpfs 914M 0 914M 0% /dev/shm
tmpfs tmpfs 914M 17M 897M 2% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/vda3 xfs 9.9G 1.6G 8.4G 16% /
/dev/vda2 vfat 100M 6.8M 94M 7% /boot/efi
tmpfs tmpfs 183M 0 183M 0% /run/user/1000
serverb.lab.example.com:/rhome/ldapuser0 nfs4 9.9G 1.6G 8.4G 16% /rhome/ldapuser0