關於 SAMBA 這個 File server 的設定方法介紹喔!
在這個章節中,我們要教大家跳的是熱情有勁的巴西 SAMBA 舞蹈...
喔不~搞錯了~是要向大家介紹 SAMBA 這個好用的伺服器啦!咦!怪了!
怎麼伺服器的名稱會使用 SAMBA 呢?還真是怪怪的呢!那麼這個 SAMBA 伺服器的功能是什麼呢?另外,
它最早是經由什麼樣的想法而開發出來的呢?底下就讓我們慢慢的談一談吧!
在早期的網路世界當中,檔案資料在不同主機之間的傳輸大多是使用 FTP
這個好用的伺服器軟體來進行傳送。不過使用 FTP 傳輸檔案卻有個小小的問題,
那就是你無法直接修改主機上面的檔案資料!也就是說,你想要更改
Linux 主機上面的某個檔案時,你必須要將該檔案自伺服器下載後才能修改。
也因此該檔案在伺服器與用戶端都會存在。這個時候,萬一如果有一天你修改了某個檔案,
卻忘記將資料上傳回主機,那麼等過了一陣子之後,呵呵,你如何知道那個檔案才是最新的?
既然有這樣的問題,那麼好吧,我可不可以在用戶端的機器上面直接使用伺服器上面的檔案, 如果可以在用戶端直接進行伺服器端檔案的存取,那麼我在用戶端就不需要存在該檔案資料囉,也就是說, 我只要有 Server 上面的檔案資料存在就可以啦!有沒有這樣的檔案系統啊! 很高興的是,第十三章的 NFS 就是這樣的檔案系統之一啦!我只要在用戶端將 Server 所提供分享的目錄掛載進來, 那麼在用戶端的機器上面就可以直接取用 Server 上的檔案資料囉,而且, 該資料就像是我用戶端上面的 partition 一般,真是好用!
而除了可以讓 Unix Like 的機器互相分享檔案的 NFS 伺服器之外,在微軟 (Microsoft)
作業系統上面也有類似的檔案系統,那就是 Common Internet File System,
CIFS 這個咚咚啦!CIFS 最簡單的想法就是目前常見的『網路上的芳鄰』咯!
Windows 系統的電腦可以透過桌面上『網路上的芳鄰』來分享別人所提供的檔案資料哩!真是方便。
不過,NFS 僅能讓 Unix 機器溝通, CIFS 只能讓 Windows 機器溝通。傷腦筋,那麼有沒有讓
Windows 與 Unix-Like 這兩個不同的平台相互分享檔案資料的檔案系統呢?
在 1991 年一個名叫 Andrew Tridgell 博士班研究生就有這樣的困擾,他手上有三部機器,分別是跑 DOS 的個人電腦、DEC公司的 Digital Unix 系統以及 Sun 的 Unix 系統。在當時, DEC 公司有發展出一套稱為 PATHWORKS 的軟體,這套軟體可以用來分享 DEC 的 Unix 與個人電腦的 DOS 這兩個作業系統的檔案資料,可惜讓 Tridgell 覺得較困擾的是,Sun 的 Unix 無法藉由這個軟體來達到資料分享的目的 (註1)。
這個時候 Tridgell 就想說:『咦!既然這兩部系統可以相互溝通,沒道理 Sun 就必需這麼苦命吧?可不可以將這兩部系統的運作原理找出來,然後讓 Sun 這部機器也能夠分享檔案資料呢?』, 為了解決這樣的的問題,他老兄就自行寫了個 program 去偵測當 DOS 與 DEC 的 Unix 系統在進行資料分享傳送時所使用到的通訊協定資訊,然後將這些重要的資訊擷取下來, 並且基於上述所找到的通訊協定而開發出 Server Message Block (SMB) 這個檔案系統,而就是這套 SMB 軟體就能夠讓 Unix 與 DOS 互相的分享資料囉!
既然寫成了軟體,想一想,總是需要註冊一下商標吧!因此 Tridgell 就去申請了 SMBServer (Server Message Block 的簡寫) 這個名字來做為他撰寫的這個軟體的商標,可惜的是,因為 SMB 是沒有意義的文字,因此沒有辦法達成註冊。既然如此的話,那麼能不能在字典裡面找到相關的字詞可以做為商標來註冊呢? 翻了老半天,呵呵!這個 SAMBA 剛好含有 SMB , 又是熱情有勁的拉丁舞蹈的名稱,不然就用這個名字來做為商標好了!這成為我們今天所使用的 SAMBA 的名稱由來啦! ^_^
由上面說明的 SAMBA 發展緣由,你就應該不難知道, SAMBA 最初發展的主要目就是要用來溝通 Windows 與 Unix Like 這兩個不同的作業平台,那麼 SAMBA 可以進行哪些動作呢?想一想網芳能做的吧!
底下我們來談幾個 SAMBA 伺服器的應用實例吧!
相信很多人都是利用個人電腦將網頁製作完畢之後,再以類似 FTP 之類的服務將網頁上傳到 WWW 主機的, 但這樣有個困擾,那就是同時在用戶端與 WWW 主機上頭都有一份網頁資料,常常會忘記哪一份是最新的, 最麻煩的是,有時候下載下來的檔案已經經過好多修改了,卻在下次的 FTP 作業,不小心又下載一次舊資料, 結果將已經修改過的資料覆蓋過去~天吶!又要重寫一遍.....真是討厭!
如果你有安裝 SAMBA 伺服器的設定的話,那麼透過『網芳』的功能,直接連線遠端伺服器所提供的目錄,
如此一來你可以直接在你的個人電腦上面修改主機的檔案資料,只有一份正確的資料而已喔!
這就有點像是『線上編修』呢,一修改完成,在 Internet 上面可以立刻檢驗,方便的很吶!
在鳥哥過去待過的實驗室中,由於電腦數量不多,研究生常常會使用到不同的電腦 (因為大家都得搶沒有人用的電腦啊!)
,此外,也常常有研究生拿自己的 NoteBook 來工作,因此,有些團隊的資料就分散在各個電腦當中,使用上相當的不方便。
這個時候,鳥哥就使用 SAMBA 將硬碟空間分享出來,由於使用者要登入 SAMBA 這個伺服器主機時需要輸入使用者資料
(帳號與密碼),而不同的登入者會取得不一樣的目錄資源,所以可以避免自己的資料在公用電腦上面被窺視,
此外,在不同的公用電腦上面都可以登入 SAMBA 主機,資料的使用上面真是相當的棒啊!
SAMBA 除了分享檔案系統外,也可以分享印表機喔,鳥哥的研究室好幾部電腦就是直接以 Linux
分享的印表機來印製報告的。你會說『啊 Windows 也可以辦的到啊!沒有什麼了不起的!』是啊。
但是鳥哥認為,用 Linux 做為伺服器主機時畢竟還是比較穩定一點,可以 24
小時且全年無休的努力工作吶。此外,因為目前透過『網路上的芳鄰』來攻擊區域網路的 Windows
作業系統的電腦病毒實在是太多了,防不勝防, Linux 對於這樣的攻擊並沒有很大的影響
(因為常見的攻擊手法均針對 Windows 而來~),所以也比較安全一些說~
SAMBA 的應用挺廣泛的,尤其對於區域網路內的電腦來說,更是一項不可多得的好用的伺服器, 雖然或許你會說,SAMBA 的功能不過是模仿 Windows 的網芳以及 AD 相關的軟體, 那我直接使用 Windows 不就 OK 了?可惜的是, Windows XP 對於網芳的連線限制依版本而有所不同, 以企業常見的專業版 (Professional) 來說,他僅能提供最多同時十個連線到網芳的連線能力,這...不太夠用吧! 所以囉,SAMBA 穩定、可靠又沒有限制連線數,值得學習吧!^_^!更多的應用你可以自行發掘吶!
事實上,就像 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 裡面說。
NetBIOS 當初發展時就著眼在區域網路內的快速資料交流,而因為是定義在區域網路內,因此他並沒有使用類似 TCP/IP 之類的傳輸協定,也就不需要 IP 的設定。如此一來資料如何在兩部主機之間交流呢? 其實主機在 NetBIOS 協定當中的定義為使用『NetBIOS Name』,每一部主機必須要有不同的 NetBIOS Name 才行, 而檔案資料就是在不同的 NetBIOS name 之間溝通囉!我們以一個網芳的設定來作簡單的說明好了:
我們的 SAMBA 則是透過兩支服務來控制這兩個步驟,分別是:
所以囉, SAMBA 每次啟動至少都需要有這兩個 daemons 喔!這可不要忘記囉!而當我們啟動了 SAMBA 之後,主機系統就會啟動 137, 138 這兩個 UDP 及 139 這一個 TCP 埠口,這可不要忘記了! 因為後面設定防火牆的時候,還會使用到這三個 port 的呢!
SAMBA 伺服器的應用相當的廣泛,而且可以依照不同的網域連線方式,與不同的使用者帳號密碼的控管方式來進行分類。
例如最常見的 Workgroup 及 Domain 兩種方式的連線模式呢!底下我們就是要來談一談這兩種最常見的區域網路的連線模式:
peer/peer (對等模式) 及 domain model (主控模式)。
peer 有同等、同輩的意思存在,所以由字面上來看,peer/peer 當然就是指兩部主機的地位相等囉! 這是什麼意思呢?簡單的說,假如在區域網路裡面的所有 PC 均可以在自己的電腦上面管理自己的帳號與密碼, 同時每一部電腦也都具有獨力執行各項軟體的能力,只是藉由網路將各個 PC 連結在一起而已的一個架構, 所以,每一部機器都是可以獨立運作的喔!
這樣的架構在目前小型辦公室裡面是最常見的。例如辦公室裡面有十個人,每個人桌上可能都安裝有一套 Windows 作業系統的個人電腦,而這十部電腦都可以獨立進行辦公室軟體的執行啊、獨立上網啊、獨立玩遊戲啊等等的, 因為這十部電腦都可以獨立運作,所以不會有一部電腦關掉,其他的電腦就無法工作的情況發生,這就是 peer/peer 的典型架構。
那在這樣的架構底下,要如何透過網路連線來取得對方的資料呢?舉例來說,以下圖的架構為例,在這樣的架構下,假設 vbird (PC A) 寫了一個報告書,而 dmtsai (PC B) 想要以網路直接取用這個報告書時,那 dmtsai 就必須要知道 vbird 使用的密碼,並且 vbird 必須要在 PC A 上面啟用 Windows 的『資源分享(或者是共用)』之後,才能夠讓 dmtsai 連線進入喔 (此時 PC A 為 Server) !而且, vbird 可以隨時依照自己的喜好來更改自己的帳號與密碼,而不受 dmtsai 的影響。不過,dmtsai 就得要取得 vbird 同意取得新的帳號與密碼後,才能夠登入 PC A 喔!反過來說,同樣的, vbird 要取得 dmtsai 的資料時,同樣需要取得 PC B 的帳號與密碼後,才能夠順利登入啊 (此時 PC A 為 Client 喔)!因為 PC A, PC B 的角色與地位都同時可以為 Client 與 Server ,所以就是 peer/peer 的架構了!
使用 peer/peer 的架構的好處是每部電腦均可以獨立運作,而不受他人的影響!不過,
缺點就是當整個網域內的所有人員都要進行資料分享時,光是知道所有電腦裡面的帳號與密碼,就會很傷腦筋了!
所以, Peer/Peer 的架構是比較適合 (1)小型的網域,或者是
(2)沒有需要常常進行檔案資料分享的網路環境,或者是
(3)每個使用者都獨自擁有該電腦的擁有權(就是說,該電腦是使用者的,而不是公用的啦!)
而,如果該單位的所有 PC 均是公有的 (例如學校的電腦教室環境),而且你需要統一控管整個網域裡面的帳號與密碼的話,
那就得使用底下的 domain models 了!
假設今天你服務的單位有 10 部電腦,但是你的單位有 20 個員工,這也就是說,這 20 個員工輪流搶著用這 10 部電腦。如果每部電腦都如同 peer/peer 的架構時,那麼每部電腦都需要輸入這 20 個員工的帳號與密碼來提供他們登入喔。而且,今天假如有個員工想要變更自己的密碼時,就需要到 10 台電腦上面進行密碼變更的作業!否則他就必須要記得這 10 部電腦裡面,那一部電腦是記憶那一個密碼...好煩那~
如果上述是這樣的情況,使用 peer/peer 架構就不是一個好方法了!這個時候就需要藉由 domain model 來達成你的需求啦!所謂的 domain model 概念其實也很簡單,既然使用電腦資源需要帳號與密碼, 那麼我將所有的帳號與密碼都放置在一部主控電腦 (Primary Domain Controller, PDC) 上面,在我的網域裡面,任何人想要使用任何電腦時,都需要在螢幕前方輸入帳號與密碼,然後通通藉由 PDC 伺服器的辨識後,才給予適當的使用權限。也就是說,不同的身份還具有不一樣的電腦資源使用權限就是了! 例如底下的圖示:
PDC 伺服器控管整個網域裡面的各個機器 (PC A ~ PC D) 的帳號與密碼的資訊,假如今天有個使用者帳號名稱為 vbird ,且密碼為 12345 時,他不論使用哪一部電腦 (PC A ~ PC D) 只要在螢幕前方輸入 vbird 與他的密碼,則該機器會先到 PDC 上面查驗是否有 vbird 以及 vbird 的密碼,並且 PDC 主機會給予 vbird 這個使用者相關的電腦資源使用權限。當 vbird 在任何一部主機上面登入成功後,他就可以使用相關的電腦資源了!
這樣的架構比較適合人來人往的企業架構,當系統管理員要控管新進人員的電腦資源使用權時,可以直接針對 PDC 來修改就好了,不需要每一部主機都去修修改改的,對於系統管理員來說,這樣的架構在控管帳號資源上,當然是比較簡單的啦!
各種架構適用的環境與適用的人都不相同,並沒有那個是最好啦!請依照你的工作環境來選擇連線的模式囉!當然, SAMBA 可以達到上述兩種模式的啦!底下我們會分別來介紹喔!
SAMBA 這個軟體幾乎在所有的 Linux distributions 上面都有提供,因為即使你的 Linux 僅做為個人桌上型電腦使用時,
你依舊可能會需要連線到遠端的 Windows 網芳,那個時候就得要 samba 提供的用戶端軟體功能囉!
因此你只要直接安裝系統上面提供的預設 samba 版本即可。底下我們會先介紹 samba 伺服器,然後再介紹用戶端功能喔!
目前常見的 samba 版本為 3.x 版,舊版的 2.x 版在設定上有點不一樣,因此在進入設定前請先確認你的 samba 版本。 咱們的 CentOS 5.x 提供的是 Samba 3.x 的版本。那麼你需要什麼軟體呢?基本上有這些:
這三個軟體你都得要安裝才行喔!如果尚未安裝的話,使用 yum 去裝好它吧!安裝完畢之後,你可以依序察看一下 Samba 的軟體結構喔!與它相關的設定檔基本上有這些:
至於常用的指令檔案方面,若分為伺服器與用戶端功能,則主要有底下這幾個資料:
大致的軟體結構就是這樣,底下就準備來講一個簡單的案例吧!這樣比較好介紹設定檔項目啦!
既然 Samba 是要加入 Windows 的網芳服務當中,所以它的設定方式應該是要與網芳差不多才是。所以我們先來聊一聊 Windows 的一些網芳設定方法再說。在早期 Windows 的網芳設定真是很簡單,不過也因為太簡單, 所以產生的安全問題可是相當的麻煩的。後來在 Windows XP 的 SP2 (服務包第二版) 之後加入了很多的預設防火牆機制, 因此使用網芳的預設限制常常會是這樣的:
工作群組與主機名稱的設定,你可以在『我的電腦』按右鍵,選擇內容後去修訂相關的設定值。當你的 Windows 主機群符合上述的條件後,就很容易處理網芳分享的工作啦!分享的步驟一般是這樣的:
例題:
假設你打開 Windows XP 的檔案總管,在 D:\VBird\Data 這個目錄下,你按下右鍵選『共用與安全性』,之後,在出現的視窗中,
你選擇:『你瞭解這個安全風險,但仍不要執行精靈而共用檔案,請按這裡』,然後勾選:『在網路上共用這個資料夾』,
最後共用的名稱你輸入了:『VBGame』,請問,假設你的 IP 是 192.168.100.100 ,那麼你的用戶會看到什麼網址列?
答:
網芳的資源名稱通常的寫法是:『 \\IP\分享資源名稱』,我們的分享資源名稱為 VBGame,因此最終這個分享的資源名稱應該是:『
\\192.168.100.100\VBGame 』才對!很多朋友都會寫成:『 \\192.168.100.100\VBird\Game 』那錯得很離譜喔!
|
真是有夠簡單的!那麼 Samba 怎麼設定啊?也是很簡單,依據上述的限制以及流程你可以這樣想像:
根據上面的流程,其實我們最需要知道的就是 smb.conf 這個設定檔的資訊就是了。 所以首先我們就要來介紹一下這個檔案的設定方式囉!這個檔案其實可以分為兩部份來看, 一個是主機資訊部分,在 smb.conf 當中以 [global] (全領域) 作為設定的依據;另一個則是分享的資訊, 以個別的目錄名稱為依據。另外,由於 Samba 主要是想加入網芳功能,因此在 smb.conf 內的很多設定都與 Windows 類似喔:
在 smb.conf 這個設定檔當中的設定項目有點像底下這樣:
# 會有很多加上 # 或 ; 的註解說明,你也可以自行加上來提醒自己相關設定 [global] 參數項目 = 設定內容 .... [分享資源名稱] 參數項目 = 設定內容 .... |
在 [global] 當中的就是一些伺服器的整體參數了,包括工作群組、主機的 NetBIOS 名稱、字元編碼的顯示、登錄檔的設定、 是否使用密碼以及使用密碼驗證的機制等等,都是在這個 [global] 項目中設定的。至於 [分享資源名稱] 則是針對你開放的目錄來進權限方面的設定,包括誰可以瀏覽該目錄、是否可以讀寫等等參數。 在 [global] 部分關於主機名稱資訊方面的參數主要有:
另外,過去常常讓使用者心生不滿的語系顯示問題方面,你務必要清楚的知道的是,SAMBA 伺服器上面的資料 (例如 mount 磁碟分割槽的參數以及原本的資料編碼), SAMBA 伺服器顯示的語系, Windows 用戶端顯示的語系, Windows 用戶端連上 SAMBA 的軟體 都需要符合設定值才行!在新版的 3.x 上面有數個提供這些語系轉換的設定喔,如下所示:
關於語系編碼,建議你參考一下討論區的這一篇:
我們的網友 eyesblue 寫得太好了!所以建議大家直接前往查閱即可!在這裡鳥哥將該文章內容作個例題來玩玩。
例題:
假設你的 Samba 使用的語系 /etc/sysconfig/i18n 顯示的是『 LANG="zh_TW.big5" 』,
而預計要分享的目標 Windows 系統是 XP,那麼你的語系資料應該如何設定?
答:
由於 Linux, Windows XP 都使用 big5 編碼,因此設定值應該是:
unix charset = cp950 display charset = cp950 dos charset = cp950 |
除此之外,還有登錄檔方面的資訊,包括這些參數:
還有網芳開放分享時,安全性程度有關的密碼參數,包括這幾個:
事實上 Samba 的密碼方面設定值很多喔,包括你還可以利用 samba 來修改 /etc/passwd 裡頭的人物的密碼呢!
不過這個時候就得需要『 unix password sync 』以及『 passwd program 』這兩個參數值的幫忙了。
我們這裡先談比較簡單的,其他進階的部分可以 man smb.conf 去進行搜尋查閱喔! ^_^
這部分就是我們在前面的小範例當中說明的,要將 (1)哪個實際的目錄 (2)分享成什麼名稱?中刮號裡面放的是『分享名稱』! 那在這個分享名稱內常見的參數有:
因為分享的資源主要與 Linux 系統的檔案權限有關,因此裡頭的設定參數多與權限有關。
為了簡化設定值,Samba 提供很多不同的變數給我們來使用,主要有底下這幾個變數喔:
[homes] valid users = %S .... |
以上就是在 smb.conf 上頭常看到的幾種設定項目,相信初次接觸 Samba 的朋友,看到上頭寫的資料肯定是一頭霧水的! 我們底下用幾個小範例來實際的介紹 smb.conf 的設定後,你就會知道這些參數如何應用了! 記得,看完底下的下範例後,要回來再將這些參數的意義瞧一瞧, 而且若有其他額外的參數須知,務必自行 man smb.conf 喔!重要的很!
瞎密?不需要密碼就能夠使用 SAMBA 主機所提供的目錄資源?真假?沒錯啦,可以達到的。不過,因為不需要密碼就能夠登入,
雖然你可以設定權限成為唯讀,讓使用者可以『瞧瞧而已』,但是畢竟比較危險。
因為如果你不小心將重要資料放置到該分享的目錄當中,豈不危險?所以盡量不要這樣設定,所以標題才會講:『純測試』嘛!
在底下的案例中,伺服器 (192.168.100.254) 預計設定的參數狀況為:
老實說, netbios name 幾乎可以不用設定了,因為現在我們都用 IP 進行網芳連線,不一定會使用主機名稱嘛!
所以這一版當中,鳥哥取消了 lmhosts 的設定值喔!好了,底下就開始依序來進行 samba 的設定吧!
由於我們有設定語系相關的資料,因此得要先查查看,到底我們 Linux 伺服器的語系是否為 utf8 呢?檢查方法如下:
[root@www ~]# cat /etc/sysconfig/i18n LANG="zh_TW.UTF-8" <==確實是出現了 utf8 喔! |
如上所示,確實是 utf8 啊!而在這個例子當中我們僅分享 /tmp 這個目錄而已,而且假設這個分享出來的目錄是可讀寫的, 另外,我們並沒有分享印表機喔!而在 smb.conf 當中的註解符號可以是『 # 』也可以是『 ; 』喔!要注意!
[root@www ~]# cd /etc/samba [root@www samba]# cp smb.conf smb.conf.raw <==先備份再說! [root@www samba]# vim smb.conf # 1. 先設定好伺服器整體環境方面的參數 [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 # 修改一下印表機的載入方式,不要載入啦! load printers = no # 2. 分享的資源設定方面:主要得將舊的註解,新的加入! # 先取消 [homes], [printers] 的項目,然後針對 /tmp 的設定,可瀏覽且可寫入喔 [temp] <==分享資源名稱 comment = Temporary file space <==簡單的解釋此資源 path = /tmp <==實際 Linux 分享的目錄 writable = yes <==是否可寫入?在此例為是的 browseable = yes <==能不能被瀏覽到資源名稱 guest ok = yes <==單純分享時,讓用戶隨意登入的設定值 |
請你特別留意,在原本的 smb.conf 上面就已經有很多預設值了,這些預設值如果你不知道他的用途,
盡量保留預設值,也可以使用 man smb.conf 去查詢該預設值的意義。上述的設定是完全控制使用者的認證層級的呦!
在啟動 samba 之前,我們務必要瞭解到 smb.conf 裡面語法是否正確,檢驗的方式使用 testparm 這個指令即可。 測試方式如下:
[root@www ~]# testparm 選項與參數: -v :查閱完整的參數設定,連同預設值也會顯示出來喔! [root@www ~]# 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] <==底下就是剛剛在 smb.conf 裡頭設定的資料! dos charset = cp950 unix charset = utf8 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 load printers = No [temp] comment = Temporary file space path = /tmp read only = No guest ok = yes |
上頭是語法驗證與各個項目的列出,如果你下達 testparm 卻出現如下畫面那就是有問題:
[root@www ~]# testparm Load smb config files from /etc/samba/smb.conf 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 來作詳細的輸出,
資料相當的豐富,透過這個你也可以知道你的主機環境設定為何呢! ^_^
啟動實在太簡單了,利用預設的 CentOS 啟動方式來處理即可。
[root@www ~]# /etc/init.d/smb start [root@www ~]# chkconfig smb on [root@www ~]# netstat -tlunp | grep mbd 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 3905/smbd tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 3905/smbd udp 0 0 192.168.100.254:137 0.0.0.0:* 3908/nmbd udp 0 0 0.0.0.0:137 0.0.0.0:* 3908/nmbd udp 0 0 192.168.100.254:138 0.0.0.0:* 3908/nmbd udp 0 0 0.0.0.0:138 0.0.0.0:* 3908/nmbd |
特別注意,在 Samba 當中預設會啟動多個埠口,這包括資料傳輸的 TCP 埠口 (139, 445),以及進行 NetBIOS
名稱解析之類工作的 UDP 埠口 (137, 138),所以你才會看到很多資料的。那麼能否僅支援 139 這個必要的埠口,關閉
445 呢?可以啊~透過 testparm -v 的觀察,可以發現『 smb ports = 445 139 』這個設定值指定兩個埠口的,因此你可以在
smb.conf 增加這個設定值,並改為 smb ports = 139 即可。不過,建議先保留預設值啦!
關於用戶端的觀察我們會在後續進行介紹。在這裡僅是說明如何確定我們的 Samba 設定與服務有順利的在運作。 我們可以在本機上透過 smbclient 這支程式來處理,它的基本查詢語法是這樣的:
[root@www ~]# smbclient -L [//主機或IP] [-U 使用者帳號] 選項與參數: -L :僅查閱後面接的主機所提供分享的目錄資源; -U :以後面接的這個帳號來嘗試取得該主機的可使用資源 |
由於在這個範例當中我們並沒有規範使用者的安全等級 (share),所以不必使用 -U 這個選項,因此你可以這樣看看:
[root@www ~]# smbclient -L //127.0.0.1 Password: <==因為不需要密碼,因此這裡按一下 [Enter] 吧! Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] Sharename Type Comment --------- ---- ------- temp Disk Temporary file space IPC$ IPC IPC Service (This is vbird's samba server) Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] Server Comment --------- ------- VBIRDSERVER This is vbird's samba server Workgroup Master --------- ------- VBIRDHOUSE |
上表輸出的資訊當中,分享的目錄資源 (Sharename) 就是在 smb.conf 當中設定的 [temp] 名稱囉! 因此在這裡的意思是:任何人都可以進入 //127.0.0.1/temp 這個目錄當中, 而這個目錄在 Linux 系統其實是 /tmp 目錄。至於那個 IPC$ 則是為了要應付 Windows 環境所必須要存在的項目就是了。那麼該如何使用這個資源呢?接下來我們可以利用 mount 這個指令來測試看看囉:
[root@www ~]# mount -t cifs //127.0.0.1/temp /mnt Password: <==因為沒有密碼,所以這裡還是按 Enter 即可 [root@www ~]# df 檔案系統 1K-區段 已用 可用 已用% 掛載點 ....(前面省略).... //127.0.0.1/temp 1984016 35884 1845720 2% /mnt [root@www ~]# cd /mnt [root@www mnt]# ll <==以上這兩個動作要進行!才會知道有沒有權限的問題! [root@www mnt]# cd ; umount /mnt |
確實可以掛載的起來,所以,測試完畢後,就將這個掛載的資料卸載吧。關於 mount 的用法,我們會在後面的小節繼續介紹。
基本上,到此為止咱們就設定好一個簡單的不需要密碼即可登入的 Samba 伺服器了! 你可以先行到用戶端軟體功能的部分進行更細部的掛載測試。 接下來,讓我們以簡易的需要密碼才能夠登入 Samba 的方式來設計一個範例吧!
設定一部不需密碼即可登入的 Samba server 是非常簡單的,不過, 你總不希望某些有機密性質的資料放在不設防的網芳中讓大家查閱吧? 舉例來說,你總不希望你的家目錄被人家隨意瀏覽吧?家目錄內可能有你自己的情書呢!^_^
那怎麼辦?沒關係,我們可以透過 Samba 伺服器提供的認證方式來進行使用者權限的給予, 也就是說,你在用戶端連線到伺服器時,必須要輸入正確的帳號與密碼後,才能夠登入 Samba 查閱到你自己的資料! 那會不會很難啊?不會啦! Samba 本身就提供一個小程式來幫助我們處理密碼的建立了,整個流程還不太難。
比較重要的是 Samba 使用者帳號必須要存在於 Linux 系統當中 (/etc/passwd),
但是 Samba 的密碼與 Unix 的密碼檔案並不相同 (這是因為 Linux 與網芳的密碼驗證方式及編碼格式不同所致)。
這就比較有點小麻煩~沒關係,就讓我們依樣畫葫蘆來處理一下這個部分的設定吧!
由於使用者層級會改變成 user 的階段,因此 [temp] 已經沒有必要存在!請將該設定刪除或註解。 而伺服器方面的整體資料則請保留,包括工作群組等等的資料,並新增底下的資料:
好了,開始一步步的處理吧!
在這個範例的設定檔當中,我們會新增幾個參數,新增的參數部分會用特殊字體圈起來, 引用之前參數的部分則為一般字體。請交互參考看看囉:
# 1. 開始設定重要的 smb.conf 檔案呦! [root@www ~]# vim /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 load printers = no # 與密碼有關的設定項目,包括密碼檔案所在格式喔! security = user <==這行就是重點啦!改成 user 層級 passdb backend = tdbsam <==使用的是 TDB 資料庫格式! # 2. 分享的資源設定方面:刪除 temp 加入 homes 與 project [homes] <==分享的資源名稱 comment = Home Directories browseable = no <==除了使用者自己外,不可被其他人瀏覽 writable = yes <==掛載後可讀寫此分享 create mode = 0664 <==建立檔案的權限為 664 directory mode = 0775 <==建立目錄的權限為 775 [project] <==就是那三位使用者的共享資源 comment = smbuser's project path = /home/project <==實際的 Linux 上面的目錄位置 browseable = yes <==可被其他人所瀏覽到資源名稱(非內容) writable = yes <==可以被寫入 write list = @users <==寫入者有哪些人的意思 # 2. 每次改完 smb.conf 你都需要重新檢查一下語法正確否! [root@www ~]# testparm <==詳細的 debug 請自行處理囉! |
在上表當中比較有趣的設定項目主要有:
千萬不要忘記了,除了設定檔之外,詳細的目錄權限與帳號設定等規範也要設定好!底下我們用範例來進行此項工作!
例題:
我們預計要分享 /home/project 目錄,這個目錄的權限該如何設定?
答:
因為是要開放給 users 群組,而共享群組的權限通常是『 2770 』這個含有 SGID 的特殊旗標功能。因此這個目錄應該如此設定才好:
|
設定使用者帳號是很重要的一環,因為設定錯誤的話,當然也就任何人都沒有辦法登入的!在這裡我們必須先要說明一下 Linux 的檔案系統與 SAMBA 設定的使用者登入權限的相關性!
如果上面這幾點說明你沒有問題了,現在就來看一下當我們在 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 的使用者當中。這都是很基本的帳號權限概念,如果你覺得這裡閱讀方面有問題, 若不考慮鳥哥的解釋不良,表示你必須要回去讀讀基礎篇了~ ^_^
現在我們知道需要新增 smb1, smb2, smb3 三個用戶,且這三個用戶需要加入 users 群組。此外,我們之前還建立過 student 這個用戶,假設這四個人都需要能用 Samba 服務,那麼除了新增用戶之外,我們還需要利用 pdbedit 這個指令來處理 Samba 用戶功能喔!
以後如果有需要新增額外的使用者帳號,若該帳號原本不存在,則使用 useradd 再以 pdbedit -a 去新增。
若已經存在於 Linux 的實體帳號,直接用 pdbedit -a 新增即可。同時要注意,管理 TDB 資料庫格式建議使用
pdbedit 這個新的玩意兒來處理,smbpasswd 僅剩下修改密碼的功能需記憶即可!
在經過重新啟動後,我們所進行的修訂才會生效。然後使用 smbclient 來檢查看看,是否不同身份會有不一樣的瀏覽結果呢? 趕緊看看:
[root@www ~]# /etc/init.d/smb restart # 1. 先用匿名登入試看看! [root@www ~]# smbclient -L //127.0.0.1 Password: <==直接按下 [Enter] 即可。 Anonymous login successful <==有看到匿名的字樣了! Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] Sharename Type Comment --------- ---- ------- project Disk smbuser's project IPC$ IPC IPC Service (This is vbird's samba server) Anonymous login successful Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] ....(底下省略).... # 2. 再使用 smb1 這個帳號登入試看看! [root@www ~]# smbclient -L //127.0.0.1 -U smb1 Password: <==輸入 smb1 在 pdbedit 所建立的密碼! Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] Sharename Type Comment --------- ---- ------- project Disk smbuser's project IPC$ IPC IPC Service (This is vbird's samba server) smb1 Disk Home Directories <==多了這玩意兒! Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] ....(底下省略).... |
由上表我們可以發現,經由不同的身份登入可以取得不一樣的瀏覽資料, 所以在使用上面需要特別留意喔!接下來,讓我們開始來自我掛載測試看看!
[root@www ~]# mount -t cifs //127.0.0.1/smb1 /mnt -o username=smb1 Password: <==確定是輸入正確的密碼喔! retrying with upper case share name mount error 6 = No such device or address Refer to the mount.cifs(8) manual page (e.g.man mount.cifs) # 竟然發生不明原因的錯誤,請參考 /var/log/samba/${IP}.log 內的錯誤說明 [root@www ~]# tail /var/log/samba/127.0.0.1.log [2011/03/23 15:25:53, 0] smbd/service.c:make_connection_snum(1013) '/home/smb1' does not exist or permission denied when connecting to [smb1] Error was 拒絕不符權限的操作 # /home/smb1 不可能不存在,也不可能權限錯誤,故開始懷疑為 SELinux 的問題? [root@www ~]# setenforce 0 <==先關閉 SELinux 看看 [root@www ~]# mount -t cifs //127.0.0.1/smb1 /mnt -o username=smb1 Password: <==確定是輸入正確的密碼喔! [root@www ~]# df 檔案系統 1K-區段 已用 可用 已用% 掛載點 ....(中間省略).... //127.0.0.1/smb1 25396668 176676 23914256 1% /mnt # 果然掛載上來!那確定是 SELinux 的問題了!請依照 /var/log/messages # 的內容自行克服相關的問題! [root@www ~]# umount /mnt; setenforce 1 |
自我測試是非常重要的!因為 Samba 是會對外提供服務的,因此 SELinux
會特別『關照』一下這個服務!包括預設使用者家目錄不會有開放的權限、預設的 SELinux type 不對就無法使用
(你可以自己嘗試掛載 //127.0.0.1/project 就知道啥原因囉!),所以,自行測試完畢就能夠理解哪個地方的 SELinux
沒有設定妥當!詳細的設定請到後續安全性設定去查閱。
有的時候你會發現,明明在 smb.conf 當中已經設定了 writable 可寫入,使用者登入的身份也沒有問題, 為啥就是無法掛載或寫入呢?是否是伺服器設定哪裡還有問題啊?非也非也!主要的問題常常是來自於 Linux 檔案系統的權限啦!
舉上面的例子來說,當你無法掛載卻發現 Linux 傳統權限是對的,那麼肯定是 SELinux 出問題~這部份得要用 setsebool 與 chcon 或 restorecon 等指令來克服。另外就是,我們在 smb.conf 當中設定 [project] 為可寫入,亦即 /home/project 是可寫入的。假設 smb1 屬於 users 這個群組,因此以 smb1 登入 SAMBA 伺服器後,對於 /home/project 應該是具有可以讀寫的能力的!但是,如果你以 root 的身份建立 /home/project 卻又忘記修改權限的話, 此時 /home/project 是無法讓 users 這個群組寫入的,因此 smb1 這個使用者當然不具有寫入的能力。 這樣說,瞭解鳥哥想要說啥了嗎?注意注意喔! ^_^
那如果你還要擴充分享的目錄與能夠登入的使用者時,可以這樣做:
事實上,SAMBA 的一般用途就是在這個連線的模式中!多使用 SAMBA 來分享你的資源吧!鳥哥都是使用 SAMBA 來做為遠端伺服器與我的工作機互通有無的重要媒介說~
時至今日,印表機的網路功能已經很強悍了!甚至也有支援無線網路的印表機,因此每台印表機都可以獨立作為各個 PC 的獨自的印表機,老實說也沒有必要進行 Samba 的網路印表機伺服器啦!但畢竟還是有些比較舊型的機種, 或者買不起有內建網路的印表機時,那麼 Samba 的印表機伺服器還是有存在的價值囉。
在 Linux 底下進行列印的服務很多,不過我們這裡要介紹的僅有目前較廣為流行的 CUPS (Common Unix Printing System) 這一個。 詳細的 CUPS 安裝設定方法我們已經在基礎篇第三版第二十一章 CUPS 當中提過,所以這裡我們不再詳細說明,僅介紹大致的處理流程就是了。如果你需要較早期的 LPRng 列印系統的話, 建議可以參考底下的資料喔:
既然要分享印表機,就得要有印表機啊!鳥哥使用對 Linux 支援度較高的 HP LaserJet P2015dn 這部印表機為例, 不使用網路功能,單純使用 USB 連接到 Samba 伺服器上。
再次說明,並不是所有的印表機都被 Linux 所支援的,所以當你想要連結一部印表機到 Linux 系統上頭時, 請務必到 http://www.openprinting.org/printers 上頭去看看是否有被支援喔! 如果沒有被支援,那就換一部印表機吧!不要進行垂死的掙扎了...
如果你的印表機連接埠為使用 USB 或者是平行序列埠的話,那麼當你連接上印表機後, 可以利用底下的方式測試看看是否成功的連接上了:
[root@www ~]# lsusb Bus 001 Device 002: ID 03f0:3817 Hewlett-Packard LaserJet P2015 series Bus 001 Device 001: ID 0000:0000 [root@www ~]# ll /dev/usb/lp0 crw-rw---- 1 root lp 180, 0 3月 23 16:57 /dev/usb/lp0 # 看得出來,已經有個 lp0 的印表機囉!測試列印一下吧! [root@www ~]# echo "Hello printer" > /dev/usb/lp0 |
如果印表機有回應,這表示 OK 的啦!你可以進行底下的工作了。
預設 CUPS 都會開啟,不過,我們在前面的第七章曾經將這個服務關閉! 所以這裡要重新設定與啟動才行。本章節 CUPS 的設定原則是這樣的:
然後開始這樣做:
[root@www ~]# vim /etc/cups/cupsd.conf # 1. 讓監聽的介面開放在所有介面! # Listen localhost:631 <==約在第 19 行左右,改成如下: Listen 0.0.0.0:631 # 2. 讓內部網域能夠進行 CUPS 的瀏覽與管控 <Location /> <==約在 32 行左右,新增能夠讓內網其他 IP 瀏覽者 Order allow,deny Allow From 127.0.0.0/8 Allow From 192.168.100.0/24 </Location> <Location /admin> <==約在 39 行左右,新增能夠管理 CUPS 者 Encryption Required <==因為這裡的關係,所以可能會用 https://IP 喔! Order allow,deny Allow From 127.0.0.0/8 Allow From 192.168.100.0/24 </Location> |
設定完畢後就可以開始來啟動 cups 系統,可以這樣做:
[root@www ~]# /etc/init.d/cups start [root@www ~]# chkconfig cups on [root@www ~]# netstat -tunlp | grep '631' tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN 2667/cupsd udp 0 0 0.0.0.0:631 0.0.0.0:* 2667/cupsd |
那個 631 的埠口就是 CUPS 所啟動的啦!要注意的是,開放介面得要給 0.0.0.0 才對呦!然後我們可以開始設定印表機了! 由於 CUPS 支援很多不同的印表機連接埠,每種連接埠都不一樣,常見的有:
之所以要加上 192.168.100.0/24 可以控制伺服器 CUPS 的原因在於...鳥哥的伺服器沒有 X 視窗啦! 所以需要透過平時的工作機連上伺服器才行啊!此時,將 CUPS 開放在區網內可以控制的功能就很重要啦! 此外,因為鳥哥的主機所在環境問題,這部 192.168.100.254 還有一個介面為 192.168.1.10,鳥哥在 cupsd.conf 裡面也加入這個網段了 (上面的範例中並沒有特別強調),所以底下的圖示你會看到很多 192.168.1.10 的 IP ,不要害怕!那是正常的! ^_^!好了,請打開瀏覽器,在網址列輸入: https://192.168.100.254:631 (底下則是 192.168.1.10)
如上圖所示,由於我們使用的是 https 這個需要憑證的連線模式,因此就會出現這個不受信任的網站訊息。 沒關係,你直接按下『我瞭解安全風險』後,再選擇『新增例外網站』即可出現如下圖示:
如果這部主機真的是你的,那麼就選擇箭頭 2 所指的那個『永久儲存』吧!最後按下箭頭 3 所指的『確認安全例外』即可!如果一切順利,就會出現如下的 CUPS 設定圖示:
在上頭的歡迎圖示當中,由於我們是想要建立印表機,因此點選箭頭所指的那個按鈕來建立印表機吧!
建立印表機時,最重要的是那個列印佇列 (上面方框中的第一個,名稱的那個玩意兒),在這裡鳥哥取名為 hpljp2015dn 的印表機名稱,這個名稱很重要,是未來分享出的印表機名字囉!至於位置與描述就隨便你填囉。 當你按下『繼續』後,就會出現如下圖示:
在上面的圖示中,你應該要選擇的是我們這部 USB 的印表機裝置才對。該裝置是由 HAL 服務所自動偵測到的, 如果你沒有看到任何 USB 的印表機,那可能就得要查詢一下印表機電源是否正確的開啟了! 點選他吧!
接下來 CUPS 會幫你選擇一個相對較佳的驅動程式,但鳥哥比較喜歡中文支援 (有 zh_TW 啊!看到沒?), 因此才選擇上述圖示當中的那個雷射印表機的項目。選完後請按下『加入印表機』按鈕吧!
如果一切設定妥當,那麼接下來就是要輸入 root 的帳號與密碼來修改印表機的設定檔。 請填入你的 Linux 裡面的 root 帳密吧!
如果一切都沒有問題,那麼印表機就應該已經建置妥當。你可以點選圖 16.2-3 那個畫面內的『印表機』分頁, 然後就會看到上圖的顯示。如果你只有一部印表機,那麼可以點箭頭 1 所指的『設為預設值』項目, 如果想要知道印表機到底有沒有成功的連接,那可以點選箭頭 2 的『列印測試頁』啊!如果都正常沒問題, 那麼你的系統已經有一部印表機被 CUPS 所管理,且這部印表機在網路的網址為:
接下來看看如何將它連結到咱們的 Samba 伺服器中吧!
開始告訴 Samba 將這部印表機給他分享出去吧!你需要這樣處理:
[root@www ~]# vim /etc/samba/smb.conf [global] # 得要修改 load printers 的設定,然後新增幾個資料 load printers = yes cups options = raw <==可支援來自 Windows 用戶的列印工作 printcap name = cups printing = cups <==與上面這兩個在告知使用 CUPS 列印系統 [printers] <==印表機一定要寫 printers 喔! comment = All Printers path = /var/spool/samba<==預設把來自 samba 的列印工作暫時放置的佇列 browseable = no <==不被外人所瀏覽啦!有權限才可瀏覽 guest ok = no <==與底下兩個都不許訪客來源與寫入(非檔案系統) writable = no printable = yes <==允許列印很重要的一項工作! [root@www ~]# testparm <==若有錯誤,請自行處理一下 [root@www ~]# /etc/init.d/smb restart |
基本上透過這樣的設定你的 Samba 就能夠順利的提供印表機的服務了!不過可惜的是,Windows
用戶端依舊得要安裝印表機的驅動程式才能夠使用 Samba 所提供的印表機,此時真是麻煩兼討厭啊~有沒有可能讓
Samba 主動的提供驅動程式給使用者,這樣一來用戶端就不需要額外去找驅動程式囉!是可以的,透過 Samba 3.x
即可處理!就這麼巧, CentOS 的 Samba 就是 3.x 呢!所以我們可以透過底下的方式來處理。
另外,或許你會想,印表機的型號這麼多,那麼 Linux 該如何提供這些印表機的驅動程式啊?豈不麻煩? 還好啦, CUPS 主要是透過利用 Postscript 的列印語言與印表機溝通的,因此用戶端只要取得 postscript 的驅動程式他們就能夠使用咱們的 Samba 伺服器所提供的印表機了!如此一來, 不論印表機的型號為何,只要他們能夠支援 Postscript 的列印格式,OK 搞定!而且 CUPS 官網本身就有提供 CUPS 的 Postscript 驅動程式囉!可以到底下的連結去下載:
很棒的是,因為我們是 CentOS 5.x 有支援 rpm 軟體封裝的系統,因此可以直接下載 cups-windows-6.0-1.i386.rpm 這個檔案即可,直接安裝這個 rpm 檔案就能夠取得 cups 對 Windows 的印表機驅動程式了。 這個檔案安裝完畢之後,會將驅動程式放置於 /usr/share/cups/drivers/ 裡頭呦! 不過你得要注意的是,除了這個驅動程式外,要支援 Windows 2000 以後出產的 Windows 版本, 你還得到 Windows XP 底下的目錄去下載幾個 32 位元支援的檔案:
將該目錄下裡面的 PS 開頭的檔案通通下載下來,應該有四個檔案的,請將他複製成為檔名小寫的檔案,並且放置到你 Samba 伺服器上的 /usr/share/cups/drivers/ 目錄下,該目錄內放置的這就是基本的驅動程式說! 在鳥哥的這個目錄底下至少含有這幾個檔案就是了:
[root@www ~]# ll /usr/share/cups/drivers -rw-r--r-- 1 root root 803 4月 20 2006 cups6.inf -rw-r--r-- 1 root root 72 4月 20 2006 cups6.ini -rw-r--r-- 1 root root 12568 4月 20 2006 cupsps6.dll -rw-r--r-- 1 root root 13672 4月 20 2006 cupsui6.dll <==上面為 cups 提供 -rw-r--r-- 1 root root 129024 3月 24 13:29 ps5ui.dll <==底下為 Win XP 提供 -rw-r--r-- 1 root root 455168 3月 24 13:29 pscript5.dll -rw-r--r-- 1 root root 27568 3月 24 13:29 pscript.hlp -rw-r--r-- 1 root root 792644 3月 24 13:29 pscript.ntf |
上述的檔案鳥哥將他打包成為一個檔案了,你可以在底下的連結下載:
不過你得注意,這個檔案內的 Windows 資料是由 32 位元的 Windows XP 上面捉來的,所以對於 Windows 98/ME 是沒有作用的。同時,對於 64 位元的其他較晚期的 Windows 7 等系統可能就得要重新處理了! 你得自行上網查閱相關的資料下載方式喔。接下來我們必須要在 smb.conf 裡面增加一筆新的分享資料,這個分享資料必須是 [print$] 名稱才行!有點類似這樣啦:
[root@www ~]# vim /etc/samba/smb.conf [global] ....(設定保留原本資料).... [homes] ....(設定保留原本資料).... [printers] ....(設定保留原本資料).... [print$] comment = Printer drivers path = /etc/samba/drivers <==存放印表機驅動程式的目錄 browseable = yes guest ok = no read only = yes write list = root <==這個驅動程式的管理員 [project] ....(設定保留原本資料).... [root@www ~]# mkdir /etc/samba/drivers [root@www ~]# chcon -t samba_share_t /etc/samba/drivers # 由於預設的 CUPS 僅有 root 能管理,因此我們以 root 作為印表機管理員; # 同時 SELinux 的類型也要修訂如上的方式!那 root 就得要加入 samba 的支援才行: [root@www ~]# pdbedit -a -u root [root@www ~]# testparm <==測試語法 [root@www ~]# /etc/init.d/smb restart <==重新啟動 [root@www ~]# smbclient -L //127.0.0.1 -U root Password: <==輸入 root 在 samba 的密碼先 Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers project Disk smbuser's project IPC$ IPC IPC Service (This is vbird's samba server) hpljp2015dn Printer 鳥哥實驗室的一部雷射印表機 root Disk Home Directories # 瞧!有看到一部印表機以及驅動程式所在的分享資料囉! |
現在我們要告知 Samba 說,我們的 CUPS 可提供 Windows 用戶端的驅動程式,所以用戶不需要自行設定他們的驅動程式哩! 要由 cups 告知 Samba 是由 cupsaddsmb 這個指令來搞定的,整個指令的執行很簡單的:
[root@www ~]# cupsaddsmb [-H SAMBA 伺服器名] [-h CUPS 伺服器名] \ > -a -v [-U 使用者帳號] 選項與參數: -H :後續接的是 Samba 伺服器名,本機的話可以直接用 localhost 即可; -h :後續接的為 CUPS 的伺服器名,同樣的可使用 localhost 即可; -a :自動搜尋出所有可用的 CUPS 印表機; -v :列出更多的資訊; -U :印表機管理員 # 利用前面的說明將印表機驅動程式掛上 SAMBA (注意 CUPS 管理員預設是 root) [root@www ~]# cupsaddsmb -H localhost -U root -a -v 需要 root 的密碼以透過 SAMBA 存取 localhost:<==輸入 root 在 SAMBA 密碼 # 這裡會閃過很多的訊息,說明已經安裝了某些資訊,底下鳥哥僅列出簡單的訊息而已。 正在執行命令:smbclient //localhost/print$ -N -A /tmp/cupsXzBTmn -c “mkdir W32X86;put /tmp/cupsyu3WEe W32X86/hpljp2015dn.ppd;... 正在執行命令:smbclient //localhost/print$ -N -A /tmp/cupsXzBTmn -c “put /usr/share/cups/drivers/cups6.ini W32X86/cups6.ini;... 正在執行命令:rpcclient localhost -N -A /tmp/cupsXzBTmn -c“adddriver "Windows NT x86" "hpljp2015dn:pscript5.dll:hpljp2015dn.ppd:.... Printer Driver hpljp2015dn successfully installed. 正在執行命令:rpcclient localhost -N -A /tmp/cupsXzBTmn -c“setdriver hpljp2015dn hpljp2015dn” Succesfully set hpljp2015dn to driver hpljp2015dn. [root@www ~]# ll /etc/samba/drivers drwxr-xr-x 3 root root 4096 3月 24 16:41 W32X86 <==這就是驅動程式目錄 |
最後在驅動程式的存放目錄會多出一個 W32X86 的目錄,你可以查詢一下該目錄的內容, 那就是預計要給用戶端使用的驅動程式啦!這樣就搞定了!不過,為了將所有的資料通通驅動, 建議你將 CUPS 及 SAMBA 通通重新啟動吧!
[root@www ~]# /etc/init.d/cups restart [root@www ~]# /etc/init.d/smb restart |
如果一切順利的話,你在 Windows 用戶端應該可以順利的連接到印表機囉! 開心吧!不過,如果你曾經印錯資料,那麼該如何進入 Linux 的 Samba 主機將該資料移除呢? 你最好知道底下的幾個指令,關於這些指令的進階用法則請自行給他 man 看看了:
# 1. 列出所有可用的印表機狀態 [root@www ~]# lpstat -a hpljp2015dn 從 西元2011年03月23日 (週三) 22時56分54秒 開始接受請求 # 2. 查詢目前預設印表機的的工作情況 [root@www ~]# lpq hpljp2015dn 已就緒 沒有項目 # 列出印表機的工作,若有列印工作存在時 (例如關掉印表機再印測試頁),會如下所示: hpljp2015dn 已就緒並正在列印 等級 擁有人 工作 檔案 總計 大小 active root 2 Test Page 17408 byte # 3. 刪除所有的工作項目喔! [root@www ~]# lprm - # 加上那個減號 (-) 代表移除所有等待中的列印工作! |
列印工作就是這樣進行的啦!趕緊試看看吧!接下來探討一下相關的防火牆與安全性的討論!
使用 SAMBA 其實是有一定程度的危險性的,這是因為很多網路攻擊的蠕蟲、病毒、木馬就是透過網芳來攻擊的!
為了抵擋不必要的連線,所以 CentOS 5.x 預設的 SELinux 已經關閉了很多 Samba 連線的功能,
因此預設情況下,很多用戶端的掛載可能會有問題。此外,僅開放有權限的網域來源,以及透過 smb.conf
來管理特定的權限,也是很重要的!同時,Linux 檔案系統的 r, w, x 權限也是需要注意的喔!
我們底下就簡單的介紹一下一些基本的安全性管理吧!
其實就如同第七章 (7.4.5) 裡面提到的,我們透過登錄檔的內容就能夠知道如何解決 SELinux 對各個服務所造成的問題了。不過,既然我們知道服務是 Samba 了,能不能找出與 Samba 有關的 SELinux 規則呢?當然可以!基本的 Samba 規則主要有:
[root@www ~]# getsebool -a | grep samba samba_domain_controller --> off <==PDC 時可能會用到 samba_enable_home_dirs --> off <==開放用戶使用家目錄 samba_export_all_ro --> off <==允許唯讀檔案系統的功能 samba_export_all_rw --> off <==允許讀寫檔案系統的功能 samba_share_fusefs --> off samba_share_nfs --> off use_samba_home_dirs --> off <==類似使用者家目錄的開放! virt_use_samba --> off |
看吧!幾乎所有的規則預設都是關閉的!所以我們需要慢慢的打開啊!目前我們僅會用到使用者的家目錄以及分享成為可讀寫, 不過似乎僅要 samba_enable_home_dirs 那個項目設定妥當即可喔!因此我們可以這樣做:
[root@www ~]# setsebool -P samba_enable_home_dirs=1 [root@www ~]# getsebool -a | grep samba_enable_home samba_enable_home_dirs --> on |
這樣使用者掛載他們的家目錄時 (例如 smb1 使用 //127.0.0.1/smb1/) 就不會出現無法掛載的怪問題了!此外, 由於分享成為 Samba 的目錄還需要有 samba_share_t 的類型。那我們還有分享 /home/project 還記得嗎?那個目錄也需要修訂喔! 這樣做看看:
[root@www ~]# ll -Zd /home/project drwxrws--- root users root:object_r:user_home_dir_t /home/project/ [root@www ~]# chcon -t samba_share_t /home/project [root@www ~]# ll -Zd /home/project drwxrws--- root users root:object_r:samba_share_t /home/project/ |
如果你分享的目錄不只是 Samba ,還包括 FTP 或者是其他的服務時,那可能就得要使用 public_content_t
這個大家都能夠讀取的類型才行!若你還有發現任何 SELinux 的問題,請依照 /var/log/messages 裡面的資訊去修訂吧!
最簡單的管理登入 SAMBA 的方法就是透過 iptables 啦!詳細的說明我們已經在第九章防火牆中提過了,所以這裡不再詳加說明。 要知道的是,如果你僅要針對底下的範圍開放 Samba 時,可以這樣想:
所以 iptables.allow 規則當中應該要加入這幾項:
[root@www ~]# vim /usr/local/virus/iptables/iptables.allow # 加入底下這幾行! iptables -A INPUT -i $EXTIF -p tcp -s 192.168.100.0/24 -m multiport \ --dport 139,445 -j ACCEPT iptables -A INPUT -i $EXTIF -p tcp -s 192.168.1.0/24 -m multiport \ --dport 139,445 -j ACCEPT iptables -A INPUT -i $EXTIF -p udp -s 192.168.100.0/24 -m multiport \ --dport 137,138 -j ACCEPT iptables -A INPUT -i $EXTIF -p udp -s 192.168.1.0/24 -m multiport \ --dport 137,138 -j ACCEPT [root@www ~]# /usr/local/virus/iptables/iptables.rule |
這是很簡單很簡單的防火牆規則,你必須要依據你的環境自行修改 (通常修改那個 192.168.1.0/24 網段即可!)。
由於 smbd 及 nmbd 並不支援 TCP Wrappers ,所以你也只能透過 iptables 來控制了~
事實上 Samba 已經有許多防火牆機制啦!那就是在 smb.conf 內的 hosts allow 及 hosts deny 這兩個參數。 通常我們只要使用 hosts allow 即可,那麼沒有寫入這個設定項目的其他來源就會被拒絕連線的!這是比較嚴格的設定。 舉例來說,如果你只想要讓本機、192.168.100.254, 192.168.100.100, 192.168.1.0/24 使用 SAMBA 而已,那麼可以這樣寫:
[root@www ~]# vim /etc/samba/smb.conf [global] # 跟防火牆的議題有關的設定 hosts allow = 127. 192.168.100.254 192.168.100.100 192.168.1. [homes] ....保留原始設定.... [root@www ~]# testparm [root@www ~]# /etc/init.d/smb restart |
這個設定值的內容支援部分比對,因此 192.168.1.0/24 只要寫出前面三個 IP 段即可 (192.168.1.)。
如此一來不但只有數部主機可以登入我們的 SAMBA 伺服器,而且設定值又簡單!不像 iptables 寫的落落長~
鳥哥建議在防火牆議題方面,只要使用 iptables 或 hosts allow 其中一項即可,當中又以 hosts allow 較為建議唷!
當然啦,如果你是針對區網開放的,那麼設定 iptables 防火牆反而是比較好的呦!因為不需要更動到 smb.conf
設定檔嘛!讓服務的設定變的比較單純些~
既然網芳是要分享檔案系統給用戶的,那麼想當然爾,各個 Samba 用戶們確實會將資料放置到你的 Samba 伺服器上嘛! 那萬一單個用戶隨便上傳個數百 GB 的容量到你的 Samba 伺服器,而且常常給你隨意存取一番, 會不會造成檔案系統分配不公或者是頻寬方面的問題呢?想想就覺得是『會嘛!』那怎辦?就透過 Quota 磁碟配額啊! 磁碟配額我們在基礎篇第三版第十五章已經談過,在本書第一章 (1.2.2-3) 裡面也已經有實作過, 在底下請你依據第一章的後續動作來處理吧!
例題:
我們預計分配 smb1, smb2, smb3 在他們自己的家目錄下,各擁有 300MB/400MB (soft/hard) 的磁碟配額限量,那該如何做?
答:
請先依據第一章的 Quota (1.2.2-3) 相關資料處理完:
|
現在你知道 Samba 伺服器的功能是用來作為檔案伺服器的,每個使用者都可以擁有家目錄,並透過網芳的功能來連結到 Samba 伺服器中。這就有個問題啦,那就是你的使用者如果太多,並且將他們的重要資料都放到這部 Samba 伺服器上頭的話,那肯定 /home 未來會有點不足啊!所以 /home 所在的磁碟或許可以使用大一點的硬碟, 或者使用磁碟陣列,使用 LVM (基礎學習篇第三版十五章) 也是個不錯的方案。 底下為簡單的思考方向:
另外,如果你的 Samba 伺服器需要掛載含有中文的 partition 時,譬如說你將原本 Windows XP 的 FAT32 檔案系統挪到 Linux 系統下,此時如果用一般模式來掛載該分割槽時,一些中文檔名可能會無法被順利的顯示出來。 這個時候你就得需要這樣做了:
mount -t vfat -o iocharset=big5,codepage=950 /dev/sd[a-p][1-15] /mount/point |
其中 iocharset 指的是本機的語系編碼方式, codepage 則與遠端軟體有關。因為我們是在本機進行掛載, 所以實際上使用 iocharset 這個參數即可啦!更多說明則請看下節的用戶端設定部分囉!
現在你已經架設好了 Samba 伺服器啦!有伺服器當然要有用戶端來使用才是好的伺服器嘛!不然要這個伺服器幹嘛? 而我們假設區域網路內有 Windows/Linux 系統,這兩種系統都是透過 NetBIOS over TCP/IP 來連上 Samba 伺服器的, 在設定之前你必須要知道的有幾件事:
接下來咱們就分別依照 Windows XP 及 Linux 系統來做說明吧!
在 Windows 上面的搜尋網路上的網芳主機實在挺簡單的,你有好幾種方法可以處理:
舉例來說,如果想要連接到我們的 Samba 主機的話,而又不知到這部 Samba 主機的 NetBIOS name , 那利用搜尋的結果會有點類似如下的圖示:
上圖中先在左側的地方輸入正確的 IP 後,按下搜尋,如果一切順利的話那麼右上方就會出現這部 Samba 伺服器的說明了。 雙擊一下該主機名稱,就會出現右下方的項目!瞧!那就是我們之前所設定的幾個基本項目的啦!真是好高興! 然後你就可以開始進入相對應的目錄進行資料的存取了,就這麼簡單。 如果是印表機的話,那麼你將滑鼠移動到印表機的上方,按下右鍵後可以選擇『連線』的項目,如下所示:
如果一切順利的話,嘿嘿!你就可以在點選『開始』、『設定』、『印表機和傳真』後所出現的視窗看到這部印表機囉! 真是好棒吶! ^_^!另外,如果你想要每次 Windows 開機後都自動的將某個網芳的目錄自動掛載到檔案總管內呢? 那麼可以使用底下的方式,在要掛載的目錄上按下右鍵:
選擇網路磁碟機之後就會出現如下的圖示,你可以自己調整想要的磁碟機代號,例如預設的 Z 槽, 那麼以後你的檔案總管中就會生出一個 Z 槽,該磁碟槽就代表 \\192.168.1.10\project 那個分享的目錄囉!
由於網芳的資安問題越來越嚴重,因此 Windows XP 之後的版本都預設僅開放本機 IP 網域的網芳連線而已。 如果你的 Windows 想要讓別人可以在 Internet 或不同的 IP 網段對你連線時,你就得修改一下防火牆的設定啊! 請叫出控制台,然後點選『Windows 防火牆』就會出現如下的圖示了:
按照上圖的說明,依序點選『例外』、『檔案及印表機共用』、『編輯』後, 就會出現該防火牆機制所管理的埠口以及可連線的網域,如下圖所示:
你可以將四組埠口通通改變成你所需要的 IP 來源,或者是將他設定為任何電腦都能連線。 不過,鳥哥不建議喔!可以參考底下的作法:
選擇自訂的方式來設定能夠使用你 Windows 網芳資料的來源 IP 或網段即可,然後確定之後即可處理吶!
這樣一來,即使我們的 Linux 不與 Windows 同在一個網域中,也能夠登入 Windows 存取網芳資料哩。
如果你知道 Samba 伺服器有啟用 port 445 ,並且他已經分享了某個目錄時,舉例來說,我們的 192.168.100.254 有分享出 project 這個分享資源名稱時,那麼這個目錄的完整寫法為:『 \\192.168.100.254\project 』, 我們可以透過『開始』、『執行』來處理這個玩意兒!如下所示:
如果可以登入的話就會順利登入,否則就會彈出一個要你輸入帳號密碼的視窗,輸入正確的資料即可! 呼呼!真過癮~除此之外,我們還可以登入別人 Windows 主機的 C 或 D 槽喔!寫法則變成這樣:
所以說,怕了吧!俺還真害怕~所以啊,Samba 沒必要時,那個 port 445 應該是可以關閉的吧!
咱們的 Samba 有提供 Linux 網芳的用戶端功能喔!也就是說 Linux 可以掛載 Samba 伺服器也能掛載 Windows 提供的網芳啦!主要是透過 smbclient 來觀察,再以 mount 來掛載檔案系統哩。先來介紹一下 smbclient 這個指令吧:
# 1. 關於查詢的功能,例如查出 192.168.100.254 的網芳資料 [root@client ~]# smbclient -L //[IP|hostname] [-U username] [root@client ~]# smbclient -L //192.168.100.2541 -U smb1 Password: Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] Sharename Type Comment --------- ---- ------- IPC$ IPC IPC Service (This is vbird's samba server) project Disk smbuser's project print$ Disk Printer Drivers hpljp2015dn Printer 鳥哥實驗室的一部雷射印表機 smb1 Disk Home Directories <==等一下用這個當範例 Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] Server Comment --------- ------- Workgroup Master --------- ------- VBIRDHOUSE VBIRDSERVER # 從這裡可以知道在目前網域當中有多少個工作群組與主要的名稱解析主機 |
除了這個先前用過的查詢功能之外,我們可以這樣簡易使用網芳的:
# 2. 利用類似 FTP 的方式登入遠端主機 [root@client ~]# smbclient '//[IP|hostname]/資源名稱' [-U username] # 意思是使用某個帳號來直接登入某部主機的某個分享資源,舉例如下: [root@client ~]# smbclient '//192.168.100.254/smb1' -U smb1 Password: Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1] smb: \> dir # 在 smb: \> 底下其實就是在 //192.168.100.254/dmtsai 這個目錄底下啦!所以, # 我們可以使用 dir, get, put 等常用的 ftp 指令來進行資料傳輸了! ? :列出所有可以用的指令,常用! cd :變換到遠端主機的目錄 del :殺掉某個檔案 lcd :變換本機端的目錄 ls :察看目前所在目錄的檔案 dir :與 ls 相同 get :下載單一檔案 mget:下載大量檔案 mput:上傳大量檔案 put :上傳單一檔案 rm :刪除檔案 exit:離開 smbclient 的軟體功能 # 其他的指令用法請參考 man smbclient 喔! |
事實上,使用 smbclient 一點也不方便,因為使用的是 ftp 的功能語法,有點怪怪的~能不能像 Windows 那樣,可以直接連線網路磁碟機啊?這當然沒有問題!不過就需要藉由 mount.cifs 來協助了!
早期的 Samba 主要是提供 smbmount 或 mount.smbfs 這個指令來掛載 (smbfs 是 SMB filesystem 的縮寫), 不過這個指令已經被可以進行比較好的編碼判斷的 mount.cifs 所取代啦!mount.cifs 可以將遠端伺服器分享出來的目錄整個給他掛載到本機的掛載點,如此一來, 遠端伺服器的目錄就好像在我們本機的一個分割槽一樣喔!可以直接執行複製、編輯等動作!這可就好用的多了! 底下我們來談一談怎麼用這個 mount.cifs 吧!
[root@client ~]# mount -t cifs //IP/分享資源 /掛載點 [-o options] 選項與參數: -o 後面接的參數 (options) 常用的有底下這些: username=你的登入帳號:例如 username=smb1 password=你的登入密碼:需要與上面 username 相對應啊! iocharset=本機的語系編碼方式,如 big5 或 utf8 等等; codepage=遠端主機的語系編碼方式,例如繁體中文為cp950 # 範例一:以 smb1 的身份將其家目錄掛載至 /mnt/samba 中 [root@client ~]# mkdir /mnt/samba [root@client ~]# mount -t cifs //192.168.100.254/smb1 /mnt/samba \ > -o username=smb1,password=4321,codepage=cp950 [root@client ~]# df 檔案系統 1K-區段 已用 可用 已用% 掛載點 //192.168.100.254/smb1 25396668 176724 23914208 1% /mnt/samba |
經由 mount 的動作,我們就可以輕易的將遠端分享出來的咚咚給他掛載到自己 Linux
本機上面!好用的很~更詳細的 mount 用法,請 man mount!
現在我們可以透過一些 NetBIOS 相關的功能來取得 NetBIOS name ,不過,如果你還想要知道這個 NetBIOS name 的其他資訊時, 例如 IP、分享的資源等等,那可以使用 nmblookup 這個指令來搞定即可。他是這麼使用的:
[root@client ~]# 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 資料; # 範例一:藉由 192.168.100.254 找出 vbirdserver 這部主機的 IP 位址 [root@client ~]# nmblookup -U 192.168.100.254 vbirdserver querying vbirdserver on 192.168.100.254 192.168.100.254 vbirdserver<00> 192.168.1.10 vbirdserver<00> <==之前鳥哥就說有兩個 IP 嘛!俺的主機! # 範例二:找出 vbirdserver 的 MAC 與 IP 等資訊: [root@client ~]# nmblookup -S vbirdserver querying vbirdserver on 192.168.100.255 <==在區網內廣播開始找! 192.168.100.254 vbirdserver<00> <==找到 IP 囉! Looking up status of 192.168.100.254 VBIRDSERVER <00> - B <ACTIVE> ..__MSBROWSE__. <01> - <GROUP> B <ACTIVE> VBIRDHOUSE <00> - <GROUP> B <ACTIVE> |
如果你想要使用類似 Windows 上面,可以一看就明瞭各個網芳所分享的資源時,你能使用 smbtree 來直接查詢喔! 這個指令更簡單!直接輸入就能用:
[root@client ~]# smbtree [-bDS] 選項與參數: -b :以廣播的方式取代主要瀏覽器的查詢 -D :僅列出工作群組,不包括分享的資源 -S :列出工作群組與該工作群組下的電腦名稱 (NetBIOS) 不包括各項資源目錄 # 範例一:列出目前的網芳樹狀相關圖 [root@client ~]# smbtree Password: <==直接按 [Enter] 即可! VBIRDHOUSE \\VBIRDSERVER This is vbird's samba server \\VBIRDSERVER\hpljp2015dn 鳥哥實驗室的一部雷射印表機 \\VBIRDSERVER\print$ Printer Drivers \\VBIRDSERVER\project smbuser's project \\VBIRDSERVER\IPC$ IPC Service (This is vbird's samba server) [root@client ~]# smbtree -S Password: VBIRDHOUSE \\VBIRDSERVER This is vbird's samba server # 此時僅有工作群組與電腦名稱而已呢! |
其實這個指令算是伺服器的相關功能啦!因為它主要的目的是查閱目前 SAMBA 有多少人來連線, 且哪些資源分享已經被使用等等的資訊。所以如果你想要使用這個軟體,請先安裝 samba 喔!簡單用法如下:
[root@www ~]# smbstatus [-pS] [-u username] 選項與參數: -p :列出已經使用 SAMBA 連線的程序 PID ; -S :列出已經被使用的資源分享狀態; -u :只列出某個使用者相關的分享資料 # 範例一:列出目前主機完整的 Samba 狀態 [root@www ~]# smbstatus Samba version 3.0.33-3.29.el5_5.1 PID Username Group Machine ------------------------------------------------------------------- 2656 smb1 smb1 ksu-dic (192.168.1.101) 3800 smb1 smb1 192.168.100.254 (192.168.100.254) 3979 smb1 smb1 192.168.100.100 (192.168.100.100) # 上半部主要在列出目前連線的狀態中,主要來自那個用戶端機器與登入的用戶名 Service pid machine Connected at --------------------------------------------------- smb1 3800 192.168.100.254 Tue Mar 29 23:10:56 2011 smb1 3979 192.168.100.100 Wed Mar 30 00:28:39 2011 IPC$ 2656 ksu-dic Tue Mar 29 15:11:30 2011 # 這部分則顯示出,目前有幾個目錄被使用了?那個 smb1 代表 //IP/smb1/ 喔! |
你可以透過這個小程式來瞭解到目前有多少人使用你的 SAMBA 的啦!
我們在 16.1.5 約略談過 PDC 這個玩意兒,他可以讓使用者在電腦教室的任何一個地方,都用同一組帳號密碼登入,
並可取得相同的家目錄等資料,這與我們之前談到的,在 Linux 底下使用 NIS 搭配 NFS 是很類似的作法!
只是它是用在 Windows 上頭就是了。那如何完成呢?我們底下就來談談這個玩意兒!^_^
前面介紹的內容都是屬於 Peer/Peer 的連線狀況,也就是 Samba 伺服器與 Windows 用戶端其實是平等地位的啦! 所以 Windows 用戶端需要知道 Samba 伺服器內的帳號密碼資料後,才能夠順利的使用 Samba 的資源。 不過,這樣的方式在較大型一些的區域網路環境可能就會有點困擾,例如學校的環境。
舉例來說,如果你有一個電腦教室裡面有 50 部 Windows XP Pro. 的個人電腦,由於電腦教室大家都會使用, 因此裡面這 50 部個人電腦有使用還原精靈,也就是每次電腦重新開機後整個作業系統就會還原成原本的樣子。 但我們知道使用者總是需要有個人家目錄吧?他們總不希望這次的工作在重新開機後就失去了~ 所以我們可以利用一部主機來讓他們儲存資料啊!那就是 Primary Domain Controller (PDC) 伺服器。
其實 Samba PDC 的作用很簡單,就是讓 Samba PDC 成為整個區域網路的領域管理員 (domain controller), 然後讓 Windows 主機加入這個領域,未來使用者利用 Windows 登入時,(1)Windows 會前往 PDC 伺服器取得使用者的帳號密碼, 同時 (2)PDC 還會傳送使用者的重要資料到那部 Windows 個人電腦上,而 Windows 電腦上的使用者登出時, (3)該使用者修改過的資料也會回傳給 PDC 。如此一來不管這個使用者在哪一部個人電腦上面登入, 他都能夠取得正確的個人資料!很棒的作用吧!
PDC 是個很複雜的環境,他可以達到的功能相當的多,而且密碼的驗證也不必在同一部 PDC 主機上面, 不過這裡我們不談那麼複雜的東西,只是做一個簡單的練習,因此底下的這部 PDC 使用 Linux 自己的密碼來進行驗證, 並且也只管理自己所分享出去的資源囉!至於假設網路環境與相關工作群組參數如下:
整個基本的設定流程應該是這樣的:
底下咱們就來依序處理處理先!
PDC 伺服器的建立非常的麻煩,需要一步一步的實作進行,挺討厭的。而且,由於建置 PDC 的環境主要在管理整個區網內的
Windows 電腦,因此每部 Windows 電腦的主機名稱與相關參數要先確定下來,如同上一小節的圖示內,
每部電腦的角色定位都需要清楚才行。清楚了各個電腦的角色後,接下來就能夠慢慢的實作進行囉!
由於我們的 Samba 即將成為整個網域的名稱解析者,因此你最好將整個網域的 NetBIOS name 與 IP 的對應寫入 lmhosts 檔案當中。如果你的區網是以 DHCP 發放 IP 的,那麼你最好搭配 DNS 系統去建置你的主機名稱對應資訊, 否則主機名稱對應不起來,總是有點困擾。在這個案例中,由於鳥哥使用的 NetBIOS name (如 vbirdserver) 與主機名稱 (如 www.centos.vbird) 並不相同,因此這裡建議需要修改 lmhosts 才好。
[root@www ~]# vim /etc/samba/lmhosts 127.0.0.1 localhost <==這行是預設存在的,不要動他,底下的請自行新增 192.168.100.254 vbirdserver 192.168.100.1 vbirdwinxp 192.168.100.2 vbirdwin7 192.168.100.100 vbirdlinux [root@www ~]# vim /etc/hosts 192.168.100.254 www.centos.vbird vbirdserver 192.168.100.100 client.centos.vbird vbirdlinux 192.168.100.1 vbirdwinxp 192.168.100.2 vbirdwin7 |
由於 Linux 上的 Samba 很多資料還是與 TCP/IP 的主機名稱有關,所以除了 lmhosts 之外,建議還是處理一下 /etc/hosts
比較妥當!這樣就行啦!
假設我們要讓 PDC 用戶端登入時可以取得他自己的家目錄,那麼需要這樣處理:
[root@www ~]# vim /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 security = user passdb backend = tdbsam load printers = yes cups options = raw printcap name = cups printing = cups # 與 PDC 有關的一些設定值: # 底下幾個設定值處理成為本區域網路內的主要名稱解析器 preferred master = yes domain master = yes local master = yes wins support = yes # 作業系統 (OS) 等級越高才能成為主網域的控制者,一般 NT 為 32, # Windows 2000 為 64 ,所以這裡我們設定高一點,但不可超過 255 os level = 100 # 底下則是設定能否利用 PDC 登入,且登入需要進行哪些動作: domain logons = yes logon drive = K: <==登入後家目錄掛載成 Windows 哪一槽 logon script = startup.bat <==每個使用者登入後會自動執行的程式 time server = yes <==自動調整 Windows 時間與 Samba 同步 admin users = root <==預設的管理員帳號!預設為 root logon path = \\%N\%U\profile <==使用者的個人化設定 logon home = \\%N\%U <==使用者的家目錄位置! # 這個在指定登入者能夠進行的工作,裡面主要是具有許多執行程式: [netlogon] <==與前面的 logon script 有關,該程式放置在這裡 comment = Network Logon Service path = /winhome/netlogon <==你要自己主動建立此目錄 writable = no write list = root follow symlinks = yes guest ok = yes [homes] ....(底下保留原本設定).... [root@www ~]# testparm [root@www ~]# /etc/init.d/smb restart |
上面的設定有幾個地方比較有趣一點:
先來建立 [netlogon] 內所需要的資料好了,那就是一個目錄。由於鳥哥預計將所有的 PDC 資料通通放置到 /winhome 當中,包括使用者家目錄,因此很多東西都需要修訂喔!包括後來的 SELinux 肯定會出問題的~
[root@www ~]# mkdir -p /winhome/netlogon
|
接下來我們還得要建立允許使用者執行的檔案,就是那個 startup.bat 才行! 注意一下,我們這裡假設使用者家目錄為 K 槽,那你可以這樣做:
[root@www ~]# vim /winhome/netlogon/startup.bat net time \\vbirdserver /set /yes net use K: /home # 這個檔案的格式為:net use [device:] [directory] # 再將該檔案轉成 DOS 的斷行格式才行!因為是提供給 Windows 系統嘛! [root@www ~]# unix2dos /winhome/netlogon/startup.bat [root@www ~]# cat -A /winhome/netlogon/startup.bat net time \\vbirdserver /set /yes^M$ net use K: /home^M$ # 瞧見嗎?會多出個奇怪的 ^M 符號,那就是 Windows 斷行字元。 |
因為鳥哥預計將使用者全部挪到 /winhome 底下,而且每個使用者家目錄應該還要有 profile 目錄存在才行, 為了避免麻煩,所以我們先到 /etc/skel 去處理一下,然後才建立帳號,最後才產生 samba 用戶吧! 產生 samba 用戶可以使用 pdbedit 也能夠直接使用 smbpasswd -a ,因為沒有要用特殊的參數, 所以,Samba 用戶就用舊的 smbpasswd 來處理即可。
[root@www ~]# mkdir /etc/skel/profile [root@www ~]# useradd -d /winhome/dmtsai dmtsai [root@www ~]# useradd -d /winhome/nikky nikky [root@www ~]# smbpasswd -a root [root@www ~]# smbpasswd -a dmtsai [root@www ~]# smbpasswd -a nikky [root@www ~]# pdbedit -L dmtsai:2007: root:0:root nikky:2008: smb1:2004: student:500:student smb2:2005: # 重點是需要有畫底線的那幾個人物出現才行呦! [root@www ~]# ll /winhome drwx------ 4 dmtsai dmtsai 4096 3月 30 16:51 dmtsai drwxr-xr-x 2 root root 4096 3月 30 15:41 netlogon drwx------ 4 nikky nikky 4096 3月 30 16:51 nikky # 使用者的家目錄不是在 /home 而是在 /winhome 裡頭才是對的呦! |
那以後新增的使用者都有可以存放來自 Windows 的特殊設定檔目錄喔!比較好管理囉~
當然啦,使用 useradd 新增使用者後,記得也要使用 smbpasswd -a username 來讓該使用者可以使用 Samba 喔!
由於 PDC 會針對 Windows 用戶端的主機名稱 (NetBIOS name) 進行主機帳號檢查, 所以我們也要為用戶端的主機名稱進行帳號的設定。咦!啥是主機帳號? 一般使用者帳號是英文或數字,主機帳號則在該帳號最後面加上一個錢字號『$』即可! 舉例來說, vbirdwinxp 這部主機可設定的帳號名稱為 vbirdwinxp$。
而我們知道要使用 smbpasswd 增加的使用者必須要在 /etc/passwd 當中,因此要建立這個帳號你就得要這樣做:
[root@www ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdwinxp$ [root@www ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdwin7$ |
會增加 -M -s -d 等參數的原因是因為不想要讓這個帳號具有可以登入的權限, 因此將這個主機帳號設定的比較怪一點~ ^_^~接下來讓 Samba 知道這個帳號是主機帳號,所以你應該要這樣做:
[root@www ~]# smbpasswd -a -m vbirdwinxp$ [root@www ~]# smbpasswd -a -m vbirdwin7$ |
這樣便加入主機帳號囉!而我們的 Samba PDC 也就可以透過『主機帳號』來判斷 Windows 用戶端能否連上來,
若連接上 PDC 與 Windows 用戶端後,接下來一般使用者帳號就可以在 windows 用戶端登入了!
由於我們建立的帳號目錄在 /winhome 底下,並非正規的 CentOS 目錄,所以最重要的 SELinux 可能會跑掉~ 所以,我們還得要修訂 SELinux 才行!方法很簡單,將 SELinux type 轉為 samba_share_t 即可!
[root@www ~]# chcon -R -t samba_share_t /winhome
|
由於 SELinux 的資料是會繼承上層目錄的,因此未來新增的用戶,理論上,就不需要重新修訂 SELinux 的檔案類型了。 但是,如果你老是發現登入 PDC 的帳號卻無法取得家目錄,那麼就觀察 /var/log/messages 內的資料來修訂吧!
請注意,底下的方法僅適用於 Windows 2000, Windows XP 專業版 (Pro.),一般的 Windows XP home 版本是不支援的!
如果你用戶端的主機是隨機版的 Windows XP ,通常是 Windows XP home ,那底下的方法可能就無法適用囉!
要連接上 Samba PDC 的過程也是挺簡單的,你可以這樣做:
(至於 Windows 7 對於 Samba 的版本要求較高,官方網站是說得高於 3.3.x 以上版本才有支援)
首先我們必須要確認 Windows 用戶端的工作群組與主機名稱跟咱們的 Samba PDC 相同, 確認的方式在區域網路裡面已經提過了,這裡在強調一次。將滑鼠移動到『我的電腦』上面,按下右鍵, 選擇『內容』,然後點選『電腦名稱』,會出現如下圖示:
如上圖所示,你要先確認箭頭 1 處指的主機名稱與工作群組,在我們這個案例當中的工作群組為 vbirdhouse,
這部 Windows 主機的 NetBIOS 名稱則為 vbirdwinxp 喔!如果不對的話,請按下『變更』來設定,
並且重新開機。重新開機完畢後再到上圖的畫面當中,按下箭頭 2 所指的網路識別處。
接下來我們要設定這部 Windows XP pro. 要連結到區域網路上的哪部 PDC 上面,亦即是處理主機帳號以及 Samba PDC 負責的網域 (domain) 啦!在圖 16.4-2 按下『網路識別』後,分別在出現的視窗當中選擇:
然後就會出現如下的視窗:
請依序填寫 Samba 主機上面的管理員帳號與密碼,要注意這個密碼是記錄於 Samba 中的那個,可不是 /etc/shadow 喔!別搞混了~這是 Samba 伺服器的設定呢。輸入之後按下一步吧,通常都會出現找不到正確主機的畫面,如下所示:
鳥哥也覺得很奇怪,老是告訴我找不到!不過沒有關係,這裡我們依舊再填一次主機的 NetBIOS name 以及群組名稱, 如上圖所示,然後繼續按下一步,就會出現如下的畫面啦:
這次就給他輸入正確的管理員帳號與密碼,記得最後面的網域就是工作群組名稱,別寫錯了。 處理完畢後給他按下確定吧!然後就會出現如下畫面:
恭喜你,這就表示已經連接上 Samba PDC 囉!我們希望所有的使用者都直接由 Samba PDC 控管,所以這裡請填寫
『此時不新增使用者』吧!按下一步去。
在圖 16.4-6 之後請重新開機,開機後整個畫面會有點類似這樣:
為了保護我們的系統,因此得要按下 [ctrl]+[alt]+[del] 三個組合按鍵後,才會出現如下的登入畫面:
目前系統上面就會有兩個可選擇的帳號管理模式,一個是本機帳號一個是 PDC 提供的帳號,那我怎知登入者是哪個管理模式? 所以你就得要按下上述畫面的『選項』,才會出現『登入到』的那一行資料。出現的兩個資料分別是:
現在請輸入你在 Samba PDC 上面擁有的帳號與密碼來嘗試登入吧!那如果你輸入的帳號密碼是對的,卻發現如下的畫面時, 肯定是某些檔案權限或者是 SELinux 設定錯誤!請參考 /var/log/messages 或 /var/log/samba/* 裡面的登錄檔來修改!
如果你可以順利登入的話,打開檔案總管後應該可以看到類似下方的畫面:
呵呵!該連上的通通連結上來囉!你也可以在自己的家目錄 (K 槽) 新增移除資料的!是否很不錯啊! ^_^! 而當你登出之後,你在 Windows 桌面上頭所進行的各項個人化設定通通會被移動到 /winhome/dmtsai/profile 當中喔! 如果不相信的話,請自行前往 Samba 伺服器上頭瞧一瞧就知道了。
很抱歉,由於 Windows 7 的 PDC 支援僅在 Samba 3.3.x 以上版本才有該補丁 (patch),而我們目前的版本為 3.0.x, 因此目前暫時無法提供 Windows 7 的相關加入動作。根據釋出公告顯示, CentOS 6.x 使用的是 samba 3.5.x 版本, 所以,讓我們期待新的版本所帶來的優勢吧! ^_^!如果你有急切的需求,可以參考:
如果老是發生錯誤訊息為『使用的帳戶是電腦帳戶。請使用你的通用使用者帳戶或本機使用者帳戶來存取這台伺服器』時, 你可以這樣做的:
在鳥哥嘗試過的案例中,上面第二個步驟挺有效的!不過,還是得要察看 /var/log/samba 裡面的登錄資訊才行喔!
雖然 PDC 很好用,不過你要注意的是,每次你使用 PDC 上頭的帳號登入 Windows 用戶端主機時, Windows 主機會由 /winhome/username/profile/ 當中載入所需要的資料, 並暫時啟動一個資料夾在 Windows 系統的 C:\Documents and Settings\username 當中,如果你的家目錄下的 profile 資料太多時, 光是傳輸就會花去很多時間的!
所以,你應該將一些檔案資料放置到你的家目錄下,亦即 K 槽當中,盡量不要使用 Windows 預設的『我的文件夾』, 因為『我的文件夾』會將資料移動到『 /winhome/username/profile/My Documents/ 』目錄下,同樣的, 儲存到桌面的資料會被放置到『 /winhome/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), Windows 7 是沒有作用的!請先確認才行喔!
除了上述的正規作法之外,其實還有一些稍微重要的事情要跟大家分享的!
通常我們在設定 SAMBA 的時候,如果是以單一主機的工作群組 (Workgroup) 的方式來進行 smb.conf 的設定時,幾乎很容易就可以設定成功了!並沒有什麼很困難的步驟。不過,萬一還是無法成功的設定起來, 請務必察看登錄檔,也就是在 /var/log/samba/ 裡面的資料!在這裡面的資料當中,你會發現:咦! 怎麼這麼多檔案啊!因為我們在 smb.conf 裡面設定了:
那個 %m 是指用戶端電腦的 NetBIOS Name 的意思,所以,當有個 vbirdwinxp 的主機來登入我們的 vbirdserver 主機時,那麼登入的資訊就會被紀錄在 /var/log/samba/vbirdwinxp.log 檔案喔!而如果萬一來源 IP 並沒有 Netbios name 的時候,那麼很可能是一些錯誤訊息,這些錯誤訊息就會被紀錄到 log.smbd, log.nmbd 裡面去了!所以,如果你要察看某部電腦連上你的 SAMBA 主機發生了什麼問題時,特別要留意這個登錄檔的形式喔!
另外,如果你的 SAMBA 明明已經啟動完成了,卻偏偏老是無法成功,又無法查出問題時,建議先關閉 Samba 一陣子,再重新啟動:
在鳥哥過去的案例當中,確實有幾次是因為 PID 與 NetBIOS 的問題,導致整個 SAMBA 怪怪的~所以完整的關閉之後, 經過一陣子的短暫時間,再重新啟動,應該就可以恢復正常了!
還有,萬一你在進行寫入的動作時,老是發現『你沒有相關寫入的權限!』,不要懷疑,幾乎可以確定是 Permission 的問題,也就是 Linux 的權限與 SAMBA 開放的權限並不相符合,或者是 SELinux 在搞鬼!無論如何, 你必須要瞭解能不能寫入 Linux 磁碟,看的是 PID 的權限與 Linxu 檔案系統是否吻合,而那個 smb.conf 裡面設定的相關權限只是在 SAMBA 運作過程當中『預計』要給使用者的權限而已,並不能取代真正的 Linux 權限喔!所以,萬一真的發現該問題存在, 請登入 Linux 系統,查驗一下該對應的目錄的 permission 吧!^_^
另外,通常造成明明已經查到分享 (smbclient -L 的結果),卻老是無法順利掛載的情況,主要有底下幾個可能的原因:
上述都是一些常見的問題,更多問題的解決方案,請參考最正確的登錄檔資訊吧! ^_^
有個問題是,我們知道使用者可以透過 passwd 修改 /etc/shadow 內的密碼,而且使用者也能夠自行以 smbpasswd 修改 Samba 的密碼。如果使用者是類似 PDC 的用戶,那麼這些用戶理論上就很少使用 Linux 啦!那麼想一想, 能否讓用戶在修改 Windows 密碼 (就是 Samba) 時,同步更新 Linux 上面的 /etc/shadow 密碼呢? 答案是可行的啦!而且動作並不困難~因為 smb.conf 裡頭已經提供了相對應的參數設定值!你可以參考底下的網站資料:
鳥哥做個總結,基本上你需要的是 smb.conf 裡面 [global] 的幾個設定值:
[root@www ~]# vim /etc/samba/smb.conf [global] # 保留前面的各項設定值,並新增底下三行即可: unix password sync = yes <==讓 Samba 與 Linux 密碼同步 passwd program = /usr/bin/passwd %u <==以 root 呼叫修改密碼的指令 pam password change = yes <==並且支援 pam 模組! [root@www ~]# testparm [root@www ~]# /etc/init.d/smb restart |
接下來,當你以一般用戶 (例如 dmtsai) 修改 samba 的密碼時,就會像這樣:
[dmtsai@www ~]$ smbpasswd Old SMB password: <==得先輸入舊密碼,才能輸入新密碼 New SMB password: Retype new SMB password: Password changed for user dmtsai <==這就是成功的字樣! # 若出現底下的字樣,應該就是你的密碼輸入被限制了!例如輸入的密碼字元少於 6 個! machine 127.0.0.1 rejected the password change: Error was : Password restriction. Failed to change password for dmtsai |
想像一個案例,如果你是學校的網管人員,有個兼任老師向你申請帳號,主要是要在很多班級內取得同學的專題資料。 因為該老師是兼任的,你或許擔心一不小心該教師就將同學的辛苦資料給銷毀,倒不是教師們故意的, 而是很多時候...不熟嘛!這個時候如果你將該老師加入同學的群組,然後偏偏同學們所在的目錄是群組可寫入的話, 那麼該教師就能夠擁有可讀寫的權限了,也就容易造成一些莫名的災難~
那該怎麼辦?其實可以透過 ACL 來管理某個目錄的單一使用者權限啦!所以說, 權限的管理不必透過 smb.conf 的設定,只要透過 ACL 來管理就能夠達到你所需要的目的了。 關於 ACL 的說明我們在基礎學習篇第三版第十四章已經提過了, 這裡不再囉唆,請自行前往查閱吶! ^_^