一、NFS服务和RPC
1、NFS启动的时候会启用未被使用的小于 1024 的端口作为监听传输使用,,并主动的向 RPC 注册,因此RPC知道NFS对应使用的端口。
2、RPC使用固定的port 111端口来监听用户端的需求并且回报给用户端正确的NFS端口。让用户端可以连结到正确的NFS端口上。
所以:NFS服务必须启动RPC服务
二、NFS的安装
[root@linux ~]# rpm -qa | grep portmap
portmap-4.0-65.2.2.1
[root@linux ~]# rpm -qa | grep nfs
system-config-nfs-1.3.23-1.el5
nfs-utils-lib-1.0.8-7.2.z2
nfs-utils-1.0.9-33.el5
如果没有以上的文件。则通过 install nfs-utils 安装
三、NFS的档案存取权限
当 用户dmtsai 进入去访问到NFS共享目录后,所以可能就会发现几个情况∶
NFS server/NFS client 刚好有相同的帐号与群组
则此时使用者可以直接以 dmtsai 的身份进行伺服器所提供的档案系统之存取。
NFS server 的 501 这个 UID 帐号对应为 vbird
若 NFS 伺服器上的 /etc/passwd 里面 UID 501 的使用者名称为 vbird 时, 则用户端的 dmtsai 可以存取伺服器端的 vbird 这个使用者的档案喔!只因为两者具有相同的 UID 而已。这就造成很大的问题了!因为没有人可以保证用户端的 UID 所对应的帐号会与伺服器端相同, 那伺服器所提供的资料不就可能会被错误的使用者乱改?
NFS server 并没有 501 这个 UID
另一个极端的情况是,在伺服器端并没有 501 这个 UID 的存在,则此时 dmtsai 的身份在该目录下会被压缩成匿名者, 一般 NFS 的匿名者会以 UID 为 65534 为其使用者,早期的 Linux distributions 这个 65534 的帐号名称通常是 nobody ,我们的 CentOS 则取名为 nfsnobody 。
如果使用者身份是 root 时
有个比较特殊的使用者,那就是每个 Linux 主机都有的 UID 为 0 的 root 。 想一想,如果用户端可以用 root 的身份去存取伺服器端的档案系统时,那伺服器端的资料哪有什么保护性? 所以在预设的情况下, root 的身份会被主动的压缩成为匿名者。
四、NFS服务的配置文档
[root@linux ~]# vi /etc/exports
/tmp *(rw,no_root_squash,sync)
/home/public 192.168.1.0/24(rw,sync) *(ro,sync)
/home/test 192.168.1.100(rw,sync)
/home/linux *.zwt.com(rw,all_squash,anonuid=502,anongid=502,sync)
权限参数说明∶
rw∶read-write,可读写的权限;
ro∶read-only,只读的权限;
sync∶资料同步写入到记忆体与硬盘当中;
async∶资料会先暂存于记忆体当中,而非直接写入硬盘!
no_root_squash∶
如果登录NFS 主机使用分享目录的用户是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限! 这个项目不安全,不建议使用!
root_squash∶
在如果登录NFS 主机使用分享目录的用户是 root 的,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody(nfsnobody) 那个系统帐号的身份;
all_squash∶
不论登录 NFS 的用户身份为何, 他的身份都会被压缩成为匿名使用者,通常也就是 nobody(nfsnobody)
anonuid∶
anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名使用者的 UID 设定值,通常为 nobody(nfsnobody),但是您可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于您的 /etc/passwd 当中!
anongid∶同 anonuid ,但是变成 group ID 就是了!
依照上文编辑的exports后,权限会是什么情况呢?让我们来检查一下∶
用户端与主机端具有相同的 UID 与帐号∶
假设我在 192.168.1.100 登入这部 NFS (IP 假设为 192.168.1.2) 主机,并且我在 192.168.1.100 的帐号为 dmtsai 这个身份,同时,在这部 NFS 上面也有 dmtsai 这个帐号, 并具有相同的 UID ,果真如此的话,那么∶
- 由于 192.168.1.2 这部 NFS 主机的 /tmp 权限为 -rwxrwxrwt ,所以我 (dmtsai 在 192.168.1.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.1.100 的身份为 vbird ,但是 192.168.1.2 这部 NFS 主机却没有 vbird 这个帐号时,情况会变成怎样呢?
- 我在 /tmp 底下还是可以写入,但是写入的档案所有人变成 nobody 了;
- 我在 /home/public 里面是否可以写入,还需要视 /home/public 的权限而定,不过,反正我的身份就被变成 nobody 了就是;
- /home/test 的观点与 /home/public 相同!
- /home/linux 底下,我的身份就被变成 UID = 40 那个使用者就是了!
当用户端的身份为 root 时∶
假如我在 192.168.1.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 的那个使用者了!
[root@linux ~]# /etc/init.d/portmap start
# portmap 根本就不需要设定!只要直接启动他就可以啦!启动之后,会出现一个 port 111 的 sunrpc 的服务,那就是 portmap 啦!也就是RPC服务。
[root@linux ~]# /etc/init.d/nfs start
[root@linux ~]# /etc/init.d/nfslock start(增加一些 NFS 伺服器的资料一致性功能)
[root@linux nfs]# /etc/init.d/nfslock restart
Stopping NFS locking: [ OK ]
Stopping NFS statd: [ OK ]
Starting NFS statd: [ OK ]
五、NFS应用的相关命令
1、查看下RPC服务的注册状态
[root@linux nfs]# rpcinfo -p localhost(查看下RPC服务的注册状态)
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 868 status
100024 1 tcp 871 status
100011 1 udp 796 rquotad
100011 2 udp 796 rquotad
100011 1 tcp 799 rquotad
100011 2 tcp 799 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 32771 nlockmgr
100021 3 udp 32771 nlockmgr
100021 4 udp 32771 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 33250 nlockmgr
100021 3 tcp 33250 nlockmgr
100021 4 tcp 33250 nlockmgr
100005 1 udp 823 mountd
100005 1 tcp 826 mountd
100005 2 udp 823 mountd
100005 2 tcp 826 mountd
100005 3 udp 823 mountd
100005 3 tcp 826 mountd
可以发现
- portmap 启动的 port 在 111;
- NFS 启动的 port 在 2049;
- 其他 rpc.daemons 启动的 port 则是随机产生的,因此需向 port 111 注册。
2、查看NFS服务关于目录权限设定的资料(可以看到一些默认的权限参数。比如root_squash,no_all_squash,anonuid=65534等。)
[root@linux nfs]# tail /var/lib/nfs/etab
/home/public 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/home/test 192.168.1.100(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/home/linux *.zwt.com(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=502,anongid=502)
/home/public *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/tmp *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
3、显示设定的NFS共享(exports资料内容)
[root@linux nfs]# showmount -e localhost
Export list for localhost:
/tmp *
/home/linux *.zwt.com
/home/test 192.168.1.100
/home/public (everyone)
4、重新挂载一次 /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
六、NFS用户端使用。
你要如何挂载 NFS 伺服器所提供的档案系统呢?基本上,可以这样做∶
- 确认本地端已经启动了 portmap 服务!
- 扫瞄 NFS 伺服器分享的目录有哪些,并了解我们是否可以使用 ();
- 在本地端建立预计要挂载的挂载点目录 (mkdir);
- 利用 mount 将远端主机直接挂载到相关目录。
[root@linux ~]# /etc/init.d/portmap start
[root@linux ~]# /etc/init.d/nfslock start
# 一般来说,系统预设会启动 portmap ,不过鸟哥之前关闭过,所以要启动。
# 另外,如果伺服器端有启动 nfslock 的话,用户端也要启动才能生效!
[root@linux ~]# showmount -e NFSserver的IP
[root@linux ~]# mkdir -p /home/nfs/public
[root@linux ~]# mount -t nfs 192.168.1.2:/home/public /home/nfs/public
# 注意一下挂载的语法!『 -t nfs 』指定档案系统类型,
# IP:/dir 则是指定某一部主机的某个提供的目录!
[root@linux ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
....中间省略....
192.168.1.2:/home/public
1984032 36800 1844800 2% /home/nfs/public
[root@linux ~]# umount /home/nfs/public
此外。除了 NFS 服务器需要保护之外,我们取用人家的 NFS 档案系统也需要自我保护才行啊! 那要如何自我保护啊?可以透过 mount 的指令参数来做。
[root@linux nfs]# umount /home/nfs/public
[root@linux nfs]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda7 10371664 3385124 6451176 35% /
/dev/sda5 1984016 36812 1844792 2% /home
/dev/sda3 4956316 204208 4496276 5% /var
/dev/sda2 4956316 141220 4559264 4% /opt
/dev/sda1 101086 12512 83355 14% /boot
tmpfs 237656 0 237656 0% /dev/shm
[root@linux nfs]# mount -t nfs -o nosuid,noexec,nodev,rw \
> 192.168.1.2:/home/public /home/nfs/public
# 通常这样你所挂载的这个档案系统就只能作为资料存取之用了
[root@linux nfs]# mount
省略...
192.168.1.2:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,addr=192.168.1.2)
更多的参数可以参考 man nfs 。
* 将 NFS设置 开机即挂载
[root@linux ~]# vi /etc/fstab
192.168.0.2:/home/public /home/nfs/public nfs nosuid,noexec,nodev,rw,
bg,soft,rsize=32768,wsize=32768 0 0
七、使用将NFS自动挂载卸载功能。
当有客户端数据包需求的时候,则自动挂载NFS服务端得共享目录,超过一定时间后,客户端则主动卸载。
可以使用autonfs功能。
1、首先在用户端编辑/etc/auto.master
[root@linux ~]# vi /etc/auto.master
/home/nfs /etc/auto.nfs
# 内容很简单,只要有用户端的用来提供挂载的主目录和 一个挂载内容的文件即可。 这个文件名可以自行设定的,通常可使用 /etc/auto.nfs 来命名
2、建立并编辑这个 提供挂载内容信息的文件。
[root@linux ~]# vi /etc/auto.nfs
public -rw,bg,soft,rsize=32768,wsize=32768 192.168.1.2:/home/public
test -rw,bg,soft,rsize=32768,wsize=32768 192.168.1.2:/home/test
temp -rw,bg,soft,rsize=32768,wsize=32768 192.168.1.2:/tmp
/home/nfs/public
/home/nfs/test
/home/nfs/temp
可以不需要提前建立的
3、启动服务并使用
[root@linux ~]# /etc/init.d/autofs start
[root@linux ~]# cd /home/nfs/public
[root@linux ~]# mount; df
不会有跟192.168.1.2有关的NFS挂载信息
[root@linux public]# pwd
/home/nfs/public
#这个目录产生了,如果mount;df一下的话,
也能看到跟192.168.1.2有关挂载信息了。