nfs
NFS服务
NFS文件系统
- NFS:基于network file system 网络文件系统,基于内核的文件系统,sun公司开发,通过使用NFS,用户可以像访问本地文件一样访问远端系统的文件
- 优势:节省本地存储空间,将常用的数据,如home目录,存放在NFS目录下服务器上且可以通过网络访问,本地终端可以减少自身存储空间的使用
NFS工作原理
NFS各个版本的对比
NFS服务介绍
软件包:nfs-utils
kernel支持:nfs.ko
端口2049(nfsd),其他的由portmap(111)分配
配置文件:/etc/exports
,/etc/exports.d/*.exports
centos7不支持同一目录同时使用nfs和samba共享,因为使用锁机制不同,
相关软件包,rpcbind(必须),tcp_wrappers
centos6开始portmap进程由rpcbind代替
nfs服务主要进程 | 说明 |
---|---|
rpc.nfsd | 最主要的nfs进程,管理客户端是否可以登录 |
rpc.mountd | 挂载和卸载NFS文件系统,包括权限管理 |
rpc.lockd | 非必要,管理文件锁,避免同时写出错 |
rpc.statd | 非必要,检查文件一致性,可修复文件 |
日志:/etc/lib/nfs
NFS配置文件
路径/etc/exports
导出的文件系统格式:
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...
-
#
开始为注释 -
主机格式
- 单个主机:ipv4,ipv6,FQDN
- IP networks:两种掩码格式均支持:172.18.0.0/16
- wildcards:主机名通配,例如
*.mage.com
,ip 不可以 - netgroups:NIS域的主机组,@group_name
- anonymous:表示使用
*
通配所有客户端
-
每个条目指定目录导出到的哪些主机,以及相关的权限和选项
默认选项:(ro,sync,root_squash,no_all_squash)
- ro,rw 只读和读写
- async 异步,数据变化之后不立即写入磁盘,性能高
- sync 同步,数据在请求之后立即写入共享
- no_all_aquash 保留共享文件的UID和GID
- all_squash所有远程用户(包括root)都变成nfsnobody
- root_squash 远程root映射为nfsnobody,UID变为65534
- no_root_squash 远程root映射成root用户
- anounid=和anongid=指明匿名用户映射为特定用户的UID和GID,而非nfsnobody,可配合all_quash使用
-
示例:/data/nfsdir1 192.168.99.0/24(sync,rw,root_squash,all_squash)
NFS配置示例
注意[101]$
开头的是主机192.168.10.101,[102]$
开头的主机是192.168.10.102
1,修改配置
[root@101 ~]#vim /etc/exports
[root@101 ~]#echo"/data/nfsdir1 *(rw)" /etc/exports
2,加载生效看看
[root@101 ~]#exportfs -r #重读配置文件生效
[root@101 ~]#exportfs -v #查看共享目录
/data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
3,用102这台机器挂载下
[root@centos7 ~]#mkdir /mnt/nfs1
[root@centos7 ~]#mount 192.168.10.101:/data/nfsdir1 /mnt/nfs1
[root@centos7 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 10475520 4517448 5958072 44% /
devtmpfs 483048 0 483048 0% /dev
tmpfs 498976 0 498976 0% /dev/shm
..........................................................
192.168.10.101:/data/nfsdir1 5232640 32896 5199744 1% /mnt/nfs1
4,挂载创建个文件结果发现权限不足
[root@centos7 ~]#cd /mnt/nfs1/
[root@centos7 nfs1]#showmount -e 192.168.10.101 #查看远程的主机共享的目录
Export list for 192.168.10.101:
/data/nfsdir1 *
[root@centos7 nfs1]#touch f1
touch: cannot touch вЂf1’: Permission denied
5,回到101,给这个目录设置FACL
[root@101 ~]#setfacl -m u:nfsnobody:rwx /data/nfsdir1
6,可以看到所创建的文件账号都是nfsnobody的
[root@centos7 nfs1]#touch f1
[root@centos7 nfs1]#ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Aug 27 17:03 f1
[root@centos7 nfs1]#
7,其他的是把102主机上的 root映射成nfsnobody账号了,这是因为在exportfs -v
的输出中,有这么一句话"root_squash",其他的主机root权限都会被压榨成nfsnobody
[root@101 ~]#exportfs -v
/data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
8,那如果换其他的账号来试试
[root@centos7 nfs1]#useradd wang
[root@centos7 nfs1]#su wang
[wang@centos7 nfs1]$ls
f1
[wang@centos7 nfs1]$whoami
wang
[wang@centos7 nfs1]$ls
f1
[wang@centos7 nfs1]$touch f2
touch: cannot touch вЂf2’: Permission denied
9,权限不足,因为wang账号的id为1001,无法映射成nfsnobody,只有id=1001才能映射成nfsnobody,那如果把所有的账号都映射层nfsnobody呢,这样做
[root@101 ~]#vim /etc/exports
[root@101 ~]#cat /etc/exports
/data/nfsdir1 *(rw,all_squash)
[root@101 ~]#exportfs -r
10,这样就可以了,所创建的账号都会被映射成nfsnobody了。
[wang@centos7 nfs1]$whoami
wang
[wang@centos7 nfs1]$touch wnag.file
[wang@centos7 nfs1]$ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Aug 27 17:03 f1
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Aug 27 17:23 wnag.file
11,那能不能映射成其他的账号呢?
#一会儿我们就映射成test用户
[root@101 ~]#useradd test
[root@101 ~]#id test
uid=1001(test) gid=1001(test) groups=1001(test)
#id同样是1001
#修改配置
[root@101 ~]#cat /etc/exports
/data/nfsdir1 *(rw,all_squash,anonuid=1001,anongid=1001)
[root@101 ~]#exportfs -r
#设置FACL
[root@101 ~]#setfacl -m u:test:rwx /data/nfsdir1
来102试试
为什么显示1001呢,因为102主机上没有id=1001的账号
[root@centos7 nfs1]#userdel wang
[root@centos7 nfs1]#touch root2
[root@centos7 nfs1]#ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Aug 27 17:03 f1
-rw-r--r-- 1 1001 1001 0 Aug 27 17:40 root2
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Aug 27 17:23 wnag.file
NFS其他配置示例
1,在/etc/exports 文件中定义导出目录
# 以下是共享配置文件中的一些例子:
/myshare server.example.com # 允许名为"server.example.com"的主机访问/myshare共享
/myshare *.example.com # 允许以 ".example.com" 结尾的任何域名的主机访问/myshare共享
/myshare server?.example.com # 允许名为"server"后面跟任意一个字符,然后以 ".example.com" 结尾的域名的主机访问/myshare共享
/myshare server[0-20].example.com # 允许名为"server"后面跟一个数字(0到20之间)然后以 ".example.com" 结尾的域名的主机访问/myshare共享
/myshare 172.25.11.10 # 允许IP地址为172.25.11.10的主机访问/myshare共享
/myshare 172.25.0.0/16 # 允许IP地址以172.25开头的所有主机(CIDR表示法)访问/myshare共享
/myshare 2000:472:18:b51:c32:a21 # 允许IPv6地址为2000:472:18:b51:c32:a21的主机访问/myshare共享
/myshare 2000:472:18:b51::/64 # 允许以2000:472:18:b51开头的所有IPv6地址的主机(CIDR表示法)访问/myshare共享
/myshare *.example.com 172.25.0.0/16 # 允许以 ".example.com" 结尾的任何域名的主机和以172.25开头的所有主机访问/myshare共享
/myshare desktop.example.com(ro) # 允许名为"desktop.example.com"的主机以只读的方式访问/myshare共享
/myshare desktop.example.com(ro) server[0-20].example.com(rw) # 允许名为"desktop.example.com"的主机以只读模式访问/myshare共享,同时允许名为"server"后面跟一个数字(0到20之间)然后以 ".example.com" 结尾的域名的主机以读写模式访问/myshare共享
/myshare diskless.example.com(rw,no_root_squash) # 允许名为"diskless.example.com"的主机以读写模式访问/myshare共享,并禁用对共享的访问进行根用户的映射(root squashing)
NFS工具
1,rpcinfo
rpcinfo -p hostname
rpcinfo -s hostname #查看RPC注册工具
2,exportfs [options]
[Optinos] | 说明 |
---|---|
-v | 查看本机所有NFS共享 |
-r | 重读配置文件,并共享目录 |
-a | 输出本机所有共享 |
-au | 停止本机所有共享 |
3,showmount -e 192.168.10.101 查看某个主机上的nfs
4,mount nfs 挂载工具
客户端NFS挂载
nfs挂载相关选项 man 5 nfs
-
fg
(默认)前台挂载 |bg
后台挂载 -
hard
(默认)持续请求 |soft
非持续请求 -
intr
和hard
配合,请求可中断。 -
rsize
和wsize
一次读和写数据最大字节数,rsize=32769 -
_netdev
无网络不挂载基于安全考虑,建议使用 nosuid,nodev,noexec挂载选项
示例:
mount -o rw nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs
开机挂载
写入配置文件。
[101]$ cat /etc/fstab
172.16.0.1:/public /mnt/ nfs defaults 0 0
参考:
参考视频:
参考文档: