鳥哥的 Linux 私房菜
為取得較佳瀏覽結果,請愛用 firefox 瀏覽本網頁
鳥哥的 Linux 私房菜館 | 目錄 | Linux 基礎文件 | Linux 架站文件 | Linux 企業運用 | 安全管理 | 新手討論 |
     
 
最近更新日期:2006/12/29
在一般的區域網路中 (LAN) 如果都是 Windows 電腦,那麼使用『網路上的芳鄰』這個功能,就可以讓不同的 Windows 電腦分享彼此的檔案囉!但萬一這個 LAN 裡面有個 Linux 主機時,我怎麼讓 Linux 也加入這個 Windows 電腦當中的『網路上的芳鄰』呢?也就是說,讓 Windows 電腦可以透過『網路上的芳鄰』來存取 Linux 主機上面的檔案!呵呵!那就是 SAMBA 這個伺服器的主要目的了!SAMBA 是很有用的一個伺服器,他可以讓您的 Linux 剎那間成為一個檔案伺服器 (File Server),並提供整個 LAN 裡面的 Windows 很簡單的就可以對 Linux 主機進行檔案的存取動作。不僅如此, SAMBA 也可以讓 Linux 上面的印表機成為印表機伺服器 (Printer Server) ,鳥哥個人覺得, SAMBA 對於整個 LAN 的貢獻真的是很大!那麼就趕緊來玩一玩吧! ^_^


大標題的圖示本章的行前準備工作
這一章的主要目的為介紹在不同的平台上面利用同樣的協定來進行檔案的傳輸, 其實主要就是讓 Linux 與 Windows 主機之間能彼此透過『網路上的芳鄰』這個方式來分享檔案, 而最主要的目的就是當你的區域網路內辦公用的主機大多是 Windows 系統時, 可以透過網芳來存取 Linux 主機上面的資源,讓你不覺得有任何不一樣! 而閱讀之前你至少需要有底下的一些基礎概念:

大標題的圖示什麼是 SAMBA ?
在這個章節中,我們要教大家跳的是熱情有勁的巴西 SAMBA 舞蹈..... 喔不~搞錯了~是要向大家介紹 SAMBA 這個好用的伺服器啦!咦!怪了! 怎麼伺服器的名稱會使用 SAMBA 呢?還真是怪怪的呢!那麼這個 SAMBA 伺服器的功能是什麼呢?另外, 他最早是經由什麼樣的想法而開發出來的呢?呵呵!底下就讓我們慢慢的談一談吧!


小標題的圖示SAMBA 的發展歷史與名稱的由來
在早期的網路世界當中,檔案資料在不同主機之間的傳輸大多是使用 FTP 這個好用的伺服器軟體來進行傳送。不過使用 FTP 傳輸檔案卻有個小小的問題, 那就是您無法直接修改主機上面的檔案資料!也就是說,您想要更改 Linux 主機上面的某個檔案時,你必須要將該檔案自伺服器上下載下來後才能修改。 也因此該檔案在伺服器與用戶端都會存在。這個時候,萬一如果有一天您修改了某個檔案, 卻忘記將資料上傳回主機,那麼等過了一陣子之後,呵呵,您如何知道那個檔案才是最新的?

  • 讓檔案在兩部主機之間直接修改
  • 既然有這樣的問題,那麼好吧,我可不可以在用戶端的機器上面直接取用 server 上面的檔案, 如果可以在用戶端直接進行 Server 端檔案的存取,那麼我在用戶端就不需要存在該檔案資料囉,也就是說, 我只要有 Server 上面的檔案資料存在就可以啦!有沒有這樣的檔案系統啊 (File System)! 很高興的是,前面我們已經提過的 Network File System, NFS 就是這樣的檔案系統之一啦!我只要在用戶端將 Server 所提供分享的目錄掛載進來, 那麼在用戶端的機器上面就可以直接取用 Server 上的檔案資料囉,而且, 該資料就像是我用戶端上面的 partition 一般,真是好用!

    而除了可以讓 Unix Like 的機器互相分享檔案的 NFS 伺服器之外,在微軟 (Microsoft) 作業系統上面也有類似的檔案系統,那就是 Common Internet File System, CIFS 這個咚咚啦!CIFS 最簡單的想法就是目前常見的『網路上的芳鄰』咯! Windows 系統的電腦可以透過桌面上『網路上的芳鄰』來分享別人所提供的檔案資料哩!真是方便。 不過,NFS 僅能讓 Unix 機器溝通, CIFS 只能讓 Windows 機器溝通。傷腦筋,那麼有沒有讓 Windows 與 Unix-Like 這兩個不同的平台相互分享檔案資料的檔案系統呢?

  • 利用封包偵測逆向工程發展的 SMB Server
  • 在 1991 年一個名叫 Andrew Tridgwell 的大學生就有這樣的困擾,他手上有三部機器,分別是跑 DOS 的個人電腦、DEC公司的 Digital Unix 系統以及 Sun 的 Unix 系統。在當時, DEC 公司有發展出一套稱為 PATHWORKS 的軟體,這套軟體可以用來分享 DEC 的 Unix 與個人電腦的 DOS 這兩個作業系統的檔案資料,可惜讓 Tridgwell 覺得較困擾的是,Sun 的 Unix 無法藉由這個軟體來達到資料分享的目的。

    這個時候 Tridgwell 就想說:『咦!既然這兩部系統可以相互溝通,沒道理 Sun 就必需這麼苦命吧?可不可以將這兩部系統的運作原理找出來,然後讓 Sun 這部機器也能夠分享檔案資料呢?』, 為了解決這樣的的問題,他老兄就自行寫了個 program 去偵測當 DOS 與 DEC 的 Unix 系統在進行資料分享傳送時所使用到的通訊協定資訊,然後將這些重要的資訊擷取下來, 並且基於上述所找到的通訊協定而開發出Server Message Block (SMB) 這個檔案系統,而就是這套 SMB 軟體就能夠讓 Unix 與 DOS 互相的分享資料囉!
    Tips:
    再次的給他強調一次,在 Unix Like 上面可以分享檔案資料的 file system 是 NFS,那麼在 Windows 上面使用的『網路上的芳鄰』所使用的檔案系統則稱為 Common Internet File System, CIFS
    鳥哥的圖示
  • 取名 SAMBA 的主因 ^_^
  • 既然寫成了軟體,想一想,總是需要註冊一下商標吧!因此 Tridgwell 就去申請了 SMBServer (Server Message Block 的簡寫) 這個名字來做為他撰寫的這個軟體的商標,可惜的是,因為 SMB 是沒有意義的文字,因此沒有辦法達成註冊。既然如此的話,那麼能不能在字典裡面找到相關的字詞可以做為商標來註冊呢? 翻了老半天,呵呵!這個 SAMBA 剛好含有 SMB , 又是熱情有勁的拉丁舞蹈的名稱,不然就用這個名字來做為商標好了! 這成為我們今天所使用的 SAMBA 的名稱由來啦! ^_^

    小標題的圖示SAMBA 常見的應用
    由上面說明的 SAMBA 發展緣由,您就應該不難知道咯, SAMBA 最初發展的主要目就是要用來溝通 Windows 與 Unix Like 這兩個不同的作業平台,那麼 SAMBA 可以進行哪些動作呢?
    • 分享檔案與印表機服務;
    • 可以提供使用者登入 SAMBA 主機時的身份認證,以提供不同身份者的個別資料;
    • 可以進行 Windows 網路上的主機名稱解析 (NetBIOS name)
    • 可以進行裝置的分享 (例如 Zip, CDROM...)
    底下我們來談幾個 SAMBA 伺服器的應用實例吧!

  • 利用軟體直接編修 WWW 主機上面的網頁資料
  • 相信很多人都是利用個人電腦將網頁製作完畢之後,再以類似 FTP 之類的服務將網頁上傳到 WWW 主機的, 但這樣有個困擾,那就是同時在用戶端與 WWW 主機上頭都有一份網頁資料,常常會忘記哪一份是最新的, 最麻煩的是,有時候下載下來的檔案已經經過好多修改了,卻在下次的 FTP 作業,不小心又下載一次舊資料, 結果將已經修改過的資料覆蓋過去~天吶!又要重寫一遍.....真是討厭!

    如果你有安裝 SAMBA 伺服器的設定的話,那麼透過『網芳』的功能,直接連線遠端伺服器所提供的目錄, 如此一來你可以直接在你的個人電腦上面修改主機的檔案資料,只有一份正確的資料而已喔! 這就有點像是『線上編修』呢,一修改完成,在 Internet 上面可以立刻檢驗,方便的很吶!

  • 做成可直接連線的檔案伺服器
  • 在鳥哥實驗室中,由於電腦數量不多,研究生常常會使用到不同的電腦 (因為大家都得搶沒有人用的電腦啊!) ,此外,也常常有研究生拿自己的 NoteBook 來工作,因此,有些團隊的資料就分散在各個電腦當中,使用上相當的不方便。 這個時候,鳥哥就使用 SAMBA 將硬碟空間分享出來,由於使用者要登入 SAMBA 這個伺服器主機時需要輸入使用者資料 (帳號與密碼),而不同的登入者會取得不一樣的目錄資源,所以可以避免自己的資料在公用電腦上面被窺視, 此外,在不同的公用電腦上面都可以登入 SAMBA 主機,資料的使用上面真是相當的棒啊!

  • 印表機伺服器
  • SAMBA 除了分享檔案系統外,也可以分享印表機喔,鳥哥的研究室好幾部電腦就是直接以 Linux 分享的印表機來印製報告的。您會說『啊 Windows 也可以辦的到啊!沒有什麼了不起的!』是啊。 但是因為 Linux 做為伺服器主機時,鳥哥認為 Linux 畢竟還是比較穩定一點,可以 24 小時且全年無休的努力工作吶。此外,因為目前透過『網路上的芳鄰』來攻擊區域網路的 Windows 作業系統的電腦病毒實在是太多了,防不勝防, Linux 對於這樣的攻擊並沒有很大的影響 (因為常見的攻擊手法均針對 Windows 而來~),所以也比較安全一些說~

    SAMBA 的應用挺廣泛的,尤其對於區域網路內的電腦來說,更是一項不可多得的好用的伺服器, 雖然或許你會說,SAMBA 的功能不過是模仿 Windows 的網芳以及 AD 相關的軟體, 那我直接使用 Windows 不就 OK 了?可惜的是, Windows XP 對於網芳的連線限制依版本而有所不同, 以企業常見的專業版 (Professional) 來說,他僅能提供最多同時十個連線到網芳的連線能力,這.....不太夠用吧! 所以囉,SAMBA 穩定、可靠又沒有限制連線數,值得學習吧!^_^!更多的應用您可以自行發掘吶!


    小標題的圖示SMB 使用的 NetBIOS 通訊協定
    事實上,就像 NFS 是架構在 RPC Server 上面一樣, SAMBA 這個檔案系統是架構在 NetBIOS (Network Basic Input/Output System, NetBIOS) 這個通訊協定上面所開發出來的。既然如此,我們當然就要瞭解一下 NetBIOS 囉!

    最早 IBM 發展出 NetBIOS 的目的僅是要讓區域網路內少數電腦進行網路連結的一個通訊協定而已, 所以考慮的角度並不是針對大型網路,因此,這個 NetBIOS 是無法跨路由的 (Router / Gateway)。這個 NetBIOS 在區域網路內實在是很好用, 所以微軟的網路架構就使用了這個咚咚來進行溝通的吶!而 SAMBA 最早發展的時候,其實是想要讓 Linux 系統可以加入 Windows 的系統當中來分享使用彼此的檔案資料的,所以當然 SAMBA 就架構在 NetBIOS 發展出來囉。

    不過 NetBIOS 是無法跨路由的,因此使用 NetBIOS 發展起來的伺服器理論上也是無法跨越路由的呢! 那麼該伺服器的使用範圍不就受限相當的多了?好在,我們還有所謂的 NetBIOS over TCP/IP 的技術呢!這是什麼樣的技術啊?

    舉個例子來說好了,我們知道 TCP/IP 是目前網路連接的基本協定,現在我們將 NetBIOS 想成是一封明信片, 這個明信片只能讓您自己欣賞而已,如果今天我們要將這個明信片送到遠方的朋友那邊時!就需要透過郵件系統 (例如郵局啦、國際快遞啦等等的) 來傳送了!這個 TCP/IP 就可以視為郵件傳遞系統啦!透過這個 NetBIOS over TCP/IP 的技術,我們就可以跨路由的使用 SAMBA 伺服器所提供的功能咯! 當然啦,目前 SAMBA 還是比較廣泛的使用在 LAN 裡面說。
    Tips:
    或許您會發現在 Windows 網路設定裡面常常看到 NetBEUI 這個咚咚,那是什麼呢?那個是 NetBIOS Extened User Interface 的簡寫,也是 IBM 在 NetBIOS 發展出來之後的改良版本。雖然這兩者的技術不太相同, 不過,我們只要知道一些簡單的概念就可以了!所以,在這裡我們不針對 NetBEUI 來介紹。
    鳥哥的圖示

    小標題的圖示SAMBA 使用的 daemons
    NetBIOS 當初發展時就著眼在區域網路內的快速資料交流,而因為是定義在區域網路內,因此他並沒有使用類似 TCP/IP 之類的傳輸協定,也就不需要 IP 的設定。如此一來資料如何在兩部主機之間交流呢? 其實主機在 NetBIOS 協定當中的定義為使用『NetBIOS Name』,每一部主機必須要有不同的 NetBIOS Name 才行, 而檔案資料就是在不同的 NetBIOS name 之間溝通囉!我們以一個網芳的設定來作簡單的說明好了:
    1. 取得對方主機的 NetBIOS name 定位該主機所在:
      當我們想要登入某部 Windows 主機使用他所提供的檔案資料時,必需要加入該 Windows 主機的群組 (Workgroup),並且我們的機器也必需要設定一個主機名稱,注意喔,這個主機名稱跟 Hostname 是不一樣的,因為這個主機名稱是架構在 NetBIOS 協定上的,我們可以簡單的稱呼他為 NetBIOS Name 好了。在同一個群組當中,NetBIOS Name 必需要是獨一無二的喔!

    2. 利用對方給予權限存取可用資源:
      在我們找到該主機名稱後,是否能登入該對方主機或者是取用對方主機所提供的資源, 還要看對方 Windows 主機有沒有提供我們使用的權限吶!所以,並不是登入該 Windows 主機之後我們就可以無限制的取用該主機的檔案資源了。也就是說,如果對方主機允許你登入, 但是卻沒有開放任何資源讓您取用,呵呵,登入主機也無法查看對方的硬碟裡面的資料的啦!
    我們的 SAMBA 則是透過兩支服務來控制這兩個步驟,分別是:
    • nmbd :這個 daemon 是用來管理工作群組啦、NetBIOS name 啦等等的解析。 主要利用 UDP 協定開啟 port 137, 138 來負責名稱解析的任務;

    • smbd :這個 daemon 的主要功能就是用來管理 SAMBA 主機分享的目錄、檔案與印表機等等。 主要利用可靠的 TCP 協定來傳輸資料,開放的埠口為 139 及 445(不一定存在) 。
    所以囉, SAMBA 每次啟動至少都需要有這兩個 daemons 喔!這可不要忘記囉! ^_^而當我們啟動了 SAMBA 之後,主機系統就會啟動 137, 138, 139 三個 port ,且同時會有 UDP/TCP 的監聽服務喔!這可不要忘記了! 因為後面設定防火牆的時候,還會使用到這三個 port 的呢!


    小標題的圖示連線模式的介紹 (peer/peer, domain model)
    SAMBA 主機的應用相當的廣泛,而且可以依照不同的網域連線與使用者帳號、密碼的控管方式不同, 來加以不同的類別應用,例如最常見的 Workgroup 及 Domain 兩種方式的連線模式呢! 底下我們就是要來談一談這兩種最常見的區域網路的連線模式 peer/peer 及domain model。

  • peer/peer (Workgroup model):
  • peer 有同等、同輩的意思存在,那麼 peer/peer 由字面上的解釋來看,當然就是同等地位的 PC 架構了!這是什麼意思呢?簡單的來說,在區域網路裡面的所有 PC 均可以在自己的電腦上面管理自己的帳號與密碼, 同時每一部電腦也都具有獨力可以執行各項軟體的能力,只是藉由網路將各個 PC 連結在一起而已的一個架構, 所以,每一部機器都是可以獨立運作的喔!

    這樣的架構在目前小型辦公室裡面是最常見的。例如辦公室裡面有十個人,每個人桌上可能都安裝有一套 Windows 作業系統的個人電腦,而這十部電腦都可以獨立進行辦公室軟體的執行啊、獨立上網啊、獨立玩遊戲啊等等的, 因為這十部電腦都可以獨立運作,所以不會有一部電腦關掉,其他的電腦就無法工作的情況發生,這就是 peer/peer 的典型架構。

    以下圖的架構為例,在這樣的架構下,假設 A 君寫了一個報告書,而 B 君想要以網路直接取用這個報告書時,他就必須要知道 A 君使用的電腦的帳號與密碼,並且 A 君必須要在 PC A 上面啟用 Windows 的『資源分享(或者是共用)』之後,才能夠讓 B 君連線進入喔 (此時 PC A 為 Server) !而且, A 君可以隨時依照自己的喜好來更改自己的帳號與密碼,而不受 B 君的影響,不過, B 君就得要取得 A 君同意取得新的帳號與密碼後,才能夠登入 PC A 喔!反過來說,同樣的, A 要取得 B 的資料時,同樣需要取得 PC B 的帳號與密碼後,才能夠順利登入啊 (此時 PC A 為 Client 喔)!因為 PC A, PC B, PC C 的角色與地位都同時可以為 Client 與 Server ,所以就是 peer/peer 的架構了!

    Peer/Peer 的連線模式
    圖一、Peer/Peer 的連線模式

    生活周遭中,哪裡看到的這種 peer/peer 的架構呢?想起來了嗎?沒錯!就是藉由 Windows 的『網路上的芳鄰』所達成的『工作群組(workgroup)』的架構,那就是典型的 peer/peer 架構啦!所以, peer/peer 也可以直接說成 workgroup 的連線架構喔。

    使用 peer/peer 的架構的好處,是每部電腦均可以獨立運作,而不受他人的影響!不過, 缺點就是當整個網域內的所有人員都要進行資料分享時,光是知道所有電腦裡面的帳號與密碼,就會很傷腦筋了! 所以, Peer/Peer 的架構是比較適合 (1)小型的網域,或者是 (2)沒有需要常常進行檔案資料分享的網路環境,或者是 (3)每個使用者都獨自擁有該電腦的擁有權(就是說,該電腦是使用者的,而不是公用的啦!) 而,如果該單位的所有 PC 均是公有的,而且您需要統一控管整個網域裡面的帳號與密碼的話,那就得使用底下的 domain models 了!

  • domain model
  • 假設今天您服務的單位有 10 部電腦,但是您的單位有 20 個員工,這也就是說,這 20 個員工輪流搶著用這 10 部電腦。如果每部電腦都如同 peer/peer 的架構時,那麼每部電腦都需要輸入這 20 個員工的帳號與密碼來提供他們登入喔,而且,今天假如有個員工想要變更自己的密碼時,就需要到 10 台電腦上面進行密碼變更的作業!否則他就必須要記得這 10 部電腦裡面,那一部電腦是記憶那一個密碼.....好煩那~

    如果上述是這樣的情況,使用 peer/peer 架構就不是一個好方法了!這個時候就需要藉由 domain model 來達成您的需求啦!所謂的 domain model 概念其實也很簡單,既然使用電腦資源需要帳號與密碼, 那麼我將所有的帳號與密碼都放置在一部主控電腦 (Primary Domain Controller, PDC) 上面,在我的網域裡面,任何人想要使用任何電腦時,都需要在螢幕前方輸入帳號與密碼,然後通通藉由 PDC 主機的辨識後,才給予適當的使用權限,也就是說,不同的身份還具有不一樣的電腦資源使用權限就是了! 例如底下的圖示:

    domain model 的連線模式
    圖二、domain model 的連線模式

    PDC 主機控管整個網域裡面的各個機器 (PC A ~ PC D) 的帳號與密碼的資訊,假如今天有個使用者帳號名稱為 Ken ,且密碼為 mypasswd 時,他不論使用哪一部電腦 (PC A ~ PC D) 只要在螢幕前方輸入 ken 與他的密碼,則該機器會先到 PDC 上面查驗是否有 ken ,以及 ken 的密碼,並且 PDC 主機會給予 ken 這個使用者相關的電腦資源使用權限。當 ken 在任何一部主機上面登入成功後,他就可以使用相關的電腦資源了!

    這樣的架構比較適合人來人往的企業架構,當系統管理員要控管新進人員的電腦資源使用權時,可以直接針對 PDC 來修改就好了,不需要每一部主機都去修修改改的,對於系統管理員來說,這樣的架構在控管帳號資源上,當然是比較簡單的啦!

    各種架構適用的環境與適用的人都不相同,並沒有那個是最好啦!請依照您的工作環境來選擇連線的模式囉!當然, SAMBA 可以達到上述兩種模式的啦!底下我們會分別來介紹喔!

    大標題的圖示SAMBA 伺服器的基礎設定
    SAMBA 這個套件幾乎在所有的 Linux distributions 上面都有提供,因為即使你的 Linux 僅做為個人桌上型電腦使用時, 你依舊可能會需要連線到遠端的 Windows 的網芳的,那個時候就得要 samba 提供的用戶端軟體功能囉! 因此你只要直接安裝系統上面提供的預設 samba 版本即可。底下我們會先介紹 samba 伺服器,然後在介紹用戶端功能喔!


    小標題的圖示Samba 所需套件及其套件結構
    目前常見的 samba 版本為 3.x 版,舊版的 2.x 版在設定上有點不一樣,因此在進入設定前請先確認你的 samba 版本。 咱們的 CentOS 4.x 提供的是 Samba 3.x 的版本。那麼你需要什麼套件呢?基本上有這些:
    • samba
      這個套件主要包含了 SAMBA 的主要 daemon 檔案 (smbd 及 nmbd)、 SAMBA 的文件檔 (document)、以及其他與 SAMBA 相關的 logrotate 設定檔及開機預設選項檔案等;

    • samba-common
      這個套件則主要提供了 SAMBA 的主要設定檔 (smb.conf) 、 smb.conf 語法檢驗的測試程式 (testparm)等等;

    • samba-client
      這個套件則提供了當 Linux 做為 SAMBA Client 端時,所需要的工具指令,例如掛載 SAMBA 檔案格式的執行檔 smbmount 等等。
    這三個套件你都得要安裝才行喔!如果尚未安裝的話,看是要由原版光碟去安裝,還是使用 yum 都可以啦! 安裝完畢之後,你可以依序察看一下 Samba 的套件結構喔!與他相關的檔案基本上有這些東西:
    • /etc/samba/smb.conf
      smb.conf 是 Samba 的主要設定檔名,如果你的 distribution 的 SAMBA 設定檔不在 /etc/samba/ 目錄當中, 那麼你應該使用 locate 或 find 等方式將他找出來就好啦。基本上,咱們的 Samba 就僅有這個設定檔而已, 且這個設定檔本身就是很詳細的說明文件了,請用 vi 去查閱他吧!這個檔案主要在設定工作群組、 NetBIOS 名稱以及分享的目錄等相關設定,我們後續要介紹的都是這個檔案而已啦!

    • /etc/samba/lmhosts
      這個檔案的主要目的在對應 NetBIOS name 與該主機名稱的 IP ,事實上他有點像是 /etc/hosts 的功能!只不過這個 lmhosts 對應的主機名稱是 NetBIOS name 喔!不要跟 /etc/hosts 搞混了!由於目前 SAMBA 的功能越來越強大,所以通常只要您一啟動 SAMBA 時,他就能自己捉到 LAN 裡面的相關電腦的 NetBIOS name 對應 IP 的資訊,因此這個檔案通常可以不用設定了!

    • /etc/samba/smbpasswd
      這個檔案預設並不存在啦!他是 SAMBA 預設的使用者密碼對應表。當我們設定的 SAMBA 伺服器是較為嚴密的,需要使用者輸入帳號與密碼後才能登入的狀態時,使用者的密碼預設就是放置在這裡咯 (當然囉,您可以自行在 smb.conf 裡面設定密碼放置的地方及密碼檔名, 不過我們這裡都以預設的狀態來說明) 。比較需要注意的是,這個檔案因為包含了使用者的密碼, 當然權限方面要較為注意啦!這個檔案的擁有者需要是 root ,且權限設定為 600 才行喔!

    • /etc/samba/smbusers
      由於 Windows 與 Unix-like 在管理員與訪客的帳號名稱不一致,分別為 administrator 及 root, 為了對應這兩者之間的帳號關係,可以使用這個檔案來設定。不過這個檔案的使用必須要經由 smb.conf 內的『 username map 』設定項目來啟動才行。

    • testparm
      這個指令主要在檢驗 samba 設定檔 smb.conf 的語法正確與否,當你編輯過 smb.conf 時,請務必使用這個指令來檢查一次, 避免因為打字錯誤引起的困擾啊!

    • smbd, nmbd
      前幾個小節曾經提過的兩個主要 daemon 就在這裡!

    • smbstatus
      列出目前的 SMB server 的狀態,也是很有用途的一個指令啦!

    • smbpasswd
      如果您的 SAMBA 設定的較為嚴格,需要規定使用者的帳號與密碼,那麼那個密碼檔案的建立就需要使用 smbpasswd 來建置才可以的喔!所以這個指令與建立 SAMBA 的密碼有關咯!

    • smbclient
      當你的 Linux 主機想要藉由『網路上的芳鄰』的功能來查看別台電腦所分享出來的目錄與裝置時,就可以使用 smbclient 來查看啦!這個指令也可以使用在自己的 SAMBA 主機上面,用來查看是否設定成功哩!

    • smbmount
      在 Windows 上面我們可以設定『網路磁碟機』來連接到自己的主機上面,同樣的,在 Linux 上面,我們可以透過 smbmount 來將遠端主機分享的檔案與目錄掛載到自己的 Linux 主機上面哪!不過,其實我們也可以直接使用 mount 這個指令來進行同樣的功能就是了。

    • nmblookup
      有點類似 nslookup 啦!重點在查出 NetBIOS name 就是了。

    • smbtree
      這玩意就有點像 Windows 系統的網路上的芳鄰顯示的結果,可以顯示類似『靠近我的電腦』之類的資料, 能夠查到工作群組與電腦名稱的樹狀目錄分佈圖,有趣吧!

    • /usr/share/doc/samba-<版本>
      這個目錄包含了 SAMBA 的所有相關的技術手冊喔!也就是說,當您安裝好了 SAMBA 之後,您的系統裡面就已經含有相當豐富而完整的 SAMBA 使用手冊了!值得高興吧! ^_^,所以,趕緊自行參考喔!
    大致的套件結構就是這樣,底下就準備來講一個簡單的案例吧! ^_^


    小標題的圖示基礎設定流程與 smb.conf 的主要規劃
    既然 Samba 是要加入 Windows 的網芳當中,所以他的設定方式應該是要與網芳差不多才是。所以我們先來聊一聊 Windows 的一些設定方法再說。在早期 Windows 的網芳設定真是很簡單,不過也因為太簡單, 所以產生的安全問題可是相當的麻煩的。後來在 Windows XP 的 sp2 (服務包第二版) 加入了很多的預設防火牆機制, 因此使用網芳的預設限制常常會是這樣的:
    • 主機與主機之間必須要在同一個網域當中 (否則需要修改 Windows 預設防火牆);
    • 最好設定為同一工作群組;
    • 主機的名稱不可相同 (NetBIOS name);
    • 專業版 Windows XP 最多僅能提供同時十個用戶連線到網芳。
    當你的 Windows 主機群符合上述的條件後,就很容易處理網芳分享的工作啦!分享的步驟是這樣的:
    1. 叫出檔案總管,然後在要分享的目錄、磁碟或裝置 (如印表機) 上面按下右鍵,選擇『共用』,然後就能夠設定好分享的資料了;
    2. 最好建立一組給用戶使用的帳號與密碼,讓其他主機的使用者可以透過該帳號密碼連線進入網芳;
    真是有夠簡單的!那麼 Samba 怎麼設定啊?也是很簡單,依據上述的限制以及流程你可以這樣想像:
    1. 在 smb.conf 當中設定好工作群組、NetBIOS 主機名、密碼使用狀態等等與主機相關的資訊;
    2. 在 smb.conf 內設定好預計要分享的目錄或裝置以及可供使用的使用者資料;
    3. 根據步驟 2 的設定,在 Linux 檔案系統當中建立好分享出去的檔案或裝置的使用權限;
    4. 根據步驟 2 的設定,以 smbpasswd 建立起使用者的帳號及密碼
    5. 啟動 Samba 的 smbd, nmbd 服務,開始運轉哩!
    瞧!根據上面的流程,其實我們最需要知道的就是 smb.conf 這個設定檔的資訊就是了。 所以首先我們就要來介紹一下這個檔案的設定方式囉!這個檔案其實可以分為兩部份來看, 一個是主機資訊部分,在 smb.conf 當中以 [global] 作為設定的依據;另一個則是分享的資訊, 以個別的目錄名稱為依據。你要先知道的是:在 smb.conf 當中, 井字號與分號 (# 跟 ;) 都是註解符號!底下咱們就來談談這個咚咚吧!


  • 主機整體參數
  • 在 smb.conf 這個設定檔當中的設定有點像底下這樣:
    # 會有很多加上 # 或 ; 的註解說明,你也可以自行加上來提醒自己相關設定
    [global]
       參數項目 = 設定內容
       ....
    
    [分享資源名稱]
       參數項目 = 設定內容
       ....
    
    在 global 當中的就是一些主機的整體參數了,包括工作群組、主機的 NetBIOS 名稱、字元編碼的顯示、登錄檔的設定、 是否使用密碼以及使用密碼驗證的機制等等,都是在這個 [global] 項目中設定的。至於 [分享資源名稱] 則是針對你開放的目錄來進權限方面的設定,包括誰可以瀏覽該目錄、是否可以讀寫等等參數。 在 [global] 部分關於主機名稱資訊方面的參數主要有:
    • workgroup = 工作群組的名稱:注意,主機群要相同;
    • netbios name = 主機的 NetBIOS 名稱啊,每部主機均不同;
    • server string = 主機的簡易說明,這個隨便寫即可。
    另外,過去常常讓使用者心生不滿的語系顯示問題方面,您務必要清楚的知道的是, SAMBA 主機上面的資料 (例如 mount 磁碟分割槽的參數以及原本的資料編碼), SAMBA 伺服器顯示的語系, Windows 用戶端顯示的語系, Windows 用戶端連上 SAMBA 的軟體 都需要符合設定值才行! 在新版的 3.x 上面有數個提供這些語系轉換的設定喔,如下所示:
    • display charset = 自己伺服器上面的顯示編碼, 例如你在終端機時所查閱的編碼資訊。一般來說,與底下的 unix charset 會相同。
    • unix charset = 在 Linux 伺服器上面所使用的編碼,一般來說就是 i18n 的編碼囉! 所以你必須要參考 /etc/sysconfig/i18n 內的『預設』編碼。
    • dos charset = 就是 Windows 用戶端的編碼了! 一般來說我們的繁體中文 Windows 使用的是 big5 編碼,這個編碼在 Samba 內的格式被稱為『 cp950 』喔!
    關於語系編碼,建議您參考一下討論區的這一篇:
    我們的網友 eyesblue 寫得太好了!所以建議大家直接前往查閱即可!除此之外,還有登錄檔方面的資訊, 包括這些參數:
    • log file = 登錄檔放置的檔案,檔名可能會使用變數處理;
    • max log size = 登錄檔最大僅能到多少 Kbytes ,若大於該數字,則會被 rotate 掉。
    還有跟密碼有關的參數,包括這幾個:
    • security = user, server, domain, share 四選一,這四個設定值分別代表:
      • user :使用 SAMBA 本身的密碼資料庫,密碼資料庫與底下的 smb passwd file 有關;
      • share:分享的資料不需要密碼即可分享;
      • server, domain:使用外部主機的密碼,亦即 SAMBA 是用戶端之意,如果設定這個項目, 你還得要提供『password server = IP』的設定值才行;
    • encrypt passwords = Yes 代表密碼要加密,注意那個 passwords 要有 s 才對!
    • smb passwd file = 密碼放置的檔案,通常是 /etc/samba/smbpasswd 。
    事實上 Samba 的密碼方面設定值很多喔,包括你還可以利用 samba 來修改 /etc/passwd 裡頭的人物的密碼呢! 不過這個時候就得需要『 unix password sync 』以及『 passwd program 』這兩個參數值的幫忙了。 我們這裡先談比較簡單的,其他進階的部分可以 man smb.conf 去進行搜尋查閱喔! ^_^


  • 分享目錄參數
  • 在目錄參數部分,主要有底下這幾個常見的參數喔:
    • [分享名稱] :這個分享名稱很重要,他是一個『代號』而已。 舉例來說,你在 Windows 當中使用『共用』來分享網芳時,假設你將『D:\game』分享出來, 系統不是還會要你輸入一個『在網路上面的名稱』嗎?假設你輸入『My_Games』這個名稱好了, 那麼未來大家在網芳看到的這個資料夾 (D:\game) 名稱其實是『\\你的IP\My_Games』啦!
    • comment :這個目錄的說明!
    • path :在網芳中顯示的名稱 [分享名稱] 中,所實際進入的 Linux 檔案系統。 也就是說,在網芳當中看到的是 [分享] 的名稱,而實際操作的檔案系統則是在 path 裡頭所設定的。
    • read only:是否唯讀?
    • public :是否讓所有可以登入的使用者看到這個項目?
    • writable :是否可以寫入?這裡需要注意一下喔!那個 read only 與 writable 不是兩個蠻相似的設定值嗎?如果 writable 在這裡設定為 no ,亦即不可寫入,那跟 read only 不就互相抵觸了!那個才是正確的設定?答案是:最後出現的那個設定值為主要的設定!
    • create mode 與 directory mode 都與權限有關的咯!
    • valid users = 使用者,這個項目可以指定能夠進入到此資源的特定使用者。
    因為分享的資源主要與 Linux 系統的檔案權限有關,因此裡頭的設定參數多與權限有關。


  • 變數特性
  • 為了簡化設定值,Samba 提供很多不同的變數給我們來使用,主要有底下這幾個變數喔:
    • %S:取代目前的設定項目值,所謂的『設定項目值』就是在 [分享] 裡面的內容! 舉例來說,例如底下的設定範例:
      [homes]
         valid users = %S
         ....
      
      因為 valid users 是允許的登入者,設定為 %S 表示任何可登入的使用者都能夠登入的意思~今天如果 dmtsai 這個使用者登入之後,那個 [homes] 就會自動的變成了 [dmtsai] 了!這樣可以明白了嗎? %S 的用意就是在替換掉目前 [ ] 裡面的內容啦!

    • %m:代表 Client 端的 NetBIOS 主機名稱喔!
    • %M:代表 Client 端的 Internet 主機名稱喔!就是 HOSTNAME。
    • %L:代表 SAMBA 主機的 NetBIOS 主機名稱。
    • %H:代表使用者的家目錄。
    • %U:代表目前登入的使用者的使用者名稱
    • %g:代表登入的使用者的群組名稱。
    • %h:代表目前這部 SAMBA 主機的 HOSTNAME 喔!注意是 hostname 不是 NetBIOS name 喔!
    • %I:代表 Client 的 IP 咯。
    • %T:代表目前的日期與時間
    至於相關的變數運用,我們會在底下的設定當中略做介紹喔!

    以上就是在 smb.conf 上頭常看到的幾種設定項目,相信初次接觸 Samba 的朋友,看到上頭寫的資料肯定是一頭霧水的! 我們底下用幾個小範例來實際的介紹 smb.conf 的設定後,您就會知道這些參數如何應用了! 記得,看完底下的下範例後,要回來再將這些參數的意義瞧一瞧, 而且若有其他額外的參數須知,務必自行 man smb.conf 喔!重要的很!


    小標題的圖示沒有密碼的 smb.conf 設定(純測試)
    瞎密?不需要密碼就能夠使用 SAMBA 主機所提供的目錄資源?真假?沒錯啦,可以達到的。 不過,因為不需要密碼就能夠登入,雖然你可以設定權限成為唯讀,讓使用者可以『瞧瞧而已』, 但是畢竟比較危險,因為如果你不小心將重要資料放置到該分享的目錄當中,豈不危險? 所以盡量不要這樣設定。不過,我們還是得介紹一下啦!先說明一下我們的設定需求:

  • 主機預計設定的參數狀況:
    • 在 LAN 內所有的網芳主機工作群組 (workgroup) 為: vbirdhouse
    • 這部 Linux 主機 (Samba 服務) 的 NetBIOS 名稱為: vbirdserver
    • 使用者登入層級設定為: share
    • 僅分享 /tmp 這個目錄而已,且取名為: temp
    • Linux 主機的編碼格式假設為萬國碼 (Unicode, 亦即 utf8)
    • 用戶端為中文 Windows ,在用戶端的軟體也使用 big5 的編碼
    底下就開始依序來進行 samba 的設定吧!


  • 1. 設定 lmhosts 檔案內容 (optional):
  • 我們前面談到 NetBIOS 名稱可以由廣播的方式自動取得,而 NetBIOS 也可以透過區域網路內經由一部主控電腦來管理, 此外,你也可以利用自己主機當中的 lmhosts 這個設定檔來進行 NetBIOS 與 IP 的對應, 讓 NetBIOS 與 TCP/IP 可以對應上關係吶!一般來說,這個檔案是可以不必設定的,因為可以經由廣播的方式取得對應的嘛! 不過,某些時刻確實可以設定一下,免除一些額外的搜尋時間說。我的區網中電腦名稱與 IP 是這樣的:
    [root@linux ~]# vi /etc/samba/lmhosts
    127.0.0.1       localhost
    192.168.1.254   vbirdserver
    192.168.1.21    vbirdcpu2
    192.168.1.11    vbirdcpu1
    # 這個檔案的內容很簡單,與 /etc/hosts 很類似,左邊是 IP 右邊是主機名稱。
    # 只是主機名稱必須符合 NetBIOS name 的標準,包括:
    # 主機名稱不要超過 15 個字元,不要含有特殊字元等等。
    # 亦可使用 man lmhosts 來查閱喔!
    
    鳥哥區網內常用的有三部主機,除了 Linux 這部機器外,還有兩部個人電腦,我將這幾部電腦的 NetBIOS name 寫到這個檔案當中,可以免除 Samba 自己去搜尋囉!而再次強調,這個名稱是 NetBIOS name 而非 HOSTNAME 喔!

  • 2. 檢查語系資料
  • 過去朋友們在進行 SAMBA 的設定時,最容易發生錯誤的地方就是在中文檔名部分, 絕大部分的朋友只要使用了中文檔名,常常會發生一些問題,就是無法順利的上傳下載, 或者是原先的中文檔名上傳後,卻變成奇怪的亂碼檔名。

    為了解決這個問題,你必須要知道幾個項目:
    • 原始檔案 (你要分享的檔案) 編碼的格式為何?一般來說,中文 Windows 的編碼預設為 Big5 ;
    • 這個檔案放置在 Linux 上,則這部 Linux 的預設語系編碼為何?這與 /etc/sysconfig/i18n 有關;
    • 在 Samba 上頭的顯示編碼為何?一般來說與上述的 Linux 預設編碼相同即可;
    • 在用戶端連接到 Samba 主機的軟體之語系編碼為何?如果是中文 Windows 作業系統,預設為 Big5。
    你的語系資料必須要在上面這幾個環境中進行轉換,因此如果你的用戶端連上 Samba 的軟體編碼為 Big5 , 你的 Samba 使用的語系也是 Big5 ,但是 Linux 主機卻預設僅支援 utf8 的編碼時,而你的 smb.conf 又沒有設定好,此時資料傳輸就會發生一些錯誤,因此你就會看到很多亂碼檔名了。

    所以,你至少得要知道你的 Linux 語系編碼為何?在 Red Hat 系統 (含我們的 CentOS) 可以查閱 /etc/sysconfig/i18n 這個檔案, 如下所示為鳥哥的 i18n :
    [root@linux ~]# cat /etc/sysconfig/i18n
    LANG="en_US.UTF-8"  <==這才是你需要注意的地方!
    SUPPORTED="zh_HK.UTF-8:zh_HK:zh:zh_CN.UTF-8:zh_CN:zh:zh_SG.UTF-8:
    zh_SG:zh:zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en"
    SYSFONT="latarcyrheb-sun16"
    
    由上頭看起來,鳥哥預設的語系編碼為 en_US.UTF-8,不過尚有支援 zh_TW 這樣的中文編碼。 先假設鳥哥的編碼為萬國碼 (Unicode) 好了。知道了之後就能夠開始處理 smb.conf 囉!


  • 3. 設定 smb.conf 設定檔
  • 在這個例子當中我們僅分享 /tmp 這個目錄而已,而且假設這個分享出來的目錄是可讀寫的, 另外,我們並沒有分享印表機喔!而在 smb.conf 當中的註解符號可以是『 # 』也可以是『 ; 』喔!要注意!
    [root@linux ~]# cd /etc/samba
    [root@linux samba]# cp smb.conf smb.conf.raw  <==先備份再說!
    [root@linux samba]# vi smb.conf
    # 先設定好主機方面的參數
    [global]
            # 與主機名稱有關的設定資訊
            workgroup     = vbirdhouse
            netbios name  = vbirdserver
            server string = This is vbird's samba server
    
            # 與語系方面有關的設定項目喔,為何如此設定請參考前面的說明
            unix charset    = utf8
            display charset = utf8
            dos charset     = cp950
    
            # 與登錄檔有關的設定項目,注意變數 (%m)
            log file = /var/log/samba/%m.log
            max log size = 50
    
            # 這裡才是與密碼有關的設定項目哩!
            security = share
    
            # 其他預設存在的項目
            socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy = no
            template shell = /bin/false
            winbind use default domain = no
    
    # 底下則是針對 /tmp 的設定而來的!可瀏覽且可寫入喔!
    [temp]
            comment   = Temporary file space
            path      = /tmp
            read only = no
            public    = yes
    
    請您特別留意,在原本的 smb.conf 上面就已經有很多預設值了,這些預設值如果你不知道他的用途, 盡量保留預設值,也可以使用 man smb.conf 去查詢該預設值的意義。舉例來說, CentOS 4.x 的 smb.conf 預設有針對 server/client 的封包傳遞項目設定值的 socket options ,也有針對 Windows NT 及 Unix 系統的帳號對應之 idmap uid 之類的設定值,這些設定值在大型的區網架構會使用到,在我們僅有一兩部 Linux samba 伺服器的環境下.... 應該是可以不予理會的啦!


  • 4. 用 testparm 查閱 smb.conf 的語法設定正確性
  • 在啟動 samba 之前,我們務必要瞭解到 smb.conf 裡面語法是否正確,檢驗的方式使用 testparm 這個指令即可。 測試方式如下:
    [root@linux ~]# testparm
    參數:
    -v :查閱完整的參數設定,連同預設值也會顯示出來喔!
    
    [root@linux ~]# testparm
    Load smb config files from /etc/samba/smb.conf
    Processing section "[temp]"   <==這個地方可以仔細看看,如果有問題會在這邊顯示
    Loaded services file OK.
    Server role: ROLE_STANDALONE
    Press enter to see a dump of your service definitions <==請按 [Enter] 按鍵
    
    # Global parameters
    [global]
            dos charset = cp950
            display charset = utf8
            workgroup = VBIRDHOUSE
            netbios name = VBIRDSERVER
            server string = This is vbird's samba server
            security = SHARE
            log file = /var/log/samba/%m.log
            max log size = 50
            socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy = No
    
    [temp]
            comment = Temporary file space
            path = /tmp
            read only = No
            guest ok = Yes
    
    上頭是語法驗證與各個項目的列出,如果你下達 testparm 卻出現如下畫面那就是有問題:
    Unknown parameter encountered: "linux charset" <==錯誤的設定
    Ignoring unknown parameter "linux charset"
    Processing section "[temp]"
    Loaded services file OK.
    Server role: ROLE_STANDALONE
    Press enter to see a dump of your service definitions
    
    如果發現上述的錯誤,這表示你的 smb.conf 有個 linux charset 的設定參數,不過 smb.conf 其實是不支援這個參數的。 可能的問題是 samba 2.x 與 samba 3.x 有一些項目的支援已經不存在了,所以你使用舊版的 2.x 設定檔來 3.x 上頭執行時,就會出現問題。此外,『打字錯誤』也是很常見的一個問題吶!趕緊測試一下語法先, 然後根據 smb.conf 有的項目去進行修改吧。

    如果你想要瞭解 samba 的所有設定 (包括沒有在 smb.conf 裡頭設定的預設值),可以使用 testparm -v 來作詳細的輸出, 資料相當的豐富,透過這個您也可以知道你的主機環境設定為何呢! ^_^


  • 5. 啟動與觀察
  • 啟動實在太簡單了,利用預設的 CentOS 啟動方式來處理即可。
    [root@linux ~]# /etc/init.d/smb start
    [root@linux ~]# netstat -tlunp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address      Foreign Address  State   PID/Program name
    tcp        0      0 0.0.0.0:139        0.0.0.0:*        LISTEN  10338/smbd
    tcp        0      0 0.0.0.0:445        0.0.0.0:*        LISTEN  10338/smbd
    udp        0      0 192.168.1.254:137  0.0.0.0:*                10343/nmbd
    udp        0      0 0.0.0.0:137        0.0.0.0:*                10343/nmbd
    udp        0      0 192.168.1.254:138  0.0.0.0:*                10343/nmbd
    udp        0      0 0.0.0.0:138        0.0.0.0:*                10343/nmbd
    
    特別注意,在 Samba (網芳) 當中預設會啟動多個埠口,這包括資料傳輸的 TCP 埠口 (139, 445), 以及進行 NetBIOS 名稱解析之類工作的 UDP 埠口 (137, 138),所以你才會看到很多資料的。 那麼能否僅支援 139 這個必要的埠口,關閉 445 呢?可以啊~透過 testparm -v 的觀察, 可以發現『 smb ports = 445 139 』這個設定值指定兩個埠口的,因此你可以在 smb.conf 增加這個設定值, 並改為 smb ports = 139 即可。不過,建議先保留預設值啦!


  • 6. 用戶端的觀察
  • 關於用戶端的觀察我們會在後續進行介紹。在這裡僅是說明如何確定我們的 Samba 設定與服務有順利的在運作。 我們可以在本機上透過 smbclient 這支程式來處理,他的基本語法是這樣的:
    [root@linux ~]# smbclient -L [//主機或IP] [-U 使用者帳號]
    參數:
    -L :僅查閱後面接的主機所提供分享的目錄資源;
    -U :以後面接的這個帳號來嘗試取得該主機的可使用資源
    
    由於在這個範例當中我們並沒有規範使用者的安全等級,所以必須要使用 -U 這個參數。 因此你可以這樣看看:
    [root@linux ~]# smbclient -L //127.0.0.1 
    Password:  <==這裡按一下 [Enter] 吧!
    Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename   Type  Comment
        ---------   ----  -------
        temp        Disk  Temporary file space
        IPC$        IPC   IPC Service (This is vbird's samba server)
        ADMIN$      IPC   IPC Service (This is vbird's samba server)
    Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Server           Comment
        ---------        -------
        VBIRDSERVER      This is vbird's samba server
    
        Workgroup        Master
        ---------        -------
        VBIRDHOUSE       VBIRDSERVER
    
    上表輸出的資訊當中,分享的目錄資源 (Sharename) 就是在 smb.conf 當中設定的 [temp] 名稱囉! 因此在這裡的意思是:任何人都可以進入 //127.0.0.1/temp 這個目錄當中, 而這個目錄在 Linux 系統其實是 /tmp 目錄。至於那個 IPC$ 及 ADMIN$ 則是為了要應付 Windows 環境所必須要存在的項目就是了。

    基本上,到此為止咱們就設定好一個簡單的不需要密碼即可登入的 Samba 主機了! 你可以先行到用戶端軟體功能的部分進行掛載測試。 底下我們則預計以簡易的需要密碼才能夠登入 Samba 的方式來設計一個範例吧!


    小標題的圖示安全等級為使用者的工作群組設定
    設定一部不需密碼即可登入的 Samba server 是非常簡單的,不過, 您總不希望某些有機密性質的資料放在不設防的網芳中讓大家查閱吧? 舉例來說,你總不希望你的家目錄被人家隨意瀏覽吧?家目錄內可能有你自己的情書呢!^_^

    那怎麼辦?沒關係,我們可以透過 Samba 主機提供的認證方式來進行使用者權限的給予, 也就是說,你在用戶端連線到主機時,必須要輸入正確的帳號與密碼後,才能夠登入 Samba 主機查閱到你自己的資料! 那會不會很難啊?不會啦! Samba 本身就提供一個小程式來幫助我們處理密碼的建立了, 整個流程還不太難。比較重要的是Samba 使用者帳號必須要存在於 Linux 系統當中 (/etc/passwd), 但是 Samba 的密碼與 Unix 的密碼檔案並不相同。這就比較有點小麻煩~ 沒關係,就讓我們依樣畫葫蘆來處理一下這個部分的設定吧!

  • 主機預計分享的資源狀態
    • 剛剛前一個免密碼時的 smb.conf 設定繼續保留;
    • 針對 NetBIOS name 的解析方式依序由 lmhosts, broadcast 及 host 來進行解析;
    • 安全等級提升為 user 等級;
    • 密碼檔案放置到 /etc/samba/smbpasswd 這個檔案當中;
    • 密碼必須要加密;
    • 每個可使用 samba 的使用者擁有自己的家目錄之外, users 這個群組的使用者可以進入 /home/public 目錄中, 且在該目錄下 users 這個群組的所有人可具有寫入的權限喔!
    好了,開始一步步的處理吧!


  • 1. 設定 lmhosts
  • 這部分與前一小節的設定相同,請自行前往查閱喔!


  • 2. 開始設定 smb.conf 檔案
  • 在這個範例的設定檔當中,我們會新增幾個參數,新增的參數部分會用特殊字體圈起來, 引用之前參數的部分則為一般字體。請交互參考看看囉:
    [root@linux ~]# vi /etc/samba/smb.conf
    [global]
            workgroup     = vbirdhouse
            netbios name  = vbirdserver
            server string = This is vbird's samba server
            unix charset    = utf8
            display charset = utf8
            dos charset     = cp950
            log file = /var/log/samba/%m.log
            max log size = 50
            socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy = no
            template shell = /bin/false
            winbind use default domain = no
    
            # 與密碼有關的設定項目,包括密碼檔案所在與加密與否喔!
            security = user
            encrypt passwords = yes
            smb passwd file = /etc/samba/smbpasswd
    
            # 與 NetBIOS name 名稱解析有關的設定
            name resolve order = lmhosts bcast host
    
    # 新增的每個使用者家目錄及群組用戶哩!
    [homes]
            comment = Home directories
            browseable = no
            writable = yes
            valid users = %S
            create mode = 0664
            directory mode = 0775
    [public]
            comment = the user groups work directory
            path = /home/public
            public = yes
            writable = yes
            valid users = @users
    [temp]
            comment   = Temporary file space
            path      = /tmp
            read only = no
            public    = yes
    
    [global] 部分
    在新增的資料部分,主要是與密碼檔案有關啦!包括安全等級設定為使用本機的密碼驗證,亦即是『 security = user 』 那個項目,而且加上了密碼加密。至於 Samba 使用的密碼檔預設就是 /etc/samba/smbpasswd 這個, 為了增加自己的記憶,乾脆直接寫到 smb.conf 當中即可。

    至於那個『 name resolve order 』就有趣了!他說明的是『這部 Samba 主機針對 NetBIOS name 的解析方式』, 主要的解析方式有幾種:
    • lmhosts:直接以 lmhosts 這個檔案的內容來對照;
    • wins:利用一部可管理 Windows 網芳的主控電腦來紀錄,本 Samba 主機向該部主機 (wins server) 要求 NetBIOS 名稱解析結果;
    • host:透過 /etc/hosts 或者是 NIS, DNS 等方式來處理 NetBIOS name 的結果;
    • bcast:在區網中直接透過 NetBIOS 的廣播功能處理,亦即是向所有 Samba 主機介面的同一網域主機發出名稱解析的需求, 舉例來說咱們的 Samba 主機為 192.168.1.254/24 ,則以 bcast 解析 NetBIOS name 時,我們的伺服器會主動向 192.168.1.0/24 發送出解析封包的要求啊。
    我們修改了預設值,讓 Samba 僅透過 lmhosts, bcast 及 host 的方式進行主機名稱的解析啊!

    [homes] 部分
    至於新增的目錄方面,[homes] 是個比較特殊的分享名稱,他代表 Linux 主機上頭的使用者家目錄。 我們知道 [homes] 代表的是分享目錄的資源名稱, 但你總不希望使用 Samba 時找到的資源分享名稱為 //127.0.0.1/homes 吧? 所以才會有『 valid users = %S 』這個設定值,那個 %S 代表擁有可登入 Samba 的所有使用者, 且當他登入後,那個 [homes] 會變成 [帳號] , 請至前一小節的變數部分查詢相關的說明。而且使用者的家目錄是除了使用者本人外, 並不會開放給其他人瀏覽的喔 (browseable = no),另外他的 umask 為 002,因為建立新檔 (create mode) 預設權限為 0664 ,而建立新目錄 (directory mode) 則為 0775 之故。

    [public] 部分
    另一個新增的分享資源比較有趣,我們命名為 [public] ,指向的目錄為 /home/public , 有趣的地方在於使用的 valid users = @users 這個設定項目,加上 @ 之後的名稱代表著群組之意,意思是說,在 Linux 主機上面可使用 Samba 的帳號中,只要該帳號支援 users 這個群組, 那麼理論上他就能夠進入 /home/public 目錄進行存取的權限。不過能否順利的存取檔案還與 Linux 最底層的檔案權限有關。且任何人均可查閱到我們的主機有提供 [public] 這個分享資源 (public = yes 之故)。

    例題:
    在上面的這個設定檔當中有提到分享出 /home/public 這個目錄, 請問這個目錄的權限應該如何設定才是符合我們 Samba 案例的要求?
    答:
      在這個案例當中我們提到任何具有 users 群組的使用者都能夠完整的存取 /home/public , 所以這個目錄的群組應該屬於 users ,且權限至少需為 770 才行。如果 /home/public 預設不存在時, 應該要如此建立:
      [root@linux ~]# mkdir /home/public
      [root@linux ~]# chgrp users /home/public
      [root@linux ~]# chmod 770 /home/public
      
      這樣當屬於 users 群組的使用者進入到此目錄後,才能夠進行讀寫的功能。


  • 3. 設定可使用 Samba 的帳號與密碼
  • 設定使用者帳號是很重要的一環,因為設定錯誤的話,當然也就任何人都沒有辦法登入的! 在這裡我們必須先要說明一下 Linux 的檔案系統與 SAMBA 設定的使用者登入權限的相關性!
    • 在 Linux 這個系統下,任何程序都需要取得 UID 與 GID (User ID 與 Group ID) 的身份之後,才能夠擁有該身份的權限,也才能夠適當的進行存取檔案等動作!

    • 關於 Linux 這個系統的 UID 與 GID 與帳號的相對關係,一般記錄在 /etc/passwd 當中,當然也能透過 NIS, ldap 等方式來取對應;

    • SAMBA 僅只是 Linux 底下的一套軟體,使用 SAMBA 來進行 Linux 檔案系統時,還是需要以 Linux 系統下的 UID 與 GID 為準則!
    如果上面這幾點說明您沒有問題了,現在就來看一下當我們在 Windows 電腦上面以網路上的芳鄰來連接 Linux 並且進行資料的存取時,會是怎樣的一個情況呢?
      我們需要透過 SAMBA 所提供的功能來進行 Linux 的存取,而 Linux 的存取是需要取得 Linux 系統上面的 UID 與 GID 的,因此,我們登入 SAMBA 主機時,所利用 SAMBA 取得的其實是 Linux 系統裡面的相關帳號!這也就是說,在 SAMBA 上面的使用者帳號,必須要是 Linux 帳號中的一個!
    所以說,在不考慮 NIS 或 LDAP 等其他帳號的驗證方式,單純以 Linux 本機帳號 (/etc/passwd) 作為身份驗證時, 在 Samba 主機所提供可登入的帳號名稱,必須要存在於 /etc/passwd 當中! 這是一個很重要的概念!例如你要先有 dmtsai 在 /etc/passwd 當中後,才能將 dmtsai 加入 Samba 的使用者當中。這都是很基本的帳號權限概念,如果您覺得這裡閱讀方面有問題, 若不考慮鳥哥的解釋不良,表示你必須要回去讀讀基礎篇了~ ^_^

    好了,假設我的機器裡面已經有 dmtsai, nikky, tang 等三人,不過我只想要讓 dmtsai 及 nikky 使用 SAMBA 而已的話, 那麼如何將這兩個使用者加入帳號密碼管理檔案 /etc/samba/smbpasswd 當中呢?很簡單的啦!這樣做即可:
    1. 先確認密碼檔是否存在
    [root@linux ~]# ls -l /etc/samba/smbpasswd
    -rw-------  1 root root 104 Dec 25 23:13 /etc/samba/smbpasswd
    # 注意啊!要這樣的權限才可以喔!如果你的 Linux 沒有這個檔案,請自行建立。
    
    2. smbpasswd 指令功能
    [root@linux ~]# smbpasswd [-adem] username
    參數說明:
       : 如果都沒有加上任何一個參數,例如『 smbpasswd dmtsai 』時,這表示:
         修改 SAMBA 密碼檔 (/etc/samba/smbpasswd) 裡面的 dmtsai 這個帳號的密碼!
         也就是說,密碼檔裡面已經存在一個 dmtsai 的帳號了!
    -a : 在 smbpasswd 密碼檔裡面新增一個使用者
    -d : 讓在 smbpasswd 密碼檔裡面的某個帳號的使用者暫時無法使用 SAMBA
         當多了 -d 的參數時,在 smbpasswd 裡面某個欄位會多出一個 D 的參數,
         代表該帳號目前無法使用喔!
    -e : 與 -d 參數相反,讓某個帳號恢復使用!
    -m : 該 username 為機器代碼 (Machine Account),這個與 domain model 有關!
    
    2.1 開始新增使用者吧!
    [root@linux ~]# smbpasswd -a dmtsai
    New SMB password: <==在這裡輸入密碼!這個密碼不一定要與 /etc/shadow 相同
    Retype new SMB password: <==再輸入一次
    Added user dmtsai.
    
    [root@linux ~]# cat /etc/samba/smbpasswd
    dmtsai:501:1B0F61E20F8F2D11AAD3B435B51404EE:F7EDDB3F55CC5DB1FE00D7F755028491:
    [U          ]:LCT-4590969D:
    # 上面的資料為同一行的資料喔!資料為加密過的!
    
    2.2 如果要暫時拒絕一個使用者的登入,可以這樣做:
    [root@linux ~]# smbpasswd -d dmtsai
    [root@linux ~]# cat /etc/samba/smbpasswd
    dmtsai:501:1B0F61E20F8F2D11AAD3B435B51404EE:F7EDDB3F55CC5DB1FE00D7F755028491:
    [DU         ]:LCT-4590969D:
    # 就是這個 D !代表的就是暫時 disable 囉!
    [root@linux ~]# smbpasswd -e dmtsai
    
    接下來你可以透過相同的方式來新增 nikky 這個使用者的 Samba 密碼,那這兩個人就能夠使用 Samba 囉。 然後我們就能夠開始準備來重新啟動 Samba 並且測試看看囉!


  • 4. 重新啟動 Samba 並測試
  • 在經過重新啟動後,我們所進行的修訂才會生效。然後使用 smbclient 來檢查看看,是否不同身份會有不一樣的瀏覽結果呢? 趕緊看看:
    [root@linux ~]# testparm
    # 這個動作很重要!每次都要進行!確認你的語法無誤後再開始!
    
    [root@linux ~]# /etc/init.d/smb restart
    
    [root@linux ~]# smbclient -L //127.0.0.1
    Password:                   <==直接按下 [Enter] 即可。
    Anonymous login successful  <==是匿名登入喔!
    Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename   Type  Comment
        ---------   ----  -------
        public      Disk  the user groups work directory
        temp        Disk  Temporary file space
        IPC$        IPC   IPC Service (This is vbird's samba server)
        ADMIN$      IPC   IPC Service (This is vbird's samba server)
    
    [root@linux ~]# smbclient -L //127.0.0.1 -U dmtsai
    Password: <==輸入 dmtsai 在 smbpasswd 檔案中所建立的密碼喔!
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename   Type  Comment
        ---------   ----  -------
        public      Disk  the user groups work directory
        temp        Disk  Temporary file space
        IPC$        IPC   IPC Service (This is vbird's samba server)
        ADMIN$      IPC   IPC Service (This is vbird's samba server)
        dmtsai      Disk  Home directories
    
    由上表我們可以發現,經由不同的身份登入可以取得不一樣的瀏覽資料, 所以在使用上面需要特別留意喔!


  • 5. 關於權限的再說明
  • 有的時候你會發現,明明在 smb.conf 當中已經設定了 writable 可寫入,使用者登入的身份也沒有問題, 為啥就是無法寫入呢?是否是伺服器設定哪裡還有問題啊?非也非也!主要的問題常常是來自於 Linux 檔案系統的權限啦!

    舉上面的例子來說好了,我們在 smb.conf 當中設定 [public] 為可寫入,亦即 /home/public 是可寫入的。 假設 dmtsai 屬於 users 這個群組,因此以 dmtsai 登入 SAMBA 伺服器後,對於 /home/public 應該是具有可以讀寫的能力的!但是,如果你以 root 的身份建立 /home/public 卻又忘記修改權限的話, 此時 /home/public 是無法讓 users 這個群組寫入的,因此 dmtsai 這個使用者當然不具有寫入的能力。 這樣說,瞭解鳥哥想要說啥了嗎?注意注意喔! ^_^

    上面的設定案例應該蠻足以提供一般家庭用的環境中進行設定了!如果您還要擴充分享的目錄與能夠登入的使用者, 可以這樣做:
    • 利用編輯 smb.conf 來多開放其他的目錄,並且特別注意 Linux 在該目錄下的權限喔!請使用 chown 與 chmod 吧!
    • 利用 smbpasswd 來新增其他使用者到 /etc/samba/smbpasswd 裡面去,如果該帳號並沒有出現在 /etc/passwd 裡面,請先以 useradd 新增該帳號;
    • 不論進行完任何的設定,請先以 testparm 進行確認,之後以 /etc/init.d/smb restart 來重新啟動!
    事實上,SAMBA 的一般用途就是在這個連線的模式中!多使用 SAMBA 來分享您的資源吧!鳥哥都是使用 SAMBA 來做為遠端伺服器與我的工作機互通有無的重要媒介說~


    小標題的圖示設定成為印表機伺服器 (CUPS 系統)
    剛剛上面的說明大部分都是針對磁碟與目錄的分享來進行 SAMBA 的設定,那麼 SAMBA 有沒有可能分享出裝置呢?舉個例子來說,例如那個我們在辦公室都會用到的印表機呢?如果說,能夠讓我們辦公室的 File Server 同時提供印表機列印的功能,如此一來,藉由 Linux 這個作業系統可以 24 小時開機的穩定功能,我們就可以隨時進行列印囉!所以,底下我們就以 SAMBA 進行印表機列印功能的提供者的角度,來介紹這個 smb.conf 的設定喔!

    在 Linux 底下進行列印的工具很多,不過我們這裡要介紹的僅有目前較廣為流行的 CUPS (Common Unix Printing System) 這一個。 詳細的 CUPS 安裝設定方法我們已經在基礎篇的 CUPS 章節當中提過, 所以這裡我們不再詳細說明,僅介紹大致的處理流程就是了。如果你需要較早期的 LPRng 列印系統的話, 建議可以參考底下的資料喔:
    底下就來談一談一般常見的流程說明吧:


  • 1 安裝印表機與確定啟動
  • 再次說明,並不是所有的印表機都被 Linux 所支援的,所以當你想要連結一部印表機到 Linux 系統上頭時, 請務必到 http://www.linuxprinting.org/printer_list.cgi 上頭去看看是否有被支援喔! 如果沒有被支援,那就換一部印表機吧!不要進行垂死的掙扎了....

    如果你的印表機連接埠為使用 USB 或者是平行序列埠的話,那麼當你連接上印表機後, 可以利用底下的方式測試看看是否成功的連接上了:
    [root@linux ~]# echo "Hello printer" > /dev/lp0     <==平行序列埠
    [root@linux ~]# echo "Hello printer" > /dev/usb/lp0 <==USB 埠
    
    如果印表機有回應,這表示 OK 的啦!你可以進行底下的工作了。如果你的印表機為網路印表機呢? 就是說印表機有 IP 的情況下,那麼該印表機就不需要加入 Samba 啦!因為該印表機本身就可以直接提供用戶端連接, 根本不必透過 Samba 來提供網路連線的嘛!當然啦,如果你有特殊需求, 將網路印表機加入 Samba server 來提供給網芳中的其他用戶,也是可以的啦!底下直接來看看如何使用 CUPS 吧。


  • 2. 設定 CUPS 的印表機
  • 請先確認你的 CUPS 已經安裝妥當了,原則上,你必須要有底下兩個套件存在才行:
    • cups-libs
    • cups
    接下來我們可以開始設定 CUPS 了!設定的原則是這樣的:
    • 我需要讓 192.168.1.0/24 這個網域可以使用印表機
    • 我需要讓 192.168.1.0/24 及 127.0.0.0/8 可以管理 CUPS 系統
    然後開始這樣做:
    [root@linux ~]# vi /etc/cups/cupsd.conf
    # 底下這個項目在控制誰可以使用 CUPS 系統,約在 772 行左右,
    # 找到這些資料並增加一筆記錄:
    <Location />
    Order Deny,Allow
    Deny From All
    Allow From 127.0.0.1
    Allow From 192.168.1.0/24
    </Location>
    
    # 底下的項目則在設定誰可以登入 CUPS 系統的管理介面?
    # 約在 830 行左右,找到這些資料並進行一些細部修改:
    <Location /admin>
    #AuthType Basic
    #AuthClass System
    Order Deny,Allow
    Deny From All
    Allow From 127.0.0.1
    Allow From 192.168.1.0/24
    </Location>
    
    # 在最後一行的地方加上這一句
    Listen 0.0.0.0:631
    # 上面在設定一個不需要密碼即可登入的管理環境,是個很粗糙的介面,
    # 建議您自行處理一下認證問題,請參考基礎篇的說明。
    
    另外,為了要進行 Windows 相關軟體所傳來的列印資料,所以我們還需要對 CUPS 作一些額外的設定, 過程也是很簡單的:
    [root@linux ~]# vi /etc/cups/mime.convs
    # 大概在最後幾行的地方,找到這一行,將註解拿掉!
    application/octet-stream   application/vnd.cups-raw   0   -
    
    [root@linux ~]# vi /etc/cups/mime.types
    # 同樣也是在最後面幾行的地方,也是將註解拿掉即可!
    application/octet-stream
    
    設定完畢後就可以開始來啟動 cups 系統,可以這樣做:
    [root@linux ~]# /etc/init.d/cups start
    [root@linux ~]# netstat -tunlp | grep '631'
    tcp 0  0 0.0.0.0:631     0.0.0.0:*    LISTEN   18271/cupsd
    udp 0  0 0.0.0.0:631     0.0.0.0:*             18271/cupsd
    
    那個 631 的埠口就是 CUPS 所啟動的啦!然後我們可以開始設定印表機了! 由於 CUPS 支援很多不同的印表機連接埠,每種連接埠都不一樣,常見的有:
    • USB 連接埠: usb:/dev/usb/lp0
    • 平行序列埠: parallel:/dev/lp0
    • 網路印表機: ipp://ip/印表機型號
    • 網路芳鄰印表機: smb://user:password@host/printer
    假設我們的 Samba 上頭接了一部 usb 連線的印表機,而我要將這部印表機取名為 hplaser2300 時, 你可以使用瀏覽器連接到 Samba 主機上頭,必須注意到網址喔:

    CUPS 的管理介面示意圖
    圖三、CUPS 的管理介面示意圖

    如上圖三所示,先在網址列的地方務必要輸入埠口才行!然後按下箭頭『 2 』所指的地方, 亦即是『Manage Printer』之後再按下『Add printer』的按鈕,就會出現如下畫面, 記得要填寫正確的資料喔!

    CUPS 的管理介面示意圖
    圖四、CUPS 的管理介面示意圖

    然後如下圖所示,選擇正確的裝置所在處!我們假設使用的是 USB 的印表機連接埠:

    CUPS 的管理介面示意圖
    圖五、CUPS 的管理介面示意圖

    之後就是選擇正確的型號囉,假設這部印表機為 HP 所出產的:

    CUPS 的管理介面示意圖
    圖六、CUPS 的管理介面示意圖

    選擇標準的雷射印表機驅動程式吧!

    CUPS 的管理介面示意圖
    圖七、CUPS 的管理介面示意圖

    最後都成功後,就會找到如下所示的畫面了。

    CUPS 的管理介面示意圖
    圖八、CUPS 的管理介面示意圖

    到此為止我們可以假設你的 CUPS 已經有一部印表機存在了,即使該印表機目前無法工作, 但是就是有一部印表機嘛!^_^!接下來看看如何將他連結到咱們的 Samba 伺服器中吧!


  • 3. 在 smb.conf 當中加入印表機的支援
  • 然後開始告訴 Samba 將這部印表機給他分享出去吧!你需要這樣處理:
    [root@linux ~]# vi /etc/samba/smb.conf
    [global]
            .....其他省略.....
            # 這裡列出的則是印表機相關的資料啊!
            printcap name = cups
            load printers = yes
            printing      = cups
    [printers]                             <==這個分享的資源名稱一定是 printers
            comment     = All Printers
            printable   = yes              <==可以進行列印的功能
            browsable   = yes              <==可以讓其他人瀏覽
            public      = yes
            valid users = @users dmtsai    <==可使用的人員有這些
            path        = /var/spool/samba <==列印佇列的地方,暫存資料
            printer admin = dmtsai         <==這是印表機管理員!需要可使用 SAMBA 者
            .....其他省略.....
    
    基本上透過這樣的設定你的 Samba 就能夠順利的提供印表機的服務了! 不過可惜的是,Windows 用戶端依舊得要安裝印表機的驅動程式才能夠使用 Samba 所提供的印表機, 此時真是麻煩兼討厭啊~有沒有可能讓 Samba 主動的提供驅動程式給使用者,這樣一來用戶端就不需要額外去找驅動程式囉! 是可以的,透過 Samba 3.x 即可處理!

    或許你會想,印表機的型號這麼多,那麼 Linux 該如何提供這些印表機的驅動程式啊?豈不麻煩? 還好啦, CUPS 主要是透過利用 Postscript 的列印語言與印表機溝通的,因此用戶端只要取得 postscript 的驅動程式他們就能夠使用咱們的 Samba 伺服器所提供的印表機了!如此一來, 不論印表機的型號為何,只要他們能夠支援 Postscript 的列印格式,OK 搞定!而且 CUPS 官網本身就有提供 CUPS 的 Postscript 驅動程式囉!可以到底下的連結去下載:
    由於 CentOS 4.x 使用的是 1.1.x 版本,所以鳥哥下載的是 cups-samba-5.0rc3.tar.gz 這個檔案, 接下來我們要將這個檔案解壓縮,然後將相關的程式給他安裝到正確的目錄去。 不過您得要注意的是,除了這個驅動程式外,要支援 Windows 2000/xp 的用戶端, 你還得到 Windows XP 的底下目錄去下載幾個檔案:
      C:\WINDOWS\system32\spool\drivers\w32x86\3
    裡面的 PS 開頭的檔案通通下載下來,應該有四個檔案的,請將他複製成為小寫的檔案,並且放置到你 Samba 主機上的 /usr/share/cups/drivers/ 目錄下,然後將 cups-samba-5.0rc3.tar.gz 解壓縮後執行 ./cups-samba.install 檔案, 就能夠將驅動程式通通安裝到 /usr/share/cups/drivers/ 目錄下了!這就是基本的驅動程式說! 在鳥哥的這個目錄底下至少含有這幾個檔案就是了:
    [root@linux ~]# ll /usr/share/cups/drivers
    -r--r--r--  1 root root  14234 Sep 24  2002 cups5.hlp
    -r--r--r--  1 root root 280268 Jan  4  2004 cupsdrv5.dll
    -r--r--r--  1 root root 219540 Jan  4  2004 cupsui5.dll
    -rw-r--r--  1 root root 129024 Dec 27 14:18 ps5ui.dll
    -rw-r--r--  1 root root 455168 Dec 27 14:18 pscript5.dll
    -rw-r--r--  1 root root  27568 Dec 27 14:18 pscript.hlp
    -rw-r--r--  1 root root 792644 Dec 27 14:18 pscript.ntf
    
    上述的檔案鳥哥將他打包成為一個檔案了,你可以在底下的連結下載:
    不過您得注意,這個檔案內的 Windows 資料是由 Windows XP 上面捉來的,所以對於 Windows 98/ME 是沒有作用的。 您得自行上網查閱相關的資料下載方式喔。 接下來我們必須要在 smb.conf 裡面增加一筆新的分享資料,這個分享資料必須是 [print$] 名稱才行! 有點類似這樣啦:
    [root@linux ~]# vi /etc/samba/smb.conf
            .....其他省略.....
    [print$]
            comment    = Printer drivers
            path       = /etc/samba/drivers  <==存放印表機驅動程式的目錄
            browseable = yes
            read only  = yes
            write list = dmtsai              <==這個驅動程式的管理員
            .....其他省略.....
    
    [root@linux ~]# mkdir /etc/samba/drivers
    [root@linux ~]# chown dmtsai /etc/samba/drivers
    # 因為我們將印表機管理員以及驅動程式管理員的身份設定為 dmtsai 這個使用者,
    # 因此存放的目錄也要改變一下權限才行吶!
    
    [root@linux ~]# testparm                 <==測試語法
    [root@linux ~]# /etc/init.d/smb restart  <==重新啟動
    
    [root@linux ~]# smbclient -L //127.0.0.1 -U dmtsai
    Password: <==輸入密碼先
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename    Type      Comment
        ---------    ----      -------
        print$       Disk      Printer drivers
        hplaser2300  Printer   HP Laser Jet 2300 printer
    # 瞧!有看到一部印表機以及驅動程式所在的分享資料囉!
    
    現在我們的要告知 Samba 說,我們的 CUPS 可提供 Windows 2000/XP 用戶端的驅動程式, 所以用戶不需要自行設定他們的驅動程式哩!要由 cups 告知 Samba 是由 cupsaddsmb 這個指令來搞定的, 整個指令的執行很簡單的:
    [root@linux ~]# cupsaddsmb -H [SAMBA 主機名] -h [CUPS 主機名] \
    >   -a -v -U [使用者帳號]
    參數:
    -H :後續接的是 Samba 主機名,本機的話可以直接用 localhost 即可;
    -h :後續接的為 CUPS 的主機名,同樣的可使用 localhost 即可;
    -a :搜尋所有可用的印表機;
    -v :列出更多的資訊;
    -U :印表機管理員
    
    範例:利用前面的說明將印表機驅動程式掛上 SAMBA
    [root@linux ~]# cupsaddsmb -H localhost -U dmtsai -a -v
    Password for dmtsai required to access localhost via SAMBA: <==輸入 dmtsai 密碼
    # 這裡會閃過很多的訊息,說明已經安裝了某些資訊,底下鳥哥僅列出簡單的訊息而已。
    putting file /usr/share/cups/drivers/pscript5.dll as 
    \W32X86/pscript5.dll (1438.5 kb/s) (average 1342.5 kb/s)
    
    Printer Driver hplaser2300 successfully installed.
    
    Succesfully set hplaser2300 to driver hplaser2300.
    
    [root@linux ~]# ll /etc/samba/drivers
    drwxr-xr-x  3 dmtsai dmtsai 4096 Dec 27 14:40 W32X86
    
    最後在驅動程式的存放目錄會多出一個 W32X86 的目錄,你可以查詢一下該目錄的內容, 那就是預計要給用戶端使用的驅動程式啦!這樣就搞定了!不過,為了將所有的資料通通驅動, 建議您將 CUPS 及 SAMBA 通通重新啟動吧!
    [root@linux ~]# /etc/init.d/cups restart
    [root@linux ~]# /etc/init.d/smb restart
    

  • 4. 一些問題的克服:
  • 如果一切順利的話,你在 Windows 用戶端應該可以順利的連接到印表機囉! 開心吧!不過,如果你曾經印錯資料,那麼該如何進入 Linux 的 Samba 主機將該資料移除呢? 你最好知道底下的幾個指令,關於這些指令的進階用法則請自行給他 man man 看了:
    [root@linux ~]# lpstat -a
    hplaser2300 accepting requests since Jan 01 00:00
    # 列出所有可用的印表機狀態
    
    [root@linux ~]# lpq
    hplaser2300 is ready
    no entries
    # 列出印表機的工作,若有列印工作存在時,會如下所示:
    hplaser2300 is ready and printing
    Rank    Owner   Job  File(s)                 Total Size
    active  dmtsai   5   smbprn.00000003 測試頁  42954752 bytes
    
    [root@linux ~]# lprm all
    # 移除所有等待中的列印工作!
    
    列印工作就是這樣進行的啦!趕緊試看看吧!


    小標題的圖示安全性管理
    使用 SAMBA 其實是有一定程度的危險性的,這是因為很多網路攻擊的蠕蟲就是透過 NetBIOS 來攻擊的! 因此,在架設好了 SAMBA 之後,請記得將權限方面的工作做好!權限方面的工作除了 smb.conf 內的設定外, Linux 檔案系統的 r, w, x 權限也是相當重要的喔!我們底下就簡單的介紹一下一些基本的安全性管理吧!


  • 利用 iptables 來管理
  • 最簡單的管理登入 SAMBA 的方法就是透過 iptables 啦!詳細的說明我們已經在 防火牆章節當中提過了,所以這裡不在詳加說明。 要知道的是,如果你僅要針對底下的範圍開放 Samba 時,可以這樣想:
    • 僅針對 192.168.1.0/24 這個網域開放 SAMBA;
    • SAMBA 的 port 有 137~139 tcp/udp;
    • SAMBA 主機的網路卡為 eth0
    所以 iptables.rule 規則當中應該要加入這幾項:
    iptables -A INPUT -p tcp -i eth0 -s 192.168.1.0/24 --dport 139     -j ACCEPT
    iptables -A INPUT -p udp -i eth0 -s 192.168.1.0/24 --dport 137:138 -j ACCEPT
    
    當然啦!這是很簡單很簡單的防火牆規則,您必須要依據您的環境自行修改 (通常修改那個 192.168.1.0/24 網段即可!) 。除了 iptables 必須要開放之外,您還需要將管制 daemon 是否能夠進出的 TCP Wrappers 開放才行吶!如果萬一您看到 /etc/hosts.deny 裡面多了這一行:
    [root@linux ~]# cat /etc/hosts.deny
    ALL : ALL
    
    不要懷疑,很可能會造成不只 SAMBA 不能動作而已~連其他的 daemon 都可能會無法動作呢!所以,請將這一行拿掉吧! 或者是將適合的 daemon 開放在 /etc/hosts.allow 檔案裡面喔!


  • smb.conf 的設定值
  • 事實上 Samba 已經有許多防火牆機制啦!那就是 hosts allow 及 hosts deny 這兩個參數。 通常我們只要使用 hosts allow 即可,那麼沒有寫入這個設定項目的其他來源就會被拒絕連線的! 舉例來說,如果你只想要讓本機、192.168.1.11, 192.168.1.21 使用 SAMBA 而已,那麼可以這樣寫:
    [root@linux ~]# vi /etc/samba/smb.conf
    [global]
            # 跟安全有關
            hosts allow = 127. 192.168.1.11 192.168.1.21
    	smb ports = 139
    
    如此一來不但只有數部主機可以登入我們的 SAMBA 伺服器,而且 Samba 只能以標準的 port 139 來連結, 關閉 Windows 常用且有點問題的 port 445 呢!這樣會比較好一些啦! 未來如果還有人想要連結你的 Samba 時,將他加入 hosts allow 後面即可! 不難吧! ^_^


  • 利用 Quota 限制使用者空間使用
  • quota 是磁碟配額限制的一個 daemon ,您可以依據不同的使用者來加以限制他們能夠使用的硬碟空間, 前提是『該磁碟空間必須是一個獨立的 partition 』才行,不建議針對根目錄 『 / 』進行 quota !這也是為什麼我們在主機規劃時特別建議大家獨立出一個 partition 來進行硬碟規劃的原因!關於 quota 的詳細用法在『 鳥哥的 Linux 私房菜--基礎學習篇』裡面已經談得很清楚了, 這裡我們不再詳談!只給大家來做個練習就是了!

    例題:
    在規劃主機的時候,我將 /dev/hda2 獨立一個 partition 給 /home 這個目錄,現在想要規劃 quota 針對 dmtsai 這個使用者進行磁碟配額的限制,他的 hardlimit 為 50mb 而 softlimit 為 40mb ,請問整個動作應該如何進行?
    答:
    1. 編輯修改 /etc/fstab ,使得 /dev/hda2 這個 partition 成為如下模樣:
      /dev/hda2 /home  ext3  defaults,usrquota,grpquota 1 1
      修改完畢之後,請千萬記得使用 mount -a 查詢看看有沒有設定錯誤 (上面總共只有六個欄位喔!), 這個動作如果發生錯誤,那麼請記得再次的進行 /etc/fstab 的修改!請特別留意啊!因為寫錯的話, 很容易造成無法正常開機的窘境!

    2. 上述動作確定沒有問題之後,請重新開機啟動 quota 的支援:
      sync; sync; sync; reboot
    3. 執行底下的指令,建立 quota 所需要的設定檔案:
      quotacheck -avug
      特別注意,如果上述的動作發生『找不到設定檔』的意思的訊息時,您可以這樣做:
      touch /home/aquota.user; touch /home/aquota.group
      然後再進行一次 quotacheck 即可!

    4. 啟動 quota 囉:
      quotaon -av
    5. 設定 bird 的磁碟配額:
      edquota -u dmtsai
      Disk quotas for user dmtsai (uid 501):
      Filesystem   blocks    soft  hard inodes  soft  hard 
      /dev/hdb2        32  40000  50000     8     0     0
      因為我們只針對硬碟空間,不針對 inode 做限制,所以只要前面的數字修訂即可!請注意,數字的單位為 kbytes !


  • 關於備份
  • 跟 SAMBA 最有關的當然就是使用者的資訊囉!所以,您應該要備份的就是使用者的資料,以及 Samba 相關的設定資料了!比較相關的有幾個咚咚:
    • /etc (因為含有 /etc/passwd 以及 /etc/samba 裡面的資料,所以建議可以全部給他備份下來 )
    • /home (還是可以察看一下,是否有其他非必要的!不過,一般來說,都會是備份的個人資料比較多啦!)
    • 其他由 smb.conf 裡面設定開放的目錄。
    無論如何,備份還是挺重要的!

    小標題的圖示主機安裝時的規劃與中文磁區掛載
    現在您知道 Samba 伺服器的功能是用來作為檔案伺服器的,每個使用者都可以擁有家目錄, 並透過網芳的功能來連結到 Samba 伺服器中。這就有個問題啦,那就是你的使用者如果太多, 並且將他們的重要資料都放到這部 Samba 主機上頭的話,那肯定 /home 未來會有點不足啊! 所以 /home 所在的磁碟或許可以使用大一點的硬碟,或者使用磁碟陣列,使用 LVM 也是個不錯的方案。 底下為簡單的思考方向:
    • 在安裝 Linux 的時候,建議不需要安裝 X Window ;
    • 在規劃 Linux 時,/home 最好獨立出一個 partition ,而且硬碟空間最好能夠大一些;
    • /home 獨立出來的 partition 可以單獨進行 quota 的作業,以規範每個使用者能夠使用的最大硬碟容量;
    • 由於 SAMBA 可以做為印表機伺服器,所以建議印表機可以直接連接在 Linux 主機的列印埠 (LPT1, USB...);
    • 由於 SAMBA 一般來說都僅針對內部 (LAN) 主機進行開放,所以,可能的話 SAMBA 主機直接使用內部保留 IP 來設定即可,當然啦, SAMBA 是否使用 private IP 還得視您的整個網域的 IP 網段的特性來規劃。 以鳥哥研究室來說,因為實驗室所有電腦的 IP 都是 Public IP,那麼 SAMBA 如果使用 Private IP ,當然大家都無法連接上啊! ^_^
    • 如果您的 SAMBA 主機使用 Public IP 時,請特別留意規範好防火牆的設定,盡量僅讓 LAN 內的電腦可以連線進來即可,不要對 Internet 開放喔!
    另外,如果你的 Samba 伺服器需要掛載含有中文的 partition 時,譬如說你將原本 Windows XP 的 FAT32 檔案系統挪到 Linux 系統下,此時如果用一般模式來掛載該分割槽時,一些中文檔名可能會無法被順利的列印出來。 這個時候你就得需要這樣做了:
    mount -t vfat -o iocharset=big5,codepage=950 /dev/hd[a-d][1-16] /mount/point
    
    其中 iocharset 指的是本機的語系編碼方式, codepage 則與遠端軟體有關。因為我們是在本機進行掛載, 所以實際上使用 iocharset 這個參數即可啦!更多說明則請看下節的用戶端設定部分囉!

    大標題的圖示Samba 用戶端軟體功能
    現在你已經架設好了 Samba 伺服器啦!有伺服器當然要有用戶端來使用才是好的伺服器嘛!不然要這個伺服器幹嘛? 而我們假設區域網路內有 Windows/Linux 系統,這兩種系統都是透過 NetBIOS over TCP/IP 來連上 Samba 主機的, 在設定之前你必須要知道的有幾件事:
    • 在區網內的主機最好具有相同的工作群組,且具有不同的主機名稱;
    • Windows XP pro. 最多僅能允許十個用戶同時連接到網芳;
    • 你可以在網芳當中看到的通常是相同群組的主機;
    • 可以使用『搜尋』-->『電腦』-->『輸入 IP』來查到 Samba 主機;
    • Windows 的網芳預設僅有同一網域的主機才能登入!
    接下來咱們就分別依照 Windows XP 及 Linux 系統來做說明吧!


    小標題的圖示Windows 系統的使用
    在 Windows 上面的搜尋實在挺簡單的,你有好幾種方法可以處理:
    • 打開『檔案總管』,『網路上的芳鄰』、『整個網路』、『Microsoft Windows Network』 就能看到屬於您群組的所有電腦主機了!

    • 『開始』、『搜尋』、『檔案或資料夾』、『電腦或人員』、『網路上的電腦』, 然後在出現的方框當中填寫正確的 IP ,按下『搜尋』即可! 這個方法可以適用於不在同一個群組當中的網路主機喔!
    舉例來說,如果想要連接到我們的 Samba 主機的話,而又不知到這部 Samba 主機的 NetBIOS name , 那利用搜尋的結果會有點類似如下的圖示:

    Windows XP 用戶端搜尋示意圖
    圖九、Windows XP 用戶端搜尋示意圖

    上圖九中先在左側的地方輸入正確的 IP 後,按下搜尋,如果一切順利的話那麼右上方就會出現這部 Samba 主機的說明了。 雙擊一下該主機名稱,就會出現右下方的項目!瞧!那就是我們所設定的幾個基本項目的啦!真是好高興! 然後你就可以開始進入相對應的目錄進行資料的存取了,就這麼簡單。 如果是印表機的話,那麼你將滑鼠移動到印表機的上方,按下右鍵後可以選擇『連線』的項目, 如下所示:

    Windows XP 用戶端連線印表機示意圖
    圖十、Windows XP 用戶端連線印表機示意圖

    如果一切順利的話,嘿嘿!你就可以在點選『開始』、『設定』、『印表機和傳真』後所出現的視窗看到這部印表機囉! 真是好棒吶! ^_^


  • 讓 Windows 系統的網芳支援不同網域的 IP 連線
  • 由於 Windows XP sp2 這個作業系統版本預設的防火牆僅開放相同網域的 IP 來源使用本機的網芳資料, 所以如果是不同的網域想要使用時,預設是無法穿透 Windows 防火牆的。此時你可以修改一下防火牆的設定啊! 請叫出控制台,然後點選『Windows 防火牆』就會出現如下的圖示了:

    Windows XP 伺服器防火牆示意圖
    圖十一、Windows XP 伺服器防火牆示意圖

    按照上圖的說明,依序點選『例外』、『檔案及印表機共用』、『編輯』後, 就會出現該防火牆機制所管理的埠口以及可連線的網域,如下圖所示:

    Windows XP 伺服器防火牆示意圖
    圖十二、Windows XP 伺服器防火牆示意圖

    你可以將四組埠口通通改變成你所需要的 IP 來源,或者是將他設定為任何電腦都能連線。 不過,鳥哥不建議喔!可以參考底下的作法:

    Windows XP 伺服器防火牆示意圖
    圖十三、Windows XP 伺服器防火牆示意圖

    選擇自訂的方式來設定能夠使用你 Windows 網芳資料的來源 IP 或網段即可,然後確定之後即可處理吶! 這樣一來,及時我們的 Linux 不與 Windows 同在一個網域中,也能夠登入 Windows 存取網芳資料哩。


  • 透過 port 445 的特殊登入方式
  • 如果你知道 Samba 主機有分享出 port 445 ,並且他已經分享了某個目錄時,舉例來說, 我們的 192.168.1.254 有分享出 public 這個分享資源名稱時,那麼這個目錄的完整寫法為:『 \\192.168.1.254\public 』,我們可以透過『開始』、『執行』來處理這個玩意兒! 如下所示:

    Windows XP 透過 port 445 連線
    圖十四、Windows XP 透過 port 445 連線

    如果可以登入的話就會順利登入,否則就會彈出一個要你輸入帳號密碼的視窗,輸入正確的資料即可! 呼呼!真過癮~除此之外,我們還可以登入別人 Windows 主機的 C 或 D 槽喔!寫法則變成這樣:
      \\192.168.1.21\c$
    所以說,怕了吧!俺還真害怕~所以啊,Samba 沒必要時,那個 port 445 應該是可以關閉的吧!

    小標題的圖示Linux 系統的使用
    咱們的 Samba 有提供 Linux 網芳的用戶端功能喔!也就是說 Linux 可以掛載 Samba 主機也能掛載 Windows 提供的網芳啦! 主要是透過 smbclient 來觀察,再以 smbmount 或 mount 來掛載磁區哩。先來介紹一下 smbclient 這個指令吧:
    1. 關於查詢的功能
    [root@linux ~]# smbclient -L //[IP|hostname] [-U username]
    [root@linux ~]# smbclient -L //127.0.0.1 -U dmtsai
    Password:
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    ....分享的資源輸出省略....
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Server           Comment
        ---------        -------
    
        Workgroup        Master
        ---------        -------
        VBIRDGRP         VBIRD_OP_2
        VBIRDHOUSE       VBIRDSERVER
    # 從這裡可以知道在目前網域當中有多少個工作群組與主要的名稱解析主機
    
    除了這個先前用過的查詢功能之外,我們可以這樣簡易使用網芳的:
    2. 利用類似 FTP 的方式登入遠端主機
    [root@linux ~]# smbclient '//[IP|hostname]/資源名稱' [-U username]
    # 意思是使用某個帳號來直接登入某部主機的某個分享資源,舉例如下:
    [root@linux ~]# smbclient '//127.0.0.1/dmtsai' -U dmtsai
    Password:
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    smb: \> dir
    # 在 smb 底下其實就是在 //127.0.0.1/dmtsai 這個目錄底下啦!所以,
    # 我們可以使用 dir, get, put 等常用的 ftp 指令來進行資料傳輸了!
    ?   :列出所有可以用的指令,常用!
    cd  :變換到遠端主機的目錄
    del :殺掉某個檔案
    lcd :變換本機端的目錄
    ls  :察看目前所在目錄的檔案
    dir :與 ls 相同
    get :下載單一檔案
    mget:下載大量檔案
    mput:上傳大量檔案
    put :上傳單一檔案
    rm  :刪除檔案
    # 其他的指令用法請參考 man smbclient 喔!
    
    事實上,使用 smbclient 一點也不方便,因為使用的是 ftp 的功能語法,有點怪怪的~能不能像 Windows 那樣,可以直接連線網路磁碟機啊?這當然沒有問題!不過就需要藉由 smbmount 來協助了!smbmount 可以將遠端主機分享出來的目錄整個給他 mount 到本機的 mount point (某個目錄),如此一來, 遠端主機的目錄就好像在我們本機的一個 partition 一樣喔!可以直接執行複製、編輯等動作!這可就好用的多了! 底下我們來談一談怎麼用這個 smbmount 吧!
    [root@linux ~]# smbmount //IP/分享資源 /掛載點 [-o options]
    參數:
    -o 後面接的參數 (options) 常用的有底下這些:
       username=你的登入帳號:例如 username=dmtsai
       password=你的登入密碼:需要與上面 username 相對應啊!
       iocharset=本機的語系編碼方式,如 big5 或 utf8 等等;
       codepage=遠端主機的語系編碼方式,例如繁體中文為cp950
    
    範例一:以 dmtsai 的身份將其家目錄掛載至 /mnt/samba 中
    [root@linux ~]# smbmount //127.0.0.1/dmtsai /mnt/samba
    > -o username=dmtsai,password=pw_test,codepage=cp950
    [root@linux ~]# df
    //127.0.0.1/dmtsai  20161024  3088896  17072128  16% /mnt/samba
    
    經由 smbmount 的動作,我們就可以輕易的將遠端分享出來的咚咚給他掛載到自己 Linux 本機上面!好用的很~事實上,原本 mount 這個指令如果有支援 smbfs 的話, 那也就可以直接掛載網路上的芳鄰分享出來的目錄了!例如上面的例子當中,我們也可以這樣下達指令:
    mount -t smbfs //127.0.0.1/dmtsai /mnt/samba \
    -o username=dmtsai,password=pw_test,codepage=cp950,iocharset=big5
    
    更詳細的 mount 用法,請 man mount 或者看考『鳥哥的 Linux 私房菜 -- 基礎學習篇』的內容喔! ^_^


  • 查詢 NetBIOS name 與 IP 及其他相關資訊:
  • 現在我們可以透過一些 NetBIOS 相關的功能來取得 NetBIOS name ,不過,如果你還想要知道這個 NetBIOS name 的其他資訊時, 例如 IP、分享的資源等等,那可以使用 nmblookup 這個指令來搞定即可。他是這麼使用的:
    [root@linux ~]# nmblookup [-S] [-U wins IP] [-A IP] name
    參數:
    -S :除了查詢 name 的 IP 之外,亦會找出該主機的分享資源與 MAC 等;
    -U :後面一般可接 Windows 的主要名稱管理伺服器的 IP ,可與 -R 互用;
    -R :與 -U 互用,以 Wins 伺服器來查詢某個 Netbios name;
    -A :相對於其他的參數, -A 後面可接 IP ,藉 IP 來找出相對的 NetBIOS 資料;
    
    範例一:藉由本機找出 vbirdserver 這部主機的 IP 位址
    [root@linux ~]# nmblookup -U localhost vbirdserver
    querying vbirdserver on 127.0.0.1
    192.168.1.254 vbirdserver<00>
    
    範例二:找出 vbirdserver 的 MAC 與 IP 等資訊:
    [root@linux ~]# nmblookup -S vbirdserver
    querying vbirdserver on 192.168.1.255
    192.168.1.254 vbirdserver<00>
    Looking up status of 192.168.1.254
            VBIRDSERVER     <00> -         B <ACTIVE>
            ..__MSBROWSE__. <01> - <GROUP> B <ACTIVE>
            VBIRDHOUSE      <1e> - <GROUP> B <ACTIVE>
    
            MAC Address = 00-00-00-00-00-00 <==因為是本機資料,所以 MAC 會成為這樣
    

  • 利用 smbstatus 觀察 SAMBA 的狀態
  • 如果想要查閱目前 SAMBA 有多人人來連線且哪些資源分享已經被使用的話,可以這樣看:
    [root@linux ~]# smbstatus [-pS] [-u username]
    參數:
    -p :列出已經使用 SAMBA 連線的程序 PID ;
    -S :列出已經被使用的資源分享狀態;
    -u :只列出某個使用者相關的分享資料
    
    範例一:列出目前主機完整的 Samba 狀態
    [root@linux ~]# smbstatus
    Samba version 3.0.10-1.4E.9
    PID     Username      Group         Machine
    -------------------------------------------------------------------
     4973   dmtsai        dmtsai        127.0.0.1    (127.0.0.1)
    # 上面列出的是與 PID 有關的資訊,可用 smbstatus -p 單純列出
    
    Service      pid     machine       Connected at
    -------------------------------------------------------
    dmtsai        4973   127.0.0.1     Thu Dec 28 10:58:36 2006
    # 上面列出的則是分享資源,那個 Service 就是分享的目錄。
    
    你可以透過這個小程式來瞭解到目前有多少人使用你的 SAMBA 的啦!

    大標題的圖示伺服器進階管理
    除了前面提到的幾個資訊之外,在這裡我們也來談談如何讓你的 Samba 作更多的事情! 包括將 Windows 使用者的家目錄放到 Samba 上頭呢!^_^


    小標題的圖示讓 Samba 管理網域使用者:PDC
    前面介紹的內容都是屬於 Peer/Peer 的連線狀況,也就是 Samba 伺服器與 Windows 用戶端其實是平等地位的啦! 所以 Windows 用戶端需要知道 Samba 伺服器內的帳號密碼資料後,才能夠順利的使用 Samba 的資源。 不過,這樣的方式在較大型一些的區域網路環境可能就會有點困擾,例如學校的環境。

    舉例來說,如果你有一個電腦教室裡面有 50 部 Windows XP Pro. 的個人電腦,由於電腦教室大家都會使用, 因此裡面這 50 部個人電腦有使用還原精靈,也就是每次電腦重新開機後整個作業系統就會還原成原本的樣子。 但我們知道使用者總是需要有個人家目錄吧?他們總不希望這次的工作在重新開機後就失去了~ 所以我們可以利用一部主機來讓他們儲存資料啊!那就是 Primary Domain Controller (PDC) 主機囉。

    其實 Samba PDC 的作用很簡單,就是讓 Samba PDC 成為整個區域網路的領域管理員 (domain controller), 然後讓 Windows 主機加入這個領域,未來使用者利用 Windows 登入時,Windows 會前往 PDC 伺服器取得使用者的帳號密碼, 同時 PDC 還會傳送使用者的重要資料到那部 Windows 個人電腦上,而 Windows 電腦上的使用者登出時, 該使用者修改過的資料也會回傳給 PDC ,如此一來不管這個使用者在哪一部個人電腦上面登入, 他都能夠取得正確的個人資料!很棒的作用吧!

    PDC 是個很複雜的環境,他可以達到的功能相當的多,而且密碼的驗證也不必在同一部 PDC 主機上面, 不過這裡我們不談那麼複雜的東西,只是做一個簡單的練習,因此底下的這部 PDC 使用自己的密碼來進行驗證, 並且也管理自己所分享出去的資源囉!整個基本的設定流程應該是這樣的:
    • 設定好 PDC 主機的 TCP/IP 與 Windows 主機的網路,這個你應該已知如何處理了;
    • 設定 PDC 的角色定位,因為 PDC 管理自己的密碼,所以 security = user
    • PDC 最好擁有整個網域的名稱解析權力,亦即成為主要的名稱解析器;
    • 需有 netlogon 資源分享,提供 windows 2000/XP pro. 用戶端的登入之用;
    • 由於 Windows 需讀入個人設定檔,預設目錄為 profile,Linux 系統需預先設定此目錄;
    • 增加 PDC 上的使用者帳號以及機器代碼 (machine account) 等等
    • 在 Windows 2000/XP pro. 個人電腦上設定成為 PDC 的用戶端。
    底下咱們就來依序處理處理先!


  • 0. 設定 lmhosts 或 /etc/hosts 對應 Netbios 與 IP
  • 由於我們的 Samba 即將成為整個網域的名稱解析者,因此你最好將整個網域的 NetBIOS name 與 IP 的對應寫入此這個檔案當中。當然啦,如果你的網域 IP 的取得為 DHCP ,那這個檔案就不要寫了吧! 以我們這個案例為例,這個檔案的內容應該是:
    [root@linux ~]# vi /etc/samba/lmhosts
    127.0.0.1       localhost
    192.168.1.254   vbirdserver
    192.168.1.21    vbirdcpu2
    192.168.1.11    vbirdcpu1
    

  • 1. 設定 smb.conf 成為具有 PDC 的能力
  • 假設我們要讓 PDC 用戶端登入時可以取得他自己的家目錄,那麼需要這樣處理:
    [root@linux ~]# vi /etc/samba/smb.conf
    [global]
            workgroup         = vbirdhouse
            netbios name      = vbirdserver
            server string     = This is vbird's samba server
            unix charset      = utf8
            display charset   = utf8
            dos charset       = cp950
            log file          = /var/log/samba/%m.log
            max log size      = 50
            socket options    = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy         = no
            template shell    = /bin/false
            winbind use default domain = no
            security          = user
            encrypt passwords = yes
            smb passwd file   = /etc/samba/smbpasswd
            printcap name     = cups
            load printers     = yes
            printing          = cups
    
            # 與 PDC 有關的一些設定值:
            # 底下幾個設定值處理成為本區域網路內的主要名稱解析器
            preferred master = yes
            domain master    = yes
            local master     = yes
            wins support     = yes
            # 作業系統 (OS) 等級越高才能成為主網域的控制者,一般 NT 為 32,
            # Windows 2000 為 64 ,所以這裡我們設定高一點,但不可超過 255
            os level = 200
            # 底下則是設定能否利用 PDC 登入,且登入需要進行哪些動作:
            domain logons = yes
            logon drive   = K:          <==登入後家目錄掛載成 Windows 哪一槽
            logon script  = startup.bat <==每個使用者登入後會自動執行的程式
            time server   = yes         <==自動調整 Windows 時間與 Samba 同步
            admin users   = root        <==預設的管理員帳號!預設為 root 
    # 因為鳥哥不喜歡在 Samba 當中使用 root ,所以這裡你也可以指定成其他帳號。
    
    # 這個在指定登入者能夠進行的工作,裡面主要是具有許多執行程式:
    [netlogon]  <==與前面的 logon script 有關,該程式放置在這裡
       comment         = Network Logon Service
       path            = /home/samba/netlogon  <==你要自己主動建立此目錄
       writable        = no
       write list      = root
       follow symlinks = yes
       guest ok        = yes
    
    [homes]
            comment = Home directories
            browseable = no
            writable = yes
            valid users = %S
            create mode = 0664
            directory mode = 0775
    [temp]
            comment   = Temporary file space
            path      = /tmp
            read only = no
            public    = yes
    
    [root@linux ~]# testparm
    [root@linux ~]# /etc/init.d/smb restart
    
    上面的設定有幾個地方比較有趣一點:
    • time server:要使 Samba 與 Windows 主機的時間同步,使用這個項目;
    • logon script:當使用者以 Windows 用戶端登入後,Samba 可以提供一支批次檔, 讓使用者去設定好他們自己的目錄配置。整個配置的內容記錄在 startup.bat 當中。 你要注意的是,這個 startup.bat 檔名可以隨意更改,不過他必須要放置到 [netlogon] 所指定的目錄內;
    • logon drive:那麼這個家目錄要掛載到那個分割槽? 在 Windows 底下大多以 C, D, E... 做為磁碟的代號,你這裡可以指定一下家目錄要放置成為那個磁碟代號;
    • admin users:指定這個 Samba PDC 的管理員身份。
    • [netlogon]:指定利用網路登入時首先去查詢的目錄資源。

  • 2. 建立所需要的目錄與檔案
  • 先來建立 [netlogon] 內所需要的資料好了,那就是一個目錄:
    [root@linux ~]# mkdir -p /home/samba/netlogon
    
    接下來我們還得要建立允許使用者執行的檔案,就是那個 startup.bat 才行! 注意一下,我們這裡假設使用者家目錄為 K 槽,而 Samba 額外分享的 temp 則為 L 槽, 那你可以這樣做:
    [root@linux ~]# vi /home/samba/netlogon/startup.bat
    net time \\vbirdserver /set /yes
    net use K: /home
    net use L: \\vbirdserver\temp
    # 這個檔案的格式為:net use [device:] [directory]
    
    # 再將該檔案轉成 DOS 的斷行格式才行!因為是提供給 Windows  系統嘛!
    [root@linux ~]# unix2dos /home/samba/netlogon/startup.bat
    [root@linux ~]# cat -A /home/samba/netlogon/startup.bat
    net time \\vbirdserver /set /yes^M$
    net use K: /home^M$
    net use L: \\vbirdserver\temp^M$
    # 瞧見嗎?會多出個奇怪的 ^M 符號,那就是 Windows 斷行字元。
    

  • 3. 建立使用者
  • 在 Samba 裡面建立使用者就是利用 smbpasswd 這個指令而已,我們已經建立過,所以這裡不再說明。 但是由於我們需要 root 這個帳號來管理 PDC 與 Windows 用戶端之間連線建立時所需要的權限, 所以你必須要建立起這個使用者才行。建立的方法很簡單,直接這樣做吧:
    [root@linux ~]# smbpasswd -a root
    
    另外,我們都知道 Windows XP pro. 的使用者設定檔會被放置到『 C:\Documents and Settings\使用者帳號 』目錄中, 在該目錄底下會有類似桌面、我的最愛、應用程式設定、啟動、我的文件夾啊等等的, 這些東西會放置到 Samba PDC 的哪裡去備份啊?其實是放置到:
      /home/使用者帳號/profile/
    目錄下的,該目錄預設會被主動的建立起來,不過偶而會有一些權限錯誤的問題~傷腦筋~ 所以你可以預先處理該目錄,以 chmod 或 chown 來改變成該使用者可以存取的權限。 另外,為了避免困擾,對於新增的使用者而言,你可以這樣做:
    [root@linux ~]# mkdir /etc/skel/profile
    
    那以後新增的使用者都有可以存放來自 Windows 的特殊設定檔目錄喔!比較好管理囉~ 當然啦,使用 useradd 新增使用者後,記得也要使用 smbpasswd -a username 來讓該使用者可以使用 Samba 喔!


  • 4. 建立機器碼帳號
  • 由於 PDC 會針對 Windows 用戶端的主機名稱 (NetBIOS name) 進行主機帳號檢查, 所以我們也要為用戶端的主機名稱進行帳號的設定。咦!啥是主機帳號? 一般使用者帳號是英文或數字,主機帳號則在該帳號最後面加上一個錢字號『$』即可! 舉例來說, vbirdcpu2 這部主機可設定的帳號名稱為 vbirdcpu2$。

    而我們知道要使用 smbpasswd 增加的使用者必須要在 /etc/passwd 當中, 因此要建立這個帳號你就得要這樣做:
    [root@linux ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdcpu2$
    [root@linux ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdcpu1$
    
    會增加 -M -s -d 等參數的原因是因為不想要讓這個帳號具有可以登入的權限, 因此將這個主機帳號設定的比較怪一點~ ^_^~接下來讓 Samba 知道這個帳號是主機帳號, 所以你應該要這樣做:
    [root@linux ~]# smbpasswd -a -m vbirdcpu1$
    [root@linux ~]# smbpasswd -a -m vbirdcpu2$
    
    這樣便加入主機帳號囉!而我們的 Samba PDC 也就可以透過『主機帳號』來判斷 Windows 用戶端能否連上來, 若連接上 PDC 與 Windows 用戶端後,接下來一般使用者帳號就可以在 windows 用戶端登入了!


  • 5. Windows XP Pro. 用戶端的連線與登入
  • 請注意,底下的方法僅是用於 Windows 2000, Windows XP 專業版 (Pro.),一般的 Windows XP home 版本是不支援的! 如果你用戶端的主機是隨機版的 Windows XP ,通常是 Windows XP home ,那底下的方法可能就無法適用囉! 要連接上 Samba PDC 的過程也是挺簡單的,你可以這樣做:
    1. 確認 windows 用戶端的網域與主機名稱

      首先我們必須要確認 Windows 用戶端的工作群組與主機名稱跟咱們的 Samba PDC 相同, 確認的方式在區域網路裡面已經提過了,這裡在強調一次。將滑鼠移動到『我的電腦』上面,按下右鍵, 選擇『內容』,然後點選『電腦名稱』,會出現如下圖示:

      Windows 用戶端連上 PDC 的方式
      圖十五、Windows 用戶端連上 PDC 的方式

      如上圖所示,你要先確認箭頭 1 處指的主機名稱與工作群組,在我們這個案例當中的工作群組為 vbirdhouse, 這部 Windows 主機的 NetBIOS 名稱則為 vbirdcpu2 喔!如果不對的話,請按下『變更』來設定, 並且重新開機。重新開機完畢後再到圖十五的畫面當中,按下箭頭 2 所指的網路識別處。

    2. 設定主機名稱與網域名稱

      接下來我們要設定這部 Windows XP pro. 要連結到區域網路上的哪部 PDC 上面, 亦即是處理主機帳號以及 Samba PDC 負責的網域 (domain) 啦! 在圖十五按下『網路識別』後,分別在出現的視窗當中選擇:

      1. 下一步;
      2. 這台電腦是公司網路的一部份,而且我在工作時用來連線到其他電腦(T)
      3. 我的公司使用一或多個網域的網路(C)
      4. 下一步


      然後就會出現如下的視窗:

      Windows 用戶端連上 PDC 的方式
      圖十六、Windows 用戶端連上 PDC 的方式

      請依序填寫 Samba 主機上面的管理員帳號與密碼,要注意這個密碼是記錄於 /etc/samba/smbpasswd 中的那個,可不是 /etc/shadow 喔!別搞混了~這是 Samba 主機的設定呢。 輸入之後按下一步吧,通常都會出現找不到正確主機的畫面,如下所示:

      Windows 用戶端連上 PDC 的方式
      圖十七、Windows 用戶端連上 PDC 的方式

      鳥哥也覺得很奇怪,老是告訴我找不到!不過沒有關係,這裡我們依舊再填一次主機的 NetBIOS name 以及群組名稱, 如上圖所示,然後繼續按下一步,就會出現如下的畫面啦:

      Windows 用戶端連上 PDC 的方式
      圖十八、Windows 用戶端連上 PDC 的方式

      這次就給他輸入正確的管理員帳號與密碼,記得最後面的網域就是工作群組名稱,別寫錯了。 處理完畢後給他按下確定吧!然後就會出現如下畫面:

      Windows 用戶端連上 PDC 的方式
      圖十九、Windows 用戶端連上 PDC 的方式

      恭喜您,這就表示已經連接上 Samba PDC 囉!我們希望所有的使用者都直接由 Samba PDC 控管,所以這裡請填寫 『此時不新增使用者』吧!按下一步去。

    3. 如果發生錯誤情況

      如果老是發生錯誤訊息為『使用的帳戶是電腦帳戶。請使用您的通用使用者帳戶或本機使用者帳戶來存取這台伺服器』時, 你可以這樣做的:

      • 先察看一下 /var/log/samba 裡面的登錄檔資訊,尤其是 vbirdcpu2.log 關於這部主機的資訊吶;
      • 如果還是無法解決,可以在 lmhosts 裡面增加 vbirdcpu2 的 IP 與主機名稱的對應,然後將 samba 整個關掉『/etc/init.d/smb stop』,等待一段時間讓 NetBIOS 的名稱解析時間逾時,再重新啟動 samba 『/etc/init.d/smb start』,然後再重新做一次輸入 root 的密碼那個動作

      在鳥哥嘗試過的案例中,上面第二個步驟挺有效的!不過,還是得要察看 /var/log/samba 裡面的登錄資訊才行喔!

    4. 重新開機並以新的網域名稱登入

      在圖十九之後請重新開機,開機後整個畫面會有點類似這樣:

      Windows 用戶端連上 PDC 的方式
      圖二十、Windows 用戶端連上 PDC 的方式

      請輸入你在 Samba PDC 上面擁有的帳號與密碼,當然啦,上圖中最底下的選項最重要! 現在這部 Windows 主機可以使用他自己的帳號登入,也可以透過 Samba 主機來登入喔! 粉不錯啦! ^_^

    5. 觀察使用者的家目錄與設定檔

      如果你可以順利登入的話,打開檔案總管後應該可以看到類似下方的畫面:

      Windows 用戶端連上 PDC 的方式
      圖二十一、Windows 用戶端連上 PDC 的方式

      呵呵!該連上的通通連結上來囉!你也可以在自己的家目錄 (K 槽) 新增移除資料的!是否很不錯啊! ^_^! 而當你登出之後,你在 Windows 桌面上頭所進行的各項個人化設定通通會被移動到 /home/dmtsai/profile 當中喔! 如果不相信的話,請自行前往 Samba 主機上頭瞧一瞧就知道了。

    6. 一些使用上面的技巧

      雖然 PDC 很好用,不過你要注意的是,每次你使用 PDC 上頭的帳號登入 Windows 用戶端主機時, Windows 主機會由 /home/username/profile/ 當中載入所需要的資料, 並暫時啟動一個資料夾在 C:\Documents and Settings\username 當中,如果你的家目錄下的 profile 資料太多時, 光是傳輸就會花去很多時間的!

      所以,你應該將一些檔案資料放置到你的家目錄下,亦即 K 槽當中,盡量不要使用 Windows 預設的『我的文件夾』, 因為『我的文件夾』會將資料移動到 /home/username/profile/My Documents 目錄下,同樣的, 儲存到桌面的資料會被放置到 /home/username/profile/桌面 目錄中,那樣在登入與登出時會花去很多時間喔! 這個小地方也要注意的呢! ^_^
    好了,關於 SAMBA 的 PDC 作法我們就談到這裡,還有更多的資訊您可以前往這個章節最後面的參考資料所列出的網址去查閱, 因為還有很多的作法吶!事實上,鳥哥覺得在一個網域當中,如果有多部的 Windows NT 主機,例如 Windows 2000/XP pro. 這一類的比較穩定的個人使用桌面版本時,使用 PDC 就很有用了!因為 Windows 2000/XP pro. 也是一個多人的作業系統,不像 Windows 98 是單人的作業系統。所以,當使用 Windows 2000/XP pro. 而無法登入 PDC 時,您是無法使用 Windows 2000/XP pro. 上面的任何的資訊的。 但是在 Windows 98 上面若無法正確的登入,您仍然具有該電腦的主控權喔!

    另外,設定 Windows 用戶端之前,請先確認你的 Windows 是什麼版本? 上述的動作對於 Windows XP 家用版 (Home) 是沒有作用的!請先確認才行喔!


    小標題的圖示問題克服
    通常我們在設定 SAMBA 的時候,如果是以 Workgroup 的方式來進行 smb.conf 的設定時,幾乎很容易就可以設定成功了!並沒有什麼很困難的步驟。不過,萬一還是無法成功的設定起來, 請務必察看登錄檔,也就是在 /var/log/samba 裡面的資料!在這裡面的資料當中,您會發現:咦! 怎麼這麼多檔案啊!因為我們在 smb.conf 裡面設定了:
      log file = /var/log/samba/%m.log
    那個 %m 是指 Client 的 NetBIOS Name 的意思,所以,當有個 vbirdcpu2 的主機來登入我們的 vbirdserver 主機時,那麼登入的資訊就會被紀錄在 /var/log/samba/vbirdcpu2.log 檔案喔!而如果萬一來源 IP 並沒有 Netbios name 的時候,那麼很可能是一些錯誤訊息,這些錯誤訊息就會被紀錄到 log.smbd, log.nmbd 裡面去了!所以,如果您要察看某部電腦連上您的 SAMBA 主機發生了什麼問題時,特別要留意這個登錄檔的形式喔!

    另外,如果您的 SAMBA 明明已經啟動完成了,卻偏偏老是無法成功,又無法查出問題時,建議先關閉 Samba 一陣子,再重新啟動:
      /etc/init.d/smb stop
    在我的案例當中,確實有幾次是因為 PID 與 NetBIOS 的問題,導致整個 SAMBA 怪怪的~所以完整的關閉之後, 經過一陣子的短暫時間,再重新啟動,應該就可以恢復正常了!

    還有,萬一您在進行寫入的動作時,老是發現『您沒有相關寫入的權限!』,不要懷疑,幾乎可以確定是 Permission 的問題,也就是 Linux 的權限與 SAMBA 開放的權限並不相符合!無論如何,您必須要瞭解能不能寫入 Linux 磁碟,看的是 PID 的權限與 Linxu 檔案系統是否吻合,而那個 smb.conf 裡面設定的相關權限只是在 SAMBA 運作過程當中『預計』要給使用者的權限而已,並不能取代真正的 Linux 權限喔!所以,萬一真的發現該問題存在, 請登入 Linux 系統,查驗一下該對應的目錄的 permission 吧! ^_^


    小標題的圖示使用者修改 samba 密碼
    有個問題是,我們知道使用者可以透過 passwd 修改 /etc/shadow 內的密碼,那麼使用者可否修改 samba 在 /etc/samba/smbpasswd 內的密碼呢?可以啊!直接輸入 smbpasswd 就能夠修改自己的密碼了! 非常簡單吧~不過,如果想要讓 /etc/shadow 與 /etc/samba/smbpasswd 同步的話, 那就得要動點手腳了~您可以參考底下這兩個連結來處理呢。

    小標題的圖示利用 ACL 配合單一使用者時的控管
    想像一個案例,如果你是學校的網管人員,有個兼任老師向您申請帳號,主要是要在很多班級內取得同學的專題資料。 因為該老師是兼任的,您或許擔心一不小心該教師就將同學的辛苦資料給銷毀,倒不是教師們故意的, 而是很多時候....不熟嘛!這個時候如果你將該老師加入同學的群組,然後偏偏同學們所在的目錄是群組可寫入的話, 那麼該教師就能夠擁有可讀寫的權限了,也就容易造成一些莫名的災難~

    那該怎麼辦?其實可以透過 ACL 來管理某個目錄的單一使用者權限啦!所以說, 權限的管理不必透過 smb.conf 的設定,只要透過 ACL 來管理就能夠達到你所需要的目的了。 關於 ACL 的說明我們在前面的認識網路安全當中已經提過了, 這裡不再囉唆,請自行前往查閱吶! ^_^

    大標題的圖示重點回顧
    • Samba 名稱的由來是因為需包含沒有意義的 SMB server 之故;
    • SAMBA 可以讓 Linux 與 Windows 直接進行檔案系統的使用;
    • SAMBA 是由 Andrew Tridgwell 在 1991 年的時候利用不同平台所發展出來的;
    • SAMBA 主要架構在 NetBIOS 上發展的,且以 NetBIOS over TCP/IP 克服 NetBIOS 無法跨路由的問題;

    大標題的圖示課後練習
    • 一般來說, SAMBA 使用的設定檔放置在哪裡?檔名為何?
    • 使用的檔名為 smb.conf ,通常會放置在 /etc/samba/smb.conf 裡面,不過,最好可以使用 rpm -qc packagename 來查詢!
    • 哪一個指令可以用來判斷 smb.conf 這個設定檔的正確性?
    • 當我們修改完 smb.conf 之後,記得要以 testparm 來進行 samba 的確認!
    • 哪一個指令可以用來察看 SAMBA 主機分享出什麼目錄?
    • 利用 smbclient 即可:『smbclient -L NetBiosName -U username 』!
    • smbmount 的功能為何?
    • 在 Linux 系統上面,將 Windows 的網路上的芳鄰,或者是 Linux 的 SAMBA 所提供分享的資源掛載到自己的系統下!
    • 我今天使用 smbpasswd 去新增一位使用者 badbird,讓他可以登入我的 Linux SAMBA 主機,但是無論如何就是無法新增。您認為原因可能是什麼?
    • 由於 Samba 使用者的資訊必須要存在於 /etc/passwd 裡面,既然無法新增,應該先確認 badbird 這個使用者已經存在於 Linux 系統當中了!如果還是無法新增,則需要查閱 smb.conf 的設定,看看是否 /etc/samba/smbpasswd 這個密碼檔案不存在?

    大標題的圖示參考資料

    2001/09/17:好久以前曾經完成的一項任務 ^_^
    2003/07/26:將 2001/09/17 所寫的內容做了大幅度的修訂,增加原理以及更多的設定項目!
    2003/09/10:將 PDC 部分補充的更完整,因為加入了個人化的 Profiles 在 /home/samba/profiles 當中了!同時加入課後練習喔
    2003/09/30:加入了 CUPS 印表機的支援!
    2005/10/17:Samba 2.2 在中文編碼上面與最新的 samba 3.0.x 版本不同。請參考: 中文編碼 網友的詳細說明喔!
    2006/12/20:將舊的文章移動到 此處
    2006/12/29:終於寫完了 Samba 了!將 PDC 改寫,很多亂亂的地方都改掉了~
    2007/04/12:原本對 homes 的說明中,那個 umask 應該是 002 ,原先的 022 是錯的!

    2003/07/26以來統計人數

     
         
    本網頁主要以 firefox 配合解析度 1024x768 作為設計依據
    http://linux.vbird.org is designed by VBird during 2001-2009. Aerosol Lab.