文件共享服務之NFS
一、基礎知識
NFS:Network File System
是在linux和unix系統上除了ftp外常用的文件共享服務的一種。
藉助於RPC實現文件傳輸功能。
經過二三十年的發展,已經非常成熟了,廣泛用於linux、unix,甚至windows和MAC都在極力支持NFS功用
NFS與http和ftp的區別:
①NFS發起的是一個函數的執行調用請求
ftp和http發出的是一個資源調用請求
② NFS是映射掛載實現功能的
ftp和http是通過應用程序的客戶端和服務器端交互實現功能的
RPC: Remote Procedure Call protocol包括遠程過程調用、函數調用(遠程主機上的函數)
一部分功能由本地程序完成
另一部分功能由遠程主機上的函數完成
過程與函數的區別:過程沒有返回值,函數有返回值
重大尷尬:
在遠程主機上存儲創建的文件屬主和屬組到底是誰?
如果本地操作用戶有賬號,遠程主機沒有,怎麼算呢?
root用戶都是0,那對遠程主機的控制權限就無限大了,遠程主機不安全。
基於這種情況,sun公司就研發了NIS系統。
NIS: Network Information System 網絡信息系統
作用:身份認證——集中於某服務器完成身份認證
用戶登錄時,在login界面程序上輸入的帳號通過網絡發送給另外一個主機,由另外這臺用於集中存儲用戶帳號信息的服務器檢查帳號是否存在,如果存在,則通知用戶輸入密碼,密碼也打包發送給遠程主機,覈對密碼也正確後,於是用戶就可以登錄了。
NIS也是明文的,因此一般只在局域網使用,而且NIS服務器成爲整個系統的單點故障所在。現在NIS已經很少應用了。
現在用戶集中存儲一般是用ldap,並可以與cobblers結合。cobblers傳輸認證可以不傳輸敏感信息但完成用戶帳號密碼信息認證。這種認證方式是比較安全的
NFS: 僅支持基於IP的認證,而不能基於帳號和密碼的認證
而且因爲是一個遠程調用服務,不是一個請求響應服務,所以自身沒辦法實現基於帳號的認證,即使是基於ip,也不能實現帳號密碼認證
因此,遠程主機一般還須啓動一個守護進程moutd,用mountd控制哪些用戶可以憑帳號和密碼訪問。只有經過mountd認證後,纔會被髮給一個令牌通行證,才能憑令牌訪問遠程主機的文件系統。
nfs服務器需要同時啓動三個服務進程:nfsd, mountd, idmapd
nfsd:
管理共享文件系統的進程,監聽在 2049/tcp, 2049/udp。
mountd:
訪問帳號的控制進程,不是總所周知的程序,僅僅是nfs的輔助服務,而且是基於RPC運行的,因此其監聽端口是由本地的公共進程服務RPC代爲監聽的,其監聽端口是由RPC代爲隨機選擇一個未用的,是個半隨機端口模式。mountd的監聽端口號需要先向RPC詢問後得知。
idmapd:
將遠程登錄的帳號映射爲本地的nobody,本地的nobody在遠程主機上映射爲響應的屬主和屬組。原理是通過UID號來對應的,與名字無關,即只要UID號是同一個,即將遠程操作用戶映射爲本地這個UID號用戶。
RPC服務:portmapper
rpcinfo: report RPC information
查看命令:# rpcinfo -p [host]
host:可以是本地主機,也可以是遠程某個主機。默認是本地主機
探測某個主機上portmapper服務是否正常工作,監聽在哪個端口上,而且有哪些服務註冊使用RPC服務
[root@aunt-s ~]# rpcinfo -p 172.16.20.150 (遠程主機)
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 58704 status
100024 1 tcp 43182 status
[root@aunt-s ~]# rpcinfo -p localhost (本地主機)
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 59481 status
100024 1 tcp 40707 status
涉及的程序包:
啓動服務的程序包爲nfs-utils,教室centos6默認是安裝上的,最小化安裝沒有安裝這個程序組;
這一個rpm包提供多種功能程序
服務器端是在內核中的,不需要再安裝,只需啓動模塊就性。
[root@aunt-s ~]# rpm -q nfs-utils
nfs-utils-1.2.3-54.el6.x86_64
[root@aunt-s ~]# rpm -ql nfs-utils
/etc/nfsmount.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/request-key.d/id_resolver.conf
/etc/sysconfig/nfs
/sbin/mount.nfs 掛載nfs4以前版本的命令
/sbin/mount.nfs4 掛載nfs4版本的命令
/sbin/nfs_cache_getent
/sbin/rpc.statd
/sbin/umount.nfs 卸載nfs4以前版本的命令
/sbin/umount.nfs4 卸載nfs4版本的命令
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/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/sbin/sm-notify
/usr/sbin/start-statd
二、 服務器端需要操作的過程:
1、查看有沒有安裝程序包
[root@kingdom ~]# rpm -q nfs-utils
nfs-utils-1.2.3-54.el6.x86_64
如果是xxx is not installed,則需要安裝一下
2、查看安裝生成的文件
[root@kingdom ~]# rpm -ql nfs-utils
3、配置服務並啓動
[root@kingdom ~]# chkconfig | grep nfs
nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@kingdom ~]# chkconfig nfs on
[root@kingdom ~]# chkconfig | grep nfs
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@kingdom ~]# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ] 這個是允許客戶端使用磁盤塊大小的控制程序
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
4、查看啓用的端口
[root@kingdom ~]# rpcinfo -p
5、查看man手冊熟悉/etc/exports文件的配置使用,並設置好
/etc/exports文件基本配置格式:
文件系統 客戶端(選項)<空格>客戶端(選項)
客戶端:IP、FQDN或DOMAIN、NETWORK
IP:長格式、短格式都可以,如172.16.20.110/16、172.16.20.100/255.255.0.0
可使用通配符:* (任意長度的任意字符)、?(任意單個字符)
選項:多個選項之間用逗號隔開,常用的有:
⑴secure:
這個選項是缺省選項,它使用了 1024 以下的 TCP/IP 端口實現 NFS 的連接。指定 insecure 可以禁用這個選項。
⑵rw:
這個選項允許 NFS 客戶機進行讀/寫訪問。缺省選項是隻讀的。
⑶async:
這個選項是缺省選項,可以改進性能,但是如果沒有完全關閉 NFS 守護進程就重新啓動了 NFS 服務器,這也可能會造成數據丟失。
⑷no_wdelay:
這個選項關閉寫延時。如果設置了 async,那麼 NFS 就會忽略這個選項。
⑸nohide:
如果將一個目錄掛載到另外一個目錄之上,那麼原來的目錄通常就被隱藏起來或看起來像空的一樣。要禁用這種行爲,需啓用 hide 選項。
⑹no_subtree_check:
這個選項關閉子樹檢查,子樹檢查會執行一些不想忽略的安全性檢查。缺省選項是啓用子樹檢查。
⑺no_auth_nlm:
這個選項也可以作爲 insecure_locks 指定,它告訴 NFS 守護進程不要對加鎖請求進行認證。如果關心安全性問題,就要避免使用這個選項。缺省選項是 auth_nlm 或 secure_locks。
⑻mp (mountpoint=path):
通過顯式地聲明這個選項,NFS 要求掛載所導出的目錄。
⑼fsid=num:
這個選項通常都在 NFS 故障恢復的情況中使用。如果希望實現 NFS 的故障恢復,請參考 NFS 文檔。
⑽root_squash:
這個選項不允許 root 用戶訪問掛載上來的 NFS 卷。
⑾no_root_squash:
這個選項允許 root 用戶訪問掛載上來的 NFS 卷。
⑿all_squash:
這個選項對於公共訪問的 NFS 捲來說非常有用,它會限制所有的 UID 和 GID,只使用匿名用戶。缺省設置是 no_all_squash。
⒀anonuid 和 anongid:
這兩個選項將匿名 UID 和 GID 修改成特定用戶和組帳號。
EXAMPLE
# sample /etc/exports file
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub *(ro,insecure,all_squash)
/srv/www -sync,rw server @trusted @external(ro)
/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build buildhost[0-9].local.domain(rw)
6、配置好共享的內容,並安全導出
專用工具:# exportfs
export -ar: 重新導出所有的文件系統,已連接的不會被打斷;添加或修改後也用這個選項重新安全導出
export -au: 關閉導出的所有文件系統
export -u FS: 關閉指定的導出的文件系統
7、查看導出成功與否
[root@kingdom nfs]# showmount -e 172.16.20.150
Export list for 172.16.20.150:
/share/nfs 172.16.250.148,172.16.20.110
三、客戶端使用過程:
1、查看NFS服務器端共享的文件系統:
# showmount -e NFSSERVER_IP
例如: # showmount -e 172.16.20.150
(如果沒有這個程序,需要先安裝showmount)
[root@aunt-s vusers_conf]# showmount -e 172.16.20.150
Export list for 172.16.20.150:
/share/nfs 172.16.250.148,172.16.20.110
2、掛載NFS文件系統:
2.1 先查看本地主機是否啓動兩個守護進程:
rpcbind
rpc.statd
[root@aunt-s mnt]# ss -tnlp | grep rpc
LISTEN 0 128 *:54418 *:* users:(("rpc.statd",1390,9))
LISTEN 0 128 :::43571 :::* users:(("rpc.statd",1390,11))
LISTEN 0 128 :::111 :::* users:(("rpcbind",1339,11))
LISTEN 0 128 *:111 *:* users:(("rpcbind",1339,8))
2.2 掛載
mount -t nfs SERVER:/path/to/sharedfs /path/to/mount_point
例如: # mount -t nfs 172.16.20.150:/share/nfs /mnt
將遠程主機172.16.20.150上的/share/nfs掛載到本地的/mnt目錄下使用,然後可以直接查看使用了,就如新加了一個分區一樣。
3、開機自動掛載nfs設置:
/etc/fstab
SERVER:/PATH/TO/EXPORTED_FS /mount_point nfs defaults,_netdev 0 0
掛載選項設置:
⑴defaults
⑵_netdev:當遠程共享主機不在線時,允許我們開機時系統等待一個時長後就不再試圖掛載後繼續啓動,如果沒有這個選項,系統將一直等待直到掛載成功。
⑶rsize 的值是從服務器讀取的字節數。
⑷wsize 是寫入到服務器的字節數。默認都是1024, 如果使用比較高的值,如8192,可以提高傳輸速度,但斷電時丟失的數據也可能越大
⑸timeo:超時時長,單位爲十分之一秒,當PRC時間超時時,主機會先等待這個timeo設定的時長,然後再發送重新傳送請求。每重試一次,timeo都加倍,直到達到設置的最大超時時間或者60秒。對於速度慢或者繁忙的nfs主機,增加這個值能改善掛載使用的體驗。
⑹intr:允許在對掛載的遠程nfs文件操作超時時發送打斷信號,如關閉等