一、NFS
1、NFS簡介
NFS:Network File System
NFS協定用于unix/linux系統之間通過網絡進行檔案共享,使用者可以把網絡中NFS伺服器提供的共享目錄挂載到本地檔案目錄中,可以象對本地檔案系統一樣操作NFS檔案系統中的内容。
NFS協定在核心空間中實作,但需要依賴于使用者空間中的功能;
NFS不适用于windows,隻用于unix/linux主機之間進行檔案共享;
NFS是古老的協定了,到了Linux不斷更新和完善,從以前隻支援UDP,現在支援TCP,現在到了V4版本。不過還是不安全,最大的毛病就是不需要身份認證(可以做IP認證,借助Kerberos也可以做身份認證但很麻煩也很少用到),也隻建議在内網用一下;
NFS的工作機制嚴重依賴于RPC:Remote Procedure Call Protocol 遠端過程調用協定
RPC的工作機制:
RPC也可以看成一個服務架構,能夠幫其它的程序監聽在套接字上(和xinetd類似),并将程序的服務提供給遠端使用者,
NIS:Network Infomation Service 網絡資訊服務
也是SUN公司開發的,和kerberos類似也可以實作帳号(使用者ID)映射和集中式使用者認證
LDAP:取代NIS的協定,認證時雖然傳輸也是明文,但可以基于ssl工作
2、RPC服務
NFS也是C/S架構,NFS的用戶端和服務端都需要依賴于rpcbind,rpcbind監聽UDP和TCP的111端口
檢視本機或遠端主機的rpc服務資訊:
[root@Node5 ~]# rpcinfo
program version netid address service owner
100000 4 tcp6 ::.0.111 portmapper superuser
100000 3 tcp6 ::.0.111 portmapper superuser
100000 4 udp6 ::.0.111 portmapper superuser
100000 3 udp6 ::.0.111 portmapper superuser
100000 4 tcp 0.0.0.0.0.111 portmapper superuser
100000 3 tcp 0.0.0.0.0.111 portmapper superuser
100000 2 tcp 0.0.0.0.0.111 portmapper superuser
100000 4 udp 0.0.0.0.0.111 portmapper superuser
100000 3 udp 0.0.0.0.0.111 portmapper superuser
100000 2 udp 0.0.0.0.0.111 portmapper superuser
100000 4 local /var/run/rpcbind.sock portmapper superuser
100000 3 local /var/run/rpcbind.sock portmapper superuser
100024 1 udp 0.0.0.0.182.117 status 29
100024 1 tcp 0.0.0.0.178.51 status 29
100024 1 udp6 ::.147.194 status 29
100024 1 tcp6 ::.178.119 status 29
[root@Node5 ~]# 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
100024 1 udp 46709 status
100024 1 tcp 45619 status
各基于RPC提供監聽服務的程序,在啟動時要向RPC注冊監聽在某端口上,rpc會從各未使用的端口中挑一個給此程序監聽,即半随機(80端口沒使用時,可能會挑選80給程序監聽)。
三、NFS的實作
1、NFS的安裝
NFS本身隻提供檔案系統,并不負責驗證用戶端的身份(不驗證使用者的IP和帳戶),也不完成将使用者的ID映射為本機的使用者ID,這些功能需要依賴于各子元件完成。
NFS由核心實作,伺服器端隻需安裝各子元件就可以:
伺服器端安裝程式:
[root@Node5 ~]# yum install nfs-utils
[root@Node5 ~]# 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
/sbin/mount.nfs4
/sbin/nfs_cache_getent
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.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
/usr/share/doc/nfs-utils-1.2.3
/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/statd/sm
/var/lib/nfs/statd/sm.bak
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab
啟動nfs服務:
因為nfs服務依賴于rpcbind配置設定端口是以rpcbind一定要優先于nfs啟動
[root@Node5 ~]# service nfs start
Starting NFS services: [ OK ]
# 主服務程序,檔案讀寫
Starting NFS quotas: [ OK ] # 磁盤配額程序
Starting NFS mountd: [ OK ]
# 挂載守護程序,負責用戶端來源認證的程序;等待用戶端挂載程序
Starting NFS daemon: [ OK ] # 服務端程序
Starting RPC idmapd: [ OK ]
# 使用者ID号映射程序
[root@Node5 ~]# 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
100024 1 udp 40067 status
100024 1 tcp 38601 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 36049 mountd
100005 1 tcp 35121 mountd
100005 2 udp 34402 mountd
100005 2 tcp 49542 mountd
100005 3 udp 60394 mountd
100005 3 tcp 44809 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 60587 nlockmgr # 鎖管理器
100021 3 udp 60587 nlockmgr
100021 4 udp 60587 nlockmgr
100021 1 tcp 34744 nlockmgr
100021 3 tcp 34744 nlockmgr
100021 4 tcp 34744 nlockmgr
[root@Node5 ~]# ps aux|grep nfs
root 34060 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd4]
root 34061 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd4_callbacks]
root 34062 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34063 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34064 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34065 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34066 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34067 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34068 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34069 0.0 0.0 0 0 ? S 08:13 0:00 [nfsd]
root 34101 0.0 0.0 103252 828 pts/1 S+ 08:15 0:00 grep nfs
NFS監聽在UDP和TCP的2049端口,不會發生變化,其它各輔助程序監聽的端口号重新開機會發生變化,也可以修改服務腳本配置檔案中的某參數來實作。
三、nfs的配置
nfs的共享目錄配置檔案在/etc/exports
1、設定NFS伺服器共享目錄/etc/exports
文法格式:
檔案系統 用戶端1(檔案系統導出屬性) 用戶端2(檔案系統到處屬性)
用戶端可以使用的格式: # 不寫則為全部主機
IP:192.168.10.4
Hostname:*.magedu.com
Network:192.168.10.0/255.255.255.0 或 192.168.10.0/24
檔案系統導出屬性有: 多各屬性用逗号分隔
ro:隻讀,預設
rw:讀寫
async:異步,預設
sync:同步,性能差
root_squash:壓縮root使用者,基于imapd,root使用者通過網絡通路時将映射為nfsnobody使用者,預設屬性
no_root_squash:不壓縮root使用者,危險,
all_squash:映射所有使用者,預設映射為nfsnobody,如果沒有啟用這個選項,用戶端建立檔案時,那麼在伺服器端顯示檔案的屬主、屬組和用戶端使用者 UID一樣的使用者,如果沒有該UID則顯示nobody。
anonuid,anongid:指定匿名使用者映射為該UID和GID,這個指令要和上面的一起使用
nohide:是否可以交叉使用nfs,不隐藏目錄下的nfs,不安全
crossmnt:運作交叉使用nfs
showmount: showmount指令也是由nfs-utils包提供
-e:在nfs用戶端執行,探查某主機所導出的nfs檔案系統,使用格式:showmount -e Server_IP
-d:在nfs伺服器端執行,顯示哪個導出的檔案系統已經被至少一個用戶端挂載使用了,測試不顯示
-a:在nfs伺服器端顯示所有的挂載會話,測試不顯示
[root@Node5 ~]# showmount -e localhost
Export list for localhost:
/data 192.168.10.0/24
[root@Node5 ~]# showmount -d localhost
Directories on localhost:
[root@Node5 ~]# showmount -a localhost
All mount points on localhost:
例:
允許192.168.10.0網絡中所有主機以讀寫權限通路/data目錄
[root@Node5 data]# cat /etc/exports
/data 192.168.10.0/24(rw)
[root@Node5 data]# service nfs restart # 修改配置檔案後需要重新開機,但此時如果有用戶端在讀寫,就會造成丢失
用戶端挂載使用:
用戶端也需要安裝nfs-utils
[root@Node4 ~]# mount -t nfs 192.168.10.5:/data /mnt
[root@Node4 ~]# ls /mnt
test1 test_file
[root@Node4 ~]# mount
/dev/sda2 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)
/dev/sda1 on /boot 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)
192.168.10.5:/data on /mnt type nfs (rw,vers=4,addr=192.168.10.5,clientaddr=192.168.10.4)
exportfs 重新輸出共享目錄格式
-a:操作所有檔案系統
-ra:重新導出所有檔案系統
-ua:取消到處的所有檔案系統
-v:顯示詳細資訊
開機時自動挂載NFS共享:
寫入/etc/fstab
192.168.10.5:/data /mnt nfs defaults 0 0
192.168.10.5:/data /mnt nfs defaults,_netdev 0 0