第三章﹕架設 SAMBA


SAMBA 的用途

前一章介紹的 NFS 是在 Linux 機器之間分享檔案﹐相信已經讓您非常深刻的領略到 Linux 強大的網路功能了吧﹖然而﹐對於一些習慣了 MS Windows 的朋友來說(我自己也是用 Windows 做工作平臺)﹐或許會問﹕ Linux 是否能和 Windows 分享資源呢﹖

有此問題者放一百個心好了﹕ 使用 SAMBA 服務您就做得到﹗透過 SAMBA﹐您不但可以分享到檔案﹐也可以分享到諸如印表機等資源呢。更甚者﹐它還可以擔當 Microsoft 網路的 PDC 角色﹗不過這需要您花更多時間去設定了。

在設定 SAMBA 服務之前﹐先讓我們了解一下 Microsoft Network 的基本概念。因為 SAMBA 正是 Linux 和 Windows Network 的橋樑﹐它的設計是讓 Unix-like OS 加入到 Windows Network﹐而不是讓 Windows Network 加入 Unix-like OS 中﹐請不要將這個本末關係顛倒了。

我們在‘學習網路’那邊的‘通訊協定’文章中曾介紹過 NetBIOS/NetBEUI 協定﹐以及它們的開發背景﹐同時也介紹了 TCP/IP 協定的作用﹔同時也在 “ OSI 層級”文章知道了網路傳送中的協定分工作用。當您有了相關網路背景知識之後﹐要了解 SAMBA 服務就比較容易了。您必須要知道的概念是﹕

  • 首先﹐Microsoft Network 主要是使用 NetBEUI 協定的﹐但 Linux 卻主要使用 TCP/IP 協定。
  • 要讓 Linux 連上 Microsoft Network﹐必須使用 NetBIOS over TCP/IP 技術。

至於這些技術的細節我這裡不打算詳細介紹了﹐且也曾經在新聞組上和網友們討論過﹐我建議您先將如下兩篇文章看完﹕

Okay﹐假設您已經對 NetBIOS over TCP/IP 有一定概念之後﹐才讓我們設定 SAMBA 服務吧﹕

設定 SAMBA

先確定您的系統上面已經裝有 SAMBA 的套件﹕samba、samba-common、samba-client ﹔否則用 RPM 裝好。如果您在 Linux 上架設好 Apache 網站伺服器﹐那還可以將 samba-swat 套件也裝上﹐並 ntsysv 確定 smb 有選擇。

事實上﹐設定 SAMBA 一點也不複雜﹐當然也可以設定得很複雜。我的設定策略是﹕先從簡單的設定開始﹐通過測試後再往複雜調整﹐再通過後再向更複雜挑戰。

  1. 先確定在 /etc/services 檔案裡面這些句子沒有被註解掉﹕

    netbios-ns      137/tcp             # NETBIOS Name Service
    netbios-ns      137/udp
    netbios-dgm     138/tcp             # NETBIOS Datagram Service
    netbios-dgm     138/udp
    netbios-ssn     139/tcp             # NETBIOS session service
    netbios-ssn     139/udp
    

  2. 然後是建立 /etc/lmhosts 檔案(如果它不存在的話)﹐建立起各主機的對應。我們只需將 MS Winndows 主機對應建立起來則可﹐且要包括作為 SAMBA 伺服器的 Linux 主機本身﹕

    127.0.0.1       localhost
    192.168.100.23  rh71
    192.168.100.20  acer
    192.168.100.24  mdk
    10.0.1.131      rh71dmz
    10.0.1.130      lp64dmz
    

    Tips﹕假如參與的機器都已經在 /etc/hosts 上面有設定過的話﹐那麼上面的檔案可以用如下命令產生﹕

    cat /etc/hosts | grep -v '^#' \
    | awk '{ printf("%s\t%s\n",$1,$3) }' > /etc/lmhosts

    然而﹐如果所有機器都在同一個 subnet 裡面的話﹐那也可以不設定 lmhosts 檔﹐因為可以透過廣播查詢。

  3. 然後是最重要的設定﹐就是修改 /etc/samba/smb.conf 這個檔案(舊的版本為 /etc/smb.conf )。讓我們先從簡單做起﹐所以我們接受預設值則可﹐只需修改下面的部份﹕

    ......
    # 如果想使用者能看到中文檔案名稱﹐可以將這行加進 [global] 設定中﹕
    client code page = 950
    ......
    # 填寫好wkgp﹐最好和Windows的一致:
       workgroup = siyongc 
    # 為機器定義一個 netbios 名稱(這行需自己加)﹕
      netbios name = rh71
    ......
    # 將 security 從 user 改為 share ﹕
    ;   security = user
       security = share
    ......
    # 將 /tmp 分享出來﹕
    [tmp]
       comment = Temporary file space
       path = /tmp
       read only = no
       public = yes
    
    ......
    

    註﹕這個設定檔案的註解符號是" # " 和 " ; " 兩種﹐前者用來註解說明﹐而後者用來註解設定。而所有設定都用 " = " 號來定義(符號兩邊必須有空白鍵)﹐= 號兩邊的設定名稱和內容允許空白鍵存在(右邊通常用來分隔多個設定值)。

  4. 執行 testparm 命令 ﹐測試一下smb.conf的語法是否正確。如果您看到 “Loaded services file OK.”的話﹐基本上就沒語法的設定問題了﹐但不保證您的設定內容是正確的。如果您要看設定內容﹐請用 testparm | more 慢慢看吧。

  5. 當 testparm 通過之後﹐我們就可以重新啟動 SAMBA ﹕

    service smb restart

接下來﹐讓我們設定 Windows 部份(我這裡是用 Windows ME 做範例)﹐進行之前先要確定和 Linux 的連線沒問題。

  1. 將網路卡和 TCP/IP﹐及 NetBEUI 安裝好(如果不會﹐請參考其他資料﹐大致順序是﹕控制台 --> 網路 --> 新增 --> 通訊協定 )﹐而且主網路登錄設定為“Client for Microsoft Network”﹕

    同時將“電腦名稱”和“工作群組”設定好﹐前者必須是唯一的﹐而後者則和 linux 的 workgroup 設定一致﹕

  2. 建立或修改 Lmhosts 檔案﹕

    edit %windir%\Lmhosts

    註﹕%windir% 是您的 windows 目錄所在。您可以將這裡的 Lmhosts 的內容和 Linux 上面的 lmhosts 內容同步。

    Tips﹕如果您的系統是 Windows 95 (第一版)﹐那您需要修改登錄檔( registry )﹐其它版本就不必了﹕
    開始 --> 執行(R) --> 輸入‘regedit’並按 Enter --> 找到這個路徑﹕ HKEY_LOCAL_MACHINE\System\CurrentControlSet
    \Services\VxD\VNETSUP
    在右邊的視窗按下右鍵 --> 新增(N) --> DWORD值(D) --> 輸入﹕
    EnablePlainTextPassword

    然後雙擊剛建立的機碼﹐將‘數值資料(V)’設定為“1”。
    如果您懶得這樣做﹐點這裡 將‘ptpwd.reg ’檔案下載到 Windows95 的機器上﹐ 或抓 samba 主機的 /usr/share/doc/samba-2.0.7/docs/Win95_PlainPassword.reg 檔﹐然後按著它點兩下滑鼠左鍵就可以搞定。

  3. 登出 Windows ﹐再重新登錄 (必要時要重新開機)。

測試和修改

如果一切順利﹐當您登錄 Windows 之後﹐就可以在‘網路芳鄰’ 那裡看到 Linux 的機器了﹕

然後就像普通的 Windows 資源分享那樣﹐用滑鼠點兩下就可以看到 Linux 的分享內容了﹕

Tips﹕要和 samba 連接﹐關鍵要確定 netbios 的連線被正確的建立起來。在可路由環境下的不同子網之間﹐除非您有 wins 伺服器提供 netbios 的名稱解析﹐您最好將所有參與連接的主機 IP 和名稱的對應寫在 /etc/lmhosts 裡面﹔同樣的﹐在 Windows 主機那邊﹐也要確定 \windows\lmhosts 有著一致的設定。

好了﹐當我們順利完成最簡單的設定測試之後﹐再讓我們更進一步修改 smb.conf 設定吧。

因為目前的 samba 是以 share 形式進行分享的﹐可以說﹐只要能連上來就可以瀏覽分享資源了。這未免太寬鬆了一點﹐所以﹐我們還是將 security 改為預設的 user 形式進行資源分享﹕

# 將 security 還原為 user﹕
   security = user
;   security = share

然後﹐還要將下面兩行前面的註解符號拿掉﹕

  encrypt passwords = yes
  smb passwd file = /etc/samba/smbpasswd

但這還沒完成﹐您還需執行如下命令﹕

touch /etc/samba/smbpasswd
chmod 600 /etc/samba/smbpasswd
smbpasswd -a kenny

New SMB password:
Retype new SMB password:

注意﹕將 kenny 改為您欲增加的使用者帳號﹐而且它必須已經存在於 /etc/passwd 裡面。同時您也使用相同的帳號從 Windows 那邊登錄。如果日後要修改密碼﹐可以將 -a 參數拿掉。

然後﹐從新啟動 samba 及 windows,再試試從 Windows 那邊透過網路芳鄰連線過來。假如這是第一次連線﹐或 smbpasswd 被修改為和 Windows 密碼不一樣的話﹐您會被要求輸入密碼﹕

假如您碰到問題﹐如下面這個﹕

那很可能是 /etc/samba/smbpasswd 還沒正確建立起來﹐或是密碼不對而已。

當您能以 user 層級進行分享之後﹐接下來讓我們針對性的設定分享目錄﹕

[study]
   comment = Study Area
   path = /home/study/html
   public = no
   browseable = yes
   valid users = kenny, netman, user_1, user_2
   read only = yes
   write list = kenny, netman
   create mask = 0774
   directory mask = 0775
   force group = study

因為 share 可能是我們日後最常改動的地方﹐這裡不妨針對上面的設定解釋一下﹕

  • comment﹕註解說明﹐可隨便設定。
  • path﹕分享資源的路徑﹐這個一定要正確﹐而且權限也必須設定正確。
  • public 或 guest ok ﹕預設為 no ﹐如為 yes 則無需進行身份驗證。
  • browseable﹕在資源瀏覽中顯示分享名稱﹐否則須指定分享路徑。
  • valid users﹕資源僅允許名單中的成員分享。
  • read only﹕預設為 yes﹐資源以唯讀形式分享。它和 writeable = no 是一樣的﹐但需注意﹕如果兩者均設定﹐則以最後讀取的值為準。
  • write list﹕如果設定為唯讀﹐只有在此名單中的成員才可以進行寫入。
  • create mask﹕建立檔案時所賦予的權限。
  • directory mask﹕建立目錄時所賦予的權限。
  • force group﹕指定所有存取所使用的 group 身份﹐您也可以用 force user 來指定帳號。
  • 注意哦﹕以上設定只有當 security 被設定為 share 的時候才有效哦﹐同時也要有 smbpasswd 設定。範例所使用的帳號、群組以及檔案路徑或許和您的機器不一樣﹐請自行建立和修改。

    不過﹐有一個常被初學者忽略的問題是﹐雖然您已經在 smb.conf 上面設定好使用者﹐並且允許他們寫入分享目錄﹐那僅是 samba 層級的權限設定而已。要真正能寫入目錄﹐還要確定 linux 本身的檔案系統權限能夠讓使用者寫入才行。這時候﹐或許就是您大玩 owner、group、others 三者權限的時候了﹐那就請 man 一下 chmod 和 chown 吧。

    但是別忘了﹕如果您更改了 User ID 或 Group ID﹐那 Windows 那邊就要重新登錄網路才會生效哦~~~ 切記切記﹗免得到時候浪費了一大堆寶貴時間都不知道問題出在哪裡。

    假如您仍有興趣進行更進一步的限制﹐您還可以在 [global] 裡面設定網路範圍﹕

    .....
    ;   hosts allow = 192.168.1. 192.168.2. 127.
       hosts allow = 192.168.100. 127. EXCEPT 192.168.100.254
       hosts deny = 10.10.1.128/255.255.255.224
    ......
    ;   interfaces = 192.168.12.2/24 192.168.13.2/24
       interfaces = 192.168.100.23/24 127.0.0.1/8
       bind interfaces only = yes
    

    最後兩行是在多界面的情況下使用﹐如果環境不太複雜﹐同時您真的要限制 samba 的服務範圍﹐才需設定﹐否則可以不理。但前面的 hosts allow 倒是可以考慮的﹐您需要留意這裡的 192.168.100. 和 127. 是兩段網路哦~~ 假如您有其它網路﹐也可以如法泡制。

    再有﹐如果您老是碰到如下錯誤﹕

    我這裡教您一個狠招數﹐就是將下面的句子換成這樣(或取消句子前面的註解)﹕

       local master = yes
       os level = 66
       domain master = yes
       preferred master = yes
    ......
       name resolve order = wins lmhosts bcast
       wins support = yes
    ;   wins server = w.x.y.z
    

    如果您有閱讀我在前面建議的文章﹐那您應該知道我這裡的設定﹐就是確保 Linux 擔當 Local Master Browser 的角色﹐以維護和收集本地網路的 Browse List 資源﹔此外﹐也設定為 Domain Master Browser 以及 wins server 的角色﹔同時﹐在進行 netbios 和 ip 名稱查詢的時候﹐其順序是先查 wins (h-node )﹐再查 lmhosts 檔﹐最後才以廣播形式查詢(b-node)。

    要注意哦﹕“wins support” 和“wins server”只能任選其一﹐千萬不要同時打開﹗前者是要設定這台 SAMBA 機器為 server 向網路提供 wins 服務﹐而後者則使用別的 server 所提供的 wins 服務。

    當您完成修改並重新啟動 smb 服務之後﹐再轉移到 Windows 系統上﹐修改 TCP/IP 的內容﹐將 wins 伺服器指向 Linux 機器﹕控制台 --> 網路 --> TCP/IP --(您的網路卡型號) --> 內容 --> WINS 組態 ﹕

    這時候﹐因為有 wins 的緣故﹐您就可以不必再擔心 lmhosts 設定檔了。您甚至可以將 lmhosts 檔移除掉﹐但條件是﹕(1) 您的 SAMBA 必須擔當 wins 伺服器﹐並且確實是工作的﹔(2) 其它機器必須使用這台 SAMBA 做 wins 伺服器﹐並確定 TCP/IP 連線沒問題。其中的連線問題有可能是您的 SAMBA 機器上錯誤的啟動了 firewall ﹐如果您是用 RH7.1 且是按我前面的步驟安裝和設定的話﹐應該還沒啟動防火牆的。否則您可以執行如下步驟﹐確定防火牆沒有啟動﹕

    service ipchains stop
    rmmod ipchains
    mv /etc/sysconfig/ipchains /etc/sysconfig/ipchains.bak
    ntsysv
    --> 取消 ipchains

    進階設定

    或許﹐您已經從 smb.conf 和 testparm 命令中得知﹕ SAMBA 的設定其實非常多項和複雜﹐儘管平時我們只用到其中少部份設定而已。但有時候﹐在複雜的網路環境中﹐您就需要修改 SAMBA 的設定﹐以迎合您的網路需求﹐其中之一是在跨多個子網路的環境中使用 SAMBA。

    我們知道﹐Microsoft Network 底層所使用的協定是 NetBIOS﹐是不能路由的﹐也就是必須借助 TCP/IP 才能進行跨網路的溝通。然而﹐根據 Microsoft Network 協定的需求﹐每一個子網路都有各自的 Local Master Browser(LMB) 來管理本地的資源列表。如何在不同子網路之間交換和同步資源列表﹐也是一個不可忽視的狀況。

    為了解決以上問題﹐最關鍵一項設定就是 WINS 和 Domain Master Browser(DMB) 了。哈﹐我們剛剛才介紹過如何設定這兩個項目﹐您不會這麼快就忘記吧﹖﹗沒錯﹐您必須在整個內部網路中(不管包含多少個子網路)﹐指定一台(也是唯一的一台) SAMBA 擔當 wins server 和 DMB。而至於設定﹐按照前面的例子即可。

    在這台 DMB 所在的子網中﹐它同時也擔當著 LMB ﹐您必須確定沒有其它機器搶去了這個角色(所以我將它的 os level 設高一點)。但是﹐在其它的子網路中﹐您也必須再指定一台 SAMBA 擔當本地網路的 LMB﹐但就不能將 domain master 設定為 yes 了。而且﹐ wins support 也一定不要設為 yes (註解起來)﹐同時﹐將 wins server 指向提供 wins 服務的機器。

    但是﹐在其它子網的 LMB 上﹐其 smb.conf 應該有類似這樣的設定﹕

       workgroup = siyongc 		# 必須一致
       netbios name = cat		# 假設該機器名為 cat 
       local master = yes		# 這個要設為 yes
       os level = 66
       domain master = no		# 這個要設為 no
       preferred master = yes
       name resolve order = wins lmhosts bcast
    ;   wins support = yes		# 這行一定要註解起來
       wins server = 192.168.100.23	# 將 IP 指向 wins 
    

    再一次提醒﹕不管 SAMBA 如何設定﹐所有子網路之間的 TCP/IP 連線(例如﹕路由和防火牆)必須是順暢的﹐否則先行解決網路的連線問題。

    Tips﹕僅管﹐我們在使用 wins 之後﹐可以不用設定 lmhosts﹐但我仍建議您將所有的 LMB 和 DMB 之 IP 位址固定起來﹐並且將它們的全部對應寫在每一台 MB 的 /etc/lmhosts 檔裡面。

    除了用 wins 解決子網路之間的資源列表同步的問題外﹐我們還有另外一個方法﹐就是用如下的設定來解決﹕

       remote announce = 192.168.1.255/siyongc 192.168.2.254 192.168.3.253
       remote browse sync = 192.168.1.255 192.168.2.254 192.168.3.253
    

    (我們這裡假設所有子網路都是採用 24bit mask 的 C Class 子網路)

    第一行的 remote announce 是用來告訴遠端目標﹕關於本子網路的資源列表有什麼。遠端目標可以是對方網路的廣播位址﹐同時您可以用 / 分隔再加上 workgroup 的名字(但這個可設可不設)。如果您知道對方網路的 LMB 位址﹐那您也可以直接指定 IP 位址(這樣可減少廣播封包的氾濫)。假如您有多個遠端目標﹐全部寫在一行﹐然後用空白鍵分隔就可以了。

    第二行﹐remote browse sync ﹐是主動要求遠端目標進行資源列表的同步。遠端目標可以是對方的 LMB 位址或是對方網路的廣播位址(無需設定 workgroup )﹔而且﹐這行只能在擔當 LMB 的 samba 主機上面設定。

    假如您在設定和測試過程中遇到問題﹐您最好先確定自己對 Microsoft Network 之 Browsing 原理有一定的認識﹐才容易找出問題所在。如果您有興趣﹐可以閱讀 samba 套件帶來的文件﹕

    /usr/share/doc/samba-2.0.7/docs/textdocs/BROWSING.txt
    /usr/share/doc/samba-2.0.7/docs/textdocs/BROWSING-Config.txt

    除了跨子網路的問題外﹐另外﹐我們或許會碰到 Microsoft Domain 的問題。假如您的網路裡面沒有 NT server (或 Windows 2000 Server) ﹐那您可以將 SAMBA 設定為 PDC ﹐為網路提供 NT domain 的服務。不過﹐說實在的﹐這些功能畢竟是模擬的﹐而且大部份技術都掌握在 Microsoft 手上﹐SAMBA 並不能完全取代 NT server 的全部功能﹐例如 PDC 和 BDC 的身份同步驗證、wins server 之間的資料同步、domain 權限和信任關係、等等的﹐這些您必須要了解和體諒。假如您的網路上面已經有 NT 伺服器了﹐那就不要再設定 SAMBA 來搞混 domain 上面的功能了﹐免得畫虎不成反類犬。

    如果您已經有 NT 在網路上﹐同時又想使用 NT 本身的安全認證﹐可如下修改 /etc/smb.conf 的設﹕

    ;   security = user
       security = server
       password server = nt4ser
    

    註﹕這裡的‘nt4ser’是我的 NT 網路的 PDC 主機名稱﹐請自行修改。

    如果您的網路上並沒有 NT 的機器﹐那您可以把您的 SAMBA 架設為 PDC ﹐向 Windows 提供 domain 服務。下面是我整理出來的步驟﹕

    1. 請確定網路上沒有其它 NT 的機器在當 PDC 的角色﹐並在 SAMBA 機器上建立如下目錄﹕

      mkdir /home/netlogon
      mkdir /home/samba
      chmod 1775 /home/samba

    2. 然後修改 /etc/smb.conf ﹐至少要包 括如下設定﹕

      [global]
         netbios name = rh71
         workgroup = siyongc
         security = user 	# 只能是 user﹗
         encrypt passwords = yes
         smb passwd file = /etc/samba/smbpasswd
         lcoal master = yes
         os level = 66
         domain master = yes
         preferred master = yes
         domain logons = yes	# 要設為 yes
         logon script = %U.bat	# U 為大寫
         wins support = yes
         time server = yes	# 這行自己加
       
      [netlogon]
         comment = Network Logon Service
         path = /home/netlogon
         guest ok = yes
         writable = no
         share modes = no
         browsable = no		# 這行請自己加﹐或忽略。
         wide links = yes	# 同上
         follow symlinks = yes	# 同上
      
      [public]
         comment = Public Stuff
         path = /home/samba
         public = yes
         writable = yes
         printable = no
         write list = @staff
      

    3. 為 windows 機器建立一個沒 shell 沒 home 的帳號﹕

      useradd -d /dev/null -s /bin/false acer$

    4. 接著將新增的機器帳號增加到 samba 密碼中去﹕

      smbpasswd -a -m acer$    # 不一定要有 $ 符號﹐但一定要有 -m 參數

    5. 執行 testparm 確定沒有語法錯誤﹐並重新啟動 smb 服務﹕

      servcie smb restart

    6. 移至 Windows 機器上﹐在 windows 上面編輯一個叫 kenny.bat 文字檔﹐該檔名必須和登錄帳號的名稱一致﹐內容如下﹕

      net time \\rh71 /set /yes
      net use p: \\rh71\public
      net use t: \\rh71\tmp
      net use u: \\rh71\kenny
      

      事實上﹐對於用過 LAN Manager 和設定過 windows 登錄 script 的朋友來說﹐應該知道個檔案的變化可多了﹗

    7. 完成後將之複製到 SAMBA 機器的 home dir (本例為 /home/kenny) 中﹐並建一個 symbolic link 到 /home/netlogong 目錄裡面﹕

      cp kenny.bat ~kenny
      chown kenny.kenny ~kenny/kenny.bat
      ln -s ~kenny/kenny.bat /home/netlogon/kenny.bat

      注意﹕這個檔案只能在 windows 或 dos 裡面編輯﹐因為它使用的文字檔格式和 Linux 不一樣。請不要在 Linux 裡面修改﹐要修改的話﹐先在 windows 上進行﹐然後再 copy 回去﹔或是等登錄後﹐從 windows 那邊透過 samba 分享進行修改。

    8. 然後至﹕控制台 --> 網路 --> 組態 --> Client for microsoft network --> 選擇 "登入 windows NTt 網域" ﹐並將 domain name 填好﹕

    9. 完成後按 “確定” 後回到前一個畫面﹐確定 “主網路登入”為 Client for microsoft network ﹐然後到“識別資料”那裡﹐確定腦名稱正確﹐以及 workgroup 名稱(與 samba 一致)﹕

    10. 完成後重新開機﹐您的登錄畫面將會三個欄位﹕ 帳號、密碼、網域﹕

      順利的話﹐您在登錄後會閃過一個 DOS 畫面﹐並進行系統配置。完成後﹐您就可以在檔案總管裡面找到您所掛載的網路磁碟機了﹕

    就這樣設定﹐您的 SAMBA 就可以當 PDC 來用了﹗假如碰到問題﹐那就自行除錯吧。您可以參考 O'Reilly 的 “Using SAMBA” 或下面的網頁﹕

    http://www.kneschke.de/projekte/samba_tng/files/pdc.php3
    http://de.samba.org/samba/ftp/docs/htmldocs/samba-pdc-faq.html

    順便一提﹕要完全發揮 PDC 的功能﹐可能要看新的 SAMBA 版本功能﹐或是 samba TNG 版本。然而﹐目前來說﹐SAMBA 和 Windows 2000 的兼容性上還有許多問題﹐在 NT 4 版本下面則比較穩定。

    如果您在 SAMBA 上面設定有列印服務(參考 system 系列之“基本設定”)﹐不管印表機接在機器上還是在網路上﹐預設情況下﹐SAMBA 就允許 windows 那邊使用它的印表機。您可以用 testprns 命令來檢查某一台印表機是否可以使用。這裡不解說如何在 windows 上面設定網路印表機了﹐請自己玩玩看吧。根據我自己的經驗來看﹐難點不在於 smb 如何設定﹐而是印表機本身的設定﹐以及 windows 端的驅動程式。

    SAMBA 工具

    到這裡﹐我們所看到的基本上是有 SAMBA 向 windows 提供的服務。要從 windows 那邊連過來 samba ﹐大都上在網路芳鄰上進行就可以了﹐和其它 windows 資源分享一樣。如果您要從 Linux 那邊要使用 Windows 上面的分享資源的話﹐也很方便﹐就用 smbmount 命令就可以了﹕

    mkdir /mnt/smb       # 建立 mount point
    smbmount "//acer/temp" /mnt/smb

    您要留意 windows 上面那些有空白鍵的目錄﹐您必須用 \ 符號跳脫﹐或是將整個 windows 分享名稱用雙引號( " " ) 括起來。還有﹐如果 windows 分享那邊沒有密碼限制的時候﹐在提示 password 的時候直接敲 Enter 就可以了。而事實上﹐除了透過 smbmount 命令﹐您也可以直接用 mount 命令來掛載 windows 的分享﹕

    mount -t smbfs -o username=kenny,password='xxxxxxx' \
    "//acer/temp" /mnt/smb

    如果對方的密碼含有特殊符號(嗯﹐這是好密碼﹗)﹐那您最好用單引號( ' ' ) 將密碼括起來。

    如果您要檢查一下連接﹐看看 Windows 機器有什麼分享資源﹐可以使用 smbclient 命令﹕

    smbclient -L acer

    透過這樣的動作﹐您可以像 ping 命令那樣﹐確定兩台機器之間的 smb 連線是否能夠建立。事實上﹐smbclient 工具也常被用來查詢網路資訊﹐例如您用 -L 參數看一下 LMB 機器﹐您會發現如下這些資訊﹕

    Anonymous login successful
    Domain=[SIYONGC] OS=[Unix] Server=[Samba 2.0.7]
    
            Sharename      Type      Comment
            ---------      ----      -------
            tmp            Disk      Temporary file space
            public         Disk      Public Stuff
            cdrom          Disk      cdrom
            ls120          Disk      ls120
            study          Disk      Study Area
            IPC$           IPC       IPC Service (Samba Server)
            epson          Printer   lp0
            hpcolor        Printer   hp
    
            Server               Comment
            ---------            -------
            ACER                 Kenny's notebook
            RH71                 Samba Server
            EMILIE               Emilie's Desktop
    
            Workgroup            Master
            ---------            -------
            SIYONGC              RH71
    

    從上面的資訊中﹐您可以輕易知道網路上有哪些機器(有提供分享)﹐同時還知道有哪些 workgroup 及其 master 主機。在一個大型的跨多個子網路的 smb 連線中﹐您能夠根據這些信息來判斷子網之間的資訊是否順利同步﹐也能輕易找出 master 的角色是否如您所預期的。

    如果您習慣用 ftp 來傳送檔案﹐您不妨試試用 smbclient 來傳檔或抓檔﹕

    smbclient "//acer/temp"

    當然了﹐這就沒有 smbmount 那麼方便啦。

    除此外﹐您還有其它一些工具可以運用的﹕

  • 假如您想了解當前的 samba 機器有哪些連線﹐可以用 smbtatus 命令﹔

  • 如果您想知道當前網路上有哪些機器﹐可以用 findsmb 命令﹔

  • 如果要查詢一個 netbios 名稱、或 workgroup 的機器等資訊﹐可以用 nmblookup 命令(如﹕nmblookup siyongc)﹔

  • 如果您要圖形界面的工具﹐有很多﹐例如 SAWT 和 Webmin 等﹐到 http://au1.samba.org/samba/GUI/ 這裡可以找到一堆;

  • 別忘了 windows 上的 nbtstatnet view 命令﹐它也可以幫我們查到許多資訊﹗
  • 還有很多其它工具﹐或許您自己到 samba 網站慢慢找吧﹕

    http://au1.samba.org/samba/download.html

    如果您習慣了在 X window 裡面工作﹐您可以抓一隻叫 LinNeighborhood 的小程式(從本站下載 srpm 套件) ﹐它可以讓您輕輕鬆鬆的將 windows 的分享抓到 linux 上面去﹕

    rpm --rebuild LinNeighborhood-0.6.3-1.src.rpm
    rpm -Uvh /usr/src/redhat/RPMS/i386/LinNeighborhood-0.6.3-1.i386.rpm

    完成後﹐在 X window 的 Application 選單中就可以執行它﹕

    註﹕第一次執行的時候﹐記得要到 Options 的 Preference 裡面修改 workgroup 哦。

    常見問題

    下面是我在實作中碰到的一些問題和注意的地方﹐當您在 samba 上碰到麻煩的時候﹐或許可以參考一下的﹕

  • 最常碰到的問題首先是底層的網路連線﹐例如子網路切分、路由設定、防火牆、等等﹐請先確定和排除網路連線的問題再測試﹕
    service ipchains stop
    service iptables stop
    如果要在開機時關閉防火牆﹐那請執行 ntsysv 修改吧。

  • 假如您碰到中文或是其它 code page (如 nls iso8559-1) 的問題﹐請在 smb.conf 的 [goblal] 中設定 client code page﹐同時確定您的核心可以支援。您可以將 File System 下面的 Native Language 的選項﹐全部選為 Modules﹐然後執行﹕
    make modules
    make modules_install
    這樣就可以了﹐連重新開機也不用﹗

  • 如果您修改了 SAMBA 上的帳號﹐如 UID 或 GID﹐那就要退出 windows 重新登錄﹔如果您修改了機器的 IP 位址 (如透過 dhcp )﹐那最好重新開機。

  • 如果您發現從 Windows 那邊不能讀或寫 Linux 的資源﹐請確定一下 Linux 下面的檔案權限﹐可以使用 chmod 和 chown 命令進行修改﹐當然﹐您得確定從 Windows 那端登錄的身份要能通過 Linux 這邊的安全信任。

  • 另外﹐如果您要進行跨網段的 samba 設定﹐例如用 VPN 連接兩個辦公室的內部網路之後﹐要讓所有 windows 能相互分享資源﹐請留意 local master browser , domain master browser , 及 wins server 的設定﹕
    1. 在每一個網段裡面指定一台 local master browser ﹐提高 os level 以及將 prefer master 和 local master browser 設定起來﹐同時指定好各自的 netbios name 。
    2. 然後挑選其中一台 local master browser ﹐將 domain master browser 和 wins support 打開。
    3. 將其餘的 local master browser 之 wins server 指向上面的主機 IP。
    4. 將所有 master browser 的 IP 和主機名稱對應﹐寫在 lmhosts 檔裡面﹐並放於每一台 master browser 的 /etc 目錄底下。
    5. 如有 dhcp 伺服器﹐修改 /etc/dhcpd.conf 之 option netbios-name-servers 設定﹐或是手工的將所有 windows 主機之 wins server 指定為 wins 主機 IP﹐並重新登入 windows。
    6. 如果還是不能﹐那麼嘗試設定 smb.conf 之 remote announce 或 remote browse sync ﹐除了自己外﹐將其它 local master browser 之 IP 寫上去﹐用空白鍵分隔。

  • 如果不同的子網之間有使用 NAT 的話﹐強烈建議您看看如下網站﹕
    http://nbfw.sourceforge.net/
    最好先將 background 和 installation 看完再決定您是否要在 IP MASQ 下面維護 samba 。我個人建議是﹕能免則免﹐能直接路由就直接路由。在設定 NAT 規則的時候﹐要留意順序﹐比方說﹐您或許簡單的有一行規則是﹕
    ipchains -A forward -s 192.168.100.0/24 -j MASQ
    這樣會讓所有從內部網路出去的封包被 NAT 掉﹐就算它是連線到另一個 smb 網路的也難遭豁免。這樣﹐您必須在這行前面插入相關網路的 ACCEPT 的規則﹐變成﹕
    ipchains -A forward -b -s 192.168.100.0/24 -d 10.0.1.128/27 -j ACCEPT
    ipchains -A forward -s 192.168.100.0/24 -j MASQ
    我們會另闢文章專門討論 ipchains 和 iptables 這些防火牆工具的設定。

  • 另外﹐我還發現如果系統上裝有 vmware 的話﹐重新開機後會影響到 samba 的連線。您不妨將 vmware 服務關閉(servcie vmware stop)然後看看 samba 是否能順利進行﹐如果可以﹐那就是 vmware 搞的怪了。然則﹐您只要到 rcX.d 目錄裡面(例如 /etc/rc.d/rc3.d ﹐視您的預設 run level 而定 )﹐將 S91smb 移到 S90vmware 前面就可以了﹕
    cd /etc/rc.d/rc3.d
    mv S90smb S89smb
    至於如何設定 vmware﹐則超出這裡的說明了。

  • 還有﹐如果您的 samba 機器上本來就有 windows 的 partition﹐然後您將之 mount 進系統後再透過 samba 分享出去的話﹐通常您只能讀取不能寫入。這是因為使用者權限的問題﹐如果您要開放寫入﹐我建議您將 windows 的 partition 以 nobody 的身份掛載﹕
    mount -o rw,uid=99,gid=99 /dev/hda1 /mnt/windows
    當然了﹐您還必須設定 smb.conf 的設定啦﹐這個不用說明了吧﹖
  • 假如您有興趣知道更多的 SAMBA 設定﹐可以參考 HOWTO 和 man﹐其實 smb.conf 本身就是一個非常詳細的說明文件。此外﹐我極力推薦您看看 Using Samba 這本書﹕
    http://de.samba.org/samba/ftp/docs/htmldocs/using_samba/index.html

    其它的﹐就靠您自己修為了﹐如果您有 NT 基礎﹐就最好不過啦。

     

     


    www.study-area.org © 2001 Netman 網中人
    Last Updated: Feb 10, 2003