记录用于 pve、openwrt 以及 centos 的nfs文件共享以及文件夹挂载,nfs相关的防火墙 iptables、firewall 设置。

开启文件共享

准备工作

准备好共享的文件目录,安装nfs服务,各linux的命令如下

1
2
3
4
5
6
7
8
9
# pve\Debian\Ubuntu
apt-get install nfs-server nfs-common

# centos
yum install nfs-utils

# openwrt
opkg update
opkg install nfs-server

pve可以直接在pve服务器上安装,或者独立创建一个容器或虚拟机作为专用的nfs服务器

如果直接pve提供nfs服务,需要在pve节点上新建一个目录:磁盘 → 目录 → 创建: 目录 ,按需填写需要挂载的盘分区等即可
pve创建目录

如果使用pve节点服务器上已有的目录也可以,注意目录权限以及安全问题

修改配置文件

按需要修改,新增 /etc/exports 条目

例如:

/etc/exports
1
2
# [共享的目录]  [主机名1或IP地址1(参数1,参数2)] [主机名2或IP地址2(参数3,参数4)]
/test 192.168.1.0/24(rw,sync,no_root_squash)
  1. 授权IP或主机

    • 可以写IP:10.10.10.1
    • 可以写网段:10.10.0.0/16
    • 可以写主机名:client.lab.com
    • 可以写域:*.lab.com
    • 可以所有,用 * 表示
  2. 参数列表

参数 作用
ro 只读访问
rw 读写访问
sync 资料同步写入到内存与硬盘当中
async 资料会先暂存于内存当中,而非直接写入硬盘
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash root用户具有根目录的完全管理访问权限

启动并设置自启动

1
2
3
4
5
/etc/init.d/nfs-kernel-server start

# 或
systemctl start nfs-server.service
systemctl enable nfs-server.service

发布并查看共享目录

1
2
3
4
5
6
# 发布共享(如果修改了/etc/exports 配置文件,此命令表示重读一遍/etc/exports,并生效)
exportfs -rv
# 本机查看共享
showmount -e
# 客户端查看共享
showmount -e 192.168.1.1

挂载nfs目录

  1. 直接命令挂载
    1
    2
    mkdir /test
    mount -t nfs 192.168.1.1:/test /test
  2. 开机自动挂载
    • 修改 /etc/fstab
      /etc/fstab
      1
      192.168.1.1:/test      /test      nfs     defaults        0       0
    • /etc/fstab 内容立即生效
      1
      mount -a
  3. 取消挂载命令
    1
    umount /test

防火墙问题

如果客户端无法看到服务端共享,请注意防火墙是否开启或对应的端口是否放行

nfs服务需要开启 mountdnfsnlockmgrportmapperrquotad 这5个服务:nfs 固定为2049,portmapper 固定为111,其他的3个服务是用的随机端口。

nfs服务查看端口命令 rpcinfo -p

  1. 固定nfs端口,修改 /etc/sysconfig/nfs
    /etc/sysconfig/nfs
    1
    2
    3
    4
    5
    MOUNTD_PORT=4001  
    STATD_PORT=4002
    LOCKD_TCPPORT=4003
    LOCKD_UDPPORT=4003
    RQUOTAD_PORT=4004
  2. 放开端口
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # iptables
    iptables -I INPUT 5 -p tcp -m tcp --dport 111 -j ACCEPT
    iptables -I INPUT 5 -p udp -m udp --dport 111 -j ACCEPT
    iptables -I INPUT 5 -p tcp -m tcp --dport 2049 -j ACCEPT
    iptables -I INPUT 5 -p udp -m udp --dport 2049 -j ACCEPT
    iptables -I INPUT 5 -p tcp -m tcp --dport 4001:4004 -j ACCEPT
    iptables -I INPUT 5 -p udp -m udp --dport 4001:4004 -j ACCEPT
    systemctl restart iptables
    iptables -nvL –line

    # firewall
    firewall-cmd --permanent --add-port=111/tcp
    firewall-cmd --permanent --add-port=111/udp
    firewall-cmd --permanent --add-port=2049/tcp
    firewall-cmd --permanent --add-port=2049/udp
    firewall-cmd --permanent --add-port=40001-40004/tcp
    firewall-cmd --permanent --add-port=40001-40004/udp
    firewall-cmd --reload
    firewall-cmd --list-all
  3. 重启 nfs、rpcbind 服务