NFS配置管理
From: http://www.goooogle.com.cn/Article/NFS-configuration-and-management.aspx
1. NFS概述
?NFS即網絡文件系統,是主機間通過網絡進行文件共享的網絡協議,最早由Sun公司提出的,多用于Unix操作系統(Windows中也有相應版本的實現) 。
?NFS通常情況下在局域網中使用,用于多臺主機共享同一主機上的文件將源。由于NFS具有共享文件訪問快、穩定性高等優越性能,在工程系統中得到了廣泛應用。
?以下應用環境:
?OS:??LINUX AS4/Cent OS 5.2
?NFS Server:?192.168.146.53 hostname 53
?NFS Client:?192.168.146.51 hostname 51
???192.168.146.52 hostname 52
???192.168.138.250 hostname 250
2. NFS安裝
[root@53 ~]# rpm -q nfs-utils portmap
nfs-utils-1.0.9-33.el5
portmap-4.0-65.2.2.1
//系統中已安裝兩個軟件包
2.1 NFS的安裝包文件
2.2 portmap軟件包
?protmap軟件包中的portmap服務,為NFS和NIS等提供RPC服務的支持,因此在安裝時應先安裝portmap軟件包。
[root@53 ~]# rpm -ql portmap
/etc/rc.d/init.d/portmap
/sbin/portmap
/usr/sbin/pmap_dump
/usr/sbin/pmap_set
/usr/share/doc/portmap-4.0
/usr/share/doc/portmap-4.0/BLURB
/usr/share/doc/portmap-4.0/CHANGES
/usr/share/doc/portmap-4.0/README
/usr/share/man/man8/pmap_dump.8.gz
/usr/share/man/man8/pmap_set.8.gz
/usr/share/man/man8/portmap.8.gz
2.3 nfs-utils軟件包
nfs-utils軟件包中提供了NFS服務器程序和相應的維護工具。
[root@53 ~]# rpm -ql portmap
/etc/rc.d/init.d/portmap
/sbin/portmap
/usr/sbin/pmap_dump
/usr/sbin/pmap_set
/usr/share/doc/portmap-4.0
/usr/share/doc/portmap-4.0/BLURB
/usr/share/doc/portmap-4.0/CHANGES
/usr/share/doc/portmap-4.0/README
/usr/share/man/man8/pmap_dump.8.gz
/usr/share/man/man8/pmap_set.8.gz
/usr/share/man/man8/portmap.8.gz
[root@53 ~]# rpm -ql nfs-utils|head
/etc/idmapd.conf
/etc/rc.d/init.d/nfs
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/rpcgssd
/etc/rc.d/init.d/rpcidmapd
/etc/rc.d/init.d/rpcsvcgssd
/etc/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/rpc.lockd
[root@53 ~]# rpm -ql nfs-utils
/etc/idmapd.conf
/etc/rc.d/init.d/nfs
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/rpcgssd
/etc/rc.d/init.d/rpcidmapd
/etc/rc.d/init.d/rpcsvcgssd
/etc/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/rpc.lockd
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.nfs4
/usr/sbin/exportfs
/usr/sbin/gss_clnt_send_err
/usr/sbin/gss_destroy_creds
/usr/sbin/nfsstat
/usr/sbin/nhfsgraph
/usr/sbin/nhfsnums
/usr/sbin/nhfsrun
/usr/sbin/nhfsstone
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/share/doc/nfs-utils-1.0.9
/usr/share/doc/nfs-utils-1.0.9/ChangeLog
/usr/share/doc/nfs-utils-1.0.9/INSTALL
/usr/share/doc/nfs-utils-1.0.9/KNOWNBUGS
/usr/share/doc/nfs-utils-1.0.9/Makefile
/usr/share/doc/nfs-utils-1.0.9/Makefile.am
/usr/share/doc/nfs-utils-1.0.9/Makefile.in
/usr/share/doc/nfs-utils-1.0.9/NEW
/usr/share/doc/nfs-utils-1.0.9/README
/usr/share/doc/nfs-utils-1.0.9/THANKS
/usr/share/doc/nfs-utils-1.0.9/TODO
/usr/share/man/man5/exports.5.gz
/usr/share/man/man5/idmapd.conf.5.gz
/usr/share/man/man5/nfs.5.gz
/usr/share/man/man7/nfsd.7.gz
/usr/share/man/man8/exportfs.8.gz
/usr/share/man/man8/gssd.8.gz
/usr/share/man/man8/idmapd.8.gz
/usr/share/man/man8/lockd.8.gz
/usr/share/man/man8/mount.nfs.8.gz
/usr/share/man/man8/mountd.8.gz
/usr/share/man/man8/nfsd.8.gz
/usr/share/man/man8/nfsstat.8.gz
/usr/share/man/man8/nhfsgraph.8.gz
/usr/share/man/man8/nhfsnums.8.gz
/usr/share/man/man8/nhfsrun.8.gz
/usr/share/man/man8/nhfsstone.8.gz
/usr/share/man/man8/rpc.gssd.8.gz
/usr/share/man/man8/rpc.idmapd.8.gz
/usr/share/man/man8/rpc.lockd.8.gz
/usr/share/man/man8/rpc.mountd.8.gz
/usr/share/man/man8/rpc.nfsd.8.gz
/usr/share/man/man8/rpc.statd.8.gz
/usr/share/man/man8/rpc.svcgssd.8.gz
/usr/share/man/man8/rpcdebug.8.gz
/usr/share/man/man8/showmount.8.gz
/usr/share/man/man8/statd.8.gz
/usr/share/man/man8/svcgssd.8.gz
/usr/share/man/man8/umount.nfs.8.gz
/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab
3. NFS服務器的配置
3.1 NFS服務器的配置文件--exports
?exports文件在目錄“/etc”下,用于配置NFS服務器所提供的目錄共享。此文件默認設置為空,沒有配置的輸出的任何的目錄共享,這也是出于安全性的考慮,這樣即使系統啟動NFS服務也不會提供任何的共享。
?如果需要在NFS服務器中輸出某個目錄的共享,需要先在exports文件中進行相應的設置。
3.2 exports文件的格式
?exports文件中每行提供一個共享目錄的設置,設置行的格式如下所示:
#要輸出的共享目錄名?客戶端主機地址(設置選擇)
/home/share??*(sync,ro)
?在exports文件的設置行中,共享目錄和主機地址間用空格分隔,主機地址之后緊隨設置選項,設置選項放置在括號中,多個設置選項間用逗號分隔。
1) 共享目錄
?共享目錄設置系統中需要輸出作為共享的目錄路徑,該目錄用于存放網絡中其它主機共享的文件。
2) 客戶端主機地址
?在exports文件中,客戶端主機地址的指定非常靈活,可以是單個主機的IP地址或域名,也只可以是指定網段中的主機或指定域中的主機,如下:
主機地址格式
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
客戶端主機地址??說明
────────────────────────────
192.168.1.19??指定IP地址的主機
nfsclient.test.com?指定域名的主機
192.168.1.0/24??指定網段中的所有主機
*.test.com??指定域中的所有主機
*???所有主機
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
3) 設置選項
?exports文件中的設置選項較多,經常使用的不多,如下:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
設置選項?說明
───────────────────────────────────────────
sync??設置NFS服務器同步寫磁盤,這樣不會輕易丟失數據,NFS服務器建議使用該選項
ro??設置輸出的共享目錄只讀,與rw不能同時使用
rw??設置輸入的共享目錄可讀寫,與ro不能同時使用
secure??NFS通過1024以下的安全TCP/IP端口發送
insecure?NFS通過1024以上的端口發送
wdelay??如果多個用戶要寫入NFS目錄,則歸組寫入(默認)?
no_wdelay?如果多個用戶要寫入NFS目錄,則立即寫入,當使用async時,無需此設置。
hide??在NFS共享目錄中不共享其子目錄
no_hide??共享NFS目錄的子目錄
subtree_check?如果共享/usr/bin之類的子目錄時,強制NFS檢查父目錄的權限(默認)?
no_subtree_check和上面相對,不檢查父目錄權限
all_squash?共享文件的UID和GID映射匿名用戶anonymous,適合公用目錄。
no_all_squash?保留共享文件的UID和GID(默認)?
root_squash?root用戶的所有請求映射成如anonymous用戶一樣的權限(默認)?
no_root_squash?root用戶具有根目錄的完全管理訪問權限
anonuid=xxx?指定NFS服務器/etc/passwd文件中匿名用戶的UID
anongid=xxx?指定NFS服務器/etc/passwd文件中匿名用戶的GID
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
4) exports文件配置實例
?在exports文件中,同一輸出共享目錄對于不同的主機可以有不同的設置選項,各主機間用空格分隔。
# more /etc/exports
/home/share?*(sync,ro) 192.168.1.19(sync,rw)
/home/ftp?192.168.1.0/24(sync,ro)
/home/public?192.168.1.19(sync,rw)
[root@53 ~]# cat /etc/exports
/nfs/mail?????? 192.168.146.51(sync,rw) 192.168.146.52(sync,rw)
/nfs/netdisk??? 192.168.146.51(sync,rw) 192.168.146.52(sync,rw) 192.168.138.250(sync,rw)
3.3 NFS服務器的啟動與停止
1) 啟動NFS服務器
[root@53 ~]# service portmap start
Starting portmap:????????????????????????????????????????? [? OK? ]
[root@53 ~]# service nfs start???
Starting NFS services:???????????????????????????????????? [? OK? ]
Starting NFS quotas:?????????????????????????????????????? [? OK? ]
Starting NFS daemon:?????????????????????????????????????? [? OK? ]
Starting NFS mountd:?????????????????????????????????????? [? OK? ]
2) 查詢NFS服務器狀態
[root@localhost ~]# service portmap status
portmap (pid 2910) is running...
[root@localhost ~]# service nfs status???
rpc.mountd (pid 9740) is running...
nfsd (pid 9737 9736 9735 9734 9733 9732 9731 9730) is running...
3) 停止NFS服務器
?在需要停止NFS服務器運行時,需要先停止nfs服務再停止portmap服務,對于系統中有其他服務(如NIS服務) 需要使用portmap服務時,不需要停止portmap服務
[root@53 ~]# service nfs stop
關閉 NFS mountd:????????????????????????????????????????? [? 確定? ]
關閉 NFS 守護進程:??????????????????????????????????????? [? 確定? ]
關閉 NFS quotas:????????????????????????????????????????? [? 確定? ]
關閉 NFS 服務:??????????????????????????????????????????? [? 確定? ]
[root@53 ~]# service portmap stop
停止 portmap:???????????????????????????????????????????? [? 確定? ]
4) 設置NFS服務器的自動啟動狀態
// 查看
[root@53 ~]# chkconfig --list portmap
portmap???????? 0:off?? 1:off?? 2:off?? 3:on??? 4:on??? 5:on??? 6:off
[root@localhost ~]# chkconfig --list nfs
nfs???????????? 0:off?? 1:off?? 2:off?? 3:off?? 4:off?? 5:off?? 6:off
// 設置
[root@53 ~]# chkconfig --level 345 portmap on
[root@53 ~]# chkconfig --level 345 nfs on
// 查看設置結果
[root@53 ~]# chkconfig --list portmap
portmap???????? 0:off?? 1:off?? 2:off?? 3:on??? 4:on??? 5:on??? 6:off
[root@53 ~]# chkconfig --list nfs
nfs???????????? 0:off?? 1:off?? 2:off?? 3:on??? 4:on??? 5:on??? 6:off
3.4 showmount命令
?在設置了NFS共享目錄并正確啟動了NFS服務器后,可以使用showmount命令查詢NFS服務器的共享目錄狀態。
1) 顯示showmount命令幫助
[root@datacenter ~]# showmount -h
Usage: showmount [-adehv]
?????? [--all] [--directories] [--exports]
?????? [--no-headers] [--help] [--version] [host]
2) 顯示主機的NFS服務器信息
showmount [NFS服務器主機地址]
[root@53 ~]# showmount
Hosts on localhost.localdomain:
[root@53 ~]# showmount 192.168.146.53
Hosts on 192.168.146.53:
3) 顯示NFS服務器的輸出列表
showmount -e [NFS服務器主機地址]
[root@53 ~]# showmount -e
Export list for localhost.localdomain:
/nfs/mail??? 192.168.146.52,192.168.146.51
/nfs/netdisk 192.168.146.52,192.168.146.51
4) 顯示NFS服務器中被掛載的目錄
showmount -d?[NFS服務器主機地址]
[root@53 ~]# showmount -d
Directories on localhost.localdomain:
/nfs/netdisk
[root@53 ~]# showmount -d 192.168.146.53
Directories on 192.168.146.53:
/nfs/netdisk
5) 顯示NFS服務器的客戶機與被掛載的目錄
showmount -a [NFS服務器主機地址]
[root@53 ~]# showmount -a
All mount points on localhost.localdomain:
192.168.138.250:/nfs/netdisk
3.5 exportfs命令
?usage: exportfs [-aruv] [host:/path]
?exportfs命令用于維護當前主機中NFS服務器的輸出目錄列表。
1) 重新輸出共享目錄(exportfs -rv)
?exportfs -rv使用NFS服務器重新讀取exports文件中的設置,使用該命令可以在改變exports文件設置后,使設置在當前NFS服務器中生效,而不需要重新啟動NFS服務器。
[root@53 ~]# exportfs -rv
exporting 192.168.146.51:/nfs/netdisk
exporting 192.168.146.52:/nfs/netdisk
exporting 192.168.146.51:/nfs/mail
exporting 192.168.146.52:/nfs/mail
2) 停止輸出所有目錄
# exportfs -auv
3) 輸出所有目錄
# exportfs -av
4. NFS客戶端設置
?可以便用mount命令把網絡中NFS服務器的共享目錄掛載到本機的文件系統中。
4.1 顯示NFS服務器的輸出共享目錄
?在便用mount命令掛載NFS服務器的共享目錄之前,先查詢NFS服務器中是否允許本機連接相應的共享目錄。
[root@192.168.146.52 ~]# showmount -e 192.168.146.53
Export list for 192.168.146.53:
/nfs/mail??? 192.168.146.52,192.168.146.51
/nfs/netdisk 192.168.146.52,192.168.146.51
4.2 掛載NFS服務器中的共享目錄
mount NFS服務器地址:共享目錄 本地掛載點目錄
[root@51 ~]# mount -h
Usage: mount -V???????????????? : print version
?????? mount -h???????????????? : print this help
?????? mount??????????????????? : list mounted filesystems
?????? mount -l???????????????? : idem, including volume labels
So far the informational part. Next the mounting.
The command is `mount [-t fstype] something somewhere'.
Details found in /etc/fstab may be omitted.
?????? mount -a [-t|-O] ...???? : mount all stuff from /etc/fstab
?????? mount device???????????? : mount device at the known place
?????? mount directory????????? : mount known device here
?????? mount -t type dev dir??? : ordinary mount command
Note that one does not really mount a device, one mounts
a filesystem (of the given type) found on the device.
One can also mount an already visible directory tree elsewhere:
?????? mount --bind olddir newdir
or move a subtree:
?????? mount --move olddir newdir
One can change the type of mount containing the directory dir:
?????? mount --make-shared dir
?????? mount --make-slave dir
?????? mount --make-private dir
?????? mount --make-unbindable dir
One can change the type of all the mounts in a mount subtree
containing the directory dir:
?????? mount --make-rshared dir
?????? mount --make-rslave dir
?????? mount --make-rprivate dir
?????? mount --make-runbindable dir
A device can be given by name, say /dev/hda1 or /dev/cdrom,
or by label, using? -L label? or by uuid, using? -U uuid .
Other options: [-nfFrsvw] [-o options] [-p passwdfd].
For many more details, say? man 8 mount .
# mount 192.168.146.53:/nfs/netdisk /netdisk/
// 掛載點“/netdisk/”是已經建立的空目錄,可以便用其它的空目錄
[root@250 ~]# mount 192.168.146.53:/nfs/netdisk /mnt/
4.3 顯示當前主機掛載的NFS目錄
[root@250 ~]# mount | grep net
4.4 卸載已掛載的NFS共享目錄
[root@250 ~]# umount /mnt/
// 目錄“/mnt/”為NFS共享目錄掛載點
5. NFS服務器配置程序
1) 安裝NFS工具
// 查詢有無安裝相關軟件包,
# rpm -q redhat-config-nfs
// 如沒有可以下載安裝或者通過光盤安裝
# mount /mnt/cdrom/
# rpm -ivh /mnt/cdrom/RedHat/RPMS/redhat-config-nfs-x.x.x-x.rpm
2)? 啟動NFS服務器配置程序
X-Windows圖形環境中:
“主菜單”=>“系統設置”=>“服務器設置”=>“NFS服務器”
命令行:
# redhat-config-nfs
6. NFS安全
NFS的不安全性主要體現于以下4個方面:
1、新手對NFS的訪問控制機制難于做到得心應手,控制目標的精確性難以實現
2、NFS沒有真正的用戶驗證機制,而只有對RPC/Mount請求的過程驗證機制
3、較早的NFS可以使未授權用戶獲得有效的文件句柄
4、在RPC遠程調用中,一個SUID的程序就具有超級用戶權限.
加強NFS安全的方法:
1、合理的設定/etc/exports中共享出去的目錄,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT僅僅有最小的權限,最好不要使用root_squash。
2、使用IPTABLE防火墻限制能夠連接到NFS SERVER的機器范圍
iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT
3、為了防止可能的Dos攻擊,需要合理設定NFSD的COPY數目。
4、修改/etc/hosts.allow和/etc/hosts.deny達到限制CLIENT的目的
/etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow
/etc/hosts.deny
portmap: ALL : deny
5、改變默認的NFS端口
NFS默認使用的是111端口,但同時你也可以使用port參數來改變這個端口,這樣就可以在一定程度上增強安全性。
6、使用Kerberos V5作為登陸驗證系統
7.NFS故障解決
1、NFSD沒有啟動起來
首先要確認NFS輸出列表存在,否則nfsd不會啟動。可用exportfs命令來檢查,如果exportfs命令沒有結果返回或返回不正確,則需要檢查/etc/exports文件。
2、mountd進程沒有啟動
mountd進程是一個遠程過程調用(RPC),其作用是對客戶端要求安裝(mount) 文件系統的申請作出響應。mountd進程通過查找/etc/xtab文件來獲知哪些文件系統可以被遠程客戶端使用。另外,通過mountd進程,用戶可以知道目前有哪些文件系統已被遠程文件系統裝配,并得知遠程客戶端的列表。查看mountd是否正常啟動起來可以使用命令rpcinfo進行查看,在正常情況下在輸出的列表中應該象這樣的行:
100005 1 udp 1039 mountd
100005 1 tcp 1113 mountd
100005 2 udp 1039 mountd
100005 2 tcp 1113 mountd
100005 3 udp 1039 mountd
100005 3 tcp 1113 mountd
如果沒有起來的話可以檢查是否安裝了PORTMAP組件。
rpm -qa|grep portmap
3、fs type nfs no supported by kernel
kernel不支持nfs文件系統,重新編譯一下KERNEL就可以解決。
4、can't contact portmapper: RPC: Remote system error - Connection refused
出現這個錯誤信息是由于SEVER端的PORTMAP沒有啟動。
5、mount clntudp_create: RPC: Program not registered
NFS沒有啟動起來,可以用showmout -e host命令來檢查NFS SERVER是否正常啟動起來。
6、mount: localhost:/home/test failed, reason given by server: Permission denied
這個提示是當client要mount nfs server時可能出現的提示,意思是說本機沒有權限去mount nfs server上的目錄。解決方法當然是去修改NFS SERVER咯。
7、被防火墻阻擋
這個原因很多人都忽視了,在有嚴格要求的網絡環境中,我們一般會關閉linux上的所有端口,當需要使用哪個端口的時候才會去打開。而NFS默認是使用111端口,所以我們先要檢測是否打開了這個端口,另外也要檢查TCP_Wrappers的設定。
總結
- 上一篇: C++ 反射机制的简单实现
- 下一篇: masm和dos