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