1. 文件共享服务-NFS
1. NFS服务基础
1.1 NFS工作原理
NFS: Network File System网络文件系统, 是基于内核的文件系统.
通过使用NFS, 应用程序可以像访问本地文件一样访问远端系统上的文件, 基于RPC(Remote Procedure Call)远程过程调用实现.
RPC采用C/S模式, 客户机应用程序调用本地进程(portmap), 发送一个有进程参数的调用信息到服务进程(portmap), 然后等待应答信息.
在服务器端, portmap进程保持睡眠状态, 直到调用信息到达. 当一个调用信息到达, 服务器获得进程参数, 计算结果, 发送答复信息, 然后等待下一个调用信息
最后, 客户端调用本地portmap进程, 接受答复信息, 获得进程结果, 然后调用继续进行
图片.png
当在NFS服务器设置好一个共享目录, 如/home/data后, 其他有权限访问NFS服务器的NFS客户端就可以将这个/home/data挂载到自己文件系统的某个挂载点
这个挂载点, 客户端可以自己定义, 并且挂载好后, 可以在客户端本地访问挂载点, 即可访问到NFS服务器上/home/data的所有数据
如果服务器端配置为客户端只读, 那么客户端只能读取文件. 如果是读写权限, 客户端就可以在本地的挂载点进行读写, 而文件的修改也是发生在服务器端
1.2 NFS的通讯
NFS工作在2049端口, 而除了2049, NFS还会开启多个随机端口, 来给客户端提供服务, 多个不同的端口通过rpcbind服务来统一进行注册和调度
[23:10:24 root@nfs ~]#grep 2049 /etc/services
nfs 2049/tcp nfsd shilp # Network File System
nfs 2049/udp nfsd shilp # Network File System
nfs 2049/sctp nfsd shilp # Network File System
客户端通过rpcbind服务(port:111)来和服务端统一进行交互, 而NFS服务器会把开启的随机端口注册在rpcbind服务中.
客户端通过rpcbind注册中心, 来调用NFS服务器上不同的功能
NFS服务依赖于rpcbind服务, 因此, NFS启动依赖于rpcbind. 不过, 在CentOS7版本后, 系统各服务间的依赖关系会自动解决
客户端和服务器端通信流程:
1. 服务器端启动rpc服务, 开启111端口
2. 服务器端启动NFS服务, 并且向rpcbind注册自己开启的随机端口号
3. 客户端启动rpc, 向服务器端的rpc服务请求服务器端的NFS端口
4. 服务器端的rpc服务将NFS开启的端口号通知客户端
5. 客户端通过获取NFS的端口号与NFS建立连接, 开始数据传输
1.3 NFS软件
软件包: nfs-utils(包含服务器和客户端相关工具)
相关软件包: rpcbind(必须安装), tcp_wrappers, 安装nfs-utils会自动安装这两个软件包
rpcbind.x86_64 0:0.2.0-49.el7 tcp_wrappers.x86_64 0:7.6-77.el7
Kernel支持: nfs.ko
端口: 2049(nfsd), 其他端口由portmap(111)分配
说明: Centos6开始, portmap进程由rpcbind代替
1.4 共享资源定义文件
1. /etc/exports文件, 由系统基础包提供
[23:30:07 root@nfs ~]#rpm -qf /etc/exports
setup-2.8.71-11.el7.noarch
2. /etc/exports.d, 由nfs-utils包提供
/etc/exports.d/*.exports
两者都可以定义共享资源
1.5 服务启动
[23:33:15 root@nfs ~]#systemctl enable --now nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[23:35:08 root@nfs ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 64 *:2049 *:*
LISTEN 0 128 *:59524 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:20048 *:*
LISTEN 0 64 *:34134 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 64 [::]:40607 [::]:*
LISTEN 0 64 [::]:2049 [::]:*
LISTEN 0 128 [::]:36940 [::]:*
LISTEN 0 128 [::]:111 [::]:*
LISTEN 0 128 [::]:20048 [::]:*
LISTEN 0 128 [::]:22 [::]:*
1.6 NFS主要进程
rpc.nfsd 最主要的NFS进程, 管理客户端是否可登录
rpc.mountd 挂载和卸载NFS文件系统, 包括权限管理
rpc.lockd 非必要, 管理文件锁, 避免同时写出错
rpc.statd 非必要, 检查文件一致性, 可修复文件
2 NFS应用
文件共享案例
NFS服务器: 10.0.0.197
NFS客户端: 10.0.0.207
2.1 服务器上创建共享目录
[23:42:51 root@nfs ~]#mkdir /data/nfsdir{1,2}
[23:44:14 root@nfs ~]#ls /data
nfsdir1 nfsdir2
[23:44:16 root@nfs ~]#touch /data/nfsdir1/a.txt
[23:45:11 root@nfs ~]#touch /data/nfsdir2/b.txt
[23:45:17 root@nfs ~]#tree /data
/data
├── nfsdir1
│ └── a.txt
└── nfsdir2
└── b.txt
2 directories, 2 files
2.2 将目录共享
- 方法1: 在/etc/exports文件定义
共享/data/nfsdir1目录, 所有人都可以远程挂载该目录(*), 后面的权限选项不写就是默认(ro,sync,root_squash,no_all_squash)
[23:45:19 root@nfs ~]#vim /etc/exports
/data/nfsdir1 *
- 方法2: 在/etc/export.d目录下创建.exports结尾的文件定义,文件名无所谓, 后缀必须是exports
[23:48:05 root@nfs ~]#vim /etc/exports.d/test.exports
/data/nfsdir2 *(rw) # 注意, 被允许的主机位和选项位之间不能有空格
2.3 让配置生效
方法1: 重启nfs服务
systemctl restart nfs
方法2: exportfs - r # 仅让配置文件生效的命令. 不会重启服务, 不会影响用户体验
#警报提示可以忽略, 因为nfsdir1没有设定选项
[23:53:40 root@nfs ~]#exportfs -r
exportfs: No options for /data/nfsdir1 *: suggest *(sync) to avoid warning
2.4 查看NFS共享配置
exportfs -v (显示当前主机上, 通过nfs共享出来的目录, 以及对应有权限的主机和相应权限)
[23:53:42 root@nfs ~]#exportfs -v
/data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/data/nfsdir2 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
2.5 客户端远程挂载
NFS客户端: 10.0.0.207
- 通过showmount命令来查看, 远程服务器有哪些资源可以使用
showmount来自nfs-utils包, 因此要在客户端也安装nfs-utils包
showmount -e HOSTNAME 可以列出, 目标主机,通过nfs共享出来的文件列表
[23:57:29 root@nfs-client ~]#showmount -e 10.0.0.197
Export list for 10.0.0.197:
/data/nfsdir2 *
/data/nfsdir1 *
- 创建wordpress目录, 模拟把nfs的共享目录挂载到wordpress下. 实现在wordpress存数据, 最终存到nfs的共享目录
[23:57:34 root@nfs-client ~]#mkdir /var/www/html/wordpress -pv
mkdir: created directory ‘/var/www’
mkdir: created directory ‘/var/www/html’
mkdir: created directory ‘/var/www/html/wordpress’
- 临时挂载
通过mount命令去挂载共享目录, nfs中用mount命令实际是调用的mount.nfs4, 这个包来自于nfs-utils, 因此客户端也需要安装nfs-utils包
[00:00:47 root@nfs-client ~]#mount
mount mount.fuse mount.nfs mount.nfs4 mountpoint mountstats
格式:
mount 服务器ip:共享目录 本地目录
[00:01:56 root@nfs-client ~]#mount 10.0.0.197:/data/nfsdir1 /var/www/html/wordpress
验证
[00:02:02 root@nfs-client ~]#df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda2 20G 1.6G 19G 8% /
/dev/sda5 27G 33M 27G 1% /data
/dev/sda1 1014M 131M 884M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
10.0.0.197:/data/nfsdir1 27G 33M 27G 1% /var/www/html/wordpress
[00:02:21 root@nfs-client ~]#ls /var/www/html/wordpress
a.txt
由于nfsdir1是默认权限, 只能读, 所有无法修改a.txt文件
[00:02:37 root@nfs-client ~]#> /var/www/html/wordpress/a.txt
-bash: /var/www/html/wordpress/a.txt: Read-only file system
创建另一个挂载点, 测试nfsdir2, 由于权限是读写权限, 所以, 可以修改b.txt文件
[00:03:02 root@nfs-client ~]#mkdir /var/www/html/discuzz -pv
mkdir: created directory ‘/var/www/html/discuzz’
[00:03:53 root@nfs-client ~]#mount 10.0.0.197:/data/nfsdir2 /var/www/html/discuzz/
[00:04:20 root@nfs-client ~]#ls /var/www/html/discuzz/
b.txt
[00:04:25 root@nfs-client ~]#echo "test" > /var/www/html/discuzz/b.txt
-bash: /var/www/html/discuzz/b.txt: Permission denied
这里虽然dir2是写权限, 但是仍然修改失败, 权限拒绝
[00:14:06 root@nfs ~]#ll /data
total 0
drwxrwxrwx 2 root root 19 Feb 11 23:45 nfsdir1
drwxrwxrwx 2 root root 19 Feb 11 23:45 nfsdir2
修改操作系统文件权限后即可完成写操作
[15:36:23 root@nfs ~]#chmod -R o+w /data/nfsdir2
[00:04:43 root@nfs-client ~]#echo "test" > /var/www/html/discuzz/b.txt
[00:14:24 root@nfs-client ~]#cat /var/www/html/discuzz/b.txt
test
在客户端以root用户创建文件, 文件的属主和属组被压榨为nfsnobody(uid-nfsnobody)
[15:36:27 root@nfs-client ~]#touch /var/www/html/discuzz/file1.txt
touch: cannot touch ‘/var/www/html/discuzz/file1.txt’: Permission denied
[15:40:04 root@nfs ~]#ll /data
total 4
drwxr-xr-x 6 mysql mysql 4096 Apr 22 13:17 mysql
drwxr-xr-x 2 root root 19 Apr 22 13:26 nfsdir1
drwxr-xrw- 2 root root 19 Apr 22 13:26 nfsdir2
[15:40:12 root@nfs ~]#ll /data/nfsdir2/
total 4
-rw-r--rw- 1 root root 5 Apr 22 15:36 b.txt
服务端修改权限
[15:40:17 root@nfs ~]#chmod -R 777 /data/nfsdir2
再次在客户端创建文件
[15:41:53 root@nfs-client ~]#touch /var/www/html/discuzz/file1.txt
[15:42:24 root@nfs-client ~]#ll /var/www/html/discuzz/
total 4
-rwxrwxrwx 1 root root 5 Apr 22 15:36 b.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 22 15:42 file1.txt
root压榨: 默认情况下, root用户在挂载点创建文件会被压榨成nfsnobody用户, 文件在客户端和服务器端都是nfsnobody
客户端
[15:42:24 root@nfs-client ~]#ll /var/www/html/discuzz/
total 4
-rwxrwxrwx 1 root root 5 Apr 22 15:36 b.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 22 15:42 file1.txt
服务端
[15:53:57 root@nfs ~]#ll /data/nfsdir2
total 4
-rwxrwxrwx 1 root root 5 Apr 22 15:36 b.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Apr 22 15:42 file1.txt
修改失败原因分析:
- 虽然nfs共享目录在设置时允许了客户端rw, 但是这是在nfs层面, 操作系统层面是没有给客户端写权限的
- 以客户端的root向共享目录写数据, 实际到了服务器那端就是其他用户了, 因此客户端的root并不是服务器上的root. 这里客户端在共享目录里创建文件时, 用户身份会被映射成nfsnobody
综合两点, 想要客户端的账户, 能在共享目录有写权限, 除了要在/etc/exports文件里设定rw权限, 还要在文件系统层面 给于远程用户整个目录的读写执行(777)权限.
目录读权限,可以ls看目录里的内容
目录写权限, 可以在目录创建和删除文件
目录执行权限, 可以进入到该目录.
文件和目录的权限补充:
想进一个目录, 需要x权限, 如果对一个目录只有x权限, 也就只能进入目录, 无法查看目录内容ls, 无法在目录内创建,删除文件touch等
想在目录里创建删除文件, 要有目录的wx权限, 如果对一个目录只有wx权限,可以进入该目录, 可以在目录内创建删除文件, 但是不能修改文件. 如果要修改文件, 需要对文件本身有w权限
想看一个目录里的文件列表, 需要rx权限, 如果对一个目录只有rx权限, 可以ls查看目录文件列表,进入目录,但是不能创建删除文件. 至于能不能修改目录里的文件内容, 要看对文件有没有写权限, 这时如果对文件没有w权限就无法修改文件了
2.6 root_squash
-
以root用户从客户端访问nfs创建文件时, 会被压榨成nfsnobody用户
-
如果是普通用户从客户端访问nfs时, 会被映射成在nfs服务器上用户id相同的人. 比如在客户端admin用户的id是500. 那么连接到nfs,后就会被映射成nfs上用户id为500的用户, 这个用户不一定就是admin要看服务器上的设置.
如果服务器上没有对应的用户id, 那么就映射用户在客户端的用户id, 即id数字, 因此, 使用nfs时要确保客户端端和服务器权限一致
容易出现的问题:
在不同的nfs客户端(比如, web服务器)上, 相同的用户名的用户id不一定一样, 因此, 同一个用户比如admin, 如果在web1上的id是100, 在web2的id是200, 100访问nfs时会映射成nfs上100的用户名, 200访问nfs时会映射成nfs上200的用户名. 这时同一个用户admin通过不同的服务器访问nfs映射成的用户不一样就会导致权限混乱, 影响文件的管理.
比如, 用户通过web1传了一个图片到nfs, web1上的系统账户比如apache的id是100,访问nfs会映射成nfs上100用户,那么所上传的图片的属主和属组也就是该100用户. 之后用户又想删除该图片,结果连接服务器时被调度到了web2, 而web2上的apache是200id, 通过200id连接到nfs会被映射成nfs上200id的用户, 肯定是和第一次连接时映射的用户不同, 那么也就没有权限删除图片了. 但是如果下次在访问又被调度回了web1就又能删除了.
因此, 如果服务器账号不统一, 很可能导致权限问题, 验证失败
如何统一所有机器的用户名和id:
- ldap方式, 实现集中的用户账户管理
不在每个web机器创建用户账户, 而是专门创建一个统一的共享服务, 专门来存放web服务器用户账号.
ldap服务器里有一个数据库, 会把所有的用户账号在数据库里建起来. nfs服务器从ldap服务器拿账号做认证.
- 另外所有容器里的id也要一致, 在制作基础镜像时就要保证账户一致, 所有上层的业务镜像都是从基础镜像集成账号,以此保证所有服务器账户一致.
- web服务器都用root和nfs连接,并且设置不压榨root
- web服务器爱用啥用啥, 但是访问到nfs都统一压榨成同一个用户
如果不想压榨root成普通用户, 只需修改nfs上对应目录的共享配置文件即可, 这里以/data/nfsdir2为例
恢复/data/nfsdir2的权限到默认的755
[00:54:46 root@nfs ~]#chmod 755 /data/nfsdir2
[00:54:54 root@nfs ~]#ll -d /data/nfsdir2
drwxr-xr-x 2 root root 36 Feb 12 00:16 /data/nfsdir2
修改/data/nfsdir2的共享配置文件
[00:54:58 root@nfs ~]#vim /etc/exports.d/test.exports
/data/nfsdir2 *(rw,no_root_squash) # 各权限位之间不要有空格
[00:56:04 root@nfs ~]#exportfs -r
exportfs: No options for /data/nfsdir1 *: suggest *(sync) to avoid warning
[00:56:04 root@nfs ~]#exportfs -v
/data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
/data/nfsdir2 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
在客户端测试
[00:57:57 root@nfs-client /var/www/html/discuzz]#echo 111 > file1.txt # 文件修改成功
[00:58:02 root@nfs-client /var/www/html/discuzz]#cat file1.txt
111
[00:59:19 root@nfs-client /var/www/html/discuzz]#touch file2.txt
-rw-r--r-- 1 root root 0 Feb 12 00:59 file2.txt # 属主和属组都是root了
在服务器端查看创建的文件
[00:56:30 root@nfs ~]#ll /data/nfsdir2
total 8
-rw-r--r-- 1 root root 0 Feb 12 00:59 file2.txt # 新建的文件, 属主和属组也是root了
如果 no_root_squash和all_squash同时设定, 那么root还是会被压榨成nfsnobody
如何指定被压榨后的用户名? - 修改共享目录配合文件
[23:10:07 root@centos8-2 /data/nfsdir2]#vim /etc/exports.d/test.exports
/data/nfsdir2 *(rw,all_squash,anonuid=2,anongid=2)
修改后, root和普通用户都会被压成nfs上uid=2,gid=2的人
root_squash: 默认选项, 远程root用户映射为nfsnobody用户, uid为65534
no_root_squash: 远程root映射成NFS服务器的root用户
all_squash: 所有远程用户, 包括root, 都变成nfsnobody
no_all_squash: 默认选项,不压榨普通用户, 保留共享文件的UID和GID
2.7 sync与async
sync: 同步, 数据在请求时, 立即写入共享存储磁盘, 性能低, 但是安全性高
async: 异步, 数据变化后不立即写入磁盘, 先写入缓冲区, 过一段时间, 再写入磁盘, 性能高, 但是安全性低
2.8 挂载权限设置
通过在共享目录配置ip地址来控制哪些ip的主机可以挂载
设定对于/data/nfsdir2目录, 10.0.0.207可以挂载并且是读写权限, 10.0.0.217可以挂载, 但是只读权限
[01:17:43 root@nfs ~]#vim /etc/exports.d/test.exports
/data/nfsdir2 10.0.0.207(rw,no_root_squash) 10.0.0.217(ro)
[01:29:06 root@nfs ~]#exportfs -r
exportfs: No options for /data/nfsdir1 *: suggest *(sync) to avoid warning
10.0.0.207测试, 之前已经挂载过了, 无需重新挂载
[01:22:38 root@nfs-client /var/www/html/discuzz]#touch testfile.txt
[01:22:45 root@nfs-client /var/www/html/discuzz]#
10.0.0.217测试
[01:25:52 root@nfs-client2 ~]#mount 10.0.0.197:/data/nfsdir2 /var/www/html/discuzz
[01:26:14 root@nfs-client2 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda2 20G 1.6G 19G 8% /
/dev/sda5 27G 33M 27G 1% /data
/dev/sda1 1014M 131M 884M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
10.0.0.197:/data/nfsdir2 27G 33M 27G 1% /var/www/html/discuzz
[01:28:06 root@nfs-client2 /var/www/html/discuzz]#echo 11 > testfile.txt
-bash: testfile.txt: Read-only file system
NFS权限隐患
即使没有权限挂载的主机, 也可以通过showmount -e 命令查看到nfs服务器设定的挂载规则. 这样就可以修改自己的ip地址充当允许挂载的机器, 不安全.
2.9 长期使用, 远程挂载, 持久保存
mount挂载都是临时, 重启失效, 持久保存, 要写入/etc/fstab文件
在10.0.0.207永久挂载/data/nfsdir2目录
[01:33:17 root@nfs-client ~]#vim /etc/fstab
10.0.0.197:/data/nfsdir2 /mnt nfs _netdev 0 0
_netdev:表示挂载的是网络资源, 服务器启动时要读取fstab文件进行挂载, 如果启动时网络和远程服务器不通,导致连不上远程服务器
那么启动时服务器就会卡死起不来, 加了这项就会主动探测网络是否通畅, 如果不通,就先不挂载, 等服务器启动后,再进行排错. 避免了由于网络不通导致挂载失败,服务器无法启动.
让挂载生效: -a -a, --all mount all filesystems mentioned in fstab
[01:36:10 root@nfs-client ~]#mount -a
练习项目:
利用一台DNS服务器实现前端调度, web服务器用3台linux apache, nfs用2台linux.
实现客户访问web服务器,先通过dns查询, dns查询随机返回服务器ip, 客户随机调度到不同的服务器,可以访问到相同的文件资源..
一台dns服务器
3台web服务器
2台nfs服务器
一台客户端
2台MySQL作为主从
2.10 停止本机所有共享与恢复
停止: exportfs -au
恢复: exportfs -a
2.11 指定nfs挂载的版本
CentOS7默认是4.1版本
mount -o vers=3
通过mount确认
3 利用autofs实现自动挂载
效果: 访问某一个文件夹时, 会自动触发预先设定的挂载规则, 显示其目录的内容
利用autofs服务
1. 利用autofs
2. 安装autofs后利用自带的nfs挂载功能, 该功能也适用于临时挂载nfs,访问数据. 方便做测试.
案例: 设置/data/net目录就是预先定好的挂载目录, 将nfs上的/data/nfsdir2目录挂载到/net目录上.
- 安装autofs软件
[01:36:12 root@nfs-client ~]#yum -y install autofs
[01:59:41 root@nfs-client ~]#systemctl enable --now autofs.service
- 设置规则
[01:50:11 root@nfs-client ~]#rpm -ql autofs
/etc/auto.master # 该文件可以定义挂载逻辑
相对路径法: 把要挂载的文件目标, 和挂载点的对应关系, 拆分成两部分实现, auto.master只写挂载点的父目录
父目录: /data --> 写到/etc/auto.master文件, 表示本机的/data目录是挂载点的父目录, 至于/data内部具体挂载哪些目录, 由另外一个文件决定, 需要手动指定一个子配置文件, 在其中定义具体挂载到哪个目录
挂载点会自动创建
格式:
/etc/auto.master: /data /etc/test.autofs(子配置文件)
/etc/test.autofs: net 10.0.0.197:/data/nfsdir2
[02:00:01 root@nfs-client ~]#vim /etc/auto.master
/data /etc/test.autofs
[02:04:15 root@nfs-client ~]#vim /etc/test.autofs
net -fstype=nfs,rw 10.0.0.197:/data/nfsdir2
[02:05:08 root@nfs-client ~]#systemctl restart autofs
[02:07:56 root@nfs-client ~]#ll /data/net
total 16
-rwxrwxrwx 1 root root 5 Feb 12 00:14 b.txt
-rw-r--r-- 1 nfsnobody nfsnobody 4 Feb 12 00:58 file1.txt
-rw-r--r-- 1 root root 0 Feb 12 00:59 file2.txt
-rw-r--r-- 1 root root 3 Feb 12 01:28 testfile.txt
-rw-r--r-- 1 root root 3 Feb 12 01:28 test.txt
[02:08:18 root@nfs-client ~]#cd /data/net
[02:08:32 root@nfs-client /data/net]#touch filefile.txt
[02:08:36 root@nfs-client /data/net]#cat b.txt
test
对于NFS的资源, 利用autofs, 需要NFS赋予本机权限才行
autofs自带NFS功能, 对于NFS的资源, 如果有权限, 可以直接访问, 无需挂载
不过需要客户端也安装nfs-utils
auto.master文件中预先定义好了NFS资源的映射关系
/net -hosts
只要访问/net目录, 指明NFS服务器的地址, 就可以访问NFS上自己有权限的文件
[02:16:12 root@nfs-client ~]#ls /net/10.0.0.197/data/nfsdir1
a.txt
[02:16:21 root@nfs-client ~]#ls /net/10.0.0.197/data/nfsdir2
b.txt file1.txt file2.txt filefile.txt testfile.txt test.txt
绝对路径法
把父目录和挂载目录都在自配置文件中指定
vim /etc/auto.master
/- /etc/test.autofs
vim /etc/test.autofs
/data/net -fstype=nfs,rw 10.0.0.197:/data/nfsdir2
[02:18:32 root@nfs-client ~]#systemctl restart autofs
[02:18:37 root@nfs-client ~]#ll /data/net
total 16
-rwxrwxrwx 1 root root 5 Feb 12 00:14 b.txt
-rw-r--r-- 1 nfsnobody nfsnobody 4 Feb 12 00:58 file1.txt
-rw-r--r-- 1 root root 0 Feb 12 00:59 file2.txt
-rw-r--r-- 1 root root 0 Feb 12 02:08 filefile.txt
-rw-r--r-- 1 root root 3 Feb 12 01:28 testfile.txt
-rw-r--r-- 1 root root 3 Feb 12 01:28 test.txt
3.1 利用autofs实现自动挂载用户家目录
10.0.0.187 - NFS服务器
10.0.0.207 - client1
10.0.0.197 - client2
- 步骤1: 三台主机分别安装nfs-utils
yum -y install nfs-utils
- 步骤2: 两台client安装autofs
yum -y install autofs
- 步骤3: NFS上创建共享目录
[05:49:53 root@nfs ~]#mkdir -pv /data/home
mkdir: created directory ‘/data/home’
- 步骤4: 在NFS创建需要登录的用户, admin
[05:52:41 root@nfs ~]#useradd -d /data/home/admin -u 1111 admin
- 步骤5: NFS上编辑共享规则
[05:53:31 root@nfs ~]#vim /etc/exports
/data/home *(rw) # 将/data/home目录共享出来, 所有主机都可以挂载, 具有读写权限
[05:54:15 root@nfs ~]#exportfs -r
[05:55:15 root@nfs ~]#exportfs -v
/data/home <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)
- 步骤6: client1创建admin用户, 不要创建家目录
[05:51:47 root@client1 ~]#useradd -M -u 1111 admin
- 步骤7: 编辑autofs规则
[05:56:19 root@client1 ~]#vim /etc/auto.master
/home /etc/auto.home
[05:57:16 root@client1 ~]#vim /etc/auto.home
* -fstype=nfs 10.0.0.187:/data/home/&
[05:57:50 root@client1 ~]#systemctl restart autofs
- 步骤8: 三台服务器都开启nfs
systemctl enable --now nfs
- 步骤9: 切换到admin用户测试
[06:04:18 root@client1 ~]#su - admin
Last login: Fri Feb 12 06:03:12 CST 2021 on pts/0
[06:04:20 admin@client1 ~]$pwd
/home/admin
[06:02:01 root@nfs ~]#ll /data/home/
total 0
drwx------ 2 admin admin 62 Feb 12 05:53 admin # 只有admin有权限
- 步骤10: client1创建leader用户, 测试可自动挂载家目录
NFS: 在NFS创建时, 要指定家目录在/data/home/leader下
[06:11:26 root@nfs ~]#useradd -d /data/home/leader -u 3333 leader
client1: 客户端创建用户时, 不要创建家目录
[06:12:59 root@client1 ~]#useradd -M -u 3333 leader
[06:13:06 root@client1 ~]#su - leader
[06:13:10 leader@client1 ~]$pwd
/home/leader
- 步骤11: 此时, 各自的家目录只有自己能进
[06:13:11 leader@client1 ~]$cd /home/admin
-bash: cd: /home/admin: Permission denied
[06:13:38 leader@client1 ~]$ll /home
total 0
drwx------ 2 admin admin 83 Feb 12 06:07 admin
drwx------ 2 leader leader 62 Feb 12 06:11 leader
- 步骤12: client2上创建两个用户, 测试nfs自动挂载
[15:25:12 root@nfs ~]#useradd -d /data/home/user2222 -u 2222 user2222
[15:29:47 root@nfs ~]#useradd -d /data/home/user4444 -u 4444 user4444
[15:33:25 root@client2 ~]#vim /etc/auto.master
/home /etc/auto.home
[15:34:09 root@client2 ~]#vim /etc/auto.home
* -fstype=nfs 10.0.0.187:/data/home/&
[15:29:56 root@client2 ~]#useradd -M -u 2222 user2222
[15:30:01 root@client2 ~]#useradd -M -u 4444 user4444