對(duì)于NFS掛載的研究
對(duì)于NFS來(lái)說(shuō),它的一個(gè)非常重要的應(yīng)用就是掛載。在這方面我們來(lái)詳細(xì)探討一下。有些人, 想用NFS Root掛載, 來(lái)建立其客戶端的目錄, 這份 Mini-Howto,正是為了幫助這些人而寫的. 請(qǐng)注意, 這工作有許多方法可以達(dá)成, 端視你的需求與目的而定. 假如客戶端彼此獨(dú)立, 且每個(gè)客戶端各自有用戶群和管理員, 那么, 不和其他客戶端, 分享重要的目錄, 將是必須的.另一方面, 倘若客戶端, 計(jì)劃用于多種用戶, 并且全都由同一人管理(例如電腦課), 這種情形, 為了容易管理, 盡可能要使愈多文檔能夠分享. 這份 Howto 將焦點(diǎn)于第二種情況.
當(dāng)建立客戶端的根目錄, 并嘗試去降到最小尺寸時(shí), 我們主要焦點(diǎn)于, 哪個(gè)文檔可以分享, 或者可從伺服器掛上. 在這份 Howto 中, 我將依自己的經(jīng)驗(yàn), 對(duì)客戶端的組態(tài) (configuration), 提出建議. 但在我們開始前, 請(qǐng)注意:
* 這份 Mini-Howto 并沒有實(shí)際說(shuō)明, 如何掛載 NFS Root.如果你需要這方面的進(jìn)一步信息, 請(qǐng)參考 NFS-Root Mini-Howto.
* 我客戶端的組態(tài), 大多基礎(chǔ)于 mounts 和 symbolic links. 這些symbolic links, 大部份可取代為 hardlinks. 選擇哪種則隨個(gè)人喜好. 而在 mount 和 symbolic link 之間, 放置 hardlink 作聯(lián)系,這樣有其優(yōu)點(diǎn), 但或許會(huì)發(fā)生混淆. 一個(gè)文檔, 除非它的 hardlinks全都移除了, 否則將無(wú)法刪掉. 因此, 當(dāng)你更新了某個(gè)檔, 該檔的 hardlinks 仍會(huì)指到舊的版本, 為了避免這情形, 你必須非常小心, 并要維系好, 你所放置的每個(gè)連結(jié).
* 從伺服器掛上信息的方式, 有兩種. ***種 (最普遍), 是將整個(gè)伺服器的根目錄, 掛在本地端的目錄下, 然后只改路徑, 或直接連結(jié)相關(guān)的目錄. 就我而言, 我不喜歡把伺服器的 root partitions掛到客戶端上. 因此, 這份 Howto 建議一種方式, 把伺服器上相關(guān)的目錄, 掛到系統(tǒng)適當(dāng)?shù)奈恢?
* 這份 Howto 立論于, 我在 Slackware 3.1 based distribution 之上,建立客戶端目錄的經(jīng)驗(yàn). 對(duì)其他使用者來(lái)說(shuō), 可能會(huì)有地方不同 (尤其是 rc.* 這些檔), 然而觀念應(yīng)該仍舊不變.
建立客戶端的根目錄
1. 建立目錄樹
最初, 你需要建立目錄本身的架構(gòu). 我把所有的客戶端, 建在/clients/hostname 之下, 我拿它用于下面的例子. 不過, 這目錄也可改為其他路徑. 接著***階段, 是在這根目錄下, 建立相關(guān)的目錄. 你應(yīng)該建立下列目錄:bin, dev, etc, home, lib, mnt, proc, sbin, server, tmp, usr, var以及其他, 你可能想置于系統(tǒng)上的目錄.local, proc, dev 這些目錄, 每臺(tái)機(jī)器要各自一份, 而其余目錄,則是部分的, 或完整的, 和其他客戶端共享.
2. 建立開機(jī)所需, 最小的文檔系統(tǒng)
2.1. 建立 dev 目錄.
盡管目錄 dev 可以共享, 但***還是為每個(gè)客戶端, 各自建一個(gè).你可以用合適的 MAKEDEV scripts, 來(lái)建客端的 dev目錄, 不過大多數(shù)情況, 直接從伺服器復(fù)制, 比較簡(jiǎn)單:cp -a /dev /clients/hostname你應(yīng)記住, /dev/mouse, /dev/cdrom, /dev/modem 是 symbolic links,將連結(jié)至實(shí)際的設(shè)備, 因此, 你應(yīng)確保, 它們連結(jié)正確, 而符合客戶端的硬件.
2.2. 復(fù)制所需的執(zhí)行檔.
盡管我們從伺服器, 掛載每件東西, 但***限度, 我們還是需要把些東西, 拷到客戶端. 首先, 我們需要 "初始", 在初始化之前, 系統(tǒng)不可能跑任何東西 (雖然作者費(fèi)了許多工夫, 才發(fā)現(xiàn)到這件事 ;-).所以***, 你應(yīng)該把 /sbin/init 復(fù)制到客戶端的目錄 sbin 下, 這么一來(lái), 便會(huì)執(zhí)行 rc.S, 接著, 你應(yīng)復(fù)制 /bin/sh 到客戶端的目錄 bin 下.還有, 為了掛載所有東西, 你需要把 /sbin/mount 拷到客戶端的目錄 sbin 下. 假設(shè)你 rc.S 的***行是 mount -av, 那這就是***限度了. 然而, 我建議再多拷些檔: update, ls, rm, cp, umount, 如此一來(lái),客戶端掛載時(shí)若出問題, 就有基本工具可用了. 假如你選擇在掛載前啟動(dòng) swap, 那你還應(yīng)復(fù)制執(zhí)行檔 swapon.因?yàn)檫@些執(zhí)行檔, 多數(shù)預(yù)設(shè)為動(dòng)態(tài)連結(jié), 所以你也需復(fù)制等份的 /lib:cp -a /lib/ld* /lib/libc.* /lib/libcursses.* /client/hostname/lib應(yīng)考慮, 若不用復(fù)制, 而是 hardlink 至執(zhí)行檔本身的情形. 請(qǐng)讀我對(duì)這所作的評(píng)語(yǔ), 在這份 Howto 的 2.1 節(jié).請(qǐng)注意, 上述所有資料, 是假設(shè)開機(jī)時(shí), 網(wǎng)路組態(tài)的參數(shù)已傳給核心. 如果你打算用 rarp 或 bootp 的話, 與這些相關(guān)的執(zhí)行檔, 你也可能需要.一般而言, 你需要的文檔, 最少要使你能設(shè)定網(wǎng)路以及跑 rc.S, 直到開始掛上文檔系統(tǒng)的其他部分. 確定你檢查過, 你的 /etc/init 以及 rc.S 檔, 確定它們沒有任何的 "驚喜", 這是指, 在***次掛載前,發(fā)生存取其他文檔的狀況. 然而, 倘若你真的發(fā)現(xiàn)有這樣的檔, 你可以也拷過來(lái), 或是從你的 init 檔和 rc.S 檔, 移除相關(guān)的部分.
2.3. 目錄 var
大多數(shù)情況下, 目錄 var 應(yīng)該, 每個(gè)客戶端各別一份. 可是, 目錄 var 的資料大多都能共享. 請(qǐng)?jiān)谒欧鞯哪夸浵? 建一目錄,稱作 var. 我們將在那, 掛上伺服器的 var 目錄. 要建立本地端的var 目錄, 直接鍵入:cp -a /var /clients/hostname/現(xiàn)在, 你可選擇, 何者要區(qū)隔開, 何者要共享. 要共享的目錄或文檔,要先從客戶端的 var 目錄中, 把它移除, 再把它 symbolic link 至目錄 /server/var. 不過請(qǐng)注意, 你應(yīng)該 symbolic link 至 /server/var 或../server/var, 而非 /clients/hostname/server/var, 因?yàn)檫@么做, 當(dāng)根目錄(指 /clients/hostname/) 更動(dòng)后, 將會(huì)失效.一般而言, 我建議隔開 /var/run, /var/lock, /var/spool, /var/log.
2.4. 其余的目錄
* etc 在下節(jié)有完整說(shuō)明.
* mnt 與 proc 用于本地端.
* usr 和 home 僅為掛載點(diǎn) (mount points).
* tmp 隨你決定. 你可以為每個(gè)客戶端, 各別建立不同的 tmp 目錄,也可以建些 /clients/tmp 目錄, 然后把它掛到每個(gè)客戶端的 /tmp之下. 我建議你為每個(gè)客戶端, 各別提供一 tmp 目錄.
3. 建立 etc 目錄, 并設(shè)定客戶端的組態(tài)
請(qǐng)注意 - 本節(jié)是談, 建立目錄 etc, 此目錄大多共享于客戶端之間. 假如你哪些無(wú)磁盤的客戶端, 各有不同的系統(tǒng)管理員, 那***為每個(gè)客戶端, 各自設(shè)立一 etc 目錄.
3.1. 建立多個(gè)客戶端共用的 etc 目錄
雖然我們隔開客戶端之間的 etc 目錄, 不過我們?nèi)韵朐谀? 分享大部分的文檔. 一般而言, 我認(rèn)為, 和伺服器的 /etc 目錄, 共享 etc檔, 這樣不好, 因此我建議, 開個(gè)目錄 /clients/etc, 容納客戶端所需的信息. 這樣一開始, 只要把伺服器的 etc 目錄內(nèi)容, 復(fù)制到/clients/etc 目錄下即可.
你應(yīng)該把所有非硬件規(guī)格的組態(tài)檔, 如 motd, issue 等, 全都加進(jìn)這個(gè)目錄, 而不應(yīng)加入會(huì)隨客戶端硬件而異的文檔. (例如, initab或是 fstab)最重大的改變, 是在你的 rc.d 目錄里. 首先, 你應(yīng)該調(diào)整 rc.inet1,以適宜于你本地端的設(shè)定. 我透過 LILO/Loadlin, 把我網(wǎng)路組態(tài)的所有參數(shù), 都傳給核心, 因此我?guī)缀跻瞥?rc.inet1 檔的每一行.唯一留下的, 是 localhost 的 ifconfig 和 route. 假如你是用 rarp 或是 bootp, 那你就必須視情況而改.
其次, 你應(yīng)該編輯你的 rc.S 檔. 首先, 移除所有會(huì)導(dǎo)致 fsck 檢查的部分, 這是因?yàn)樗欧鏖_機(jī)時(shí), 會(huì)啟動(dòng) fsck. 接著, 你應(yīng)該把掛載你 fstab 的那一行找出來(lái). 這應(yīng)該看起來(lái)像:
- mount -avt nonfs
-t nonfs 在這, 是因?yàn)檎5目蛻舳? 先跑 rc.S, 緊接著以 rc.inet1來(lái)組設(shè) Ethernet. 由于這會(huì)導(dǎo)致, 不掛載任何的 NFS partitions,所以這行應(yīng)該刪掉. 因此, 把它改成 mount -av. 倘若你需要跑rarp/bootp 來(lái)設(shè)定你網(wǎng)路的組態(tài), 那就在掛載前, 在 rc.S 作這件事(或者從 rc.S 呼叫適當(dāng)?shù)?script), 并且確定你磁盤的 bin 和 sbin目錄, 提供所需的文檔.#p#
執(zhí)行完 mount -av, 你就有個(gè)運(yùn)作中的文檔系統(tǒng)了. 建個(gè)一般的fstab, 這樣稍后你便可, 把它復(fù)制到每個(gè)客戶端. 你的 fstab 應(yīng)該看起來(lái)像:
- server:/clients/hostname / nfs default 1 1
- server:/bin /bin nfs default 1 1
- server:/usr /usr nfs default 1 1
- server:/sbin /sbin nfs default 1 1
- server:/home /home nfs default 1 1
- server:/lib /lib nfs default 1 1
- server:/clients/etc /server/etc nfs default 1 1
- server:/clients/var /server/var nfs default 1 1
- none /proc proc default 1 1
請(qǐng)注意, 關(guān)鍵字 default 或許不會(huì)有效于所有不同版本的掛載. 你可以把它更改為 rw 或 ro, 或者移除全部的 default 1 1.再者, 確定你伺服器的 /etc/exports, 看起來(lái)像:
- /clients/hostname hostname.domainname(rw,no_root_squash)
- /clients/etc hostname.domainname(ro,no_root_squash)
- /clients/var hostname.domainname(ro,no_root_squash)
- /usr hostname.domainname(ro,no_root_squash)
- /sbin hostname.domainname(ro,no_root_squash)
- /bin hostname.domainname(ro,no_root_squash)
- /lib hostname.domainname(ro,no_root_squash)
- /home hostname.domainname(rw,no_root_squash)
對(duì)每臺(tái)主機(jī)而言, ***行應(yīng)該各自獨(dú)立, 除此之外, 其他行可替換為主機(jī)遮罩 (hostmask), 使你所有的主機(jī)都能相契 (如 pc*.domain -然而要記住, * 只能代換沒有句點(diǎn)的字串). 我建議你, 讓大部分的目錄唯讀, 不過這由你決定. no_root_squash 將確保使用者 root,在客戶端上, 對(duì)于 nfsd 實(shí)際也有 root 權(quán)限. 請(qǐng)查證 man exports(5).
假如你要讓使用者, 也能從客戶端執(zhí)行 passwd, 那請(qǐng)確定 /etc 可讀可寫 (rw) 而非唯讀 (ro). 不過, 這并不明智.請(qǐng)注意另一件, 有關(guān)文檔 rc.S 的事. 在 Slackware 執(zhí)行 rc.S, 預(yù)設(shè)會(huì)每次都建立新的 /etc/issue 和 /etc/motd. 假如這些檔從伺服器掛載為唯讀 (ro), 那這個(gè)功能一定要停用, 而且我建議, 在任何情況都應(yīng)停用.
***, 如果你伺服器, 要和客戶端一樣, 擁有相同的使用者資料庫(kù) (userbase), 你應(yīng)在下列兩種方式作選擇,
1) 使用 NIS (YellowPages - 請(qǐng)參考 yp-howto), 這樣, 接收自 NIS 伺服器之故, 每個(gè)客戶端都會(huì)各自有 /etc/passwd 以及 /etc/group.
2) 大多數(shù)情況, 簡(jiǎn)單的 symbolic link 就夠了. 因此, 你需要 hardlink /clients/etc/passwd到 /etc/passwd, 或者你喜歡用 symbolic link 的話, 那就把 /etc/passwd連結(jié)到 /clients/etc/passwd (反過來(lái)說(shuō), 這是因?yàn)榭蛻舳瞬⒉粧燧d伺服器的 etc 目錄). 至于 /etc/group, 方法也一樣.
3.2. 建立單一客戶端專用的 etc 目錄
一般而言, 在客戶端的 etc 中, 文檔大部分應(yīng)該 symbolic link 到目錄 /server/etc. 然而, 有些文檔應(yīng)隨每臺(tái)硬件的差異, 而彼此不同,而有些只在載入核心時(shí)才用到. 目錄 etc 中, 你最少需要的檔, 如下:
- resolv.conf
- hosts
- inittab
- rc.d/rc.S
- fstab
既然這五個(gè)檔, 在所有客戶端都可以相同, 你可以直接把它們hardlink, 或者再?gòu)?fù)制一次. 不過, rc.S 與 fstab 兩檔, ***是每個(gè)客戶端各復(fù)制一份. 你還需要每個(gè)客戶端, 各自一份 etc/HOSTNAME.我個(gè)人是建議, 所有的 rc.d 檔, 每個(gè)客戶端都要各自有一份, 因?yàn)榻M態(tài)和硬件可能彼此相異.為每個(gè)客戶端, 把適當(dāng)?shù)?swap 行, 加入其 fstab 檔:
- /dev/swap_partition swap swap default 1 1
客戶端其余的 /etc 檔, 你可以 hardlink 到文檔 /clients/etc/*, 或把它們 symbolic link 到 /server/etc (這是 /clients/etc/ 的掛載點(diǎn)).確定你的主機(jī)能正確的 resolve, 無(wú)論是透過 named 還是 etc/hosts.在 etc/hosts 中記錄伺服器的 IP, 而不倚賴 resolve, 這方式不錯(cuò). 假如你只倚賴 named 的 resolve, named 出了個(gè)問題, 將使你客戶端無(wú)法開機(jī).
3.3. 開機(jī)
現(xiàn)在, 你該作的就是, 開機(jī), 十指交叉, 期望每件事都正常運(yùn)作。
4. 建立更多的客戶端
如果你已跟著我的指示, 作到這里, 那這應(yīng)該很簡(jiǎn)單 - cd 到 /clients,鍵入:
- cp -a hostname1 hostname2
然后, 確定你檢查了這幾點(diǎn):rc.d/* 檔符合軟硬件組態(tài)etc/HOSTNAME 正確, fstab 的 swap 行正確, dev/mouse, dev/modem,dev/cdrom 這三個(gè)的 symbolic links 正確.