我正在运行一个 Oracle 11 盒作为 ZFS 存储设备,并且通过定期对 ZFS 文件系统进行快照cron
。
过去,我知道如果我想从快照中抓取某个文件,会保留一个只读副本.zfs/snapshot/{name}/
,我只需导航到那里并提取文件即可。这已记录在案在 Oracle 网站上。
但是,前几天我去执行此操作时,发现快照目录中的 ZFS 目录都是空的。zfs list -t snapshot
正确显示了应该存在的快照列表,并.zfs/snapshots
正确包含每个快照的目录,并且每个快照中都有每个 ZFS 文件系统的目录。但是,这些目录似乎为空。
我刚刚测试了恢复,方法是触碰一个不常用的共享中的文件并回滚到最新的每小时快照,这似乎运行良好。所以回滚功能是存在的。
Oracle 是否改变了快照的生成方式?或者这里出了什么严重问题?
答案1
例如,如果您有一个后代 ZFS 文件系统tank/newfs
。那么您将不会在文件夹tank/newfs
中找到文件/tank/.zfs/mysnapshot
,只有挂载点newfs
存在。如果您想访问文件,您需要在/tank/newfs/.zfs/mysnapshot
文件夹中查找文件。
答案2
列出的快照.zfs/snapshot/
会在浏览时按需自动安装,不再使用时会自动卸载。
在目录中执行简单操作ls
显然不足以被视为“需求”。您需要cd
进入相关目录,然后发出ls
命令。
您可能还需要设置snapdir=visible
文件系统。
答案3
在 ZoL 上(尽管最初的 q 指的是 Solaris),漏洞目前存在一个问题,即 @Daniel 描述的自动挂载功能无法工作,导致快照目录为空。这似乎专门发生在 ZFS 根文件系统上(快照通常在 下访问/.zfs/snapshot
)。
一个明显的迹象是/proc/spl/kstat/zfs/dbgmsg
阅读中的条目Unable to automount <snapdir_path> error=512
两个都此处建议的解决方法对我有用(我在 Ubuntu 21.10 上运行 ZoL 2.0.6 并通过 ZFS 启动菜单启动):
- 将您的 ZFS 根文件系统挂载点添加到
/etc/fstab
(例如zpool/ROOT/rootfs / zfs defaults 0 0
:)并重新启动 mkdir /sysroot && mount -o bind / /sysroot
;然后可以通过以下方式访问 snap/sysroot/.zfs/
选择您喜欢的解决方法(不需要两者)。
根据对相关问题:
这个错误发生在带有 initramfs 的系统上,该系统将 chroot(2) 转换为新的根文件系统,并通过运行 switch_root(8) 启动 init 进程。
答案4
如果安装快照失败,该.zfs/snapshot/my_snapshot
文件夹也会显示为空。
在我的例子中,运行sudo mount -t zfs tank/my_dataset@my_snapshot /mnt/mountpoint
失败,出现输入/输出错误,这是 zfs 版本从 升级0.8.something
到2.1.5
引入的。请参阅github 问题。