1.5. Step 4: 用testparm測試你的配置文件
用testparm程序測試smb.conf文件非常重要。如果testparm運行OK就會列出可裝載的服務項,否則會給出出錯信息。在繼續之前請確保它運行OK,並且服務項都符合要求。
--------------------------------------------------------------------------------
1.6. Step 5: 啟動smbd和nmbd進程
你必須選擇是以後台進程方式還是從inetd裡啟動smbd和nmbd,注意二者只能選其一。要麼把它們放到inetd.conf,然後由inetd根據需要來啟動;要麼從命令行或從/etc/rc.local裡以後台進程方式啟動。參見手冊頁中有關的命令行選項,特別要注意的是啟動Samba的賬號,通常必須是root。
以後台進程方式啟動smbd和nmbd的主要優勢是,對初始化連接請求的響應要更快一點,不過這並不是個太大的問題。
--------------------------------------------------------------------------------
1.6.1. Step 5a: 從inetd.conf啟動
注意:如果你用NIS或NIS+來分發服務映射表的話,就會與以下方法有所不同。
找到/etc/services中所定義的端口139/tcp。如沒有就把下面這行加進去:
netbios-ssn 139/tcp
類似的,還應該有如下這樣的端口137/udp定義:
netbios-ns 137/udp
接著編輯/etc/inetd.conf並加入下面這兩行:
netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd smbd
netbios-ns dgram udp wait root /usr/local/samba/bin/nmbd nmbd
各種UNIX版本中的/etc/inetd.conf其語法可能也不同。參考一下該文件中其它項目的格式。
注意:有些UNIX的/etc/services已經包含了諸如netbios_ns這樣的項目(小心下劃線)。你必須編輯/etc/services或者/etc/inetd.conf使它們一致。
注意:在很多系統上你必須使用smb.conf中的“interfaces”選項來指定系統接口的IP地址及掩碼。如果你不知道網絡的廣播地址,請以root身份運行ifconfig。nmbd會在運行時嘗試檢測廣播地址,但在有些系統上這樣做就會失敗。如有必要請參見“testing nmbd”部分獲得查找方法。
!!!警告!!!多數UNIX的inetd.conf只接受大約5個命令行參數。也就是說你不應該在選項和參數間用太多空格,或者使用一個腳本並讓它從inetd啟動。
接著重新啟動inetd,為此你只要給它發信HUP信號就可以了。如果你已安裝了一個以前版本的nmbd,那還需要把它殺一下。
--------------------------------------------------------------------------------
1.6.2. Step 5b. 可選法:以後台進程啟動
要以後台進程方式來啟動服務器,應該創建一個如下這樣的腳本,並起名為諸如startsmb。
#!/bin/sh
/usr/local/samba/bin/smbd -D
/usr/local/samba/bin/nmbd -D
然後用chmod +x startsmb這個命令使它可執行。當然你可以手工運行startsmb或者從/etc/rc.local啟動。給nmbd和smbd各發一個殺進程信號就可以使它們停止運行。
注意:如果你用的是SVR4風格的init系統的話,可以改一下examples/svr4-startup這個腳本以使它適用於你的系統。
--------------------------------------------------------------------------------
1.7. Step 6: 嘗試列出服務器可獲得之共享項
$ smbclient -L yourhostname
用上面這個命令,就可以得到一份服務器上可獲得的共享項列表,不然的話就是設置上出了什麼問題。注意,這個方法也可以用於查看其它LanManager客戶端(如WfWg)可獲得的共享信息。
如果選用了用戶級安全,則Samba會在列出共享列表前要求你輸入口令。詳情請參見smbclient的手冊頁。(你可以在命令行上加入選項-U%來強迫它列出共享列表,但對於非Samba服務器就不能這麼做了。)
--------------------------------------------------------------------------------
1.8. Step 7: 嘗試從UNIX客戶端建立連接
$ smbclient //yourhostname/aservice
命令中的yourhostname應該是安裝了smbd程序的主機名。而aservice就是在smb.conf文件中定義了的服務項。如果在smb.conf中定義了[homes]段的話可以試著用你的用戶名來連接。例如,如果你的UNIX主機是bambi,而你的用戶名是fred的話,該命令就應該是:
$ smbclient //bambi/fred
--------------------------------------------------------------------------------
1.9. Step 8: 嘗試從DOS、WfWg、Win9x、WinNT、Win2k、OS/2及其它客戶端建立連接
要裝載磁盤的話:
C:\WINDOWS\> net use d: \\servername\service
要打印的話:
C:\WINDOWS\> net use lpt1: \\servername\spoolservice
C:\WINDOWS\> print filename
至此,你已經安裝成功,否則請向我匯報bug!
--------------------------------------------------------------------------------
1.10. 如不工作咋辦?
如果你萬事不順並開始考慮“是誰寫了這一大堆的垃圾”的話,我建議你再做一次step 2(或多次),直到你平靜下來。
然後你可以去讀一下DIAGNOSIS.txt和FAQ。如果還是卡住的話請試一下郵件列表和新聞組(詳情參見README)。Samba已經在世界上數千個站點成功安裝,所以可能已經有人已經遇到並解決了你的問題。你還可以到WWW站點去查一下Samba-digest發布的消息。
當你修正了什麼問題,請給我發回更新的文檔或源代碼,以方便後來人。
--------------------------------------------------------------------------------
1.10.1. 診斷問題
如果你有安裝方面的問題請參考DIAGNOSIS.txt,看看能否找到該問題。
--------------------------------------------------------------------------------
1.10.2. 范圍ID
缺省情況下Samba會用一個空的范圍ID。這樣的話,所有的windows機器也必須有一個空范圍ID。如果你真想用非空的范圍ID,就需要在nmbd、smbd和smbclient命令中使用-i 選項,不過這樣一來所有的機器都必須具有相同的設定。不推薦使用范圍ID。
--------------------------------------------------------------------------------
1.10.3. 選擇協議級別
SMB協議有很多別名,現在Samba支持5種,它們分別是CORE、COREPLUS、LANMAN1、LANMAN2和NT1。
你可以在smb.conf文件中選擇支持最高級的協議。缺省為NT1,對大多數站點來說這是最合適的。
以前一些版本的Samba必須使用COREPLUS,現在已經修正了這種限制,而且已經不太需要使用低於LANMAN1的協議了。保留COREPLUS只是兼容一些少數情況,如WfWg要在該協議中保持口令的大小寫格式,而在LANMAN1、LANMAN2或NT1下所有的口令在被發送前都轉換為大寫,所以在某些情況下你可能要強制使用“passWord level=”選項。
使用LANMAN2和NT1主要的好處是支持一些客戶的長文件名(如smbclient、Windows NT或Win95)。
詳情請參見smb.conf(5)手冊頁。
注意:如要支持打印隊列報表,則在WfWg下必須用TCP/IP作為缺省協議。如果在有些系統上把NetBEUI作為缺省的話,就會打斷打印隊列報表,這大概是WfWg的一個bug。
--------------------------------------------------------------------------------
1.10.4. 從UNIX向PC客戶端進行打印
要從一台UNIX主機使用smb服務器上的打印機,就需要編譯smbclient程序。然後還需要安裝“smbprint”腳本。詳情請閱讀smbprint的使用說明。
另外還有一個具有同樣功能的SYSV風格腳本smbprint.sysv,它也有使用說明。
--------------------------------------------------------------------------------
1.10.5. 鎖定
有時鎖定會產生一些麻煩。
SMB服務器要實現兩種類型的鎖定。第一種是“記錄鎖定record locking”,它允許一個客戶鎖定一個打開文件的一段字節;第二種就是“拒絕模式deny modes”(譯者注:也稱“共享模式”),它在打開文件時指定的。
Samba使用UNIX系統調用fcntl()來支持“記錄鎖定”。而通常實現的方法是用rpc來調用服務器上運行的rpc.lockd進程。不幸的是rpc.lockd實現問題太多了,特別是要與其他版本進行對話的情況。rpc.lockd崩潰並不是什麼稀罕事兒。
還有一個問題是,把PC客戶端產生的32位鎖定請求轉換為多數UNIX所支持的31位請求。但很多PC應用程序(典型的如OLE2應用)使用字節范圍(其中最高位為標志位)的方式進行工作。Samba嘗試通過轉換來支持這類應用程序,並且這樣的轉換被證明是相當成功的。
嚴格意義上的SMB服務器應該在每次讀寫被調用文件之前檢查其鎖定情況。但fcntl()按上述方式來工作速度可能比較慢,而且會使rpc.lockd過載。當然這幾乎也是不必要的,如果鎖定對客戶來說非常重要的話,他們應該在讀寫之前獨立生成鎖定調用。缺省情況下,Samba只在客戶明確要求時才生成鎖定調用,
Samba使用UNIX系統調用fcntl()來支持“記錄鎖定”。而通常實現的方法是用rpc來調用服務器上運行的rpc.lockd進程。不幸的是rpc.lockd實現問題太多了,特別是要與其他版本進行對話的情況。rpc.lockd崩潰並不是什麼稀罕事兒。
還有一個問題是,把PC客戶端產生的32位鎖定請求轉換為多數UNIX所支持的31位請求。但很多PC應用程序(典型的如OLE2應用)使用字節范圍(其中最高位為標志位)的方式進行工作。Samba嘗試通過轉換來支持這類應用程序,並且這樣的轉換被證明是相當成功的。
嚴格意義上的SMB服務器應該在每次讀寫被調用文件之前檢查其鎖定情況。但fcntl()按上述方式來工作速度可能比較慢,而且會使rpc.lockd過載。當然這幾乎也是不必要的,如果鎖定對客戶來說非常重要的話,他們應該在讀寫之前獨立生成鎖定調用。缺省情況下,Samba只在客戶明確要求時才生成鎖定調用,