在我的 GFS 集群中,我使用CDPN/dev/log
在单独的集群节点上拥有单独的 chroot 目录的功能:
/home/ftpuser/foo: lrwxrwxrwx 1 root root 18 Sep 26 2010 dev -> .sys/@hostname/dev /home/ftpuser/foo/.sys: drwx--x--x 3 root root 3864 2010 年 9 月 26 日 server1.example.com drwx--x--x 3 root root 3864 2010 年 9 月 26 日 server2.example.com drwx--x--x 3 根 根 3864 2010 年 9 月 26 日 server3.example.com /home/ftpuser/foo/.sys/server2.example.com: drwx--x--x 2 root root 3864 九月 25 09:34 开发 /home/ftpuser/foo/.sys/server2.example.com/dev: srw-rw-rw- 1 root root 0 九月 25 09:23 日志 /home/ftpuser/foo/dev:(根据节点名称透明地选择 1 个子目录) srw-rw-rw- 1 root root 0 九月 25 09:23 日志
我使用它是为了每个节点上的 rsyslog 守护进程不会互相干扰。它之所以有效,是因为@hostname
路径中的内容被替换为解释它的主机的主机名,因此不同的主机会获得不同的目录。集群在所有节点上同时处于活动状态。
我的问题:
- 有没有办法在 NFS 共享上获得相应的功能?
- 理论上它可以在所有文件系统上的 Linux 内核中实现吗(通过挂载选项,这样默认情况下就不会破坏东西)?
这个问题与这个问题相似但不完全相同:名称相同但内容不同的 NFS 文件,具体取决于主机
答案1
我认为 NFS 不存在 CDPN,但您可以使用基本工具实现大致相同的功能。限制是您必须将所有特定于节点的文件放在同一位置(或者至少您必须保留位置列表),您不能在@hostname
任何您喜欢的地方使用该功能。
在同一位置的所有节点上安装本地文件系统,例如/local
。在该文件系统上,创建一个符号链接,其目标在节点之间有所不同,并指向远程文件系统的特定于节点的区域。您不需要任何本地存储,它可以是内存中的文件系统;由于它只需要存储一个符号链接,因此开销很小。
mount -t tmpfs -o noexec,nodev,nosuid,mode=755,nr_inodes=2,nr_blocks=2 local-redirect /local
ln -s "/nfs/.sys/$HOSTNAME" /local/storage
在您的示例中使用/local/storage
您将使用的位置。.sys/@hostname
另一种不同的 Linux 特定方法是在每个节点上进行绑定安装。在共享文件系统上有一个空目录,并@hostname
在挂载 NFS 文件系统后绑定挂载到该目录。
mount --bind "/.nfs/sys/$HOSTNAME" /nfs/.sys/@hostname