• cifs、nfs共享同一目录时权限问题


    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
    
  • 相关阅读:
    最简单的 Java内存模型 讲解
    Chrome快捷键吐血整理
    【并发编程】InheritableThreadLocal使用详解
    【并发编程】Object的wait、notify和notifyAll方法
    【并发编程】Thread类的详细介绍
    【软件工具】easyExcel简明使用指南
    【并发编程】实现多线程的几种方式
    【并发编程】Java并发编程传送门
    CODING 研发管理系统上线全球加速,助力企业跨区域协作
    上帝的归上帝,凯撒的归凯撒—— CODING 权限管理更新
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/15997141.html
Copyright © 2020-2023  润新知