SAMBA 伺服器
  
  本文转自鸟哥的空间 http://linux.vbird.org/linux_server/0370samba.php
  
  SAMBA 的發展歷史與名稱的由來
  
  在早期的網路世界當中,檔案資料在不同主機之間的傳輸大多是使用 FTP 這個好用的伺服器軟體來進行傳送。不過使用 FTP 傳輸檔案卻有個小小的問題, 那就是您無法直接修改主機上面的檔案資料!也就是說,您想要更改 Linux 主機上面的某個檔案時,你必須要將該檔案自伺服器上下載下來後才能修改。 也因此該檔案在伺服器與用戶端都會存在。這個時候,萬一如果有一天您修改了某個檔案, 卻忘記將資料上傳回主機,那麼等過了一陣子之後,呵呵,您如何知道那個檔案才是最新的?
  
  
  利用封包偵測逆向工程發展的 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 的名稱由來啦! ^_^
  
  --------------------------------------------------------------------------------
  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 所需套件及其套件結構
  
  目前常見的 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 主機群符合上述的條件後,就很容易處理網芳分享的工作啦!分享的步驟是這樣的:
  
  叫出檔案總管,然後在要分享的目錄、磁碟或裝置 (如印表機) 上面按下右鍵,選擇『共用』,然後就能夠設定好分享的資料了;
  最好建立一組給用戶使用的帳號與密碼,讓其他主機的使用者可以透過該帳號密碼連線進入網芳;
  真是有夠簡單的!那麼 Samba 怎麼設定啊?也是很簡單,依據上述的限制以及流程你可以這樣想像:
  
  在 smb.conf 當中設定好工作群組、NetBIOS 主機名、密碼使用狀態等等與主機相關的資訊;
  在 smb.conf 內設定好預計要分享的目錄或裝置以及可供使用的使用者資料;
  根據步驟 2 的設定,在 Linux 檔案系統當中建立好分享出去的檔案或裝置的使用權限;
  根據步驟 2 的設定,以 smbpasswd 建立起使用者的帳號及密碼
  啟動 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 』喔!
  關於語系編碼,建議您參考一下討論區的這一篇:
  
  http://phorum.vbird.org/viewtopic.php?t=22001
  我們的網友 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 即可。不過,建議先保留預設值啦!
  
  
  基本上,到此為止咱們就設定好一個簡單的不需要密碼即可登入的 Samba 主機了! 你可以先行到用戶端軟體功能的部分進行掛載測試。 底下我們則預計以簡易的需要密碼才能夠登入 Samba 的方式來設計一個範例吧!
  
  
  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
  
  
  由上表我們可以發現,經由不同的身份登入可以取得不一樣的瀏覽資料, 所以在使用上面需要特別留意喔!
  
  
  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 後面即可! 不難吧! ^_^
  
  
  
  --------------------------------------------------------------------------------
  
  windows 使用
  如果可以登入的話就會順利登入,否則就會彈出一個要你輸入帳號密碼的視窗,輸入正確的資料即可! 呼呼!真過癮~除此之外,我們還可以登入別人 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
Logo

更多推荐