docker-compose安装
version: '2.1'
services:
nfs-server:
image: itsthenetwork/nfs-server-alpine
privileged: true
container_name: nfs-server
ports:
- "2049:2049"
cap_add:
- SYS_ADMIN
- SETPCAP
environment:
- "SHARED_DIRECTORY=/share"
volumes:
- /home/nfs/nfs-data:/share
restart: always
centos 7.9 安装 nfs
服务端:
1、安装服务
yum -y install nfs-utils rpcbind
2、 设置服务开机启动与启动服务
systemctl enable rpcbind && systemctl start rpcbind
systemctl enable nfs && systemctl start nfs
3、配置exports
#创建共享存储文件夹
mkdir /nfs
- 配置nfs
输入以下内容,格式为:nfs共享目录 nfs客户端地址1(param1, param2,…) nfs客户端地址2(param1, param2,…)
如: /nfs 10.0.0.200/24(rw,async,no_root_squash)
- 固定网段所有IP可挂载
echo "/data/nfs 10.0.0.*(rw,sync,no_root_squash)" >> /etc/exports
- 固定网段固定IP区间可挂载
echo "/data/nfs 10.0.0.200/24(rw,sync,no_root_squash)" >> /etc/exports
- 所有客户端可挂载
echo "/data/nfs *(rw,sync,no_root_squash)" >> /etc/exports
- 启动服务
1.先启动rpc服务,再启动nfs服务
systemctl start rpcbind
2.加入开始自启动
systemctl enable rpcbind
systemctl enable nfs && systemctl restart nfs
3.查看服务状态
systemctl status rpcbind
systemctl status nfs
4.如果显示rpc 服务器注册的端口列表(端口:111),则启动成功。
rpcinfo -p
-
配置文件/etc/exports
权限配置的说明:
• rw:可读写
• ro: 只读,但最终能不能读写,还是与文件系统的 rwx 及身份有关
• no_root_squash:当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
• root_squash: 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名(nobody)用户
• all_squash: 不论登入 NFS 的使用者身份为何, 均被映射为匿名用户,通常就是 nobody(nfsnobody)
• insecure: 允许从客户端过来的非授权访问
• sync: 数据会同步写入到内存与硬盘中
• async: 数据会先暂存于内存当中,而非直接写入硬盘
• anonuid: 指定uid的值,此uid必须存在于/etc/passwd中
• anongid:指定gid的值 -
exportfs的参数说明:
• -a:全部mount 或unmount /etc/exports中的内容
• -r: Reexport all directories: 重新导出所有目录
• -u:umount目录
• -v: verbose,输出详情
如: 使nfs配置生效exportfs -r -
查看是否成功和可用的nfs地址:
showmount -e 127.0.0.1或showmount -e localhost
[root@node2 ~]# showmount -e localhost
Export list for localhost:
/nfs 10.0.0.200/24
- 看有哪些参数生效
[root@node2 ~]# cat /var/lib/nfs/etab
/nfs 10.0.0.200/24(rw,async,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)
参数说明:
- ro:只读设置,这样 NFS 客户端只能读、不能写(默认设置);
- rw:读写设置,NFS 客户端可读写;
- sync:将数据同步写入磁盘中,效率低,但可以保证数据的一致性(默认设置);
- async:将数据先保存在内存缓冲区中,必要时才写入磁盘;如果服务器重新启动,这种行为可能会导致数据损坏,但效率
- root_squash:当客户端用 root 用户访问该共享文件夹时,将 root 用户映射成匿名用户(默认设置);
- no_root_squash:客户端的 root 用户不映射。这样客户端的 root 用户与服务端的 root 用户具有相同的访问权限,这可能会带来严重的安全影响。没有充分的理由,不应该指定此选项;
- all_squash:客户端所有普通用户及所属组都映射为匿名用户及匿名用户组;「推荐设置」
- no_all_squash:客户端所有普通用户及所属组不映射(默认设置);
- subtree_check:如果共享,如:/usr/bin之类的子目录时,强制NFS检查父目录的权限;
- no_subtree_check:即使共享 NFS 服务端的子目录时,nfs服务端也不检查其父目录的权限,这样可以提高效率(默认设置)
- secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
- insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
- wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
- no_wdelay:若有写操作则立即执行,当使用async时,无需此设置;
- anonuid=xxx:将远程访问的所有用户主都映射为匿名用户主账户,并指定该匿名用户主为本地用户主(UID=xxx);
- anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组为本地用户组(GID=xxx);
客户端:
1、安装服务
yum -y install nfs-utils rpcbind
2、 设置服务开机启动与启动服务
systemctl enable rpcbind && systemctl start rpcbind
systemctl enable nfs && systemctl start nfs
3、挂载nfs服务器的路径
mount -v 服务端IP:/ ~/nfs/nfs-data(客户端挂载的路径)
4、卸载路径
umount ~/nfs/nfs-data
坑汇总
解决mount.nfs: access denied by server while mounting
在linux下进行挂载时突然出现: mount.nfs: access denied by server while mounting
第一感觉是读取文件权限不够,准备去更改一下挂载点的权限,但又考虑到在其他服务器上都能正常挂载,那就说明权限是正确的。
排除了权限问题后,就需要检查需要挂载的服务器ip是否在被挂载服务器的允许范围内,检查/etc/exports文件中的配置,如下所示:
/home/share 10.10.166.0/255.255.255.0(rw,sync,no_root_squash)
/home/share为被挂载服务器中的目录(挂载点)
10.10.166.0/255.255.255.0为允许被挂载的ip
(rw,sync,no_root_squash) 为允许的权限
如果被挂载服务器允许在所有机器上进行挂载,则可以在被挂载服务器的/etc/exports文件中记录一条 /home/share *(rw,sync,no_root_squash),*代表所有的ip
如果需要挂载的服务器ip不在/etc/exports文件内,则可以在该服务器中增加一条记录,保存退出后,重启nfs服务即可(sudo /etc/init.d/nfs-kernel-server restart <—重启nfs服务)