講解NFS服務器的使用
NFS的使用,我們通常是在Linux一級Unix系統下完成的。那么對于這個NFS服務器的應用,你是否有所了解呢?這里,我們就來介紹一下有關的知識。NFS是一種Unix之間通過網絡共享文件的標準方式.使用NFS,就能夠透明的安裝和訪問網絡上遠程主機上的文件系統,將其安裝到本機的文件系統中.
NFS客戶支持
安裝NFS服務器上的文件系統的方式與安裝本機磁盤文件系統非常相似,同樣是通過 mount命令:
# mount nfssrv:/exports /mnt
這個命令將nfssrv主機上的/exports目錄安裝到本機的/mnt目錄下.可以看到安裝 NFS與本地磁盤文件系統的不同在于 ── 文件系統的描述方法不同.本地磁盤文件系統使用/dev下的設備文件來描述,而NFS文件系統使用遠程主機名和主機上的共享目錄名(中間使用:分隔)來描述.當然其執行的實質是不同的,事實上mount根據文件系統的類型,執行mount_nfs來真正安裝nfs文件系統.
/mnt應該是本地文件系統上的一個空目錄,沒有安裝其他文件系統.如果這個目錄非空,那么使用mount之后,原有的本地文件系統中的內容將不可被訪問,只能看到新安裝上的文件系統中的內容.
由此來看,NFS客戶不需要進行復雜的配置,只需知道NFS服務器的主機名和共享出的目錄名即可.事實上,知道了NFS服務器的主機名,就可以使用showmount命令,來查看這臺服務器共享出的目錄名和訪問限制.
# showmount -e nfssrv
使用NFS文件系統只需要內核支持,而不需其他額外設置,但是同時使用nfsiod進程能夠提供高效的緩沖機制,從而改善nfs文件系統的性能,應該可以在裝載NFS文件系統之前執行這個守護進程.
# nfsiod -n 4
參數-n 4用于限制nfsiod的副本數量,每一個nfsiod用于輔助處理一次I/O操作,因此如果通過NFS文件系統進行頻繁的I/O操作,就要考慮增加nfsiod的副本數量.
由于使用nfsiod能夠提升系統性能,對于NFS客戶計算機,就可以在系統啟動時執行這個守護進程.這需要在FreeBSD的系統配置文件rc.conf中設置nfs_client_enable參數的值為"YES",系統啟動時就自動執行nfsiod.#p#
使用fstab
對于經常用到的NFS文件系統,并且提供NFS服務的Unix主機也非常可靠.那么就可以將這些系統加入/etc/fstab文件中,在系統啟動時自動安裝該NFS文件系統.由于NFS文件系統不在本地,因此在服務器不能提供NFS服務時就會造成故障,系統會遇到啟動障礙,而不同正常啟動.因此對于一臺不穩定的服務器系統,最好不要使用/etc/fstab來裝載NFS文件系統,或者在/etc/fstab的設置參數選項中使用noauto參數,不讓系統自動裝載這個文件系統.
# Device Mountpoint FStype Options Dump Pass#
/dev/wd0s3b none swap sw 0 0
/dev/wd0s3a / ufs rw 1 1
/dev/wd0s3f /usr ufs rw 2 2
/dev/wd0s3e /var ufs rw 2 2
proc /proc procfs rw 0 0
/dev/wcd0c /cdrom cd9660 ro,noauto 0 0
nfssrv:/exports /nfs nfs ro,noauto 0 0
/etc/fstab文件中的第四列為安裝文件系統時使用的安裝參數,如果增加了noauto選項,這樣系統啟動時并不立即安裝這個文件系統,而是直到管理員輸入mount命令之后才進行安裝.但是此時mount命令的參數就可以比較簡單,對應前面安裝nfssrv的命令,可以簡化為 mount /nfs,mount會查看fstab文件尋找匹配的行,以使用正確的參數安裝文件系統.#p#
自動安裝守護進程AMD
為了更方便的使用NFS,可以使用自動安裝軟件amd(automounter daemon,自動安裝守護進程)自動維護文件系統,這就使在訪問具體目錄時能夠立即安裝該文件系統,而經過一端時間間隔內沒有任何訪問發生,再自動卸載這個文件系統.
amd需要指定一個進行監視的空目錄,所有要安裝的文件系統與這個目錄下的子目錄一一對應;它還需要一個維護用的空目錄,用于安裝遠程文件系統,而監視目錄中的子目錄將是正確安裝的文件系統的符號連接.這些子目錄和符號連接并不需要管理員創建,而是要在映射文件中指明,由amd來創建和維護.當監視子目錄被訪問時,amd守護進程就會安裝相應的文件系統并建立正確的連接,使得目錄和文件能被正常訪問.
通常使用/etc/amd.map用作amd的映射文件,這個文件就用于告訴amd子目錄與文件系統的對應關系.下面是一個最簡單的映射文件amd.map:
# cat /etc/amd.map
/defaults type:=host;fs:=${autodir}/${rhost};rhost:=${key}
nfssrv typs:=nfs;rhost:=nfssrv;rfs:=/exports
第一行使用/defaults定義缺省的設置,type參數用于定義維護的文件系統的類型, host類型為通過NFS安裝遠程服務器中直接在exports文件中輸出的目錄,fs參數為amd安裝文件系統使用的安裝位置,變量autodir為amd維護安裝文件系統的目錄,而rhost變量為遠程計算機的名字,需要進行設置.缺省的rhost變量設置為${key}的值,當用戶訪問amd監視目錄的子目錄時,key就被設置為這個子目錄的名字.通過這個缺省設置,當用戶訪問amd監視目錄的任意一個子目錄時,這個子目錄名就被轉換為遠程NFS服務器的名字,amd就自動將這個服務器共享的目錄安裝到fs定義的安裝位置上.#p#
第二行設置
一個專有的映射關系,第一列也是amd設置的key值,當訪問對應的子目錄時就啟動這個設置,這一個安裝點為nfs類型,nfs類型與host略有不同,host類型只需要rhost 定義,而查詢服務器上的共享出的目錄來自動安裝,而nfs類型則要配置者手工指定遠程主機共享的目錄,這就需要設置rfs參數.通常在自動維護的計算機數量較少時,使用nfs類型更明確,否則可以使用host類型以簡化配置工作.
設置好映射文件之后,就可以運行amd守護進程了.
# amd -a /net -c 1800 /host /etc/amd.map
# ls /host
# cd /host/nfssrv
# ls -l /host
nfssrv
上面的amd的命令參數為,第一個-a參數告訴amd將真實的文件系統安裝到/net這個臨時目錄下,在執行amd之前必須建立這個空目錄,這個目錄將被amd作為autodir變量設置映射關系;-c參數用于指明超時參數,經過這個時間間隔內沒有訪問這個文件系統上的內容,就卸載已安裝的文件系統,設置為1800秒;而/host目錄為amd監視用戶訪問的目錄,訪問這個目錄中的子目錄,就會觸發amd守護進程,例如上例中使用cd /host/nfssrv訪問nfssrv子目錄,那么amd 就將啟動,將nfssrv設置為key值,因此amd就讀取/defauts設置的缺省參數和nfssrv這個key值對應的參數,然后執行自動安裝過程.最后一個參數就是指定映射文件為/etc/amd.map.
因此,amd的處理過程可以總結為:用戶首先訪問/host目錄下的子目錄,觸發amd;amd 使用子目錄的名字作為key值,讀取相應映射文件中的設置,將文件系統安裝到/net目錄下的相應目錄上(fs定義的目錄);最后amd在/host目錄下以key值建立符號連接,指向已經安裝到/net 目錄下的真實文件系統,使得用戶訪問子目錄的操作能夠正常完成.
amd主要是和NFS結合使用,用于維護多臺服務器的用戶和文件目錄的一致性,然而amd 不僅僅能用于維護NFS文件系統,同樣也可以用于維護其他種類的文件系統,如CD9660、本地文件目錄的連接,以及擴展到運行一個程序等方式自動安裝相應的文件系統,對于這些非NFS文件系統,就需要使用不同的type參數定義不同的類型.例如可以使用amd將所有用戶的個人目錄維護在同一個路徑下,而不是事實上分布在不同目錄和主機上,等等.此時,amd.map應為:
/defaults opts:=rw,grpid,nosuid,nodev
wb host==wb;type:=link;fs:=/home/wb
cd opts:=ro;host==wb;type:=cdfs;dev:=/dev/wcd0c
dos host==wb;type:=program;mount:="/sbin/mount_msdos mount_msdos /dev/wd0s1 ${path}"
這個映射文件中的缺省設置中首先使用opts設置了幾個安裝選項,用于安裝文件系統時使用.由于這個例子中維護的文件系統NFS文件系統,因此沒有使用變量定義相應的參數,而且在維護的文件系統不多的條件下,可以直接定義各個自動安裝所需要的各個參數.
第一個設置為是一個link類型,它必須在主機為wb(本地主機的名字,amd將自動設置 host變量)時才有效.這個類型只是用于建立連接,因此就沒有必要定義rhost和rfs,而通過 fs定義需要建立連接的目標.因此當訪問/host/wb目錄時,amd就自動建立一個到/home/wb的符號連接.
第二個設置為cdfs類型,這用于訪問時自動安裝CDROM,它通過dev參數設置安裝使用的設備文件.第三個設置為program類型,當訪問/host/dos目錄時,amd會自動執行后面的mount_msdos 程序,裝載上dos分區,安裝點被使用變量path傳遞給外部程序的參數.
為了在啟動時自動執行amd,需要修改rc.conf中的設置,更改其中的選項amd_enable為"YES", amd的執行參數在amd_flags項中設置,缺省為:
amd_flags="-a /net -c 1800 -k i386 -d my.domain -l syslog /host /etc/amd.map"
這個參數使用了另一些有用的參數,-k參數用于運行amd的計算機內核體系,-d參數用于定義計算機的domain名,修改這個參數可以幫助amd偵測計算機所在的domain名字,因此要修改為計算機實際的域名,-l參數定義審計記錄文件,缺省使用syslog.amd的設置相當復雜,這里只是通過一個映射文件來提供針對一個目錄的自動安裝維護,實際上amd可以同時維護多個目錄,這就需要設置一個配置文件,來定義多個監視目錄.對于一般的目的,使用命令行指定一個映射就夠用了.#p#
NFS服務器
為了使得其他系統能使用FreeBSD上的硬盤空間,就需要運行NFS服務進程.NFS服務器使用了幾個守護進程用于提供NFS服務.最基本的提供NFS服務的系統至少要運行nfsd和mountd 守護進程,nfsd用于處理NFS協議,而mountd用于處理客戶的mount請求.此外,由于NFS使用RPC 遠程調用,因此portmap、rpc_lockd、rpc_statd等RPC守護進程都可以用來幫助提供更高效的服務.
這些守護進程一般應該在系統啟動時載入,因此需要在rc.conf中更改相關的參數: nfs_server_enable, rpc_statd_enable, rpc_lockd.enable和portmap_enable參數將對應相應的守護進程.
那么系統重起之后,就有了能共享文件出去的能力,余下的工作只是用來配置需要共享那些目錄,以及進行何種限制以保證安全性,這些設置工作需要更改/etc/exports文件:
# cat /etc/exports
/usr/src/sys -maproot=daemon ns host2
/usr/ports -ro -network 192.168.1.0
從這個例子中可以看出exports文件的格式,首先是定義要共享出去的文件目錄,必須使用絕對路徑,而不能使用是符號連接.后面就是對這個目錄進行訪問限制的參數,用于保證安全性.第一行設置中,
將/usr/sys/src目錄共享出去,但限制客戶機上的root用戶等價于本機上的daemon用戶,以避免客戶機上的root用戶擁有這個服務器上的root權力,進行非法操作,此后的ns和host2參數是主機名,這就限制只有ns和host2才能共享這個/usr/sys/src目錄.第二行設置共享了/usr/ports目錄,但限制為只允許讀取,并且也只有192.168.1.0網絡上的計算機才能訪問這個共享目錄.
目錄的訪問限制中具有多種選項,這些選項對于保證NFS的安全性相當重要.
-ro---以只讀形式輸出文件系統,遠程客戶只能讀不能寫這個目錄
-maproot---將客戶機上的root用戶映射為服務器中的某個用戶和族,也可以使用UID 和GID的形式,如maproot=root,maproot=10,或maproot=10:1.這個設置選項可以用來保護服務器上的文件系統不被客戶中的使用者非法訪問.
-mapall---將客戶上的所有用戶都映射為本機的某個用戶,使用形式與maproot相同.它同樣也是用于保護服務器文件系統的安全性的.
-alldirs---允許安裝該目錄下的所有子目錄.
-network---允許一定網絡上的計算機可以裝載這個文件系統.
-mask---用于修訂 network中的網絡號使用的缺省掩碼,可定義對網絡的一部分開放文件系統.
當更改了exports文件之后,需要向mountd發送SIGHUP信號,使其重讀exports文件的內容.