Orbstack上搭建NFS服务器

Database and Ruby, Python, History


我在NAS上启用了NFS,并且在Mac上成功挂载,倒是没有什么太多的问题。但是在Mac上启动NFS服务器,就遇到了很多问题。

Mac上如何启动NFS

Mac上可以通过修改/etc/exports文件来启动NFS,但是文件格式却和Linux的不一样。问ChatGPT,很多时候都是Linux上的语法。

/tmp/nfs-data -mapall=root -alldirs
/tmp/nfs-data -mapall=root -alldirs -network 192.168.0.0 -mask 255.255.0.0

然后sudo nfsd restart启动NFS服务,nfsd checkexports查看是否有语法错误,showmount -e会输出下面启动的NFS文件夹。

Exports list on localhost:
/tmp/nfs-data Everyone

rpcinfo -p会输出NFSD对应的端口和协议

   program vers proto   port
    100000    2   udp    111  rpcbind
    100000    3   udp    111  rpcbind
    100000    4   udp    111  rpcbind
    100000    2   tcp    111  rpcbind
    100000    3   tcp    111  rpcbind
    100000    4   tcp    111  rpcbind
    100024    1   udp    991  status
    100024    1   tcp   1021  status
    100021    0   udp    940  nlockmgr
    100021    1   udp    940  nlockmgr
    100021    3   udp    940  nlockmgr
    100021    4   udp    940  nlockmgr
    100021    0   tcp   1017  nlockmgr
    100021    1   tcp   1017  nlockmgr
    100021    3   tcp   1017  nlockmgr
    100021    4   tcp   1017  nlockmgr
    100011    1   udp    900  rquotad
    100011    2   udp    900  rquotad
    100011    1   tcp    999  rquotad
    100011    2   tcp    999  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100005    1   udp    865  mountd
    100005    3   udp    865  mountd
    100005    1   tcp    752  mountd
    100005    3   tcp    752  mountd

Linux中挂载Mac的NFS文件夹

假设Mac主机的IP是192.168.1.27,尝试mount -t nfs -v 192.168.1.27:tmp/nfs-data /tmp/nfs-data会报错。

mount.nfs: timeout set for Fri Feb 28 15:50:24 2025
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.1.27,clientaddr=198.19.249.104'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4,minorversion=1,addr=192.168.1.27,clientaddr=198.19.249.104'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4,addr=192.168.1.27,clientaddr=198.19.249.104'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'addr=192.168.1.27'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.1.27 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.1.27 prog 100005 vers 3 prot UDP port 865
mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting 192.168.1.27:tmp/nfs-data

但是换成mount -t nfs -v 198.19.249.3:tmp/nfs-data /tmp/nfs-data却可以成功挂载。

mount.nfs: timeout set for Fri Feb 28 15:52:26 2025
mount.nfs: trying text-based options 'vers=4.2,addr=198.19.249.3,clientaddr=198.19.249.104'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4,minorversion=1,addr=198.19.249.3,clientaddr=198.19.249.104'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'vers=4,addr=198.19.249.3,clientaddr=198.19.249.104'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'addr=198.19.249.3'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 198.19.249.3 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 198.19.249.3 prog 100005 vers 3 prot UDP port 865

Linux之间互相挂载

Linux上安装apt install nfs-kernel-server,创建/etc/exports文件,通过systemctl enable nfs-kernel-serversystemctl restart nfs-kernel-server启动NFS即可。

下面的Linux下的/etc/exports文件

/tmp/nfs_data *(rw,sync,no_subtree_check,all_squash,anonuid=0,anongid=0)

另外一个Linux上通过mount -v -t nfs 198.19.249.104:/tmp/nfs_data /tmp/nfs_data即可正常挂载。

Mac挂载Linux的NFS

Mac上不能够挂载虚拟机中的NFS文件夹,现在看上去是跨网段的挂载都不行,无论从VM挂Mac,还是Mac挂VM的。

mount_nfs: can't mount /tmp/nfs_data from 198.19.249.104 onto /private/tmp/nfs_data: Operation not permitted
mount: /private/tmp/nfs_data failed with 1

挂入Kubernetes

在Kubernetes里面,默认支持NFS。所以直接挂载成PersistentVolume,然后通过PVC挂入Deployment即可。以后想要修改啥,就直接放到NAS上,这样就可以直接挂进Kubernetes里面。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: synology-nas-pv
spec:
  capacity:
    storage: 20Gi  # 按实际大小调整
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain  # 建议设置为 Retain 避免数据误删
  storageClassName: nfs-client  # 添加这行,与 PVC 的 storageClassName 匹配
  mountOptions:
    - hard
    - nfsvers=3  # 根据群晖支持的 NFS 版本调整(通常 3 或 4)
    - tcp
    - nolock
  nfs:
    path: /volume1/docker/macmini  # 替换为群晖的 NFS 路径
    server: 192.168.51.123 # 群晖 NAS 的 IP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: synology-nas-pvc
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  volumeName: synology-nas-pv