arch linux配置NFS服务
Network File System (NFS)是1984年Sun Microsystems公司(唏嘘)开发的一种分布式文件系统协议,允许客户端用户访问在远程网络上共享的文件,就好像本地文件访问。
备注
备注
本文实践在 Asahi Linux 上进行,实现 Btrfs NFS
安装NFS
在 Arch Linux 上安装NFS支持软件包(只需要
nfs-utils
):
sudo pacman -S nfs-utils
备注
强烈建议在客户端和服务端采用 ntp服务 ,例如 使用chrony同步时间 。如果所有节点没有精确的时钟,NFS会出现非预期的延迟。
配置
NFS服务器的全局配置位于 /etc/nfs.conf
,对于简单配置使用无需修改。
NFS服务器需要一个 exports
列表来确定输出的文件系统,输出列表在 /etc/exports
或者 /etc/exports.d/*.exports
定义,这些共享配置称为 NFS root
。
备注
为了能够提升NFS安全性,建议在不同的目录中定义 NFS root
,这样可以限制用户在指定的挂载点:
使用NFS输出用户目录,建议每个用户输出一个
NFS root
,避免由于uid/gid
匹配错误导致用户能够访问非授权的目录建议采用 ZFS NFS 或者 Btrfs NFS 这样的结合了卷管理的文件系统,方便灵活配置完全隔离的逻辑卷,能够安全地限制客户端访问
也可以采用传统的 Linux LVM逻辑卷管理 结合 XFS文件系统 ,同样采用LVM卷隔离文件系统,或者采用两者结合的 Stratis - Linux存储系统
准备输出的服务器文件系统目录( Btrfs )
在 Btrfs快速起步 中采用 parted分区工具 划分磁盘:
# 50G data,48G docker,216G libvirt(3个vm 共48G + 3个Ceph存储 168G)
parted -a optimal /dev/nvme0n1 mkpart primary 181GB 231GB
parted -a optimal /dev/nvme0n1 mkpart primary 231GB 279GB
parted -a optimal /dev/nvme0n1 mkpart primary 279GB 495GB
parted /dev/nvme0n1 name 7 btrfs-data
parted /dev/nvme0n1 name 8 btrfs-docker
parted /dev/nvme0n1 name 9 lvm-libvirt
将磁盘分区7格式化成 Btrfs :
sudo mkfs.btrfs -f -L data /dev/nvme0n1p7
磁盘挂载:
echo "UUID=efd22ea6-9365-4bc3-a233-e61d1d159fcd /data btrfs defaults,compress=lzo 0 1" >> /etc/fstab
kdir /data
mount /data
此时 /data
目录挂载了 /dev/nvme0n1p7
磁盘分区,但这还不是我们输出的NFS文件目录。虽然我们可以直接指定这个 /data
目录下的子目录输出,但是 Btrfs 的 subvolume
可以提供清晰的隔离,所以我在NFS输出 Btrfs 目录采用了子卷功能:
在
/data
挂载卷下创建cloud-atlas_build
子卷:
# 在 ``/data`` 已挂载的btrfs目录下创建子卷 cloud-atlas_build
btrfs subvolume create /data/cloud-atlas_build
在
/etc/fstab
配置cloud-atlas_build
子卷的挂载项:
echo "UUID=efd22ea6-9365-4bc3-a233-e61d1d159fcd /data/docs/github.com/cloud-atlas/build btrfs subvol=cloud-atlas_build 0 1" >> /etc/fstab
systemctl daemon-reload
mount /data/docs/github.com/cloud-atlas/build
配置NFS输出(/etc/exports)
对于 Docker 容器访问,采用只读输出NFS卷,并且限制IP段为容器的网络段(注意,对于 kind(本地docker模拟k8s集群) 用户容器是
docker_in_docker
所以要通过kubectl exec
进入用户容器检查网络段10.244.7)
/data/docs/github.com/cloud-atlas/build 10.244.7.0/24(ro,all_squash,insecur)
备注
这里没有直接将 /data/docs/github.com/cloud-atlas/build
下的子目录 html
输出为NFS,因为这个目录会随着 Sphinx文档 的 make clean
命令删除,会导致NFS客户端挂载hang,所以只能输出稳定的不会删除的 cloud-atlas_build
子卷,也就是 /data/docs/github.com/cloud-atlas/build
目录。
修改
/etc/exports
配置后,需要执行以下命令重新输出NFS:
exportfs -arv
启动NFS服务
启动并激活
nfs-server.service
:
systemctl start nfs-server.service
systemctl enable nfs-server.service