You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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 /recordings
    
    参数说明:
    • category.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:50:22