共计2890个字符,预计需要花费8分钟才能阅读完成。
简介
本文介绍如何使用 Linux LVM Cache 将 SSD 作为机械硬盘(HDD)的缓存层,实现兼顾大容量与高性能的存储方案。
什么是 LVM Cache
LVM Cache 是 Linux LVM(Logical Volume Manager)基于 Device Mapper(dm-cache)提供的块设备缓存功能,可以将 SSD 作为 HDD 的高速缓存,而对文件系统和应用完全透明。
优点:
- 提高随机读写性能
- 保留 HDD 大容量
- 无需修改应用程序
- 支持 XFS、EXT4 等文件系统
工作原理
应用程序
│
文件系统(XFS/EXT4)
│
Logical Volume
│
LVM Cache
├── SSD Cache
└── HDD Data
读取时优先从 SSD 获取数据;缓存未命中时从 HDD 读取并自动缓存。写入时根据缓存模式决定是否先写入 SSD。
Writeback 与 Writethrough 模式
| 模式 | 读性能 | 写性能 | 安全性 |
|---|---|---|---|
| Writeback | ★★★★★ | ★★★★★ | ★★★ |
| Writethrough | ★★★★★ | ★★★ | ★★★★★ |
Writeback
- 性能最佳
- 后台回写 HDD
- SSD 损坏可能导致尚未回写的数据丢失
Writethrough
- 同时写 SSD 与 HDD
- 更安全
- 写入性能略低
开始配置
环境说明
以下是我的硬件配置:
- 固态硬盘(SSD):/dev/nvme1n1
- 机械硬盘(HDD):/dev/sda
以下是我创建的:
- VG:disk_cache
- Cache Pool:cachepool
- LV:disk
为 SSD 分区
由于我不想使用整个固态硬盘作为加速盘,因此我用 sudo fdisk /dev/nvme1n1 进行了分区。
最终创建了分区 /dev/nvme1n1p2,用于给机械硬盘加速。
创建 PV
PV(Physical Volume,物理卷)是 LVM 的核心。它可以是整块物理硬盘、RAID 磁盘阵列,或者是硬盘分区。当这些物理存储设备经过 LVM 初始化后,就会被赋予元数据并转化为供 LVM 调用的基本存储单元。
简单来说,就是创建 PV 后,就代表 LVM 可以管理这块硬盘或者分区了。
首先为 SSD 创建 PV,用以下命令:
sudo pvcreate /dev/nvme1n1p2

接着,用同样的命令为 HDD 创建 PV:
sudo pvcreate /dev/sda

如果 HDD 已使用过,可以先用命令 sudo wipefs -a /dev/sda 进行擦除。
创建 VG
在 LVM 中,VG(Volume Group,卷组)是将多块硬盘或分区整合在一起所形成的“集中存储池”。可以将 VG 理解为一个虚拟的大型硬盘,其容量等于组成它的所有物理设备的容量总和。
这里我们直接创建名为 disk_cache 的 VG,并将 /dev/nvme1n1p2 和 /dev/sda 加入到这个 VG。
sudo vgcreate disk_cache /dev/nvme1n1p2 /dev/sda

创建 LV
在 LVM 中,LV 代表(Logical Volume,逻辑卷)。它是 LVM 最终划分出来、供系统挂载并使用的逻辑分区。可以直接在其上创建文件系统(如 ext4 或 xfs),就像操作传统硬盘分区一样。
首先,为 SSD 创建缓存池,用命令:
sudo lvcreate --type cache-pool -n cachepool -l 100%PVS disk_cache /dev/nvme1n1p2

这样就创建好一个名叫 cachepool 的缓存池了。
接着创建 HDD 的 LV:
sudo lvcreate -n disk -l 100%PVS disk_cache /dev/sda

此时,HDD 就创建好了一个没有经过 SSD 加速的 LV 了。
启用 LVM Cache
这时候,我们只需要启用 LVM Cache,就能利用 SSD 为 HDD 进行加速了,如下命令:
sudo lvconvert \
--type cache \
--cachepool disk_cache/cachepool \
--cachemode writeback \
disk_cache/disk

格式化并挂载
先用格式化为 xfs 文件系统:
sudo mkfs.xfs -f /dev/disk_cache/disk
然后用以下命令挂载即可:
sudo mkdir -p /mnt/disk
sudo mount /dev/disk_cache/disk /mnt/disk

此时,用 lsblk 命令可以看见:

开机启动
首先,需要获取分区的 UUID 信息:
sudo blkid /dev/disk_cache/disk

然后用 vim 命令,写入 /etc/fstab 文件:
UUID=<UUID> /mnt/disk xfs defaults 0 0

最后用以下命令验证是否挂载成功即可:
sudo mount -a
其他
常用命令
| 功能 | 命令 |
|---|---|
| 查看 PV | pvs |
| 查看 VG | vgs |
| 查看 LV | lvs |
| 查看缓存模式 | lvs -o +cache_mode |
| 查看缓存使用率 | lvs -o +data_percent |
| 查看缓存策略 | lvs -o +cache_policy |
| 查看 Device Mapper | dmsetup status |
| 分离缓存 | lvconvert --splitcache VG/LV |
| 删除缓存池 | lvremove VG/cachepool |
| 查看 UUID | blkid |
| 查看块设备 | lsblk |
查看缓存状态
sudo lvs
sudo lvs -a
sudo lvs -o +cache_mode
sudo lvs -o +data_percent
sudo lvs -o +metadata_percent
sudo lvs -o +cache_policy
sudo lvs -a -o +devices
推荐:
sudo lvs -o lv_name,vg_name,cache_mode,data_percent,metadata_percent,devices
Cache 调优
查看 Device Mapper:
sudo dmsetup status
sudo dmsetup table
切换模式:
sudo lvchange --cachemode writethrough disk_cache/disk
sudo lvchange --cachemode writeback disk_cache/disk
删除 Cache
sudo umount /mnt/disk
sudo lvconvert --splitcache disk_cache/disk
删除 Cache Pool:
sudo lvremove disk_cache/cachepool
sudo vgreduce disk_cache /dev/nvme1n1p2
sudo pvremove /dev/nvme1n1p2
常见问题
为什么缓存没有立即生效?
LVM Cache 会根据访问热点自动建立缓存,多次访问同一数据后命中率会逐渐提高。
SSD 损坏会怎样?
- Writeback:可能丢失未回写数据。
- Writethrough:通常不会丢失数据。
推荐搭配
- 家庭 NAS:Writeback + UPS + 企业级 SSD
- 重要数据:Writethrough
总结
LVM Cache 是一种块设备级缓存方案,能够在不改变应用程序的情况下,为机械硬盘提供 SSD 级的热点数据访问能力。对于 NAS、媒体服务器和大容量存储场景,推荐使用 Writeback + UPS + 企业级 SSD 获得最佳性能;对于关键数据,建议选择 Writethrough 模式以提升可靠性。