nfs共享

实验环境:

服务端:192.168.36.158

客户端:192.168.36.159

iptables and selinux disabled

一.nfs(Net File System)简介

NFS分为和客户机两部分,每个主机都有自己的内核级服务:外部数据表示(XDR,eXternal Data Representation)、远程过程调用(RPC,Remote Procedure Call)、I/O监控程序和锁监控程序。每个主机还有自己的用户级服务。内核级服务和用户级服务都依赖于主机的功能:NFS客户机或者是NFS服务器。当然,还要依赖于每个主机使用的不同功能的配置文件(如果是服务器,则用的是/etc/exports配置文件,如果是客户机,则用的是/etc/fstab配置文件)。如果一台主机既是服务器又是客户机,那么它需要运行两个部分的服务。

  在服务器端,portmap、 mountd、 nfsd三个监控程序将在后台运行。portmap监控程序用来注册基于rpc的服务。当一个RPC的监控程序启动的时候,它告诉portmap监控程序它在哪一个端口进行侦听,并且它在进行什么样的RPC服务。当一个客户机向服务器提出一个RPC请求,那么它就会和portmap监控程序取得联系以确定RPC消息应该发往的端口号。而Mountd监控程序的功能是来读取服务器端的/etc/exportfs文件并且创建一个将服务器的本地文件系统导出的主机和网络列表,因而客户机的挂接(mount)请求都被定位到mountd监控程序(daemon)。当验证了服务器确实具有挂接所请求的文件系统的权限以后,mountd为请求的挂接点返回一个文件句柄。而nfsd监控程序则被服务器用来处理客户机端发过来的请求,由于服务器需要同时处理多个客户机的请求,所以在缺省情况下,在当中将会自动启动八个nfsd线程。当然,如果NFS服务器特别忙的时候,系统有可能根据实际情况启动三十个线程。

二.共享资源

/etc/exports参数详解

rw 可读写的权限

ro 只读的权限

no_root_squash 登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限

root_squash 在登入NFS主机使用目录的使用者如果是root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的UID与GID都会变成nobody那个身份

all_squash 不管登陆NFS主机的用户是什么都会被重新设定为nobody

anonuid 将登入NFS主机的用户都设定成指定的userid,此ID必须存在于/etc/passwd中

anongid 同anonuid,但是变成groupID就是了

sync 资料同步写入器中

async 资料会先暂时存放在内存中,不会直接写入硬盘

insecure 允许从这台机器过来的非授权访问

exportfs[-aruv] 参数

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

r 重新挂载/etc/exports 里面的设定,也同步的更新/etc/exports和/var/lib/nfs/xtab里面的内容 

u 卸载某一目录 

v 在export的时候,将分享的目录显示到荧屏上 

#exportfs -rv 重新export一次 

#exportfs -au 全部卸载 

服务端

# yum install -y nfs nfs-utils rpcbind

# /etc/init.d/rpcbind start

# /etc/init.d/nfs start

# mkdir /test

# cd /test/

# touch file{1..3}

# vim /etc/exports

/test 192.168.36.159(rw)

# exportfs -rv

# showmount -e localhost

Export list for localhost:

/test 192.168.36.159

客户端

# yum install -y nfs nfs-utils rpcbind

# showmount -e 192.168.36.158

Export list for 192.168.36.158:

/test 192.168.36.159

# mount 192.168.36.158:/test /mnt/

# df

192.168.36.158:/test 18208256 2638592 14638080 16% /mnt

cd /mnt/

# ls

file1 file2 file3

# rm -f file1

rm: cannot remove `file1': Permission denied

# touch file4

touch: cannot touch `file4': Permission denied

服务端

# ls -ld .

drwxr-xr-x. 2 root root 4096 Aug 19 04:30 .

# chmod 1777 .

# ls -ld .

drwxrwxrwt. 2 root root 4096 Aug 19 04:30 .

客户端

# touch file4

# ll

total 0

-rw-r--r--. 1 root root 0 Aug 19 04:30 file1

-rw-r--r--. 1 root root 0 Aug 19 04:30 file2

-rw-r--r--. 1 root root 0 Aug 19 04:30 file3

-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug 19 04:37 file4

# rm -f file4

服务端

/test 192.168.36.159(rw,no_root_squash)

# exportfs -rv

exporting 192.168.36.159:/test

客户端

在挂载目录mnt下

# touch file4

# ll

total 0

-rw-r--r--. 1 root root 0 Aug 19 04:30 file1

-rw-r--r--. 1 root root 0 Aug 19 04:30 file2

-rw-r--r--. 1 root root 0 Aug 19 04:30 file3

-rw-r--r--. 1 root root 0 Aug 19 04:52 file4

二.多个共享资源

服务端

根目录下创建目录/public和/public2

[root@test1 public]# mkdir /public2

[root@test1 public]# cd ../public2

[root@test1 public2]# touch file{2..5}

/public 192.168.36.159(rw,no_root_squash)

/public2 192.168.36.159(ro,sync)

[root@test1 ~]# exportfs -rv

exporting 192.168.36.159:/public2

exporting 192.168.36.159:/public

客户端

[root@test1 test]# showmount -e 192.168.36.158

Export list for 192.168.36.158:

/public2 192.168.36.159

/public 192.168.36.159

[root@test1 ~]# umount /mnt/

[root@test1 ~]# mount 192.168.36.158:/ /mnt/

192.168.36.158:/ 18208256 2780544 14496128 17% /mnt

[root@test1 ~]# cd /mnt/

[root@test1 mnt]# ls

public public2

[root@test1 mnt]# cd public

[root@test1 public]# ls

test test2

[root@test1 public2]# touch file1

touch: cannot touch `file1': Read-only file system

[root@test1 public2]# rm -f file2

rm: cannot remove `file2': Read-only file system