linux nfs 无权限

2020-04-06 13:22:29 m0_46756244 阅读数 66
  1. NFS和Samb服务主要是应用与局域网内,FTP服务可以应用在互联网上来使用
  2. 权限主要分两种,ro(默认,只读)rw(读写)sync(同步,必须加);客户端还可以用*来表示,就代表所有客户端都可以访问
  3. 在设置权限后,还应别忘了系统层面的权限设置,否则也会显示权限不够,没法操作,可以在系统层次上设置最大权限
  4. NFS服务不具备用户身份验证的功能,而是基于客户端的IP来进行认证的
  5. Exportfs命令,可以在不重启的情况下加载配置文件,使新的修改的配置项生效,exportfs命令的选项,-a(全部挂载或全部卸载),-r(重新挂载),-v(显示详细信息),一般是将这三个选项结合使用

NFS用户的身份映射:

  1. Nfsnobody nfs匿名用户,只要安装了nfs服务就会有这么一个用户,这个用户不允许登录系统,Anonymous(匿名)
  2. 在服务器上会有这么一个nfsnobody匿名用户,然后客户端在用nfs服务访问服务器上的共享目录时,就会被映射成这个用户来访问
  3. 作用就是客户端访问服务器的共享目录具有什么权限,就是相当于服务器给nfsnobody用户什么权限,但实际中,有些用户会被映射,而有些用户不会被映射,根据是否映射就分为三个情况,根据三个情况又有三个选项;一般不建议将共享目录的权限设为777
  4. 在/etc/exports配置文件中提供了几项,来确定是否将NFS客户端映射为nfsnobody用户:

·root_squash,当NFS客户端以root用户身份访问时,映射为NFS服务器的nfsnobody用户

·no_root_squash,当NFS客户端以root身份访问时,映射为NFS服务器的root用户,也就是要为超级用户保留权限,这个选项会存在严重的安全隐患,一般不建议采用。

·all_squash,无论NFS客户端以哪种用户身份访问,均映射为NFS服务器的nfsnobody用户。

这些选项添加在客户端选项中,起到对应的作用,服务器端可以根据用户映射这个原理,结合ACL来控制客户端对共享文档的权限。

  1. 用户身份重叠,指在NFS服务采用默认设置(root_squash)时,将root用户映射成匿名用户,如果在服务器端赋予某个用户对共享目录具有相应权限,而且在客户端正好也有一个相同UID的用户,那么当在客户端以该用户身份访问共享时,就会被映射成具有相同UID的用户,将自动具有服务器端对应的用户的权限,

这种情况仅对于Linux系统而言,因为区分不同用户的唯一标识就是UID,具有一定的偶然性,如何避免用户身份重叠?

  1. 在设置NFS共享时,建议采用“all_squash”选项,将所有使用共享目录的客户端都映射成匿名用户,这样就可以有效避免重叠问题。
  2. 严格控制NFS共享目录的系统权限,尽量不给普通用户提供权限。
2013-11-12 14:53:01 L_yangliu 阅读数 13922


Q:使用touch创建文件时,怎么报“Permission denied”或“权限不够”错误?

A:检查NFS服务端的共享目录,看属主和组是否为nfsnobody。如果不是,更改之,如下所示:(在NFS服务端所在系统上操作)

chown -R nfsnobody /vmsnfs

chgrp -R nfsnobody /vmsnfs

chown -R nfsnobody:nfsnobody /vmsnfs

2015-03-23 11:36:38 u013359794 阅读数 4898

文章三部分组成:

第一部分:

文章摘自:http://www.cnblogs.com/king-77024128/articles/2666230.html

安装nfs:

#sudo apt-get install nfs-kernel-server

ubuntu12.04中的已经是最新版本了,无需安装

打开/etc/exports文件,在末尾加入:

/home/kevin *(rw,sync,no_root_squash)

注:nfs允许挂载的目录及权限,在文件/etc/exports中进行定义,各字段含义如下:

/home/kevin:要共享的目录

* :允许所有的网段访问

rw :读写权限

sync:资料同步写入内在和硬盘

no_root_squash:nfs客户端共享目录使用者权限

重启服务:
#sudo /etc/init.d/portmap restart                 <---重启portmap,
#sudo /etc/init.d/nfs-kernel-server restart     <---重启nfs服务
#showmount -e                                          <---显示共享出的目录

注:nfs是一个RPC程序,使用它前,需要映射好端口,通过portmap设定

命令执行情况如下:

kevin@ubuntu:~$sudo /etc/init.d/portmap restart
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service portmap restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the restart(8) utility, e.g. restart portmap
portmap start/running, process 474


kevin@ubuntu:~$sudo /etc/init.d/nfs-kernel-server restart
 * Stopping NFS kernel daemon                                              [ OK ]
 * Unexporting directories for NFS kernel daemon...                   [ OK ]
 * Exporting directories for NFS kernel daemon...     

  exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/home/xgc".
  Assuming default behaviour ('no_subtree_check').
  NOTE: this default has changed since nfs-utils version 1.0.x
                                                                                 [ OK ]
 * Starting NFS kernel daemon                                       [ OK ]

kevin@ubuntu:~$showmount -e
Export list for xgc-VirtualBox:
/home/kevin *

 

现在可以在本机上试一下:
#sudo mount -t nfs localhost:/home/kevin /mnt

注:localhost为本机linux的IP地址

这样就把共享目录挂到了/mnt目录,取消挂载用:
#sudo umount /mnt

如果用在嵌入式设备上挂载,要加上参数-o nolock

我在开发板上使用的挂载命令:

mount -t nfs -o nolock 192.168.1.8:/home/kevin /mnt


第二部分:

文章摘自:http://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html


Linux NFS服务器的安装与配置

一、NFS服务简介

  NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

  NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

  NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

二、系统环境

系统平台:CentOS release 5.6 (Final)

NFS Server IP:192.168.1.108

防火墙已关闭/iptables: Firewall is not running.

SELINUX=disabled

三、安装NFS服务

NFS的安装是非常简单的,只需要两个软件包即可,而且在通常情况下,是作为系统的默认包安装的。

  • nfs-utils-* :包括基本的NFS命令与监控程序 
  • portmap-* :支持安全NFS RPC服务的连接

1、查看系统是否已安装NFS

系统默认已安装了nfs-utils portmap 两个软件包。

2、如果当前系统中没有安装NFS所需的软件包,需要手工进行安装。nfs-utils 和portmap 两个包的安装文件在系统光盘中都会有。

# mount /dev/cdrom /mnt/cdrom/
# cd /mnt/cdrom/CentOS/
# rpm -ivh portmap-4.0-65.2.2.1.i386.rpm 
# rpm -ivh nfs-utils-1.0.9-50.el5.i386.rpm
# rpm -q nfs-utils portmap

四、NFS系统守护进程

  • nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;
  • mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。
  • portmap:主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。

五、NFS服务器的配置

NFS服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。

NFS的常用目录

/etc/exports                           NFS服务的主要配置文件
/usr/sbin/exportfs                   NFS服务的管理命令
/usr/sbin/showmount              客户端的查看命令
/var/lib/nfs/etab                      记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab                      记录曾经登录过的客户端信息

NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。

/etc/exports文件内容格式:

<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]

a. 输出目录:

输出目录是指NFS系统中需要共享给客户机使用的目录;

b. 客户端:

客户端是指网络中可以访问这个NFS输出目录的计算机

客户端常用的指定方式

  • 指定ip地址的主机:192.168.0.200
  • 指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
  • 指定域名的主机:david.bsmart.cn
  • 指定域中的所有主机:*.bsmart.cn
  • 所有主机:*

c. 选项:

选项用来设置输出目录的访问权限、用户映射等。

NFS主要有3类选项:

访问权限选项

  • 设置输出目录只读:ro
  • 设置输出目录读写:rw

用户映射选项

  • all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
  • no_all_squash:与all_squash取反(默认设置);
  • root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
  • no_root_squash:与rootsquash取反;
  • anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
  • anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);

其它选项

  • secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
  • insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
  • sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
  • async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
  • wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
  • no_wdelay:若有写操作则立即执行,应与sync配合使用;
  • subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
  • no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

六、NFS服务器的启动与停止

在对exports文件进行了正确的配置后,就可以启动NFS服务器了。

1、启动NFS服务器

为了使NFS服务器能正常工作,需要启动portmap和nfs两个服务,并且portmap一定要先于nfs启动。

# service portmap start
# service nfs start

2、查询NFS服务器状态

# service portmap status
# service nfs status  

3、停止NFS服务器

要停止NFS运行时,需要先停止nfs服务再停止portmap服务,对于系统中有其他服务(如NIS)需要使用时,不需要停止portmap服务

# service nfs stop
# service portmap stop

4、设置NFS服务器的自动启动状态

对于实际的应用系统,每次启动LINUX系统后都手工启动nfs服务器是不现实的,需要设置系统在指定的运行级别自动启动portmap和nfs服务。

# chkconfig --list portmap
# chkconfig --list nfs

设置portmap和nfs服务在系统运行级别3和5自动启动。

# chkconfig --level 35 portmap on
# chkconfig --level 35 nfs on

七、实例

1、将NFS Server 的/home/david/ 共享给192.168.1.0/24网段,权限读写。

服务器端文件详细如下:

# vi /etc/exports

/home/david 192.168.1.0/24(rw)

2、重启portmap 和nfs 服务

# service portmap restart
# service nfs restart
# exportfs

3、服务器端使用showmount命令查询NFS的共享状态

# showmount -e    //默认查看自己共享的服务,前提是要DNS能解析自己,不然容易报错

# showmount -a    //显示已经与客户端连接上的目录信息

4、客户端使用showmount命令查询NFS的共享状态

# showmount -e NFS服务器IP

5、客户端挂载NFS服务器中的共享目录

命令格式

# mount NFS服务器IP:共享目录 本地挂载点目录

# mount 192.168.1.108:/home/david/ /tmp/david/

# mount |grep nfs

挂载成功。

查看文件是否和服务器端一致。

6、NFS的共享权限和访问控制

现在我们在/tmp/david/ 里面建立一个文件,看看权限是什么

# touch 20130103

这里出现Permission denied,是因为NFS 服务器端共享的目录本身的写权限没有开放给其他用户,在服务器端打开该权限。

# chmod 777 -R /home/david/

再次在客户端/tmp/david/ 里面建立一个文件

我用root 用户建立的文件,变成了nfsnobody 用户。

NFS有很多默认的参数,打开/var/lib/nfs/etab 查看分享出来的/home/david/ 完整权限设定值。

# cat /var/lib/nfs/etab

默认就有sync,wdelay,hide 等等,no_root_squash 是让root保持权限,root_squash 是把root映射成nobody,no_all_squash 不让所有用户保持在挂载目录中的权限。所以,root建立的文件所有者是nfsnobody。

下面我们使用普通用户挂载、写入文件测试。

# su - david

$ cd /tmp/david/

$ touch 2013david

普通用户写入文件时就是自己的名字,这也就保证了服务器的安全性。

  关于权限的分析

  1. 客户端连接时候,对普通用户的检查

    a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;

    b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;

    c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;

  2. 客户端连接的时候,对root的检查

    a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;

    b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;

    c. 如果没有明确指定,此时root用户被压缩为nfsnobody;

    d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组;

7、卸载已挂载的NFS共享目录

# umount /tmp/david/

八、启动自动挂载nfs文件系统

格式:

<server>:</remote/export> </local/directory> nfs < options> 0 0

# vi /etc/fstab

保存退出,重启系统。

查看/home/david 有没有自动挂载。

自动挂载成功。

九、相关命令

1、exportfs

如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:

  # exportfs [-aruv]

  -a 全部挂载或卸载 /etc/exports中的内容
  -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
  -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
  -v 在export的时候,将详细的信息输出到屏幕上。

具体例子:
  # exportfs -au 卸载所有共享目录
  # exportfs -rv 重新共享所有目录并输出详细信息

2、nfsstat

查看NFS的运行状态,对于调整NFS的运行有很大帮助。

3、rpcinfo

查看rpc执行信息,可以用于检测rpc运行情况的工具,利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些。

4、showmount

  -a 显示已经于客户端连接上的目录信息
  -e IP或者hostname 显示此IP地址分享出来的目录

5、netstat

可以查看出nfs服务开启的端口,其中nfs 开启的是2049,portmap 开启的是111,其余则是rpc开启的。

最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。

NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill 来结束,(-9 强制结束)

 

CentOS 6.3下Samba服务器的安装与配置

http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html


第三部分:ARM板子nfs挂载权限问题

ARM板子挂载nfs系统后,在板子上操作,其文件夹下总提示operation not permitted
解决方法:将文件夹所在组及所有者分别改为nogroup nobody
chown -R nobody ***
chgrp -R nogroup ***










2017-10-19 14:02:10 xiyang_1990 阅读数 12527

http://www.blogjava.net/gf7/archive/2012/12/12/392843.html


环境:

OS:Red Hat Linux As 5


1.服务器上创建共享目录
mkdir 
doc_share


2.编辑exports文件
vim /etc/exports
写入
/doc_share 
192.168.2.131/255.255.255.0(rw,sync)
格式是:
要共享的目录 
共享的IP及掩码或者域名(权限,同步更新)


3.启动服务
/etc/init.d/portmap restart
/etc/init.d/nfs restart
chkconfig nfs 
on
chkconfig portmap on

然后关闭防火墙以及更改Selinux关于NIS的选项
/etc/init.d/iptables stop (防护墙服务关闭)
chkconfig iptables off
system-config-selinux (设置selinux)


查看共享的东西
[root@rac1 
/]# exportfs -rv
exporting 192.168.2.131/255.255.255.0:/doc_share


试着在本机看能否加载
mount 
192.168.2.131:/doc_share /mnt

[root@rac1 doc_share]# echo 
aa>aa.txt
[root@rac1 doc_share]# ls
aa.txt
[root@rac1 /]# cd 
/mnt
[root@rac1 mnt]# ls
aa.txt


4.客户端
手工mount:
mount -o nolock 192.168.2.131:/doc_share 
/mnt
这个时候可以看到在节点1上内容了.
[root@rac2 
mnt]# cd /mnt
[root@rac2 mnt]# ls
aa.txt

自动mount:
编辑fstab文件,实现开机自动挂载
mount -t nfs IP:/目录 挂载到的目录 
(此为临时挂载)
如:
mount -t nfs 
192.168.0.9:/doce /doc
vim /etc/fstab 添加如下内容
192.168.2.131:/doc_share /mnt             nfs     
defaults        0 0



相关的一些命令:
showmout命令对于NFS的操作和查错有很大的帮助.
showmout 

-a:这个参数是一般在NFS SERVER上使用,是用来显示已经mount上本机nfs目录的cline机器.
-e:显示指定的NFS 
SERVER上export出来的目录.
例如: 
showmount -e 192.168.0.30 

Export list for localhost: 
/tmp * 
/home/linux *.linux.org 

/home/public (everyone) 
/home/test 192.168.0.100


exportfs命令:
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
exportfs 
[-aruv] 
-a :全部mount或者unmount /etc/exports中的内容 
-r :重新mount 
/etc/exports中分享出来的目录 
-u :umount 目录 
-v :在 export 
的时候,将详细的信息输出到屏幕上.
具体例子:
[root @test root]# exportfs 
-rv
 <==全部重新 export 一次! 
exporting 
192.168.0.100:/home/test 
exporting 192.168.0.*:/home/public 
exporting 
*.the9.com:/home/linux 
exporting *:/home/public 
exporting *:/tmp 

reexporting 192.168.0.100:/home/test to kernel

exportfs -au 
<==全部都卸载了
-------------------------------------------------------------------------------
今天在机器上配置NFS文件系统,在/etc/exports中加入以下信息:
    /testfs 10.0.0.0/8(rw)
    重启NFS服务以后,在客户机通过mount -o rw -t nfs 10.214.54.29:/testfs /rd1命令将网络文件mount到本地。执行完成之后,目录是可以访问了,但无法写入。感觉有点奇怪,明明在命令中指定可以写入了。于是到网上搜索资料,发现exports目录权限中,有这么一个参数no_root_squash。其作用是:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有                      root 的权限!。默认情况使用的是相反参数                     root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的                      UID 与 GID 都会变成 nobody 那个身份。
    因为我的客户端是使用root登录的,自然权限被压缩为nobody了,难怪无法写入。将配置信息改为:
    /testfs 10.0.0.0/8(rw,no_root_squash)
    据说有点不安全,但问题是解决了。 
    另外,在测试NFS文件系统时,会经常mount和umount文件,但有时会出现device is busy的错误提示。你肯定感到很奇怪,我明明没有使用啊,看看你当前所在的目录,是不是在mount的文件目录中?回退到上层目录重新umount,是不是OK了?

2016-08-01 21:33:46 iamonlyme 阅读数 34224

在客户机通过

mount -o rw -t nfs 192.168.192.204:/mnt/cephfs /mnt/nfs

命令将网络文件mount到本地。执行完成之后,目录是可以访问了,但无法写入。

分析:

     用户对目录的权限受两方面约束:NFS认证权限、Posix权限;

     NFS权限:

     NFS服务器器中exports中配置额读写、只读权限

     Posix权限:

     发现exports目录权限中,参数no_root_squash的其作用是:NFS客户端使用共享目录的用户,如果是root 的话,所有的操作均在服务器端映射为root用户,拥有共享目录的root权限!

     默认情况使用的是相反参数root_squash:在登入 NFS 主机export目录的使用者如果当root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个身份。

因为客户端是使用root登录的,自然权限被压缩为nobody了,难怪无法写入。

将配置信息改为:

/mnt/cephfs 192.168.192.0/8(rw,no_root_squash)
据说有点不安全,但问题是解决了。