我将把 FreeBSD 自动挂载器切成小块,然后在油中煮沸

lar*_*sks 41 freebsd zfs central-processing-unit jail automount

我试图将主目录的层次结构暴露给许多 FreeBSD 监狱。主目录的配置使得每个目录都是唯一的 ZFS 数据集。监狱用于开发工作,因此会定期创建和销毁。

我的第一个想法是简单地使用nullfs挂载/home到 jail,但nullfs不提供任何访问从属文件系统的方法。

我的第二个想法是通过 NFS 导出目录,然后在每个 jail 中运行自动挂载程序守护程序 (amd)。如果可以在监狱内执行 NFS 挂载,这将是有效的。但事实并非如此。

我的第三个想法是在主机上运行 amd 并将nullfs挂载到监狱中……但是 amd 对nullfs 的支持不存在。

我的第四个想法是回到使用 NFS 导出目录,因为 amd 当然可以与 NFS 一起使用,对吗?不幸的是,amd 不是在目标挂载点上挂载目录,而是喜欢在临时位置 ( /.amd_mnt/...)挂载东西,然后创建符号链接……当然,这在 jail 环境中是无用的。

那么也许您可以使用nullfs将 的子目录暴露/.amd_mnt给监狱?不!这让我们回到了我的第一次尝试,我们发现无法使用nullfs访问从属文件系统。

然后我的头爆炸了。

我正在尝试做的事情有没有好的解决方案?一个糟糕的解决方案是在启动 jail 之后运行一个脚本,该脚本将为每个主目录创建多个nullfs挂载点,但这非常笨拙——它需要定期运行以考虑新目录或删除的目录。所以基本上我将不得不编写一个糟糕的自动挂载程序。

一定会有更好的办法。帮助我,Serverfault,你是我唯一的希望!

更新 1:我突然想到我可以用 解决部分问题pam_mount,尽管这充其量是不完整的。此外,文档中不清楚是否pam_mount可以自动创建目标挂载点。如果它需要先验存在挂载点,那么这个解决方案不会比我已经提出的坏自动挂载器更好。

更新 2:如下面的答案中所讨论的,VFCF_JAILNFS 文件系统上的设置确实允许 jails 执行 NFS 挂载。不幸的是,自动挂载程序继续无用的行为,并且当在监狱中运行时,它似乎非常擅长以这样的方式陷入困境,以至于需要重新启动系统才能删除进程条目。

lar*_*sks 26

为什么,你好,拉斯!这是你问的一个有趣的问题,经过一些研究,我可能已经为你找到了答案。

根据 这篇 文章和其他帖子,可以VFCF_JAIL 在 NFS 文件系统提供程序上设置该属性,理论上这将允许监狱执行 NFS 挂载。反过来,这可能允许一个人在监狱内运行 amd ......这将巧妙地解决这个问题。

今晚我将尝试重建内核,看看情况如何。它不一定是最好的解决方案(因为这意味着您需要确保此更改在未来的内核更新中持续存在),但如果它有效的话会很有趣。

并记住...

           ___________    ____                                           
    ______/   \__//   \__/____\                             
  _/   \_/  :           //____\\                             
 /|      :  :  ..      /        \                         
| |     ::     ::      \        /                             
| |     :|     ||     \ \______/     Don't try to rebuild the
| |     ||     ||      |\  /  |        kernel remotely because
 \|     ||     ||      |   / | \         you know you're just
  |     ||     ||      |  / /_\ \        going to hose the server.
  | ___ || ___ ||      | /  /    \    
   \_-_/  \_-_/ | ____ |/__/      \   
                _\_--_/    \      /   
               /____             /  
              /     \           /    
              \______\_________/     
Run Code Online (Sandbox Code Playgroud)

  • +1 代表 LOL。还要考虑这是一种通行权 - 在半夜开车到您的服务器以启动 KERNEL.OLD(或 KERNEL.GENERIC - 您确实在您的系统上保留了最新的 GENERIC,对吗?如果没有,您应该开始。)教了很多课...... (10认同)
  • 谢谢,拉斯;我希望我采纳了你的建议,因为现在我无法访问服务器,我必须等到我回家再试试。 (6认同)