如何重新排列文件树然后通过 NFS 将其导出?

如何重新排列文件树然后通过 NFS 将其导出?

我有一个备份服务器,它将增量备份存储在这样的树中:

/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和选项。它仅适用于单服务器导出。我从未使用过它,因为文档中有很多关于此选项的警告,例如可能crossmountexportsinode 编号冲突

由于您从同一个物理文件系统导出目录树,因此您永远不会遇到此 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)

相关内容