网络文件共享服务(二)
NFS:Network File System 网络文件系统,基于内核的文件系统。Sun公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol远程过程调用)实现RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
NFS优势:节省本地存储空间,将常用的数据,如:/home目录,存放在NFS服务器上且可以通过网络访问,本地终端将可减少自身存储空间的使用。
软件包:nfs-utils
相关软件包:rpcbind(必须),tcp_wrappers
Kernel支持:nfs.ko
端口:2049(nfsd), 其它端口由portmap(111)分配
说明:CentOS 6 开始portmap进程由rpcbind代替
NFS服务主要进程:
rpc.nfsd 最主要的NFS进程,管理客户端是否可登录
rpc.mountd 挂载和卸载NFS文件系统,包括权限管理
rpc.lockd 非必要,管理文件锁,避免同时写出错
rpc.statd 非必要,检查文件一致性,可修复文件
日志:/var/lib/nfs/
NFS配置文件:
/etc/exports
/etc/exports.d/*.exports
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)... #把文件夹给主机1 主机2 ...使用
格式说明:
#开始为注释
主机格式:
单个主机:ipv4,ipv6,FQDN
IP networks:两种掩码格式均支持
172.18.0.0/255.255.0.0
172.18.0.0/16
wildcards:主机名通配,例如*.magedu.com,IP不可以
netgroups:NIS域的主机组,@group_name
anonymous:表示使用*通配所有客户端
每个条目指定目录导出到的哪些主机,及相关的权限和选项
默认选项:(ro,sync,root_squash,no_all_squash)
ro,rw 只读和读写
async 异步,数据变化后不立即写磁盘,性能高
sync(1.0.0后为默认)同步,数据在请求时立即写入共享存储磁盘
root_squash (默认)远程root映射为nfsnobody,UID为65534,CentOS8 为nobody,早期版本是4294967294 (nfsnobody)
no_root_squash 远程root映射成root用户,对root权限不压榨
all_squash 所有远程用户(包括root)都变成nfsnobody,CentOS8 为nobody
no_all_squash (默认)保留共享文件的UID和GID
anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nfsnobody,可配合
all_squash使用
[root@centos8 ~]#mkdir /data/share1
[root@centos8 ~]#mkdir /data/share2
[root@centos8 ~]#touch /data/share1/share1.txt
[root@centos8 ~]#touch /data/share2/share2.txt
[root@centos8 ~]#vim /etc/exports
[root@centos8 ~]#cat /etc/exports
/data/share1/ *
[root@centos8 ~]#vim /etc/exports.d/test.exports
[root@centos8 ~]#cat /etc/exports.d/test.exports
/data/share2 *
[root@centos8 ~]#exportfs -v
[root@centos8 ~]#exportfs -r
exportfs: No options for /data/share1/ *: suggest *(sync) to avoid warning
exportfs: No options for /data/share2 *: suggest *(sync) to avoid warning
[root@centos8 ~]#exportfs -v
/data/share1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/data/share2 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
客户端查看共享资源
[root@centos7 ~]#showmount -e 192.168.32.8
Export list for 192.168.32.8:
/data/share2 * #能看到文件真实路径不安全,通常在局域网用,企业内部用。不怎么用于公共网络
/data/share1 *
[root@centos7 ~]#
客户端可以挂载到本机访问
[root@centos7 ~]#mkdir /mnt/nfs1
[root@centos7 ~]#mount 192.168.32.8:/data/share1 /mnt/nfs1
[root@centos7 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 104806400 1575828 103230572 2% /
devtmpfs 920776 0 920776 0% /dev
tmpfs 931624 0 931624 0% /dev/shm
tmpfs 931624 9808 921816 2% /run
tmpfs 931624 0 931624 0% /sys/fs/cgroup
/dev/sda5 52403200 33060 52370140 1% /data
/dev/sda1 1038336 140228 898108 14% /boot
tmpfs 186328 0 186328 0% /run/user/0
192.168.32.8:/data/share1 52403200 398592 52004608 1% /mnt/nfs1
[root@centos7 ~]#ls /mnt/nfs1/
share1.txt
[root@centos7 ~]#
**只要是远程都需要映射到本机的系统账号。**这里映射成了nobody。用ID相等来映射。
如果没有映射的账户,则映射相同的ID号。
范例:NFS配置示例
vim /etc/exports
/myshare server.example.com
/myshare *.example.com
/myshare server?.example.com
/myshare server[0-20].example.com
/myshare 172.25.11.10
/myshare 172.25.0.0/16
/myshare 2000:472:18:b51:c32:a21
/myshare 2000:472:18:b51::/64
/myshare *.example.com 172.25.0.0/16
/myshare desktop.example.com(ro)
/myshare desktop.example.com(ro) server[0-20].example.com(rw)
/myshare diskless.example.com(rw,no_root_squash)
[root@centos8 ~]#vim /etc/exports.d/test.exports
/data/share2 * 192.168.32.0/24(ro) 192.168.32.7(rw)
#对一个网段设置为只读,对单个主机ip设置为可读可写
查看端口列表:
[root@centos8 ~]#rpcinfo -p
rpcinfo 工具可以查看RPC相关信息
查看注册在指定主机的RPC程序
rpcinfo -p hostname
查看RPC注册程序
rpcinfo –s hostname
范例:rpcinfo
[root@centos8 ~]#rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper #端口号为111
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 48676 status
100024 1 tcp 40143 status
100005 1 udp 20048 mountd
[root@centos8 ~]#rpcinfo -s #注册中心注册的信息 服务端口
program version(s) netid(s) service owner
100000 2,3,4 local,udp,tcp,udp6,tcp6 portmapper superuser
100024 1 tcp6,udp6,tcp,udp status 29
100005 3,2,1 tcp6,udp6,tcp,udp mountd superuser
100003 4,3 tcp6,tcp nfs superuser
100227 3 tcp6,tcp nfs_acl superuser
100021 4,3,1 tcp6,udp6,tcp,udp nlockmgr superuser
exportfs:可用于管理NFS导出的文件系统
常见选项:
–v 查看本机所有NFS共享
–r 重读配置文件,并共享目录
–a 输出本机所有共享 恢复所有的暂停的共享
–au 停止本机所有共享
常见用法
showmount -e hostname
客户端NFS挂载
vim /etc/fatab
NFS相关的挂载选项:man 5 nfs
fg (默认)前台挂载 (default)
bg 后台挂载
hard(默认)持续请求 不断的持续挂载
soft 非持续请求 挂不上过一会再挂
intr 和hard配合,请求可中断 ctrl+c 可以终端
rsize和wsize 一次读和写数据最大字节数,rsize=32768
_netdev 无网络不挂载
提示:基于安全考虑,建议使用nosuid,nodev,noexec挂载选项
范例:临时挂载NFS共享
挂载的时候依赖rpcbind服务端口(111)。重启的时候会自动起来。
没有启动rpcbind服务端口,showmount -e hostip 远程看不到,从而也不知道远程主机中的挂载点的信息
[root@centos8 ~]#systemctl status rpcbind
● rpcbind.service - RPC Bind
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2019-12-18 17:16:10 CST; 1h 42min ago
Docs: man:rpcbind(8)
Main PID: 5965 (rpcbind)
Tasks: 1 (limit: 12402)
Memory: 1.7M
CGroup: /system.slice/rpcbind.service
└─5965 /usr/bin/rpcbind -w -f
Dec 18 17:16:10 MYSQL systemd[1]: Starting RPC Bind...
Dec 18 17:16:10 MYSQL systemd[1]: Started RPC Bind.
mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/
范例:开机挂载 永久挂载
vim /etc/fstab
172.16.0.1:/public /mnt/nfs nfs defaults,_netdev 0 0
vim /etc/fstab
注意后面的 _netdev 。这个意思是如果没有网络的就默认不会挂载,直接跳过去不挂载。什么时候有网络什么时候挂载。
可使用 autofs 服务按需要挂载外围设备,NFS共享等,并在空闲5分钟后后自动卸载。
用的时候自动挂载,不用的时候不挂载。更加节约资源。
[root@centos7 ~]#systemctl status autofs
● autofs.service - Automounts filesystems on demand
Loaded: loaded (/usr/lib/systemd/system/autofs.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2019-12-07 19:31:37 CST; 1 weeks 3 days ago
Main PID: 6397 (automount)
CGroup: /system.slice/autofs.service
└─6397 /usr/sbin/automount --systemd-service --dont-check-daemon
Dec 07 19:31:36 centos7mini systemd[1]: Starting Automounts filesystems on demand...
Dec 07 19:31:37 centos7mini systemd[1]: Started Automounts filesystems on demand.
[root@centos7 ~]#
[root@centos7 ~]#cd /net/192.168.32.8/
[root@centos7 192.168.32.8]#ll
total 0
dr-xr-xr-x 4 root root 0 Dec 18 19:16 data
[root@centos7 192.168.32.8]#
[root@centos7 192.168.32.8]#cd
[root@centos7 ~]#cd /misc/cd #也是基于自动挂载
[root@centos7 cd]#ls
CentOS_BuildTag EULA images LiveOS repodata RPM-GPG-KEY-CentOS-Testing-7
EFI GPL isolinux Packages RPM-GPG-KEY-CentOS-7 TRANS.TBL
[root@centos7 cd]#
[root@centos7 ~]#cd /net/
[root@centos7 net]#cd 192.168.32.8
[root@centos7 192.168.32.8]#ls
data
[root@centos7 192.168.32.8]#cd data/
[root@centos7 data]#ls
share1 share2
[root@centos7 data]#cd share2
[root@centos7 share2]#ls
share2.txt
[root@centos7 share2]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 104806400 1575784 103230616 2% /
devtmpfs 920776 0 920776 0% /dev
tmpfs 931624 0 931624 0% /dev/shm
tmpfs 931624 9808 921816 2% /run
tmpfs 931624 0 931624 0% /sys/fs/cgroup
/dev/sda5 52403200 33060 52370140 1% /data
/dev/sda1 1038336 140228 898108 14% /boot
tmpfs 186328 0 186328 0% /run/user/0
192.168.32.8:/data/share1 52403200 398592 52004608 1% /mnt/nfs1
/dev/sr0 10491772 10491772 0 100% /misc/cd
192.168.32.8:/data/share2 52403200 398592 52004608 1% /net/192.168.32.8/data/share2
只要访问对应的文件夹就会自动挂载。只能看到父目录。不能看到全目录。
软件包:autofs
服务文件:/usr/lib/systemd/system/autofs.service
配置文件:/etc/auto.master
参看帮助:man 5 autofs
所有导出到网络中的NFS启用特殊匹配 -host 至 “browse”
范例:/net目录可以自动挂载NFS共享
cat /etc/auto.master
/net -hosts
cd /net/192.168.8.100/
相对路径法:将mount point 路径分成 dirname 和 basename 分别配置,可能会影响现有的目录结构
缺点:父目录里面的数据内容会被隐藏,数据都是在子文件中才能访问,会被子文件覆盖。
绝对路径法:直接匹配全部绝对路径名称,不会影响本地目录结构
挂载点的dirname 指定目录的配置文件路径
挂载点的basename 挂载选项 选项设备
范例:相对路径法
[root@centos8 ~]#vim /etc/auto.master
/misc /etc/auto.misc #/misc为dirname /etc/auto.misc为basename
[root@centos8 ~]#vim /etc/auto.misc
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom #cd为basename的具体名称 挂载选项 选项设备
[root@centos7 ~]#cat /etc/auto.master |grep -Ev "^#|^$"
/misc /etc/auto.misc #/etc/auto.misc为子配置文件
/net -hosts #自动把网络中共享文件挂载到/net文件夹中,可以直接访问
+dir:/etc/auto.master.d
+auto.master
[root@centos7 ~]#
[root@centos7 ~]#cat /etc/auto.misc |grep -Ev "^#|^$" #打开对应的子配置文件
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom #cd为basename的具体名称 挂载选项 选项设备
[root@centos7 ~]#
范例:相对路径法为支持通配符
vim /etc/auto.master
/misc /etc/auto.misc
vim /etc/auto.misc
#表示/misc下面的子目录和nfs共享/export目录的子目录同名
* server:/export/&
范例:实现centos8中share1中的共享文件挂载到centos7中/misc/nfs1中
这里由于dirname为misc已经存在,所以直接配置basename nfs1即可
[root@centos7 ~]#showmount -e 192.168.32.8 #查看远程主机共享文件
Export list for 192.168.32.8:
/data/share2 *
/data/share1 *
[root@centos7 ~]#
[root@centos7 ~]#vim /etc/auto.misc
[root@centos7 ~]#cat /etc/auto.misc |grep -Ev "^#|^$"
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
nfs1 -fstype=nfs 192.168.32.8:/data/share1
[root@centos7 ~]#ls /misc #最先查看/misc文件,暂时一个文件也没有
[root@centos7 ~]#ls /misc/nfs1 #访问一下
share1.txt
[root@centos7 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 104806400 1575816 103230584 2% /
devtmpfs 920776 0 920776 0% /dev
tmpfs 931624 0 931624 0% /dev/shm
tmpfs 931624 9808 921816 2% /run
tmpfs 931624 0 931624 0% /sys/fs/cgroup
/dev/sda5 52403200 33060 52370140 1% /data
/dev/sda1 1038336 140228 898108 14% /boot
tmpfs 186328 0 186328 0% /run/user/0
192.168.32.8:/data/share1 52403200 398592 52004608 1% /mnt/nfs1
[root@centos7 ~]#
[root@centos7 ~]#ls /misc #再一次访问,已经自动挂载了
nfs1-
[root@centos7 ~]#
范例:实现把centos8中的共享文件/data/share2挂载到centos7中的 /data/d1/d2/d3
[root@centos7 ~]#vim /etc/auto.master #修改autofs的主配置文件,在后面追加下面内容
/data/d1/d2 /etc/auto.d2 # /etc/auto.d2这个名称无所谓,对应子配置文件即可
#dirname文件会自动生成
[root@centos7 ~]#vim /etc/auto.d2 #对应主配置文件中的子配置文件名称
[root@centos7 ~]#cat /etc/auto.d2
d3 -fstype=nfs 192.168.32.8:/data/share2
[root@centos7 ~]#systemctl restart autofs #重启对应服务
[root@centos7 ~]#
[root@centos7 ~]#cd /data/d1/d2/
[root@centos7 d2]#cd
[root@centos7 ~]#ls /data/d1/d2/
[root@centos7 ~]#cd /data/d1/d2/d3
[root@centos7 d3]#ls
share2.txt
[root@centos7 d3]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 104806400 1575980 103230420 2% /
devtmpfs 920776 0 920776 0% /dev
tmpfs 931624 0 931624 0% /dev/shm
tmpfs 931624 9808 921816 2% /run
tmpfs 931624 0 931624 0% /sys/fs/cgroup
/dev/sda5 52403200 33092 52370108 1% /data
/dev/sda1 1038336 140228 898108 14% /boot
tmpfs 186328 0 186328 0% /run/user/0
192.168.32.8:/data/share1 52403200 398592 52004608 1% /mnt/nfs1
192.168.32.8:/data/share2 52403200 398592 52004608 1% /data/d1/d2/d3
[root@centos7 d3]#
把namedir和basename放在一起。
/- 指定配置文件路径
绝对路径 挂载选项 选项设备
范例:绝对路径法
vim /etc/auto.master:
/- /etc/auto.direct
vim /etc/auto.direct:
/foo -fstype=nfs server1:/export/foo
/user/local/ -fstype=nfs,vers=3 server1:/usr/local
/mnt/cdrom -fstype=iso9660 :/dev/cdrom
范例:
[root@centos7 ~]#vim /etc/auto.master
[root@centos7 ~]#cat /etc/auto.master |grep -Ev "^#|^$"
/- /etc/auto.d2 #这个表示在 /etc/auto.d2 中需要写完整路径
[root@centos7 ~]#vim /etc/auto.d2
[root@centos7 ~]#cat /etc/auto.d2
/data/d1/d2/d3 -fstype=nfs 192.168.32.8:/data/share2 #写上完整的路径/data/d1/d2/d3
[root@centos7 ~]#
[root@centos7 ~]#systemctl restart autofs
[root@centos7 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 104806400 1576036 103230364 2% /
devtmpfs 920776 0 920776 0% /dev
tmpfs 931624 0 931624 0% /dev/shm
tmpfs 931624 9808 921816 2% /run
tmpfs 931624 0 931624 0% /sys/fs/cgroup
/dev/sda5 52403200 33092 52370108 1% /data
/dev/sda1 1038336 140228 898108 14% /boot
tmpfs 186328 0 186328 0% /run/user/0
192.168.32.8:/data/share1 52403200 398592 52004608 1% /mnt/nfs1
[root@centos7 ~]#ls /data/d1/d2/d3/ #访问
share2.txt
[root@centos7 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 104806400 1576016 103230384 2% /
devtmpfs 920776 0 920776 0% /dev
tmpfs 931624 0 931624 0% /dev/shm
tmpfs 931624 9808 921816 2% /run
tmpfs 931624 0 931624 0% /sys/fs/cgroup
/dev/sda5 52403200 33092 52370108 1% /data
/dev/sda1 1038336 140228 898108 14% /boot
tmpfs 186328 0 186328 0% /run/user/0
192.168.32.8:/data/share1 52403200 398592 52004608 1% /mnt/nfs1
192.168.32.8:/data/share2 52403200 398592 52004608 1% /data/d1/d2/d3 #自动挂载
[root@centos7 ~]#
如果要取消自动挂载的挂载,需要停了服务之后才能取消挂载
优点:自动挂载,省资源。
目标
将NFS的共享目录,通过autofs 发布出来,做为远程主机用户的家目录
环境准备
三台主机
一台主机 nfs server,IP:192.168.8.100
另两台当 nfs client,IP:192.168.8.101和192.168.8.102
步骤
#NFS服务器创建用户和相应的家目录,将用户wang的家目录共享
useradd -d /data/wang wang
vim /etc/exports.d/test.exports
/data/wang *(rw,anonuid=1000,anongid=1000,all_sqush)
#在第一台NFS客户端主机192.168.8.101上实现相对路径法的autofs
vim /etc/auto.master
/home /etc/homeauto
vim /etc/homeauto
* -fstype=nfs,vers=3 192.168.8.100:/data/wang/&
#注意:home目录下其它用户家目录无法访问
#在第二台NFS客户端主机192.168.8.102上实现绝对路径法的autofs
vim /etc/auto.master
/- /etc/homeauto
vim /etc/homeauto
/home/wang -fstype=nfs,vers=3 192.168.8.102:/data/wang