如何实现NFS挂载目录与本地目录挂载覆盖及同步,保留48小时副本
简便实现方案推荐
方案1:rsync + 定时任务(最易上手)
这个方案依赖系统基础工具,无需额外复杂挂载逻辑,直接通过同步+绑定挂载实现需求。
步骤:
- 准备本地存储目录,比如
/local-recordings - 编写同步脚本
sync-recordings.sh:#!/bin/bash NFS_DIR="/recordings" LOCAL_DIR="/local-recordings" # 生成当日、前一日的日期目录格式(YYYY/MM/DD) TODAY=$(date +%Y/%m/%d) YESTERDAY=$(date -d "yesterday" +%Y/%m/%d) # 同步NFS上的当日/前一日目录到本地,保证本地有最新基础数据 rsync -a --delete "${NFS_DIR}/${TODAY}/" "${LOCAL_DIR}/${TODAY}/" [ -d "${NFS_DIR}/${YESTERDAY}" ] && rsync -a --delete "${NFS_DIR}/${YESTERDAY}/" "${LOCAL_DIR}/${YESTERDAY}/" # 将本地修改同步回NFS,确保NAS数据完整 rsync -a --delete "${LOCAL_DIR}/${TODAY}/" "${NFS_DIR}/${TODAY}/" [ -d "${LOCAL_DIR}/${YESTERDAY}" ] && rsync -a --delete "${LOCAL_DIR}/${YESTERDAY}/" "${NFS_DIR}/${YESTERDAY}/" # 删除本地超过48小时的旧目录(mtime +1代表超过1天) find "${LOCAL_DIR}" -type d -mtime +1 -exec rm -rf {} \; # 重新绑定本地目录到NFS路径,确保应用访问的是本地副本 mkdir -p "${NFS_DIR}/${TODAY}" "${NFS_DIR}/${YESTERDAY}" mount --bind "${LOCAL_DIR}/${TODAY}" "${NFS_DIR}/${TODAY}" [ -d "${LOCAL_DIR}/${YESTERDAY}" ] && mount --bind "${LOCAL_DIR}/${YESTERDAY}" "${NFS_DIR}/${YESTERDAY}" - 给脚本添加执行权限:
chmod +x sync-recordings.sh - 配置cron定时执行,每小时一次保证同步及时:
编辑crontab:crontab -e,添加:0 * * * * /path/to/sync-recordings.sh >> /var/log/recordings-sync.log 2>&1
优点:工具都是系统自带,逻辑直白,调试和维护成本低。
方案2:mergerfs 联合挂载(更优雅的透明访问)
mergerfs可以将本地目录和NFS目录合并为统一挂载点,让应用无需感知底层存储差异,自动优先读写本地副本。
步骤:
- 安装mergerfs(以Debian/Ubuntu为例):
apt install mergerfs - 调整原NFS挂载路径,比如挂载到
/recordings-nfs,避免和最终访问路径冲突 - 创建本地存储目录
/local-recordings,然后用mergerfs挂载出最终访问路径/recordings:
参数说明:mergerfs -o defaults,allow_other,use_ino,category.create=mfs,func.getattr=newest /local-recordings:/recordings-nfs /recordingscategory.create=mfs:新建文件/目录时优先写到本地存储func.getattr=newest:读取时优先返回本地的最新文件副本
- 编写清理同步脚本
cleanup-recordings.sh,定期将本地过期数据同步回NFS并删除:#!/bin/bash LOCAL_DIR="/local-recordings" NFS_DIR="/recordings-nfs" # 遍历本地超过1天的目录,同步到NFS后删除 find "${LOCAL_DIR}" -type d -mtime +1 -print0 | while IFS= read -r -d '' dir; do REL_PATH=$(realpath --relative-to="${LOCAL_DIR}" "${dir}") rsync -a --delete "${dir}/" "${NFS_DIR}/${REL_PATH}/" rm -rf "${dir}" done - 将清理脚本加入cron,每日执行一次:
0 2 * * * /path/to/cleanup-recordings.sh >> /var/log/recordings-cleanup.log 2>&1
优点:无需手动维护绑定挂载,对Frigate完全透明,读写逻辑更顺畅。
为什么不推荐OverlayFS原方案?
你的OverlayFS思路可行,但需要频繁调整上下层挂载关系,日期切换时容易出现挂载冲突;双向同步还得额外加目录监视器,整体复杂度比上面两个方案高,维护成本也更高。
内容的提问来源于stack exchange,提问作者tiktak
相关产品推荐
相关产品推荐

