个人主页:wei_shuo的个人主页
Hello World !
VDO(Virtual Data Optimize 虚拟数据优化程序),可以优化块设备上数据的空间占用。VDO 是一个Linux 设备映射器驱动程序,它可以减少块设备上的磁盘空间使用,同时最大限度减少数据重复,从而节省磁盘空间,甚至提高数据吞吐量。VDO 包括两个内核模块:kvdo 模块用于以透明的方式控制数据压缩,uds 则可用于重复数据删除。
VDO 会按以下顺序对数据实施三个阶段的处理,以减少存储设备上的空间占用:
- 零区块的排除:
在初始化阶段,整块为 0 的会被元数据记录下来,这个可以用水杯里面的水和沙子混合的例子来解
释,使用滤纸(零块排除),把沙子(非零空间)给过滤出来,然后就是下一个阶段的处理。该阶段将启
用 VDO 设备中的精简配置功能。
- 重复数据删除:
在创建相同数据的多个副本时,输入的数据会判断是不是冗余数据(在写入之前就判断),这个部分
的数据通过 UDS 内核模块来判断(U niversal D eduplication S ervice),被判断为重复数据的部分不
会被写入,然后对元数据进行更新,直接指向原始已经存储的数据块即可。
- 压缩:
一旦消零和重删完成,kvdo 内核模块使用 LZ4 对每个单独的数据块进行处理,然后压缩好的数据块
会以固定大小 4KB 的数据存储在介质上加速读取的性能。
实施虚拟数据优化器
利用 VDO 创建的逻辑设备被称为 VDO 卷。VDO 卷与磁盘分区类似,可以将这些卷格式化为所需的文
件系统类型,并像常规文件系统那样进行挂载。
要创建 VDO 卷,请指定块设备以及 VDO 向用户显示的逻辑设备的名称。可以指定 VDO 卷的逻辑大小
[root@rhel82 dev]# fdisk -l
Disk /dev/nvme0n1:30 GiB,32212254720 字节,62914560 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x85e747f1
设备 启动 起点 末尾 扇区 大小 Id 类型
/dev/nvme0n1p1 2048 6143 4096 2M 83 Linux
/dev/nvme0n1p2 * 6144 2103295 2097152 1G 83 Linux
/dev/nvme0n1p3 2103296 10491903 8388608 4G 82 Linux swap / Solaris
/dev/nvme0n1p4 10491904 62914559 52422656 25G 5 扩展
/dev/nvme0n1p5 10493952 62914559 52420608 25G 83 Linux
Disk /dev/nvme0n2:20 GiB,21474836480 字节,41943040 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
安装 VDO 和 kmod-vdo 软件包,以便在系统中启用 VDO
[root@rhel82 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
[root@rhel82 ~]# yum -y install vdo kmod-kvdo
[root@rhel82 ~]# vdo create --name=vdo1 --device=/dev/nvme0n2 --vdoLogicalSize=50G
Creating VDO vdo1
The VDO volume can address 16 GB in 8 data slabs, each 2 GB.
It can grow to address at most 16 TB of physical storage in 8192 slabs.
If a larger maximum size might be needed, use bigger slabs.
Starting VDO vdo1
Starting compression on VDO vdo1
VDO instance 0 volume is ready at /dev/mapper/vdo1
如果省略逻辑大小,刚生成的 VDO 卷将与物理设备的大小相同。
[root@rhel82 ~]# vdo status --name=vdo1
以 YAML 格式显示有关 VDO 系统的报告以及 VDO 卷的状态,属性
# vdo list 显示当前启动的 VOD 卷的列表
# vdo start/stop 启动和停止 VOD 卷
[root@rhel82 ~]# vdo status --name vdo1 | grep Deduplication
Deduplication: enabled
[root@rhel82 ~]# ll /dev/mapper/
总用量 0
crw-------. 1 root root 10, 236 12月 4 21:39 control
lrwxrwxrwx. 1 root root 7 12月 4 21:39 vdo1 -> ../dm-0
# -K 选项可防止立即丢弃文件系统中未使用的块,从而使命令返回更快
[root@rhel82 ~]# mkfs.xfs -K /dev/mapper/vdo1
meta-data=/dev/mapper/vdo1 isize=512 agcount=4, agsize=3276800 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=13107200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=6400, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
#刷新存储设备
[root@rhel82 ~]# udevadm settle
#创建挂载点并挂载
[root@rhel82 ~]# mkdir /opt/vdo1
[root@rhel82 ~]# mount /dev/mapper/vdo1 /opt/vdo1/
[root@rhel82 ~]# df -Th | grep vdo
/dev/mapper/vdo1 xfs 50G 390M 50G 1% /opt/vdo1
[root@rhel82 ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 20.0G 4.0G 16.0G 20% 99%
# 生成一个大文件
[root@rhel82 ~]# dd if=/dev/zero of=/root/bigfile bs=100M count=5
记录了5+0 的读入
记录了5+0 的写出
524288000 bytes (524 MB, 500 MiB) copied, 0.679848 s, 771 MB/s
[root@rhel82 ~]# cp /root/bigfile /opt/vdo1/
[root@rhel82 ~]# cp /root/bigfile /opt/vdo1/bigfile.bak
[root@rhel82 boot]# cp /boot/initramfs-0-rescue-6faa2b9449024f3aae2659da675e2567.img /opt/vdo1/
再次查看
[root@rhel82 boot]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 20.0G 4.1G 15.9G 20% 94%
vdo 卷存储相同的文件并不会占用多余的空间
首先获取 vdo 卷的 uuid
[root@rhel82 ~]# lsblk --output=UUID /dev/mapper/vdo1
UUID
60c60042-24e2-4b34-a470-a37b3c0febb5
编译/etc/fstab 文件
[root@rhel82 ~]# vim /etc/fstab
UUID=60c60042-24e2-4b34-a470-a37b3c0febb5 /opt/vdo1 xfs defaults,x-systemd.requires=vdo.service 0 0
# x-systemd.requires= vdo.service 挂载选项可延迟挂载文件系统,直到 systemd 在启动过程中启动 vdo.service 为止。若不使用此选项,将会导致计算机在下一次重启时引导到 emergency.target。
重启验证
[root@rhel82 ~]# df -h | grep vdo
/dev/mapper/vdo1 50G 1.5G 49G 3% /opt/vdo1