NFS的一些思考

思考一:让 root 保有 root 的权限

 

我想将/tmp 分享出去给大家使用,由于这个目录本来就是大家都可以读写的,因此想让所有的

人都可以存取。此外,我要让 root 写入的档案还是具有 root 的权限,那如何设计配置文件?

[root@linux ~]# vi /etc/exports

# 任何人都可以用我的 /tmp ,用通配符来处理主机名,重点在 no_root_squash

/tmp *(rw,no_root_squash)

 

参考前面的主机名设定说明,我们可以利用通配符的。这表示无论来自哪里都可以使用我的

/tmp 这个目录。再次提醒,『*(rw,no_root_squash) 』这一串设定值中间是没有空格符的

喔!而 /tmp *(rw,no_root_squash) 则是有空格符来隔开的!特别注意到那个

no_root_squash 的功能!在这个例子中,如果你是客户端,而且您是以 root 的身份登入您的

Linux 主机,那么当您 mount 上我这部主机的 /tmp 之后,您在该 mount 的目录当中,将具有

root 的权限!』

 

 

思考二:同一目录针对不同范围开放不同权限

 

我要将一个公共的目录 /home/public 公开出去,但是只有限定我的局域网络内 192.168.0.0/24

这个网域可以读写,其他人则只能读取:

[root@linux ~]# vi /etc/exports

/tmp          *(rw,no_root_squash)

/home/public  192.168.0.0/24(rw)    *(ro)

# 继续累加在后面,注意,我有将主机与网域分为两段 (用空白隔开) 喔!

 

上面的例子说的是,当我的 IP 是在 192.168.0.0/24 这个网段的时候,那么当我在 Client

挂载了 Server 端的 /home/public 后,针对这个被我挂载的目录我就具有可以读写的权限~至

于如果我不是在这个网段之内,那么这个目录的数据我就仅能读取而已,亦即为只读的属性啦!

 

需要注意的是,之前鸟哥将主机名的通配符与 IP 网段搞错了!通配符仅能用在主机名

的分辨上面,IP 或网段就只能用 192.168.0.0/24 的状况,不可以使用 192.168.0.* 喔!

 

 

思考三:仅给某个单一主机使用的目录设定

 

我要将一个私人的目录 /home/test 开放给 192.168.0.100 这个 Client 端的机器来使用,那么

我就必需这么写:

[root@linux ~]# vi /etc/exports

/tmp          *(rw,no_root_squash)

/home/public  192.168.0.0/24(rw)    *(ro)

/home/test    192.168.0.100(rw)

# 只要设定 IP 正确即可!

 

这样就设定完成了!而且,只有 192.168.0.100 这部机器才能对 /home/test 这个目录进行存取

喔!

 

 

思考四:开放匿名登录的情况

 

我要让 *.linux.org 网域的主机,登入我的 NFS 主机时,可以存取 /home/linux ,但是他们存

资料的时候,我希望他们的 UID GID 都变成 40 这个身份的使用者,假设我 NFS 服务器上

UID 40 已经有设定妥当:

[root@linux ~]# vi /etc/exports

/tmp          *(rw,no_root_squash)

/home/public  192.168.0.0/24(rw)    *(ro)

/home/test    192.168.0.100(rw)

/home/linux  *.linux.org(rw,all_squash,anonuid=40,anongid=40)

# 如果要开放匿名,那么重点是all_squash,并且要配合 anonuid 喔!

 

特别注意到那个 all_squash anonuid, anongid 的功能!如此一来,当 test.linux.org

入这部 NFS 主机,并且在 /home/linux 写入档案时,该档案的所有人与所有群组,就会变成

/etc/passwd 里面对应的 UID 40 的那个身份的使用者了!

 

 

上面四个案例的权限如果依照前一小节的存取设定权限来思考的话,那么权限会是什么情况呢?

让我们来检查一下:

 

 

客户端与主机端具有相同的 UID 与账号:

 

假设我在 192.168.0.100 登入这部 NFS (IP 假设为 192.168.0.2) 主机,并且我在

192.168.0.100 的账号为 dmtsai 这个身份,同时,在这部NFS 上面也有 dmtsai 这个账号,

并具有相同的 UID ,果真如此的话,那么:

 

由于 192.168.0.2 这部 NFS 主机的 /tmp 权限为 -rwxrwxrwt ,所以我 (dmtsai

192.168.0.100 上面) /tmp 底下具有存取的权限,并且写入的档案所有人为 dmtsai

/home/public 当中,由于我有读写的权限,所以如果在 /home/public 这个目录的权限对于

dmtsai 有开放写入的话,那么我就可以读写,并且我写入的档案所有人是 dmtsai 。但是万一

/home/public 对于 dmtsai 这个使用者并没有开放可以写入的权限时,那么我还是没有办法写

入档案喔!这点请特别留意!

/home/test 当中,我的权限与 /home/public 相同的状态!还需要 NFS 主机的 /home/test

对于 dmtsai 有开放权限;

/home/linux 当中就比较麻烦!因为不论您是何种 user ,您的身份一定会被变成 UID=40

个账号!所以,这个目录就必需要针对 UID = 40 的那个账号名称,修改他的权限才行!

客户端与主机端的账号并未相同时:

 

假如我在 192.168.0.100 的身份为 vbird ,但是 192.168.0.2 这部 NFS 主机却没有 vbird

个账号时,情况会变成怎样呢?

 

我在 /tmp 底下还是可以写入,但是写入的档案所有人变成 nobody 了;

我在 /home/public 里面是否可以写入,还需要视 /home/public 的权限而定,不过,反正我的

身份就被变成 nobody 了就是;

/home/test 的观点与 /home/public 相同!

/home/linux 底下,我的身份就被变成 UID = 40 那个使用者就是了!

当客户端的身份为 root 时:

 

假如我在 192.168.0.100 的身份为 root 呢? root 这个账号每个系统都会有呀!权限变成怎样

呢?

 

我在 /tmp 里面可以写入,并且由于 no_root_squash 的参数,改变了预设的 root_squash 设定

值,所以在 /tmp 写入的档案所有人为 root 喔!

我在 /home/public 底下的身份还是被压缩成为 nobody 了!因为默认属性里面都具有

root_squash 呢!所以,如果 /home/public 有针对 nobody 开放写入权限时,那么我就可以写

入,但是档案所有人变成 nobody 就是了!

/home/test /home/public 相同;

/home/linux 的情况中,我 root 的身份也被压缩成为 UID= 40 的那个使用者了!

这样的权限讲解之后,您可以了解了吗?这里是最重要的地方,如果这一关通过了,底下的咚咚

就没有问题啦! ^_^!当然啦,您还是得要回到前一小节NFS 的档案访问权限好好的瞧一瞧,

才能解决 NFS 的问题喔!

 

 

--------------------------------------------------------------------------------

启动 NFS

 

配置文件搞定后,当然要开始来启动才行啊!而前面我们也提到过,NFS 的启动还需要 portmap

协助才行啊!所以赶紧来启动吧!

[root@linux ~]# /etc/init.d/portmap start

# 如果 portmap 本来就已经在执行了,那就不需要启动啊!

 

[root@linux ~]# /etc/init.d/nfs start

# 有时候可能会出现如下的警告讯息:

exportfs: /etc/exports [3]: No 'sync' or'async' option specified

for export"192.168.0.100:/home/test".

 Assuming default behaviour ('sync').

# 上面的警告讯息仅是在告知因为我们没有指定sync async 的参数,

# NFS 将默认会使用 sync 的信息而已。妳可以不理他,也可以加入 /etc/exports

 

[root@linux ~]# vi /etc/exports

/tmp          *(rw,no_root_squash,sync)

/home/public  192.168.0.0/24(rw,sync)    *(ro,sync)

/home/test    192.168.0.100(rw,sync)

/home/linux  *.linux.org(rw,all_squash,anonuid=40,anongid=40,sync)

 

[root@linux ~]# /etc/init.d/nfs restart

 

那个 portmap 根本就不需要设定!只要直接启动他就可以啦!启动之后,会出现一个 port 111

sunrpc 的服务,那就是 portmap 啦!至于 nfs 则会启动至少两个以上的 daemon 出现!然

后就开始在监听 Client 端的需求啦!你必须要很注意屏幕上面的输出信息,因为如果配置文件写

错的话,屏幕上会显示出错误的地方喔!

 

此外,如果妳想要增加一些 NFS 服务器的数据一致性功能时,可能需要用到 rpc.lockd

rpc.statd RPC 服务,那么或许妳可以增加一个服务,那就是nfslock

[root@linux ~]# /etc/init.d/nfslock start

 

启动之后,请赶快到 /var/log/messages 里面看看有没有被正确的启动呢?

[root@linux ~]# vi /var/log/messages

Sep 22 00:01:37 linux nfs: Starting NFSservices:  succeeded

Sep 22 00:01:37 linux nfs: rpc.rquotadstartup succeeded

Sep 22 00:01:37 linux nfsd[1050]:nfssvc_versbits: +2 +3 +4

Sep 22 00:01:37 linux nfs: rpc.nfsd startupsucceeded

Sep 22 00:01:37 linux nfs: rpc.mountdstartup succeeded

Sep 22 00:01:37 linux rpcidmapd: rpc.idmapd-SIGHUP succeeded

 

在确认没有问题之后,接下来我们来瞧一瞧那么 NFS 到底开了哪些埠口?

[root@linux ~]# netstat -ultn

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address  Foreign Address State   PID/Program name

tcp       0      0 0.0.0.0:2049   0.0.0.0:*       LISTEN -

tcp       0      0 0.0.0.0:803    0.0.0.0:*       LISTEN 1047/rpc.rquotad

tcp       0      00.0.0.0:111    0.0.0.0:*       LISTEN 32503/portmap

tcp       0      0 0.0.0.0:819    0.0.0.0:*       LISTEN 1064/rpc.mountd

udp       0      0 0.0.0.0:2049   0.0.0.0:*               -

udp       0      0 0.0.0.0:800    0.0.0.0:*               1047/rpc.rquotad

udp       0      0 0.0.0.0:816    0.0.0.0:*               1064/rpc.mountd

udp       0      0 0.0.0.0:111    0.0.0.0:*               32503/portmap

 

注意看到上面喔!总共产生了好多的 port 喔!真是可怕!不过主要的埠口是:

 

portmap 启动的 port 111

NFS 启动的 port 2049

其他 rpc.daemons 启动的 port 则是随机产生的,因此需向 port 111 注册。

好了,那我怎么知道每个 RPC 服务的注册状况?没关系,妳可以使用 rpcinfo 来处理的。

[root@linux ~]# rpcinfo [-p] [IP|hostname]

参数:

-p :显示出所有的 port porgram 的信息;

 

范例一:显示出目前这部主机的 RPC 状态

[root@linux ~]# rpcinfo -p localhost

  program vers proto   port

   100000    2   tcp    111 portmapper

   100000    2   udp   111  portmapper

   100011    1   udp   800  rquotad

   100011    2   udp   800  rquotad

   100011    1   tcp   803  rquotad

   100011    2   tcp   803  rquotad

   100003    2   udp  2049  nfs

   100003    3   udp  2049  nfs

   100003    2   tcp  2049  nfs

   100003    3   tcp  2049  nfs

   100005    1   udp   816  mountd

   100005    1   tcp   819  mountd

   100005    2   udp   816  mountd

    100005   2   tcp    819 mountd

   100005    3   udp   816  mountd

   100005    3   tcp   819  mountd

#        NFS版本       埠口  服务名称

 

仔细瞧瞧,上面出现的信息当中除了程序名称与埠口的对应可以与 netstat -tlunp 输出的结果

作比对之外,还需要注意到 NFS 的版本支持!新的 NFS 版本传输速度较快,由上表看起来,我

们的 NFS 至少支持到第 3 版,应该还算合理啦! ^_^!如果妳的 rpcinfo 无法输出,那就表

示注册的数据有问题啦!可能需要重新启动 portmap nfs 喔!

 

 

 

--------------------------------------------------------------------------------

NFS 的联机观察

 

在妳的 NFS 服务器设定妥当之后,我们可以先自我测试一下是否可以联机喔!就是利用

showmount 这个指令来查阅!

[root@linux ~]# showmount [-ae][hostname|IP]

参数:

-a :显示目前主机与客户端的 NFS 联机分享的状态;

-e :显示某部主机的 /etc/exports所分享的目录数据。

 

范例一:请显示出刚刚我们所设定好的相关 exports 信息

[root@linux ~]# showmount -e localhost

Export list for localhost:

/tmp        *

/home/linux *.linux.org

/home/public (everyone)

/home/test  192.168.0.100

 

很简单吧!所以,当您要扫瞄某一部主机他提供的 NFS 分享的目录时,就使用 showmount -e IP

(hostname) 即可!非常的方便吧!这也是NFS client 端最常用的指令喔!

 

事实上 NFS 关于目录权限设定的数据非常之多!我们可以检查一下 /var/lib/nfs/etab 就知道

了!

[root@linux ~]# tail /var/lib/nfs/etab

/home/public   *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,

subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)

# 上面是同一行,可以看出除了 ro,sync, root_squash 等等,

# 其实还有 anonuid anongid 等等的设定!

 

/tmp   *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,subtr

ee_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2)

# 同样的,在 /tmp 也有很多的权限相关的参数喔!

 

上面仅仅是一个小范例,只是....怎么 anonuid 会是 -2 啊?其实那个数值是 65536-2 啦!所

以得到 65534 ,比对 /etc/passwd ,会发现 CentOS 出现的是 nfsnobody 啦!这个账号在不

同的版本都可能会不一样的!另外,如果有其他客户端挂载了妳的 NFS 文件系统时,那么该用

户端与文件系统信息就会被记录到 /var/lib/nfs/xtab 里头去的!

 

另外,如果妳想要重新处理 /etc/exports 档案,当重新设定完 /etc/exports 后需不需要重新

启动 nfs ?不需要啦!如果重新启动 nfs 的话,要得要向 RPC 注册!很麻烦~这个时候我们

可以透过 exportfs 这个指令来帮忙喔!

[root@linux ~]# exportfs [-aruv]

参数:

-a :全部挂载(或卸除)/etc/exports 档案内的设定

-r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports

     /var/lib/nfs/xtab 的内容!

-u :卸除某一目录

-v :在 export 的时候,将分享的目录显示到屏幕上!

 

范例一:重新挂载一次 /etc/exports 的设定

[root@linux ~]# exportfs -arv

exporting 192.168.0.100:/home/test

exporting 192.168.0.0/24:/home/public

exporting *.linux.org:/home/linux

exporting *:/home/public

exporting *:/tmp

 

范例二:全部都卸除

[root@linux ~]# exportfs -auv

 

要熟悉一下这个指令的用法喔!这样一来,就可以直接重新 exportfs 我们的记录在

/etc/exports 的目录数据

 

 

[root@linux ~]# showmount -e 192.168.0.2

Export list for 192.168.0.2:

/tmp        *

/home/linux *.linux.org

/home/public (everyone)   <==这是等一下我们要挂载的目录

/home/test  192.168.0.100

 

[root@linux ~]# mkdir -p /home/nfs/public

 

 

[root@linux ~]# mount -t nfs -o nolock192.168.0.2:/home/public /home/nfs/public

# 注意一下挂载的语法!『 -t nfs 』指定文件系统类型,

# IP:/dir 则是指定某一部主机的某个提供的目录!

 

[root@linux ~]# df

Filesystem    1K-blocks      Used Available Use% Mounted on

....中间省略....

192.168.0.2:/home/public

               10080512   2135072  7433344  23% /home/nfs/public

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值