思考一:让 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