- 论坛徽章:
- 0
|
NFS(Network File System)网络文件系统,主要用在Unix Like主机间共享文件。NFS服务器可以让你将网络远端的NFS主机共享的目录挂载到本地端,在本地端机器上看远程NFS共享的目录就像本地端自己的一个分区一样。
![]()
NFS与RPC:
NFS (NFS守护进程打开端口2049)支持的功能很多,每启用一个功能,就会随机打开一个小于1024的未用端口,这样就造成客户端由于不知道NFS启动的端口号而不能连上NFS服务器。所以NFS服务器需要依赖于RPC服务,NFS启动时主动向RPC注册端口号,并且RPC在111端口(portmap)监听客户端的请求,当有NFS服务请求来临时,RPC负责告诉客户端NFS服务各功能的对应端口号。
注意:在NFS启动前请先启动RPC服务(service portmap start),然后再启动NFS。如果RPC服务重启,也必须重启NFS服务,以便于NFS重新注册其端口到RPC。
![]()
当客户端有存取NFS文件需求时,他会如何想服务器端请求资料?
- 客户端向RPC(port 111)发出存取NFS服务器上文件的询问要求;
- RPC找到NFS服务器注册的端口号返回给客户端;
- 客户端通过NFS的端口号去连接NFS daemon。
注意:由上图可知不管是NFS服务器端还是客户端都需要启动RPC服务。
NFS启动的daemon:
NFS 又被称为RPC Server,他的主要任务是进行文件系统的共享,所以通常会涉及到文件权限。NFS服务启动时至少要启动两个daemon,一个管理客户端是否能够登陆问题,一个管理客户端能够存取的权限。如果要做磁盘配额(quota)的话还要启动其他daemon。
- rpc.nfsd:这个daemon主要用来管理客户端是否能够登陆NFS服务器的,其中包括验证登陆者的ID。
- rpc.mountd:这个daemon主要用来管理NFS服务器的文件权限。当客户端顺利通过rpc.nfsd的验证后,还要验证文件的使用权限,它会去读/etc/exports配置文件来对比客户端的权限,通过后方可存取NFS的文件(通常NFS文件的使用权限由/etc/exports配置文件里设置的权限和文件本身的权限决定。)。
- rpc.lockd(非必要):这个daemon主要用来管理管理文件的锁定。因为当多个人同时写一个文件时可能会造成问题。rpc.lockd必须同时在客户端和服务器端同时启用才行。通常它还与rpc.statd同时启用。
- rpc.statd(非必要):这个daemon主要用来检查文件的一致性。当客户端由于同时对一个文件进行写操作而造成问题时,rpc.statd会试图检查并修复此文件。这个功能也必须在客户端和服务器端同时启用才能生效。
NFS服务器认证与文件存取权限
1、客户端访问NFS时使用什么身份?
![]()
当用户dmtsai访问NFS服务器上的文件时,NFS服务器会检测此用户的UID和GID在其/etc/passwd和/etc/group中是否存在,如果存在,客户端尝试以此UID和GID进行访问;如果不存在将以nobody(或者nfsnobody)身份访问。如果是root则默认会被映射到匿名用户(nobody),因为此用户权限太大,可能会对NFS服务器造成破坏。
2、NFS服务器必须开放文件权限(在/etc/exports中进行设定)。
3、在实际的文件系统中具有相应的权限。
如果你想有某文件的写入权限,你必须具备(1)、有登陆NFS服务器权限(UID);(2)、NFS服务器设定此UID有写入权限;(3)、实际文件系统中此UID有写入权限。
NFS服务器设置
确保以下两个安装包被安装:
- RPC主程序:portmap(一般默认安装),NFS需要注册其端口到portmap中,所以启动NFS前请先启动portmap。
- NFS主程序:nfs-utils主要提供rpc.nfsd和rpc.mountd这两个daemon及相关文档等。
查看服务安装情况:
[root@somode ~]# rpm -qa |grep portmap
portmap-4.0-65.2.2.1
[root@somode ~]# rpm -qa |grep nfs
nfs-utils-1.0.9-24.el5
nfs-utils-lib-1.0.8-7.2.z2
[root@somode ~]# netstat -tunlp
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:111 0.0.0.0:* LISTEN 1778/portmap
udp 0 0 0.0.0.0:111 0.0.0.0:* 1778/portmap
默认情况下portmap已经启动。
NFS套件结构:
- /etc/exports:这个是NFS的配置文件,默认为空,需要自己配置。
- /usr/sbin/exportfs:主要用在fwq端,当/etc/exports改变时重新共享目录或者可以将NFS共享的目录卸载。
- /usr/sbin/showmount:主要用在客户端,用来查看NFS的共享目录。
- /var/lib/nfs/*tab:NFS服务器的登陆档放在/var/lib/nfs/下,其中etab主要记录了NFS分享出来的目录的完整权限设定;xtab主要记录了曾经连接到此NFS主机的相应用户资料。
NFS的配置文件:/etc/exports
[root@somode ~]# vi /etc/exports
/home/public 220.231.31.0/24(rw)
#[分享目录] [主机(权限列表)]
其中主机可以是一个IP或IP地址段,可用的主机名如localhost,也可以是域名如*.tech.net,对于域名可以使用通配符。
权限设定常见参数:
- rw:read-write,可读写;
- ro:read-only,只读;
- sync:资料同步写入内存和硬盘中;
- no_root_squash:如果是root登陆NFS是将具有root权限;
- root_squash:如果是root登陆NFS是将被映射到nobody(或是nfsnobody)(默认值);
- all_squash:不管用户登陆身份是什么都被映射到匿名用户(nobody)通常与anonuid和anongid连用,将所有用户映射到此UID和GID;
- anonuid:当设置*_squash时,用户被映射到此UID。
- anongid:同anonuid。
权限设置实例:
[root@somode ~]# vi /etc/exports
/home/public 192.168.0.0/24(rw,sync,no_root_squash)
/home/istone 192.168.0.0/24(rw)
/home/test *.tech.net(rw,sync,all_squash,anonuid=501,anongid=501)
[root@somode ~]# ls -l /home/
婊璁?40
drwx------ 3 istone istone 4096 04-22 20:21 istone
drwxrwxrwx 2 root root 4096 04-22 20:21 public
drwx------ 3 test test 4096 04-22 20:41 test
[istone@somode ~]$ id istone
uid=500(istone) gid=500(istone) groups=500(istone) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[root@somode ~]# id test
uid=501(test) gid=501(test) groups=501(test) context=root:system_r:unconfined_t:SystemLow-SystemHigh
从192.168.0.0/24 这网段登陆NFS服务器的所有用户对/home/public有读写权限,且如果为人偶root用户将不会被映射为匿名用户;而只有gid为500的用户才能访问/home/istone ;当从*.tech.net登陆到NFS时将被映射为UID=501,GID=501的用户,且对/home/test目录有读写权限。
启动NFS服务
在启动NFS服务前请确保RPC服务(port 111)已经启动。
[root@somode ~]# /etc/init.d/nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS 守护进程: [确定]
启动 NFS mountd: [确定]
[root@somode ~]# netstat -tunlp
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 - #nfs的守护进程
tcp 0 0 0.0.0.0:1029 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:619 0.0.0.0:* LISTEN 3407/rpc.rquotad
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1778/portmap #RPC的守护进程
tcp 0 0 0.0.0.0:722 0.0.0.0:* LISTEN 1812/rpc.statd
tcp 0 0 0.0.0.0:635 0.0.0.0:* LISTEN 3423/rpc.mountd
udp 0 0 0.0.0.0:2049 0.0.0.0:* -
udp 0 0 0.0.0.0:1026 0.0.0.0:* -
udp 0 0 0.0.0.0:716 0.0.0.0:* 1812/rpc.statd
udp 0 0 0.0.0.0:719 0.0.0.0:* 1812/rpc.statd
udp 0 0 0.0.0.0:616 0.0.0.0:* 3407/rpc.rquotad
udp 0 0 0.0.0.0:111 0.0.0.0:* 1778/portmap
udp 0 0 0.0.0.0:632 0.0.0.0:* 3423/rpc.mountd
- RPC启动的端口为:111;
- NFS启动的端口为:2049;
- 其他rpc.daemon启动的端口是随机产生的,需要向RPC注册。
[root@somode ~]# rpcinfo -p localhost #使用rpcinfo来查看端口的注册情况。
程序 版本 协议 端口
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 719 status
100024 1 tcp 722 status
100011 1 udp 616 rquotad
100011 2 udp 616 rquotad
100011 1 tcp 619 rquotad
100011 2 tcp 619 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 1026 nlockmgr
100021 3 udp 1026 nlockmgr
100021 4 udp 1026 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 1029 nlockmgr
100021 3 tcp 1029 nlockmgr
100021 4 tcp 1029 nlockmgr
100005 1 udp 632 mountd
100005 1 tcp 635 mountd
100005 2 udp 632 mountd
100005 2 tcp 635 mountd
100005 3 udp 632 mountd
100005 3 tcp 635 mountd
[root@linux ~]# showmount [-ae] [hostname|IP]
参数:
-a :显示当前主机客户端与 NFS 连接的共享状态;
-e :显示某主机 /etc/exports 所共享的目录。
#显示当前主机 /etc/exports 所共享的目录
[root@somode ~]# showmount -e localhost
Export list for localhost:
/home/test 192.168.0.0/24
/home/istone 192.168.0.0/24
/home/public 192.168.0.0/24
#检查/var/lib/nfs/etab,查看NFS共享目录的权限,很多为默认值。
[root@somode ~]# tail /var/lib/nfs/etab
/home/public 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/home/istone 192.168.0.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.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=501,anongid=501)
[root@somode ~]# exportfs [-aruv]
参数:
-a :全部挂载(或卸载) /etc/exports 文件下的目录
-r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新/var/lib/nfs/etab和/var/lib/nfs/xtab 的內容!
-u :卸载某一目录
-v :在 export 的时候,将共享的目录显示在屏幕上!
范例一:重新挂载一次 /etc/exports 的设定
[root@somode ~]# exportfs -arv
exporting 192.168.0.0/24:/home/public
exporting 192.168.0.0/24:/home/istone
exporting 192.168.0.0/24:/home/test
范例二:全部都卸载
[root@linux ~]# exportfs -auv
NFS客户端设置
如何挂载NFS服务器共享的文件系统:
确认本地端已经启动了portmap服务。
扫描NFS服务器共享的目录有那些,并了解我们是否可以使用(showmount)。
在本地端创建挂载点(mkdir)
利用mount命令挂载NFS文件系统到本地端。在NFS服务器端查看配置文件
[root@somode public]# cat /etc/exports
/home/public 192.168.0.0/24(rw,sync,no_root_squash)
/home/istone 192.168.0.0/24(rw)
/home/test 192.168.0.0/24(rw,sync,all_squash,anonuid=501,anongid=501)
在客户端查看NFS服务器发布的NFS共享目录
[root@lib ~]# showmount -e somode.tech.net
Export list for somode.tech.net:
/home/test 192.168.0.0/24
/home/istone 192.168.0.0/24
/home/public 192.168.0.0/24
# 创建挂载点
[root@lib ~]# mkdir /home/nfs
[root@lib ~]# mkdir /home/nfs/test
[root@lib ~]# mkdir /home/nfs/public
# 挂载NFS共享目录到本地
[root@lib ~]# mount -t nfs 192.168.0.30:/home/public /home/nfs/public/
[root@lib ~]# cd /home/nfs/public/
[root@lib public]# touch test.txt
[root@lib public]# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr 22 22:22 test.txt
# 挂载NFS服务器下/home/istone/到home/nfs/istone/时被拒绝,因为当前用户是root,如果加入no_root_squash参数,root将能够挂载此目录。
[root@lib ~]# mount -t nfs 192.168.0.30:/home/istone /home/nfs/istone/
mount: 192.168.0.30:/home/istone failed, reason given by server: Permission denied
# su到istone用户
[istone@lib ~]$ id
uid=500(istone) gid=500(istone) groups=500(istone)
创建挂载点
[istone@lib ~]$ mkdir /home/nfs/istone
# 使用sudo命令挂载,普通用户不允许mount,修改/etc/sudoers(visudo -f /etc/sudoers,在最后添加一行:istone ALL=/bin/mount,/bin/umount)。
[istone@lib ~]$ sudo mount -t nfs 192.168.0.30:/home/istone /home/nfs/istone
[istone@lib ~]$ cd /home/nfs/istone/
[istone@lib istone]$ touch a.txt
[istone@lib istone]$ ll
total 0
-rw-rw-r-- 1 istone istone 0 Apr 22 22:43 a.txt
# 挂载NFS服务器下/home/public/到home/nfs/public/
[istone@lib ~]$ sudo mount -t nfs 192.168.0.30:/home/public /home/nfs/public
[istone@lib ~]$ cd /home/nfs/public/
[istone@lib public]$ touch istone.txt
[istone@lib public]$ ll
total 0
-rw-rw-r-- 1 istone istone 0 Apr 22 22:50 istone.txt
-rwxrwxrwx 1 root root 0 Apr 22 22:22 test.txt
# 挂载NFS服务器下/home/test/到home/nfs/test/
[istone@lib ~]$ sudo mount -t nfs 192.168.0.30:/home/test /home/nfs/test/
Password:
[istone@lib ~]$ cd /home/nfs/test/
[istone@lib test]$ touch b.txt
# 注意:istone创建的文件确为test所有
[istone@lib test]$ ll
total 0
-rw-rw-r-- 1 test test 0 Apr 22 22:57 b.txt
# 在NFS上查看test用户的ID
[root@somode home]# id test
uid=501(test) gid=501(test) groups=501(test)
# 查看文件系统挂载情况
[root@lib nfs]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7063480 2578888 4125784 39% /
/dev/sda1 101086 13238 82629 14% /boot
none 257200 0 257200 0% /dev/shm
/dev/hdc 2357878 2357878 0 100% /media/cdrom
192.168.0.30:/home/istone
4761856 3281376 1234688 73% /home/nfs/istone
192.168.0.30:/home/public
4761856 3281376 1234688 73% /home/nfs/public
192.168.0.30:/home/test
4761856 3281376 1234688 73% /home/nfs/test
mount指令的常用参数:
- suid/nosuid:保留/取消挂载文件系统的suid功能,默认保留。
- rw/ro:是指挂载文件系统的权限,读写/只读,默认为rw。
- dev/nodev:是否保留设备的特殊功能,只有/dev才有特殊装置,默认为dev。
- exec/noexec:是否有执行权限,默认为exec,有执行权限。
- user/nouser:是否允许使用者进行文件系统的挂载与卸载功能,默认是nouser。
- auto/noauto:使用mount -a时是否会挂载此目录,如果不需要分区被随时挂载可以设为noauto,默认为auto。
mount nfs的其它可选参数:
* HARD mount和SOFT MOUNT:
HARD: NFS CLIENT会不断的尝试与SERVER的连接(在后台,不会给出任何提示信息,在LINUX下有的版本仍然会给出一些提示),直到MOUNT上。
SOFT:会在前台尝试与SERVER的连接,是默认的连接方式。当收到错误信息后终止mount尝试,并给出相关信息。
例如:mount -F nfs -o hard 192.168.0.10:/nfs /nfs
如果此时你用的是HARD方式的话,系统就会等待,直到能够重新与NFS SERVER建立连接传输信息。另外如果是非关键数据的话也可以使用SOFT方式。
* rsize和wsize:
文件传输尺寸设定:V3没有限定传输尺寸,V2最多只能设定为8k,可以使用-rsize(读出) and -wsize(写入)来进行设定。这两个参数的设定对于NFS的执行效能有较大的影响
* bg:在执行mount时如果无法顺利mount上时,系统会将mount的操作转移到后台并继续尝试mount,直到mount成功为止。(通常在设定/etc/fstab文件时都应该使用bg,以避免可能的mount不上而影响启动速度)
* fg:和bg正好相反,是默认的参数
* intr:允许通知中断一个NFS调用。当服务器没有应答需要放弃的时候有用处。
自动挂载:autofs
当用户使用到此文件系统时才挂载,如长时间不用可自动卸载此文件系统。
![]()
# 在autofs的主配置文件中添加NFS要挂在的顶级目录
[root@lib ~]# vi /etc/auto.master
/home/nfs /etc/auto.nfs
# 在制定文件中设置NFS挂载使用的下级目录
[root@lib ~]# vi /etc/auto.nfs
# [本地目录] [挂载参数] [NFS共享目录]
public -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.30:/home/public #将192.168.0.30:/home/public挂载到本地的/home/nfs/public/
istone -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.30:/home/istone
test -rw,bg,soft,rsize=32768,wsize=32768 192.168.0.30:/home/test
# 启动autofs
[root@lib ~]# /etc/init.d/autofs start
Starting automount: [ OK ]
[root@lib ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7063480 2578896 4125776 39% /
/dev/sda1 101086 13238 82629 14% /boot
none 257200 0 257200 0% /dev/shm
/dev/hdc 2357878 2357878 0 100% /media/cdrom
[root@lib ~]# cd /home/nfs/public # 进入/home/nfs/public目录是NFS文件系统被自动挂载。
[root@lib public]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7063480 2578896 4125776 39% /
/dev/sda1 101086 13238 82629 14% /boot
none 257200 0 257200 0% /dev/shm
/dev/hdc 2357878 2357878 0 100% /media/cdrom
192.168.0.30:/home/public
4761856 3281376 1234688 73% /home/nfs/public
[root@lib public]# mount
192.168.0.30:/home/public on /home/nfs/public type nfs (rw,bg,soft,rsize=32768,wsize=32768,addr=192.168.0.30)
[root@lib public]# su - istone
[istone@lib ~]$ cd /home/nfs/istone
[istone@lib istone]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
7063480 2578896 4125776 39% /
/dev/sda1 101086 13238 82629 14% /boot
none 257200 0 257200 0% /dev/shm
/dev/hdc 2357878 2357878 0 100% /media/cdrom
192.168.0.30:/home/public
4761856 3281376 1234688 73% /home/nfs/public
192.168.0.30:/home/istone
4761856 3281376 1234688 73% /home/nfs/istone
参考资料:
鸟哥的NFS服务器假设:http://linux.vbird.org/linux_server/0330nfs.php
NFS-HowTo:http://nfs.sourceforge.net/nfs-howto/
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26560/showart_1913146.html |
|