我有一个备份服务器,它将增量备份存储在这样的树中:
/backups
hourly.0
server 1
server 2
hourly.1
server 1
server 2
hourly.2
server 1
server 2
daily.0
server 1
server 2
etc...
在不使用实际备份更改源树的情况下,我想创建一个如下所示的重新组织的树:
/share
server1/1 Hour Ago -> /backups/hourly.0/server1
server1/2 Hours Ago -> /backups/hourly.1/server1
server2/1 Hour Ago -> /backups/hourly.0/server2
server2/2 Hours Ago -> /backups/hourly.1/server2
...
...然后将这棵树导出为单身的NFS 挂载。
NFS 客户端应该看到:
/backups
server 1
1 Hour Ago
2 Hours Ago
server 2
1 Hour Ago
2 Hours Ago
失败的尝试 #1 - 使用符号链接
这不起作用,因为符号链接与 NFS 客户端计算机有关,而不是与服务器有关。尝试在客户端上打开“1 小时前”会尝试访问 /backups/hourly.0/server1客户但它并不存在。
失败的尝试 #2 - 在 /etc/fstab 中使用 BIND
IE:
/backup/hourly.0/server1/ "/share/server1/1 Hour Ago" none ro,bind,defaults 0 0
这样我就创建了我想要的树,它在 NFS 客户端上可见,但我看不到文件夹内的任何内容。这可能是因为 NFS 不跨文件系统,并且 NFS 将绑定挂载点视为新文件系统。
有什么方法可以实现这个吗?
答案1
不,在基于内核的 nfs 服务器上使用单个 NFS 导出无法实现这一点。
正如exports(5)
手册所述:
文件 /etc/exports 包含本地身体的NFS 服务器上可供 NFS 客户端访问的文件系统。
但是,您可以导出树的各个部分,然后使用绑定在客户端上重新组装它们。
符号链接
另一种解决方法是使用符号链接:
/server_1
hourly.0 -> /backups/hourly.0/server\ 1
hourly.1 -> /backups/hourly.1/server\ 1
...
/server_2
hourly.0 -> /backups/hourly.0/server\ 2
hourly.1 -> /backups/hourly.1/server\ 2
...
要实现此功能,您必须导出整个备份树以及服务器目录。这意味着通过符号链接,每个服务器都可以看到其他服务器的备份。
nohide 选项
文件中有nohide
和选项。它仅适用于单服务器导出。我从未使用过它,因为文档中有很多关于此选项的警告,例如可能crossmount
exports
inode 编号冲突。
由于您从同一个物理文件系统导出目录树,因此您永远不会遇到此 inode 编号冲突或中间服务器故障导致死锁导出 NFS 挂载子树时可能会发生这种情况。
我不认为 Linux 内核 NFS 服务器会让使用绑定选项挂载的文件系统通过 nohide 可见。
反过来做
我思考了这个问题,然后意识到解决这个问题的正确方法可能是反过来做。即为每个要导出的服务器创建目录树。将数据移动到适当的位置,然后使用 重新组装 /backups 树mount -o bind
。
你的文件系统看起来应该是这样的
/share/server1/1_Hour_Ago
2_Hour_Ago
...
/share/server2/1_Hour_Ago
2_Hour_Ago
...
你的 fstab 将是
/share/server1/1_Hour_Ago /backups/hourly.0/server_1 none rw,bind 0 0
/share/server1/2_Hour_Ago /backups/hourly.1/server_1 none rw,bind 0 0
...
/share/server2/1_Hour_Ago /backups/hourly.0/server_2 none rw,bind 0 0
/share/server2/2_Hour_Ago /backups/hourly.1/server_2 none rw,bind 0 0
...
你exports
的
/share/server1 server1(rw,no_subtree_check)
/share/server2 server2(rw,no_subtree_check)