2006年(25)
分类: LINUX
2006-09-09 11:46:17
當您的 Linux 主機安裝好並連上網路之後﹐那麼很自然會進行遠端操作吧。最常用的服務就是 telnet 了﹐它可以讓您從一台機器登錄到另外一台機器﹐然後完成所有遠端的作業。使用 telnet ﹐有點像“網路基礎”中的“Telecommunication”那裡所說的 remote control ﹐也就是﹐您可以利用其他機器鍵盤和熒幕遠端使用 Linux 主機。如果您使用 Windows 98 連接 Linux 的話﹕
按 ‘開始’--> ‘執行’--> 然後輸入﹕ telnet 192.168.100.23 (如果 dns 或 hosts 檔案設定好了﹐可以輸入機器名稱)﹐您就會看到一個登錄畫面了﹐不過﹐先別急著輸入您的大名和密碼﹐做做下面的動作﹕
然後再進行登錄不遲。為什麼這樣做﹖我也不知道啦﹐本來我用以前的 Redhat 好好的﹐但後來換了 Redhat 6.0 之後﹐只要進入 vi 等文書編輯器﹐方向鍵就不聽使喚了﹐只有做了上面動作才可以。後來發現﹐只要在 /etc/bashrc 檔案裡面加下面這一行就解決了﹕
export TERM=vt100 |
然而﹐在 RH7.1 上面預設是將 telnet 功能關閉的﹐您得修改 /etc/xinetd.d/telnet 裡面的設定﹐設定 disable = no 才可以提供 telnet 服務。不過﹐系統之所以要關閉 telnet ﹐是因為它在網路上使用明碼(clear text) 方式傳送數據的緣故。為此﹐在 RH7.1 上面使用 ssh 服務來取代 telnet 服務﹐關於 ssh 的設定﹐您可以參考‘Linux System’系列中的‘’﹐這裡不再重複。只是再提醒您一次﹕能用 ssh 就不要用 telnet ﹗
Okay﹐不管您使用 telnet 還是 ssh﹐所使用的檔案系統和資源都在遠端系統上面﹐如果您要將資料回存在本地電腦上面就不那麼方便了。除了用 ftp 之外﹐您有否想過將遠端的資料 mount 進本地的檔案系統中呢﹖那麼﹐NFS(Network File System) 就可以幫到你了。
另外﹐在網路環境中﹐理想的情況下是讓使用者能夠從網路上任何一台系統進行登錄﹐也只有這樣﹐您才能在登錄之後使用 telnet 服務。然而﹐為了讓使用者能夠在網路上登錄﹐您就必須為每一個使用者在所有 Linux 機器上建立獨立的帳號。是否太麻煩了呢﹖您是否希望 Linux 能像 NT 那樣有一個中央的 DOMAIN 登錄資料庫呢﹖有此念頭完全正確﹐而好消息是﹕您在 Linux 上面使用 NIS (Network Information Service) 就能做到﹗
或許﹐在一些大型的網路伺服器設計上﹐例如設定多台 email server 來進行 load balancing 服務﹐除了前端需要 DNS 和其它一些負載分流技術之外﹐在後端﹐也不能避免的碰到帳號同步和資料同步的需求。前端的技術我們留代日後慢慢探討﹐至於後端的技術﹐完全可以用 NFS 和 NIS 來做到。這也是我們這章的重點﹐假如您是一個 windows 用戶﹐在看完下面的文章後﹐肯定讓您震撼於 Linux 的強大網路功能而目瞪口呆﹗
先將我的網路環境說說吧(您可以參考上一章所介紹的環境)﹕
系統 | 主機名稱 | IP 位址 | |
伺服端 | RedHat 7.1 | rh71.siyongc.domain | 192.168.100.23 |
客戶端 | Mandrak 8.0 | mdk.siyongc.domain | 192.168.100.24 |
請先確定 nfs-utils 套件有裝起來(rpm -qa | grep nfs)﹐如果沒有﹐請用 rpm 安裝。假如需要在一開機的時候就啟動 nfs 服務的話﹐那就用 ntsysv 將 nfs 選起來吧。喜歡的話﹐把 nfslock 也一並開啟也無妨(請 man lockd)。
事實上﹐要設定 NFS 一點都不難﹐關鍵是 server 那端﹕/etc/exports 這個檔案。在真正動手設定之前﹐我建議您先看看它的 manual ﹕
man 5 exports |
請小心設定這個檔﹐如果設定錯誤了﹐以後重新開機的時候您可就得非常不耐煩了。我是這樣設定﹕
/tmp *(rw,no_root_squash) /usr/src *.siyongc.domain(ro,insecure) 192.168.100.*(ro,insecure) /var/ftp/pub/incoming 192.168.100.24(rw,all_squash,anonuid=50,anongid=50) |
第一行﹐我將 /tmp 這個目錄完全分享出去了﹐不管客戶端來自哪裡。在括號裡面的‘rw’就是 Read&Write 的意思﹐而‘no_root_squash’呢﹐則是允許讓使用者具備 root 的權限﹐在某些特殊情況下﹐例如使用 bootp 登錄的無磁碟工作站﹐是相當好用的。因為預設情況下 NFS 會將 root 的身份 squash 為權限最低的 anonymous (nobody) 身份﹐而其它身份則以 client 端機器上當時擁有的 User ID 和 Group ID (指號碼的值)來建立檔案。注意哦﹐在進權限判斷的時候﹐ 不是以 UserName 來作為身份依據哦﹐UID 和 GID 的號碼最後必須對應到 server 端的 /etc/passwd ﹐而非 client 那邊的。
第二行﹐我將 /usr/src 這個目錄分享給以 siyongc.domain 這個 domain 做結尾或是以 192.168.100 開頭的所有機器﹐而無需使用 secure port (insecure)﹐但只具備唯讀權限(ro)。這裡﹐您要留意 " * " 的使用﹐在一些舊版本的 NFS 您不能用在 IP 上。不過﹐我這裡的測試卻是可行的。
第三行﹐我將 /var/ftp/pub/incoming 這個目錄只分享給 192.168.0.22 這台機器﹐且具備了讀和寫的權限(rw)﹐但在 server 上寫入的檔案﹐必須換成 anonymous 身份進行。但是其後的設定又將所有 anonymous 換成設定的 UID 和 GID (這裡都是 ftp)﹐這樣的安排是要確定所有存取都按指定身份進行。這個 incoming 目錄預設是不存在的﹐日後在討論到 FTP 服務設定時候會提到﹐但您可以自行用 mkdir 建立﹐而且為 group 和 others 加上 +w 權限以及 sgid 和 sticky bit (3777)。
完成 exports 設定後﹐就是重新啟動 nfsd ﹕
service nfs stop service nfs start |
哦﹐我不建議您用 restart 來進行﹐最好用 stop 和 start ﹐並且重複兩次﹐確定在第二次 stop 的時候﹐沒看到紅色的 [ FAILED ] 信息。因為我發現如果設定不正確﹐就算您執行 start ﹐也看到了四個 [ OK] ﹐但事實上未必真的成功跑起來﹐只能在 stop 的時候才能發現。另外一個原因是﹕如果設定錯誤﹐很可能導致 nfs 在啟動的時候要等非常久的時間﹐這是不勝其煩的﹐尤其在開機的時候。所以﹐當您每次修改完 nfs 的設定﹐一定要 stop 再 start 看看﹐沒問題才關機﹐否則下次開機可要培養耐性了。
exportfs -rv |
假如有錯誤的話﹐應該會得到提示的。
為求確定﹐您最好執行﹕
showmount -e localhost |
如果這個命令不能正確顯示您所 export 的內容﹐那就重新檢查設定步驟吧。
一但 server 設定好之後﹐您只需在 client 端建立 mount point﹐然後用 mount 命令來掛載即可。不過﹐mount 之前最好用 showmount 來確定一下﹕
showmount -e rh71 |
當 showmount 能順利找到 server 的 exports 之後﹐那就可以放心 mount 了﹕
mkdir /mnt/nfs mount -t nfs -o bg,soft,intr rh71:/tmp /mnt/nfs |
然後﹐就好像自己的硬碟一樣使用~~ ^_^ 要卸載它﹐用 umount 命令就可以。不過﹐如果沒有那些 -o 參數﹐然後在卸載之前您將 server 的 nfs 關閉了﹐或是網路連線出了問題﹐這時候再進行 umount 的話﹐很可能將您的機器‘定格’在那裡哦﹗﹗小心小心~~~ 所以﹐最好在 mount 的時候加上 soft 參數﹐並且在關閉 nfs 伺服器端之前﹐一定要先將所有的 client 所掛載的 mount point 進行 umount 才好進行。
如果您遇到問題﹐通常最常見的錯誤信息是﹕
mount: xxxxx:/yyyyyyyy, reason given by server: Permission denied |
造成這樣的原因多數是 /etc/exports 檔案沒設定好的緣故﹐也就是在分享目錄後面的“( )”裡面的權限設定﹐建議從簡單的設定測試起﹐例如 "/tmp *(ro)"。或是從 /var/log/messages 這個檔案找找原因﹐檢查一下被拒絕的原因。
還有﹐您最好確定 client 和 server 的機器名稱已經在 /etc/hosts 被“正確”的設定起來﹐或者能夠通過 DNS 查詢得到(包括正反兩解)。
在我的實踐中﹐‘link_relative’有時候會造成‘Unknown keyword’﹐這樣會引至 nfsd 無法正常啟動﹐測試的時候請留意。
如果您碰到 rpc 相關的錯誤信息﹐例如﹕
mount: RPC: Unable to receive; errno = Connection refused |
可能出現的問題很多﹐首先確定 portmap 服務是否有跑起來﹐可以用 rpcinfo 來檢查﹕
rpcinfo -p rh71 |
service portmap restart |
不過﹐執行之後﹐請重新啟動 nfs ﹐以及其它所有和 portmap 相關的服務(因為它們會因為 portmap 重啟而失效(最好用 rpcinfo 來確認)。
還有另外的情形﹐可能是 portmap (tcp & udp port 111) 的連線被防火牆擋掉了。或是 xinetd 那邊沒開放 portmap 服務﹐例如在 /etc/hosts.deny 中設定了 "ALL: ALL"﹐那您可以修改 /etc/hosts.allow ﹕
portmap: 192.168.100., .siyongc.domain |
還有﹐就是可能 nfs 還沒起來﹐請確定服務能正確跑起來﹐可以用 stop 和 start 或是 rpcinfo 來判斷。
另外﹐當您升級 server 的 kernal 之後﹐最好也將 client 的 kernal 一起同步。否則您會遇到 mount version 的警告﹐不過﹐您還是可以成功的實現 nfs mount 這動作。
有時候﹐您或許會突發興致給電腦改改主機名稱或轉換 domain﹐這樣也容易造成 NFS 在啟動的時候延遲﹐而且是延遲得難以忍受﹗造成這樣的問題可能有多方面的﹐如 hostsname 設定不正確﹐或 DNS 那裡有誤。不過﹐有一個地方您可以考慮的﹐就是把這個檔案內容清一清﹕/var/lib/nfs/rmtab
如果還有問題﹐先熟讀一下 exports 的 man page (man 5 exports)﹐更詳細的就請參考 NFS 的 文件。
設定 NIS 一點都不難~~ 嘿嘿﹐又來了~~~ ^_^
難的是當它不工作的時候卻不知道問題出在哪裡﹖哈哈﹐廢話~~ ^_^
好了﹐言歸正傳。我們只需指定某一台 Linux 機器做 NIS 伺服器﹐然後其他機器就老實的當 NIS 客戶就好了。如果您的網路較大﹐也可以考慮安裝 Slave NIS 伺服器來分擔 Master NIS 的工作。不過﹐我們這裡只說說 NIS Server 和 Client 的設定﹐Slave NIS 則留給您自己去研究了﹐若有成果的話﹐最好能回來和大家分享分享。
或許﹐您還聽說過 NIS+ 這個名稱﹐它是 NIS 增強版本﹐尤其在網路安全方面有所改善。不過﹐這裡不針對 NIS+ 說明了﹐有興趣的話﹐建議您讀一下 文件。
首先﹐讓我們架設好中央的 NIS 伺服器吧。 (以下步驟是本人實踐之作﹐未必是最佳方法。如果您有更好的主意﹐歡迎 。)
再來確定 ypserv 套件有安裝起來(rpm -qa | grep yp)﹐否則用 rpm 安裝。
執行 ntsysv 將 ypserv 和 yppasswdd 選擇起來﹐確定在開機的時候就能抓取到。
service xinetd restart |
# Always allow access for localhost 255.0.0.0 127.0.0.0 # This line gives access to everybody. PLEASE ADJUST! #0.0.0.0 0.0.0.0 255.255.255.0 192.168.100.0 |
dns: no * : * : passwd.byname : port |
touch /etc/gshadow /etc/netgroup |
nisdomainname chen |
註﹕最好起一個有別於目前 domain 的名字﹐這主要是出於安全考量。 您可以將上面這行命令加進 /etc/rc.d/rc.local 裡面 (不過我在實作上﹐發現 server 端不設定 nisdomainname 也可以的﹐不知道是否真的﹖)。並修改 /etc/sysconfig/network 檔中的句子(不存在則自行建立)﹕
NISDOMAIN=chen |
rpcinfo -u localhost ypserv |
確定 ypserv 是工作的﹐您應該會看到這樣的信息﹕
program 100004 version 1 ready and waiting program 100004 version 2 ready and waiting |
如果您沒看到﹐那就執行﹕
service ypserv start |
重複同樣的步驟﹐確定 yppasswdd 也是工作的。並且用 rpcinfo -p localhost 確定 ypserv 和 yppasswdd 均列其上。
/usr/lib/yp/ypinit -m |
記住要用 Ctrl + D 來結束﹐不是用 Ctrl + C 哦﹐切記切記﹗
然後輸入 y 按 Enter 。
註﹕每次您新增了帳號﹐或修改過 /etc/passwd 檔﹐都要重複這個動作。
留意一下有否錯誤﹐有則根據信息做適當修改﹐無則繼續。例如﹐如果它回應說 "No rule to mak target xxxxxx, needed by yyyyyyyy."﹐通常是在 /etc 下面找不到檔案而已﹐用 touch /etc/xxxxxxx 就可以解決之。
service ypserv restart service yppasswdd restart |
為求保險﹐最好用 rpcinfo 命令來確認一下。就這樣﹐NIS 的 server 就設定好了﹗很容易~~ 沒騙您吧﹖^_^
接下來﹐是設定 NIS Client 。這裡是在 mdk.siyongc.domain (192.168.100.24) 這台機器上面設定﹕
/bin/nisdomainname chen |
domain chen ypserver rh71.siyongc.domain |
註﹕必須確定 client 和 server 的 nisdomain 一致。並修改 /etc/sysconfig/network 檔中的句子(不存在則自行建立)﹕
NISDOMAIN=chen |
passwd: files nis nisplus shadow: files nis nisplus group: files nis nisplus |
+:::::: # 就是 + 號後帶六個冒號﹐之間沒空白鍵。 |
service ypbind restart |
如果順利﹐這命令很快就完成﹐要不然要檢查 server 和 client 雙方的設定和連線了。
接下來﹐就是檢驗勞動成果的時候了。先以 root 身份登入 server﹐並新增一個測試帳號﹕
useradd ypu1 passwd ypu1 cd /var/yp make |
然後轉到客戶端上面以 root 身份登錄﹐並輸入﹕
ypcat passwd |
如果順利的話﹐ server 端 UID 大於 500 的帳號都會被列出來。您也可以執行下面命令來確定某帳號是否出現在 NIS 登錄之中﹕
getent passwd ypu1 |
假如您看不到任何信息回應﹐那麼﹐很可能是前面的步驟(包括伺服器和客戶端)還沒正確完成﹐您則需要找出原因所在。
如果您能得到信息回應﹐例如﹕
ypu1:$1$BzYQtUua$n68UwKiNVDjWS/UJGHFU4/:1001:1001::/home/ypu1:/bin/bash |
那是好消息﹗否則您得從頭進行 debug 方好繼續。
當上一步驟過關之後﹐如果您覺得有需要﹐那您可以再修改帳號的 yp 密碼。但這步不是必須的﹐如果您能夠從另外的機器用 NIS 帳號登錄就可以略過此步驟(我建議您不必修改 yp 密碼)。﹕
yppasswd ypu1 Please enter root passwd: Please enter new passwd: Please retype password: |
注意﹕第一行是 root 密碼﹐最後兩行是設定 yp 的 NIS password。最好和原來的密碼一致﹐因為原來的密碼也會被更改為 nis 的密碼﹐小心﹗(請參考後面的說明)
接著請在本地主機上面建立起該使用者的家目錄﹕
cp -a /etc/skel /home/ypu1 chown -R ypu1.ypu1 /home/ypu1 |
這樣﹐您就可以使用 NIS 登錄了﹗
當然﹐您也可以設定 Linux 在開機的時候通過 NFS 掛載到使用者原本的家目錄(tips﹕修改 /etc/fstab)。但如何做﹖您自己去嘗試吧﹐這裡暫時賣個關子。不過﹐下面我有更好的提議﹐請不要錯過了哦~~ ^_^
在使用 NIS 的時候﹐您需要注意的地方大致有如下這些﹕
但這似乎是個矛盾﹕修改了 yp 密碼會改變系統密碼﹐修改系統密碼卻不改變 yp 密碼﹐然後新增帳號後需要同步 nis 帳號﹐卻又把 yp 密碼變回系統密碼﹗真是有點亂~~ 所以﹐所有 NIS 帳號﹐最好避免修改系統密碼。
我曾經試過一直嘗試 client 那邊的 ypbind 都連不上 server ﹐總得到什麼 "Domain not bound" 的信息。後來也沒改什麼﹐吃完中午飯回來再試一次竟然可以了﹗百思不得其解﹐只是將經驗告訴您﹕有時候﹐退一步海闊天空。
曾和在新聞組上和網友的討論過一篇關於 NIS 的文章﹐我覺得蠻值得參考一下的﹐不妨 閱讀。
當您按照前面的步驟完成了 NFS 和 NIS 一定很興奮吧﹗(有沒有衝動要來信和我分享這份喜悅啊﹖^_^ ) 然而﹐這裡我再教您一個法子﹐讓您 high 到最高點﹗
您在前面的實作中﹐您腦海中是否閃過這些疑問呢﹕
Okay﹐說了這麼多﹐趕快介紹如何設定吧﹕
service yppasswdd stop service ypserv stop service nfs stop mkdir /home/yphome |
mv /home/ypu1 /home/yphome usermod -d /home/yphome/ypu1 ypu1 |
其它 NIS 帳號也如法泡制。如果您需要新增加 NIS 帳號﹐請指定其 home dir 的路徑﹐例如﹕
useradd -d /home/yphome/ypu2 ypu2 passwd ypu2 |
cd /var/yp make |
修改 /etc/exports 檔﹐輸出 yphome 目錄﹕
/home/yphome *.siyongc.domain(rw,no_root_squash) 192.168.100.*(rw,no_root_squash) |
service nfs start service ypserv start service yppasswdd start |
/home/yphome /etc/auto.yphome --timeout=60 |
* -fstype=nfs,bg,soft,intr rh71:/home/yphome/& |
mkdir /home/yphome |
servcie autofs restart service ypbind restart |
沒錯﹐就醬子而已~~~ 然後您用原來的 ypu1 和新增的 ypu2 帳號登錄﹐看看是否成了﹖
如果您的系統從安裝到核心編譯到網路設定都是根據我的步驟進行的話﹐應該不會有困難。如果有問題﹐那可能是您打錯字(或是我這裡打錯字)的關係而已。不過﹐如果發現 autofs 不成功的話﹐建議先用手工執行 mount 來測試 NFS 連線。
有了以上經驗﹐假如您要將所有 yp user 的郵件信箱也集中在相同的位置上(例如做 mail server load balancing)﹐也不會難倒您才對。具體步驟我不詳說了﹐只點出關鍵要注意的地方﹕
事實上﹐善用 NFS﹑NIS﹑和 autofs 可以營造的網路空間是非常廣闊的﹐這些需要您自己發揮創意了。有什麼好點子的話﹐隨時歡迎來信討論和大家分享。