cifs、nfs同时共享同一目录时权限冲突问题
场景描述
有一台奇怪的设备A,这台设备只能通过NFS挂载服务端的目录,不支持通过CIFS挂载,于是我们做了一个NFS的服务端B,A通过NFS挂载B共享的目录,然后在A上执行操作后会产生一个txt文件,默认情况下,此文件的属主、属组是nfsnobody。
我们需要在一台windows电脑C上打开编辑A产生的这一个txt文件,于是我们在B上又起了SMB服务,以方便windows打开和编辑这一个文件,但现在问题是:
A写入时是的属主、属组是nfsnobody,但通过SMB访问此目录时的用户却因为不是nfsnobody所以打不开此文件,怎么办?
如果是临时解决很好办,直接chmod 777 完事儿,但如果这种类型的文件源源不断的产生,有什么好用的长期办法呢?
解决思路
思路一:既然NFS写入文件的属主和属组是nfsnobody,那我们在做SMB共享的时候也用这一个用户,那问题不就解决了。
思路二:如果SMB写入时用的是某用户,那让在NFS客户端写入时也用同样的用户,问题也能解决。
思路三:创建一个专门的用户,这个用户专门用于NFS和SMB(下面用这个方法做演示)
操作演示
- NFS操作演示
## NFS-SERVER
# 准备一个公用的账号nfsmb,不允许直接登录
[root@NFS-SERVER ~]# useradd nfsmb -s /sbin/nologin
# 查看nfsmb用户的uid和gid
[root@share ~]# grep nfsmb /etc/passwd
nfsmb:x:1000:1000::/home/nfsmb:/sbin/nologin
# 安装配置nfs-server
[root@share ~]# mkdir -p /data/share
[root@share ~]# yum -y install nfs-utils &>/dev/null
[root@share ~]# echo $?
0
[root@share ~]# cat /etc/exports
/data/share 192.168.80.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
# 注意,最好是不要用restart,而是先stop,然后再start
[root@share ~]# systemctl stop nfs-server
[root@share ~]# systemctl status nfs-server
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: inactive (dead) since Sat 2022-03-12 00:36:02 EST; 5s ago
Process: 1583 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
Process: 1581 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
Process: 1580 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
Process: 1565 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
Process: 1548 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 1547 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 1548 (code=exited, status=0/SUCCESS)
Mar 12 00:35:27 share systemd[1]: Starting NFS server and services...
Mar 12 00:35:27 share systemd[1]: Started NFS server and services.
Mar 12 00:36:02 share systemd[1]: Stopping NFS server and services...
Mar 12 00:36:02 share systemd[1]: Stopped NFS server and services.
[root@share ~]# systemctl start nfs-server
# 验证是否生效
[root@share ~]# cat /var/lib/nfs/etab
/data/share 192.168.80.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
[root@share ~]# setfacl -m u:nfsmb:rwx /data/share/
- SMB操作演示
## SMB-SERVER,与NFS-SERVER其实是一台机器
[root@share ~]# yum -y install samba &> /dev/null
[root@share ~]# echo $?
0
[root@share ~]# tail -4 /etc/samba/smb.conf
[share]
path = /data/share
write list = nfsmb
guest ok = no
[root@share ~]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
[root@share ~]# smbpasswd -a nfsmb
[root@share ~]# smbpasswd -e nfsmb
[root@share ~]# systemctl start smb ; systemctl start nmb echo $?
0
# 注意保持hostname和hosts文件一致性
- 客户端尝试
# 先找一个linux客户端尝试
[root@c72 ~]# showmount -e 192.168.80.130
Export list for 192.168.80.130:
/data/share 192.168.80.0/24
[root@c72 ~]# mount -t nfs 192.168.80.130:/data/share /mnt
[root@c72 ~]# echo 123 > /mnt/text.txt
[root@c72 ~]# rm -rf /mnt/text.txt
[root@c72 ~]# echo 456 > /mnt/text.txt
[root@c72 ~]# ll /mnt/text.txt
-rw-r--r-- 1 1000 1000 4 Mar 12 00:50 /mnt/text.txt
再找一个windows的客户端,读写删除都没有问题
- 再去服务端上查看,会发现是无论通过nfs还是通过smb写入的文件全都以nfsmb用户写入的,实验成功,如下所示:
[root@share share]# ll
total 12
-rwxr--r-- 1 nfsmb nfsmb 10846 Mar 12 00:47 default_2022-03-11_18-56-23.log
-rw-r--r-- 1 nfsmb nfsmb 0 Mar 12 01:04 linux.txt