一、RPC與NFS:
RPC稱作Remote Procedure Call Protocol,遠程過程調用協議。RPC可以實現客戶端向遠程主機請求服務(調用函數),而不需要了解底層協議(可以理解是一個框架)。RPC負責處理來自RPC客戶端的請求,其監聽在TCP/UDP的111端口上。
NFS是RPC協議的一種具體的實現,NFS全稱爲Network File System,網絡文件系統。NFS可以實現類Unix主機之間文件系統的共享。NFS的底層依賴於RPC(可以將NFS理解爲是一個RPC服務器),NFS的端口是不固定的,需要向RPC服務代註冊。
當NFS客戶端向NFS服務器端通信的時候,客戶端將NFS報文用RPC協議封裝並向RPC服務端發起請求(詢問NFS服務器的端口),RPC服務接收用戶的請求並告知其NFS所監聽的端口。之後客戶端通過RPC協議封裝NFS的報文併發給NFS的端口(此端口是RPC監聽的,所以仍然是連接的RPC),RPC將用戶的請求轉交給NFS程序,由NFS程序調用NFS模塊對報文解析並執行操作。
NFS依賴於RPC通信,當啓動NFS服務的時候,需要事先啓動RPC服務。
NFS只能在類Unix系統之間提供文件系統的共享服務,原因在於NFS功能是由內核模塊提供的,所以只能在內核提供了NFS功能的系統上使用。而大多數類Unix系統都具有該功能。
二、配置NFS服務:
1.配置NFS需要先啓動rpc服務,rpc服務程序由rpcbind這個包提供。安裝rpcbind
[root@localhost ~]# yum install -y rpcbind [root@localhost ~]# rpm -ql rpcbind /etc/rc.d/init.d/rpcbind #啓動腳本 /sbin/rpcbind #rpcbind程序 ......
2.啓動rpcbind服務:
[root@localhost ~]# service rpcbind start Starting rpcbind: [ OK ] [root@localhost ~]# ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 :::111 :::* LISTEN 0 128 *:111 *:*
3.安裝NFS相關程序並啓動,NFS程序由nfs-utils提供:
[root@localhost ~]# yum install -y nfs-utils [root@localhost ~]# rpm -ql nfs-utils /etc/nfsmount.conf #掛載NFS配置 /etc/rc.d/init.d/nfs #nfs服務腳本,負責處理請求 /etc/rc.d/init.d/nfslock #nfs鎖服務 /etc/rc.d/init.d/rpcgssd #rpcgssd /etc/rc.d/init.d/rpcidmapd #rpc的ID映射服務 /etc/rc.d/init.d/rpcsvcgssd #rpcsvcgssd ....
[root@localhost ~]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ]
NFS的四個主要服務:
quotas:限額設置 mountd:掛載程序,等待用戶使用掛載申請,並驗證客戶來源 daemon:NFS的主程序 idmapd:負責NFS服務的id映射
4./etc/exports導出文件:
NFS共享文件系統使用/etc/exports文件導出,其格式:
/Dire(FileSystem) 允許的範圍(屬性) #####各分支格式#### 範圍格式: host:單一主機地址,例如localhost、192.168.1.1 域匹配:例如*.magedu.com 網絡地址:192.168.10.0/24、192.168.10.0/255.255.255.255 導出屬性: rw:讀寫權限 ro:讀權限 async:異步寫入 sync:同步寫入;默認項 nohide:允許遞歸掛載,就是NFS的/shared目錄中的a目錄掛載了其他的NFS目錄,當其他主機掛載/shared目錄的時候,允許這個主機訪問/shared/a目錄 root_squash:壓縮root用戶,如果用戶使用的root用戶將NFS掛載在本地的,則把root映射爲來賓用戶;此選項爲默認選項 no_root_squash:不壓縮root用戶。 all_squash:將所有用戶映射爲來賓用戶 anonuid/anongid:設置來賓用戶/組的ID,默認是nobody用戶。由rpcidmapd映射。
5.配置/etc/exports文件:
[root@localhost ~]# vim /etc/exports /shared 10.10.10.0/24(rw,no_root_squash,async)
共享/shared這個目錄,安全起見,建議將分區掛載到/shared上,我這裏是實驗環境,就不做此操作了。
6.導出命令:
導出配置使用exportfs命令: exportfs [arg] -a:處理/etc/exports文件中定義的所有項 -r:重新導出,一般結合a參數 -u:取消導出,一般結合a參數
[root@localhost ~]# exportfs -ra #重新導出所有/etc/exports文件中定義的項
7.查看命令:
查看使用showmount命令: showmount [options] [host] -e [host]:查看指定NFS服務器共享的文件系統 -d:只顯示客戶端掛載的文件系統 -a:以 HostName :Directory 格式顯示所有客戶端掛載信息
[root@localhost ~]# showmount -e localhost #查看本機共享的文件系統 Export list for localhost: /shared 10.10.10.0/24 #共享/shared這個目錄,僅允許10.10.10.0/24這個網段掛載使用 [root@localhost ~]#
8.客戶端測試掛載:
[root@client ~]# mount -t nfs 10.10.10.11:/shared /mnt/nfs [root@client ~]# mount /dev/mapper/VolGroup-lv_root on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0") /dev/sda1 on /boot type ext4 (rw) /dev/mapper/VolGroup-lv_home on /home type ext4 (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) nfsd on /proc/fs/nfsd type nfsd (rw) 10.10.10.11:/shared on /mnt/nfs type nfs (rw,vers=4,addr=10.10.10.11,clientaddr=10.10.10.11)
可以看到已經掛載了,可以使用showmount在服務器上查看一下:
在客戶端的/mnt/nfs中寫入一個b文件,並查看服務器端的/shared目錄:
客戶端寫入:
[root@client nfs]# cp /etc/fstab /mnt/nfs [root@client nfs]# ls /etc/fstab [root@client nfs]
服務器端查看:
[root@localhost ~]# ls /shared/ fstab [root@localhost ~]# cat /shared/fstab # # /etc/fstab # Created by anaconda on Sat Dec 5 11:32:13 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/VolGroup-lv_root / ext4 defaults 1 1 UUID=1a04e551-c2f2-4d1d-8d9a-948e2a2d4be6 /boot ext4 defaults 1 2 /dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2 /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 [root@localhost ~]#
9.NFS的啓動配置
NFS啓動時端口不固定,帶來一些麻煩,可以使用啓動腳本的配置文件(/etc/sysconfig/nfs)。
10.RPC服務管理查看:
可以使用rpcinfo -p命令,顯示所有基於rpc的服務:
[root@localhost ~]# rpcinfo -p 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 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad 100005 1 udp 50980 mountd 100005 1 tcp 59447 mountd 100005 2 udp 46689 mountd 100005 2 tcp 34305 mountd 100005 3 udp 56518 mountd 100005 3 tcp 47681 mountd 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 2 tcp 2049 nfs_acl 100227 3 tcp 2049 nfs_acl 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 2 udp 2049 nfs_acl 100227 3 udp 2049 nfs_acl 100021 1 udp 41169 nlockmgr 100021 3 udp 41169 nlockmgr 100021 4 udp 41169 nlockmgr 100021 1 tcp 34117 nlockmgr 100021 3 tcp 34117 nlockmgr 100021 4 tcp 34117 nlockmgr
11.修改/etc/sysconfig/nfs配置文件,將rquotad進程的端口改爲876(默認爲875):
[root@client ~]# rpcinfo -p|grep rquotad 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad [root@client ~]# vim /etc/sysconfig/nfs RQUOTAD_PORT=876
重啓服務已經變爲876端口了:
[root@localhost ~]# service nfs restart Shutting down NFS daemon: [ OK ] Shutting down NFS mountd: [ OK ] Shutting down NFS quotas: [ OK ] Shutting down NFS services: [ OK ] Shutting down RPC idmapd: [ OK ] Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ] [root@localhost ~]# rpcinfo -p|grep rquotad 100011 1 udp 876 rquotad 100011 2 udp 876 rquotad 100011 1 tcp 876 rquotad 100011 2 tcp 876 rquotad [root@localhost ~]#