NFS
NFS概念
NFS:Network File System 网络文件系统,基于内核的文件系统。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol远程过程调用)实现。RPC采用C/S模式。客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进,一般应用于企业内网而不是互联网。
另外,NFS的安全性基于IP认证,很容易伪装可性的IP来访问NFS,所以总体的安全性不高。
NFS拓扑图
NFS特点
rpm -q nfs-utils
/usr/lib/systemd/scripts/nfs-utils_env.sh
/usr/lib/systemd/system-generators/nfs-server-generator
/usr/lib/systemd/system-generators/rpc-pipefs-generator
/usr/lib/systemd/system/auth-rpcgss-module.service
/usr/lib/systemd/system/nfs-blkmap.service
/usr/lib/systemd/system/nfs-client.target
/usr/lib/systemd/system/nfs-config.service
/usr/lib/systemd/system/nfs-idmap.service
/usr/lib/systemd/system/nfs-idmapd.service
/usr/lib/systemd/system/nfs-lock.service
/usr/lib/systemd/system/nfs-mountd.service
/usr/lib/systemd/system/nfs-secure.service
/usr/lib/systemd/system/nfs-server.service
/usr/lib/systemd/system/nfs-utils.service
/usr/lib/systemd/system/nfs.service
/usr/lib/systemd/system/nfslock.service
/usr/lib/systemd/system/proc-fs-nfsd.mount
/usr/lib/systemd/system/rpc-gssd.service
/usr/lib/systemd/system/rpc-statd-notify.service
/usr/lib/systemd/system/rpc-statd.service
/usr/lib/systemd/system/rpc_pipefs.target
/usr/lib/systemd/system/rpcgssd.service
/usr/lib/systemd/system/rpcidmapd.service
/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount
locate nfs.ko
1. 相对复杂的服务,如上述的列表,依赖众多的服务
2. 对外提供的端口不固定,用rpcinfo -p查看
3. 通过rpcbind来管理NFS的临时端口,rpcbind使用固定的端口111
4. Centos7启动systemctl start nfs-server CentOS6:service nfs start,另外,在CentOS6,启动nfs之前,必须确保rpcbind启动。
NFS配置
/etc/exports主配置文件
rpm -qf /etc/exports
setup-2.8.71-9.el7.noarch(exports并不来自nfs-utils安装包,而是来自更基础的setup安装包)
/etc/exportd.d/*.exports 子配置文件
systemctl enable nfs-server
systemctl start nfs-server
format:共享文件夹 who(permission)
exportfs -r (重读配置文件)
exportfs -v (查询已共享的资源)
格式:
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...
主机格式:
1. 单个主机:ipv4,ipv6,FQDN
2. IP networks:两种掩码格式均支持 172.18.0.0/255.255.0.0 or 172.18.0.0/16
3. wildcards:主机名通配,例如*.magedu.com,IP不可以,需要配合DNS解析
4. anonymous:表示使用*通配所有客户端
每个条目指定目录导出到的哪些主机,及相关的权限和选项:
1. 默认选项:(ro,sync,root_squash,no_all_squash)
2. ro,rw 只读和读写
3. async 异步,数据变化后不立即写磁盘,性能高
4. sync(1.0.0后为默认)同步,数据在请求时立即写入共享
5. no_all_squash (默认)保留共享文件的UID和GID
6. all_squash 所有远程用户(包括root)都变成nfsnobody
7. root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody)
8. no_root_squash 远程root映射成root用户,如果和all_squash一起配置,all_squash起使用
9. anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nfsnobody,可配合all_squash使用
NFS客户端
是内核的功能,所有客户端不需要安装第三方的RPM,可以用showmount -e IP(NFS server)
[root@web1 ~]# showmount -e 172.20.42.201
Export list for 172.20.42.201:
/data/wordpress 172.20.0.0/16
mkdir /mnt/nfs
mount 172.20.42.201:/data/wordpress /mnt/nfs
mount(检查状态)
172.20.42.201:/data/wordpress on /mnt/nfs type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.20.42.203,local_lock=none,addr=172.20.42.201)
可以指定挂载的版本:
mount -o vers=3 172.20.42.201:/data/wordpress /mnt/nfs
注意: nfs客户端访问服务器端时: root映射为nfsnobody用户(root_squash),普通用户映射为id相同的用户(no_all_squash)
NFS相关的挂载选项:
fg(默认)前台挂载,bg后台挂载
hard(默认)持续请求,soft 非持续请求
intr 和hard配合,请求可中断
rsize和wsize 一次读和写数据最大字节数,rsize=32768
_netdev 无网络不挂载
例子:mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/
实验:
服务器端,保持/data/nfs 755,在客户端的/mnt/nfs下root用户无法创建文件;setfacl -m u:nfsnobody:rwx /data/liang/在服务器端,在客户端用root可以在/mnt/nfs下创建文件
可以配置
/data/liang *(rw,no_root_squash),应用于管理员管理多台NFS服务器。
NFS伪根
服务器配置
mkdir -p /app/nfsdir1
mkdir -p /data/nfsdir2
把如上的两个文件夹用伪根共享
mkdir -p /nfsroot/{dir1,dir2}
chown nfsnobody /nfsroot/{dir1,dir2}
vim /etc/fstab
/data/nfsdir2 /nfsroot/dir2 none bind 0 0
/app/nfsdir1 /nfsroot/dir1 none bind 0 0
vim /etc/exports
/nfsroot *(fsid=0,rw,crossmnt)
/nfsroot/dir1 *(ro)
/nfsroot/dir2 *(rw)
客户端
mount 172.20.42.201:/nfsroot /mnt
[root@web1 mnt]# ll /mnt/
total 0
drwxr-xr-x 2 root root 21 Jun 26 04:57 dir1
drwxr-xr-x 2 root root 22 Jun 26 04:57 dir2
cd dir1
echo hello > hello.txt
自动挂载
rpm -ql autofs
挂载规则
相对路径
挂载点分为两部分:/dir/subdir分为/dir和/subdir两部分
auto.master配置文件定义父目录的规则:
/dir autofs子配置文件路径
autofs子配置文件:
/subdir mountdev
绝对路径
auto.master配置文件只定义如下:
/- 子配置文件
autofs子配置文件
/dir/subdir mountdev
NFS server
mkdir /data/nfsdir
vim /etc/exports
/data/nfsdir *(rw)
NSF client
showmount -e 172.20.42.201
cd /net/
cd 172.20.42.201
vim /etc/auto.master
/d1/d2/d3 /etc/test.autofs
vim /etc/test.autofs
nfs -fstype=nfs,vers=3,rw 172.20.42.201:/data/nfsdir
systemctl restart autofs
cd /d1/d2/d3/nfs (注意,/d1/d2/d3不需要手动创建,访问即生成)
例子
家目录自动挂载NFS,同一个用户在不同的机器上登录,看到的内容是一致的(相对路径法)
1. 三台server:一台NFS,两台普通服务器,同时两台普通服务器上有相同的用户nfsuser1, nfsuser2
2. NFS服务器
useradd -d /data/nfs2 -u 2101 nfs2
useradd -d /data/nfs1 -u 2100 nfs1
vim /etc/exports
/data *(rw)
exportfs -v
3. 两台普通服务器执行相同的操作
useradd -u 2100 nfsuser1
useradd -u 2101 nfsuser2
mount 172.20.42.201:/data/nfs1 /home/nfsuser1/
mount 172.20.42.201:/data/nfs2 /home/nfsuser2/
su - nfsuser1
touch nfs1
在NFS服务器上查看,ll /data/nfs1 nfs1
自动挂载:
vim /etc/auto.master
/home /etc/test.autofs (/home下的文件夹全部交给autofs来控制)
vim /etc/test.autofs
nfsuser1 -fstype=nfs,vers=3,rw 172.20.42.201:/data/nfs1
nfsuser2 -fstype=nfs,vers=3,rw 172.20.42.201:/data/nfs2
systemctl restart autofs
总结:上述方法会导致别的普通用户登录失败,如下:
```
[root@centos7 ~]# su - vmx
Last login: Tue May 22 16:51:34 CST 2018 from ::ffff:192.168.30.145 on pts/5
su: warning: cannot change directory to /home/vmx: No such file or directory
解决的方法用绝对路径法。
家目录自动挂载NFS,同一个用户在不同的机器上登录,看到的内容是一致的(绝对路径)
1. NFS服务器保持上述的配置
2. 普通服务器上
vim /etc/auto.master
/- /etc/test.autofs
vim /etc/test.autofs
/home/nfsuser1 -fstype=nfs,vers=3,rw 172.20.42.201:/data/nfs1
/home/nfsuser2 -fstype=nfs,vers=3,rw 172.20.42.201:/data/nfs2
特殊用法(如果NFS共享的文件夹名字和用户名正好相同,只适用于相对路径的情形)
1. NFS服务器上
useradd -d /data/nfsuser3 -u 2102 nfs3
useradd -d /data/nfsuser4 -u 2103 nfs4
useradd -d /data/nfs** -u 210* nfs**
2. 普通服务器上
useradd -u 2102 nfsuser3
useradd -u 2103 nfsuser4
vim /etc/test.autofs
* -fstype=nfs,vers=3,rw 172.20.42.201:/data/&
/misc和/net/ip的自动挂载解释
/misc能自动挂载到CDROM
/etc/auto.master: /misc /etc/auto.misc
/etc/auto.misc: cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
/net目录能自动访问NFS共享的IP
/etc/auto.master: /net -hosts
总结:在三种网络共享VSFTP,NFS, SAMBA中,NFS和SAMBA属于文件系统级别, 可以通过挂载的方法实现服务器和客户机之间的网络资源共享,VSFTP是应用层的,需要安装相关的服务器和客户端软件实现。