本指南介绍如何使用NFS和systemd在多台Linux机器间实现共享home目录,重点关注实际实现而非性能优化。
前提
在一个服务器集群中,一个常见的情况就是所有的用户不管登陆到哪个机器都能访问同一个home目录或者同一个shared目录,而具体实现方法各有不同。本文主要介绍基于nfs文件共享和systemd服务创建两个方法来创建一个较稳稳定的共享home方案。
- 集群中的Linux机器
- 所有系统的root访问权限
- 节点间的网络连接
- 所有机器上统一的UID/GID
NFS服务器配置
- 在存储节点安装NFS服务器:
sudo apt install nfs-kernel-server
sudo systemctl enable --now nfs-server
- 在计算节点安装NFS客户端:
sudo apt install nfs-common
如果使用nas系统来用作存储节点,如TrueNAS SCALE,则可以简化NFS服务器搭建过程。
创建共享目录
此处主要处理linux系统中的文件权限问题,一个常见的home目录所需要具有的权限是:
- 普通用户无法在/home下创建新目录。
- 每个用户在/home下拥有自己完整权限的同名目录。
- 每个用户无法修改他人的同名目录,但是可以查看他人的可公开文件。
因此需要nfs共享的文件夹由root创建,修改权限为777,然后切换到各个用户,分别创建各自的文件夹,最后在把home文件夹的权限改回755,除root用户之外只读。
TrueNAS在创建用户的时候可以选择用户目录,也可以使用这个方法自动生成一个共享home目录。
一个非常重要的是由于linux使用的用户id和组id来管理文件,所以必须要保证集群所有机器中的同一个用户的id和组id相同,不然用户甲在A机器上的文件夹在B机器上可能变成乙的文件夹。同时尽可能把同一个类型的用户放在同一组,方便管理这一整个组的权限,同时同组的用户默认文件,相互之间可读不可写。
挂载共享目录
一般挂载可以直接在/etc/fstab中修改对应的文件,但是为了功能更加复杂,可以在精确控制挂载时间,挂载方式和网络检查,这里选用自定义的systemd实现,所需要做的是在所有机器的/etc/systemd/system/文件夹下拷贝一份相同的文件nfs-home-mount.service,文件内容如下:
# /etc/systemd/system/nfs-data-mounts.service
[Unit]
Description=Mount NFS home shares
Requires=network-online.target
After=network-online.target
StartLimitIntervalSec=0
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c 'while ! ping -c 1 -W 5 SERVER_IP > /dev/null 2>&1; do echo "Waiting for NFS server"; sleep 30; done'
ExecStart=/bin/mount -t nfs SERVER_IP:/shared/home /home
ExecStop=/bin/umount /home
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
此处主要的优点是:
- 开机后检查网络是否畅通,再尝试进行挂载。
- 挂载失败后会进行30s重试。
- 开始挂载前会尝试检查数据节点的网络状态。
sudo systemctl daemon-reload
sudo systemctl enable --now nfs-home-mount
如果原home目录已有文件,在挂载的过程中不用担心,home文件夹会被隐藏而不是删除,对应的文件在服务停止之后依然可见。
注意事项
由于home目录仅仅是挂载的应用配置,而不是应用程序,因此在软件版本相差比较大的几个机器可能会存在不同的机器运行时行为不同。对于这点最好的解决方法就是所有机器使用同一个系统,同一套硬件。但是这种情况不一定都能满足,这时候就需要具体情况具体处理,采用更换软件版本和依赖等方法。