網路檔案系統服務 (NFS)

Network File Service (NFS)

要執行 NFS 服務,要安裝兩個 RPM 套件,portmap 和 nfs-utils,兩者皆是 System V 啟動方式,將服務的腳本放在 /etc/init.d/ 中。NFS 分享出來的目錄,設定在 /etc/exports 中。NFS 服務要啟動,一定要啟動 portmap、rps.nfsd、rps.mountd 三個服務。在預設狀況下,NFS 是使用 2049 通訊埠,如果 2049 被其他程式佔用,就由 portmap 來指派其他的服務埠。

NFS 可用 tcp_wrappers 來作為連線控管的機制,控管的標的是 portmap,例如要讓 192.168.0.0/24 的網段可以使用 NFS 服務,可以在 /etc/hosts.allow 中設定:
portmap:  192.168.0.

要確認本機是否有啟動 NFS 服務,可使用以下指令:
# rpcinfo  -p
程式採用的協定連接阜
100000    2   tcp    111  portmapper
100000    2   udp    111  portmapper
100024    1   udp    765  status
100024    1   tcp    768  status
100011    1   udp    680  rquotad
100011    2   udp    680  rquotad
100011    1   tcp    683  rquotad
100011    2   tcp    683  rquotad
100003    2   udp   2049  nfs
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
100003    2   tcp   2049  nfs
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100021    1   udp  32770  nlockmgr
100021    3   udp  32770  nlockmgr
100021    4   udp  32770  nlockmgr
100021    1   tcp  47175  nlockmgr
100021    3   tcp  47175  nlockmgr
100021    4   tcp  47175  nlockmgr
100005    1   udp    713  mountd
100005    1   tcp    716  mountd
100005    2   udp    713  mountd
100005    2   tcp    716  mountd
100005    3   udp    713  mountd
100005    3   tcp    716  mountd

# service  portmap  status
portmap (pid 2672) 正在執行…
# service  nfs  status
rpc.mountd (pid 3505) 正在執行…
nfsd (pid 3499 3498 3497 3496 3495 3494 3493 3492) 正在執行…
rpc.rquotad (pid 3471) 正在執行…

要確認遠端主機是否有開啟 NFS,可使用下列指令:
# rpcinfo  -p  REMOTE_HOST
# showmount  -e  REMOTE_HOST

本機目錄分享指令:
exportfs  -r:在修改完 /etc/exports 後更新分享目錄 (refresh)
exportfs  -v:顯示目前已經分享的目錄及其參數
exportfs  -a:分享所有在 /etc/exports 中指定的目錄
exportfs  -au:關閉所有在 /etc/exports 中指定的分享目錄

==============================

NFS Ports

NFS 服務埠基本上是由 portmap 來管理,我們也可以為 portmap 指定固定的服務埠,其中使用的程式包含 mountd、statd、和 lockd。要指定固定的服務埠可在 /etc/sysconfig/nfs 中設定:
MOUNTD_PORT=”4002″
STATD_PORT=”4003″
LOCKD_TCPPORT=”4004″
LOCKD_UDPPORT=”4004″
RQUOTAD_PORT=”4005″
STATD_OUTGOING_PORT=”4006″

NFS Server

NFS Server 要分享出去的目錄都寫在 /etc/exports 裡,其中預設的參數是 ro,sync,root_squash,語法:
/SHARE_DIRECTORY    ALLOW_HOSTS(PERMISSION, 參數) (在 ALLOW_HOSTS 與 PERMISSION 之間不可以加空白)

例:
/var/ftp/pub    *.example.com(ro,sync)    bigserver.redhat.com(rw,sync) (/var/ftp/pub 這個目錄,在 *.example.com 的網域中可以唯讀、資料直接寫入的權限;在 bigserver.redhat.com 這台主機,有讀與寫、資料直接寫入的權限,其中網域名稱要能夠反查出來)
/root/presentations    server2.example.com(rw,sync) (/root/presentations 這個目錄,在 server2.example.com 這台主機,有讀與寫、資料直接寫入的權限,其中網域名稱要能夠反查出來)
/data    192.168.10.0/255.255.255.0(sync) (/data 這個目錄,在 192.168.10.0/24 這個網段,有唯讀、資料直接寫入的權限)

參數:
root_squash:預設參數,如果 NFS Client 是以 root 的身份在操作,會將其身份轉換成 nfsnobody。
no_root_squash:不要將 root 的身份轉換成 nfsnobody。
all_squash:其他使用者都將身份轉換成 nfsnobody。
no_all_squash:預設參數,不會轉換 NFS Client 使用者的身份,會保留其 UID 和 GID。
sync:預設參數,資料同步直接寫入硬碟,使用上會比較慢,可是資料比較有保障。
async:資料不同步寫入硬碟,會先寫入緩衝區 (buffers),再在背景寫入硬碟,速度比較快,可是資料比較可能會有損毀。
anonuid:預設為 anonuid=65534,nfsnobody,可在此指定要轉換的 UID。
anongid:預設為 anongid=65534,nfsnobody,可在此指定要轉換的 GID。

啟動:

# chkconfig  nfs  on (設定每次開機都會啟動)
# service  nfs  start (現在啟動 NFS Server)

檢查:

# service  nfs  status (檢視本機 nfs server 狀況)
rpc.mountd (pid 16580) 正在執行…
nfsd (pid 16574 16573 16572 16571 16570 16569 16568 16567) 正在執行…
rpc.rquotad (pid 16563) 正在執行…

# exportfs  -v (檢視本機分享目錄及其權限)
/var/ftp/pub    192.168.0.0/24(rw,wdelay,root_squash,no_subtree_check,anonuid=65534,anongid=65534)
# showmount  -e  localhost (顯示 localhost 所分享出來可供掛載的目錄)
Export list for localhost:
/var/ftp/pub 192.168.0.0/24

# rpcinfo  -p  localhost (顯示 localhost 所註冊的 RPC 服務)
程式採用的協定連接阜
100000    2   tcp    111  portmapper
100000    2   udp    111  portmapper
……  略  ……
100005    3   udp    644  mountd
100005    3   tcp    647  mountd

==============================

NFS Client

NFS 目錄的掛載可由 root 手動掛載或設定在 /etc/fstab 使在開機時自動掛載。

手動掛載:
# mount  -t  nfs  SERVER_IP:/SHARE_DIRECTORY /MOUNT_POINT

例:
# mount  -t  nfs  192.168.0.2:/var/ftp/pub  /mnt/nfs
# df -h
檔案系統              容量  已用 可用 已用% 掛載點
/dev/mapper/VolGroup00-LogVol00
18G  5.9G   11G  36% /
/dev/sda1              99M   22M   72M  24% /boot
tmpfs                 760M     0  760M   0% /dev/shm
192.168.0.2:/var/ftp/pub       18G  5.9G   11G  36% /mnt/nfs

自動掛載:
在 /etc/fstab 設定:
SERVER_IP:/SHARE_DIRECTORY /MOUNT_POINT nfs  defaults  0  0

例:
# echo “192.168.0.2:/var/ftp/pub    /mnt/share    nfs    defaults    0  0” >> /etc/fstab
# mount -a
# df -h

檔案系統              容量  已用 可用 已用% 掛載點
/dev/mapper/VolGroup00-LogVol00
18G  5.9G   11G  36% /
/dev/sda1              99M   22M   72M  24% /boot
tmpfs                 760M     0  760M   0% /dev/shm
192.168.0.2:/var/ftp/pub                      18G  5.9G   11G  36% /mnt/share

autofs:

除了在 /etc/fstab 中設定開機掛載外,也可以使用 autofs 來自動掛載 NFS
# echo  “NFSDIR   –fstype=nfs,rw,soft   192.168.0.2:/var/ftp/pub”  >>  /etc/auto.misc (將本行加到 /etc/auto.misc 中)
# service  autofs  restart (重新啟動 autofs)
正在停止 automount:                                        [  確定 ]
正在啟動 automount:                                        [  確定 ]

# cd  /misc/NFSDIR (每次只要有人使用到此目錄,就會自動掛載)
# ls
This.is.var_ftp_pub
# mount (檢查一下所有掛載點看看有沒有掛載起來)
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
/var/ftp/pub on /misc/NFSDIR type none (rw,bind)

相關參數:
在 /etc/fstab 或 /etc/auto.misc 中,如果掛載 NFS 可使用的參數如下:
rsize=8192,wsize=8192:讀取及寫入的大小,影響網路傳輸時緩衝區記憶體容量,在區域網路時可加大,或是使用預設值:rsize=1024,wsize=1024。
soft:斷線後會在背景重複呼叫直到回覆。
hard:斷線後會在前景持續呼叫直到回覆。
intr:和 hard 混合使用,如果呼叫太久可以中斷呼叫。
nolock:取消檔案鎖定 (lockd) 的動作,以相容於舊版的 NFS。