You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WebDAV服务器丢失,如何从.davfs2/cache恢复原文件系统?

从davfs2缓存恢复WebDAV文件

嘿,我之前正好碰到过一模一样的情况——远程WebDAV服务器挂了,但davfs2的缓存里存了几乎所有数据,而且完全可以不用挂载就安全恢复文件,完全不用怕弄坏缓存。咱们一步步来:

第一步:先给缓存做个完整备份!

这是最关键的一步,绝对不能跳过。不管后面操作出什么问题,备份都能让你回到原点:

cp -a ~/.davfs2 ~/.davfs2_full_backup

这条命令会把整个.davfs2目录原封不动复制一份,后续所有操作都在原目录上做,备份就老老实实待着当后手。

第二步:搞清楚缓存文件对应哪些原始路径

davfs2用Berkeley DB(就是缓存目录里的cache.db)存着“缓存文件名”和“远程WebDAV原始路径”的映射关系,咱们可以把这个数据库导出成文本文件来看:

  1. 先装一下Berkeley DB的工具(如果没装的话):
    # 如果你用Debian/Ubuntu系
    sudo apt install db-util
    # 要是RHEL/CentOS系
    sudo yum install libdb-utils
    
  2. 导出数据库内容到文本文件:
    db_dump ~/.davfs2/cache/cache.db > cache_mapping.txt
    
  3. 打开cache_mapping.txt看看,你会看到类似这样的条目(格式可能随davfs2版本有点变化):
    key: 0x00000023
    data: /work/projects/notes.md [size=456, mtime=1689999999, etag="abc123"]
    
    这里的key就是缓存目录里的文件名(去掉开头的0x就是实际文件名),data里的第一个字符串就是远程WebDAV上的原始文件路径。

第三步:批量把缓存文件恢复成原始目录结构

有了映射关系,咱们可以写个简单脚本自动把缓存文件复制到对应的目录里。这里给你一个Python脚本示例(你可以根据自己导出的映射格式微调):

import os
import shutil

# 先配置好路径
CACHE_DIR = "~/.davfs2/cache"
MAPPING_FILE = "cache_mapping.txt"
# 恢复后的文件会存在这个目录里
OUTPUT_DIR = "./recovered_webdav_files"

# 确保输出目录存在
os.makedirs(OUTPUT_DIR, exist_ok=True)

with open(MAPPING_FILE, "r") as f:
    lines = f.readlines()
    current_cache_file = None
    current_remote_path = None

    for line in lines:
        line = line.strip()
        # 提取缓存文件名
        if line.startswith("key:"):
            current_cache_file = line.split(":")[1].strip().replace("0x", "")
        # 提取远程原始路径
        elif line.startswith("data:"):
            # 取data后面第一个空格前的内容就是路径
            current_remote_path = line.split(" ")[1].strip()
            if current_cache_file and current_remote_path:
                # 拼接实际路径
                cache_file_path = os.path.join(os.path.expanduser(CACHE_DIR), current_cache_file)
                target_file_path = os.path.join(OUTPUT_DIR, current_remote_path.lstrip("/"))
                # 创建目标文件的父目录
                os.makedirs(os.path.dirname(target_file_path), exist_ok=True)
                # 复制缓存文件到目标路径(保留原文件属性)
                if os.path.exists(cache_file_path):
                    shutil.copy2(cache_file_path, target_file_path)
                    print(f"已恢复: {current_remote_path}")
                else:
                    print(f"警告: 缓存文件 {cache_file_path} 找不到,跳过 {current_remote_path}")
            # 重置变量,处理下一个条目
            current_cache_file = None
            current_remote_path = None

运行这个脚本后,所有能匹配到的缓存文件都会被恢复到./recovered_webdav_files目录下,完全保留原来WebDAV上的文件结构。

第四步:验证恢复结果

恢复完之后,建议挑几个重要文件打开看看内容,对比一下大小和修改时间,确保没问题。如果有部分文件提示找不到缓存,那大概率是这些文件从来没被完整缓存过,这种情况就没法恢复了。


内容的提问来源于stack exchange,提问作者zillion

火山引擎 最新活动