SAMBA 設定介紹
發表於 : 2007-09-26 15:48:22
from http://www.twbsd.org/cht/book/ch20.htm
第二十章 SAMBA 網路芳鄰
使用 MS Windows 的人大概都知道我們可以經由「網路上的芳鄰」看到網路中的電腦,並經由共用資料夾來分享檔案、印表機。而在 FreeBSD 中,我們也可以安裝一些軟體來讓 Windows、FreeBSD 的使用者經由網路上的芳鄰共享 FreeBSD 機器中的檔案。使用 FreeBSD 來做為檔案伺服器,可以讓家中、公司的電腦輕易的交換資訊,可以說是非常方便。
本章將介紹如何使用 FreeBSD 架設網路芳鄰,並使用 FreeBSD 去存取 Windows 網路芳鄰的資料。讀完本章後,您將了解下列主題:
* 網路芳鄰的運作原理。
* 安裝及設定 Samba。
* 使用網頁管理 Samba 的設定檔。
* 如何在 Windows 及 FreeBSD 中使用網路芳鄰。
20.1 網路芳鄰簡介
20.1.1 SMB 協定簡介
MS Windows 可以說是目前桌上型電腦中市佔率最高的作業系統,許多人使用 Windows 來進行日常工作。而在 Windows 平台上,使用者可以經由「網路上的芳鄰」來看到不同電腦,並經由設定「共用資料夾」來分享檔案及印表機。Windows 的網路芳鄰其實是使用 SMB/CIFS 通訊協定。
SMB (Server Message Block) 通訊協定最早是在 1980 年代由 IBM 所發展出來,這個通訊協定可以讓不同的電腦共享檔案、印表機、及其它裝置。SMB 最早是運作在 NetBIOS 的網路協上,一開始 IBM 設計了 NetBIOS 只是為了讓網路中少數的電腦可以彼此互相溝通。所以 NetBIOS 的功能比較陽春,在使用上有一些限制。例如,只能使用在區域網路中、跨不過路由器。後來又出現了 NetBEUI (NetBIOS Extend User Interface),也是 IBM 針對 NetBIOS 的改良版。後來又有 NetBIOS over TCP/IP,使得 SMB 協定也可以跑在 TCP/IP 上,並可以經由網際網路存取。在使用 NetBIOS 在存取遠端電腦時,我們可以使用電腦名稱如「\\alex-pc」來存取,而 TCP/IP 只能使用「\\192.168.0.1」這種方式來存取。所以 NetBIOS 也不是一無是處,它提供了比較簡單而易懂的方式。
Microsoft 在 1996 年為了市場考量,將 SMB 改名為 CIFS (Common Internet File System),名稱看起來比較容易了解,顧名思義就是可以在網際網路上使用的檔案系統。所以我們其實不應該稱呼網路上的芳鄰為「網路芳鄰」,而是 SMB/CIFS 通訊協定,就好像我們稱呼 HTTP、FTP 一樣。在 Windows 的世界裡,人們可以使用 SMB/CIFS 來共享檔案。而在 UNIX 的世界裡使用的是 NFS (Network File System);Mac 的世界中則是使用 AppleTalk。我們可以看到不同的作業系統環境中,都有自己的一套方法,不過我們還是可以經由安裝軟體來達成不同平台共享檔案的功能。
20.1.2 Samba 簡介
在 1991 年,澳洲的一位個大學生 Andrew Tridgell 為了要讓 DOS 的機器和 UNIX 的機器可以共享檔案,就在 UNIX 系統中寫了一套 SMB 協定的軟體。經過了一段時間的發展,他想要為這套軟體取一個名字,但又不能直接使用 SMB 這個名字。所以他就翻翻字典,最後找到一個和 SMB 很像的字 Samba。最後 Samba 就開始有長足的發展,加入了許多有志之士。而今,Samba 已經成為 UNIX 世界中 SMB/CIFS 協定的代名詞了。
但為什麼我們要在 UNIX 中使用 Samba 而不直接使用 Windows 的機器來分享檔案呢?以筆者的使用經驗,由於我的 FreeBSD 伺服器是 24 小時開機,在上面安裝了 Samba 之後,網路上的所有電腦都可以使用這台伺服器共享檔案,而不必另外再開一台 Windows 機器。而且,我在編輯網頁、寫程式時,會使用 Samba 將我的網頁資料、程式直接分享出來,再由 Windows 上的文書編輯軟體來進行編輯。存檔後,我不必再使用 FTP 上傳檔案,而是可以直接使用瀏覽器看到編輯的結果,很棒吧。
Samba 的功能可不只有檔案分享,它還可以讓我們使用 UNIX 加入 Windows 的 Domain、ADS,以使用 Windows 的 Domain 使用者權限控管。更多的功能,請參考 Samba 網站的資料。
20.2 安裝設定 Samba
Samba 目前有二個主要的版本:2.2.12 及 3.0.x。2.2.12 已經發展很久了,目前已進入停滯狀態。和 3.0 比較起來,速度稍快、功能較簡單。最大的不同在於 Samba 2.2.12 只支援 code page,而 Samab 3.0 支援 Unicode。Unicode 的支援可以讓我們同時在一個目錄中存放中文、日文、簡體中文等多國語的檔名。所以,筆者建議您安裝 Samab 3.0。
20.2.1 安裝 Samba
Samba 的安裝設定很簡單,我們可以使用 ports 來安裝:
# cd /usr/ports/net/samba3
# make install clean
接著,將出現下列畫面,讓您做一些偏好設定:
圖 20-1
我們維持原本的設定即可,接下來就可以選 OK 繼續編譯了。
20.2.2 基本的設定檔說明
Samba 的設定檔位置為 /usr/local/etc/smb.conf。在安裝完後,設定檔的範本會放在 /usr/local/etc/smb.conf.default,您可以直接複製它來加以修改。
Samba 的設定檔中,一個以中括號括起來的部份就是一個區段,如:[區段名稱] 。除了 [global] 區段外,每一個區段都是一個分享資源的設定。在 [global] 區段中,決定了 Samba 伺服器的主要設定,而其它區段則是不同分享資源的權限設定。[分享資源] 區段可以是印表機或是共用資料夾,我們可以針對不同的目錄設定不同的權限。除了設定的資料外,在 smb.conf 檔案中行首為 ";" 或 "#" 都是註解。
以下為 smb.conf 的主要的設定說明:
#===================== Global Settings =========================
[global]
# workgroup 就是設定電腦的工作群組。
workgroup = Workgroup
# 要使用哪一種安全模式。如果設定為 share,就是任何人都可以存取,無需使用帳號密碼;
# 而設為 user 則是要輸入使用者名稱及密碼。如果我們設為 user,必須要再設定使用者
# 使用者及密碼。我們會在下一小節中做更詳細的說明。
security = user
# Windows 98 及 WinNT SP3 以上會將密碼加密,我們必須將它設為 yes。
encrypt passwords = yes
# 設定可以使用 Samba 的網路介面,可以是 IP/netmask 或是網路卡名稱。
interfaces = fxp1
# 設定新建檔案時的權限為何。Samba 的權限除了看資料夾的權限設定外,還會看 UNIX 的
# 權限。我們將新建檔案的權限設為 0666,新建目錄設為 0777,以讓不同使用者所建立的
# 可以讓有權存取該共享資料夾的使用者存取。
create mask = 0666
directory mask = 0777
# 在下載檔案時,我們使用 FreeBSD 的系統呼叫 sendfile() 以提高下載速度。使用
# sendfile() 可以提高效能近一倍喔!
use sendfile = yes
#========================== Share Definitions ==============
# 這個區段是用來設定我們要分享的資料來。在這個區斷中,有幾個設定的範例可以讓我們參考
# 。以下的範例為設定分享的目錄是 /home/mp3,設定該目錄的分享名稱為 "music",只有
# wheel 群組的使用者才可以寫入。
#
[music]
path = /home/mp3
write list = @wheel
# 另一個範例,假設我們要設定一個上傳區,分享路徑為 /home/upload,具有寫入權限的帳
# 號是 alex 及 wheel 群組,而 samba 群組的使用者只有唯讀的權限。當 security
# 設為 user 時,我們必需先在系統中建立該真實使用者,再使用 smbpasswd 來建立
# Samba 的密碼。必須要注意的是,當您設定某一個使用者對某個目錄具有寫入權限時,該使
# 用者在系統中對於該目錄的 UNIX 權限也必須要有寫入權限才可以喔。
[upload]
path = /home/upload
write list = alex,@wheel
valid users = @samba
上述設定檔中,在全域設定方面,您大概只需要修改「interfaces」部份即可。接下來的設定重點在於各個共用資料夾的設定。共用資料夾可以讓我們分享系統中的某個目錄,分享的名稱以中括號括起來。例如,我們想要分享系統中的 /home/mp3,而使用者連進來後,看到的資料夾名稱為「music」,則我們必須要設定一個區段名為 [music]。在共用資料夾權限設定方面,我們可以使用下列參數:
* path:設定該共用資料夾在系統中的真正路徑。
* invalid users:設定不可以使用此資料夾的使用者。如果是群組名稱,則必須在名稱之前加上 @。有多個使用者及群組時,可以使用逗號分開。
* write list:設定具有讀寫權限的使用者及群組。如果是群組名稱,則必須在名稱之前加上 @。有多個使用者及群組時,可以使用逗號分開。
* valid users:設定具有讀取權限的使用者。如果是群組名稱,則必須在名稱之前加上 @。有多個使用者及群組時,可以使用逗號分開。
* browseable:設定該資料夾是不是要在使用者瀏覽有哪些資料夾時顯示出來。可以設為 yes 或 no。如果設為 no,則該資料夾在瀏覽時並不會出現,而只能直接使用 \\ip\share 來進入該資料夾 (假設名稱為 share)。
當我們連線到一個 Samba 伺服器時,如果「security」模式設為 user,Samba 會先訊問使用者名稱及密碼。接下來,要進入一個共用資料夾時,會經過下列檢查:
* 檢查使用者是否在「invalid users」中,如果有,則不可以存取。
* 檢查使用者是否在「valid users」中,如果有則可以存取。如果使用者不在「invalid users」及「valid users」中,則表示可以存取。
* 檢查使用者是否在「write list」中,如果有,則具有讀寫權限。
基於上述規則,建議您先在「invalid users」中加入不可以使用 Samba 資源的群組,再設定可以讀寫的使用者即可。
您必須特別注意的是,由於 Samba 3.0 支援 Unicode (UTF-8),如果您要將共用資料夾名稱設定為中文,請使用支援 UTF-8 的文書編輯器來編輯 smb.conf,並在存檔時將檔案存成 UTF-8 的純文字格式。Windows 支援 UTF-8 的文書編輯器如 Word、UltraEdit、EmEditor,在存檔時,必須使用 UNIX 的換行格式。以 Word 為例,在存檔時,我們將檔案存成純文字檔 (txt),接下來會出現下列選單:
圖 20-2
接下來,您可以就可以將該檔案放到 FreeBSD 中,並將副檔名 .txt 移除,更名為 smb.conf。還有一點,由於 Windows 的文書編輯軟體會在檔案最開頭加入三個 Unicode 的辨識字元,當您以 ee 打開該檔時,可能看到下列這樣的內容:
嚜璟global]
workgroup = Workgroup
server string = FreeBSD
interfaces = lnc0
security = user
encrypt passwords = Yes
create mask = 0777
我們可以看到檔案第一行的開頭有亂碼,這時候,請使用 ee 刪除開始的三個字元,讓第一行變成 [global] 即可。
小提示
支援 Unicode 的好處是您可以同時使用中文、日文、韓文等多國語。但在共用資料夾名稱中使用中文時,設定會比較麻煩一點。不過您一定要記得,當共用資料夾要設為中文時,smb.conf 一定要存成 UTF-8 格式,否則資料夾名稱會看不到或是變亂碼喔。
對於分享的資料夾除了要在 Samba 設定你想要的權限外,對於該目錄在 UNIX 系統上的讀寫權限也要配合。如果你在 Samba 中的設定都正確,卻發現無法對該資料來寫入,很可能是在系統中的權限沒有正確設定,必須以 chmod 來加以修改。也就是說,如果您設定要分享 /home/mp3,而使用者 alex 登入後無法寫入,可能是 Samba 的權限設定不對,或是該使用者在系統中對於該資料夾本來就沒有寫入權限。這時候,您必須使用 chmod 將 /home/mp3 的權限設為 777,這樣該使用者才可以寫入該目錄。關於更詳細的分享目錄權限,請參考下一小節的說明。
修改完 smb.conf 之後,我們可以使用指令 testparm 來查看我們的設定有沒有語法上的錯誤。
設定完 smb.conf 後,在啟動 Samba 之前,我們必須先增加可以使用 Samba 的使用者密碼。假設我們要新增使用者 alex,請先確定使用者 alex 是 FreeBSD 中的系統帳號,接下來才可以請使用下列指令來設定它的 Samba 密碼:
# smbpasswd -a alex
New SMB password:
Retype new SMB password:
我們在 smbpasswd 中使用了參數 -a,表示新增使用者。如果您只是要修改使用者密碼,則不需要使用參數 -a。一般使用者也可以使用 smbpasswd 來修改自己的密碼。不過一般使用者在修改密碼時,密碼長度一定要大於五個字元喔。其它關於刪除使用者、停用使用者帳號的設定,請參考後續小節的說明。
Samba 會將使用者帳號密碼存放在 /usr/local/private/smbpasswd 中,您可以使用文書編輯器打開該檔案,以查看目前有哪些使用者。
小提示
可以使用 Samba 資源的使用者一定要是系統中的使用者,而且必須先使用 smbpasswd 設定該使用者的密碼喔。
20.2.3 啟動 Samba
完成了設定之後,我們可以啟動 Samba 了。請先編輯 /etc/rc.conf,並加入下列設定:
nmbd_enable="YES"
smbd_enable="YES"
我們在 /etc/rc.conf 設定啟用 nmbd 及 smbd, smbd 這支程式是用來做分享資料的 daemon,而 nmbd 則是用來做名稱服務的 daemon。如果沒有跑 nmbd,您只能使用 IP 連到 Samba。例如,\\192.168.0.1;而有 nmbd 後,您可以使用主機名稱 (hostname) 連到 Samba,例如,\\freebsd (假設您的主機名稱是 freebsd.twbsd.org)。
接下來,請先將 Samba 的啟動程式更名:
# cp /usr/local/etc/rc.d/samba.sh.sample /usr/local/etc/rc.d/samba.sh
最後,我們就可以使用下列指令啟動 Samba 了:
# /usr/local/etc/rc.d/samba.sh start
現在您就可以從 Windows 端連線到 Samba 了,您可以在檔案總管的網址列輸入 \\ip 或 \\hostname 來使用連線資源。
20.3 smb.conf 設定說明
Samba 的設定檔中有很多細項可以讓我們進行微調,建議您可以瀏覽一遍,以了解有什麼是您需要的設定。以下我們就針對比較常用的項目分別說明。
20.3.1 global 區段的基本設定
fstype
我們可以使用 Windows 的連線網路磁碟機功能,將一個共用資料夾變成系統中的網路硬碟。例如,將共用資料夾變成 Z: 磁碟機。如果您點選該網路磁碟機,並查看內容,您會看到它的檔案系統格式為 NTFS,如下圖所示:
圖 20-3
您可以經由設定 fstype 以改變設定。例如,下列設定是將檔案系統變成 UFS2:
fstype = UFS2
netbios name
netbios name 就像是 Windows 中的電腦名稱一樣,如果您檢示工作群組中的電腦,您可以看到預設的是您的 hostname。您可以修改 netbios name 為其它名稱,如 snoopy,這樣一來您就可以使用 \\snoopy 來連到該電腦。
pid directory
設定用來放 smbd 及 nmbd process id 的檔案路徑。預設是 /var/run。
server string
在我們查看網路上的芳鄰時,除了可以看到電腦名稱外,在電腦名稱後還會加入一串電腦描述。預設的描述是 Samba + 版本名稱。您可以任意設定這個字串。在設定時,如果您使用 %v,則 %v 會被取代成為 Samba 的版本名稱。而 %h 則會被取代成為主機名稱。
workgroup
設定工作群組。
20.3.2 global 區段的安全性設定
admin users
設定管理者帳號。預設的管理者帳號為 root。在管理者帳號中的使用者,Samba 不會去檢查該使用者在 UNIX 系統中的權限,而會一律以 root 的身份執行刪除檔案、建立新檔案等動作。預設並沒有設定管理者帳號,也就是沒有其它使用者被設定為具有 root 的權限。如果您要設定使用者 alex 具有管理者帳號的權限,可以加入下列這一行:
admin users = alex
available
available 可以讓我們設定是否要停用 Samba 服務。如果 available 設為 no,則會禁止使用者登入,而且所有登入的動作都會被記錄下來。
create mask
設定新建檔案時的權限為何。Samba 的權限除了看資料夾的權限設定外,還會看 UNIX 的權限。例如,如果我們將 /home/music 設定讓使用者 alex 及 john 都有寫入的權限,當使用者 alex 建立了一個檔案後,而 john 要去刪除該檔案時,因為該檔案的擁有者不是 john,如果檔案的權限是 644,則 john 會無法刪除檔案。我們可以將新建檔案的權限設為 0666,這樣一來,john 也可以刪除使用者 alex 所建立的檔案。這樣設計的好處是我們可以讓所有權限的控制都交由 Samba 的資料夾權限控制,而非 UNIX 權限。
directory mask
這是用來設定新建目錄時權限為何。它的作用和 create mask 差不多,只是會用在目錄的權限上。
encrypt passwords
設定是否要使用加密過的密碼。Windows 98 及 WinNT SP3 以上會將密碼加密,我們必須將它設為 yes。
follow symlinks
設定是否要允許使用者取得、進入 symbolic link 的真的目錄及檔案。預設是 yes,在設為 yes 的情況下,如果您分享了 /home/music,但在該目錄中有一個 symbolic link 指向 /usr/local,則使用者也可以進入到 /usr/local 目錄中。這樣的設定比較危險。例如,如果使用者可以進入系統中對 /home/music 做 symbolic link,則他可以建一個連結到 /etc/master.passwd,這樣使用者就可以從共用資料夾中去存取 master.passwd 這個檔了。
guest account
設定 guest 帳號,預設是 nobody。當我們在共用資料夾權限中設定了 guest ok 為 yes 時,使用者可以使用這個帳號去存取該資料夾,而不需任何密碼。這個使用者一定要是系統中的使用者。
map to guest
是否要將登入錯誤的使用者對映到 guest 使用者而登入,預設是 Never。這個設定只有在 security 不是 share 時才有用。在設定時可以有下列三種模式:
* Never:不會自動將登入失敗的使用者變成 guest 使用者登入。
* Bad User:只有在使用者名稱正確,但密碼錯誤時才會自動將使用者身份變成我們在 guest account 中設定的使用者。
* Bad Password:只要密碼錯誤就自動轉成 guest。
使用自動對映到 guest 使用者的好處是,一般使用者不需要記得自己的密碼就可以登入。但缺點是如果使用者登入失敗,其身份會自動變成 guest,他有可能會無法使用原本自己帳號該有的權限去存取檔案。
null passwords
是否允許使用空白密碼。預設是 no。
security
這個項目可以說是 Samba 設定檔中最重要的項目,它控制了使用者的登入行為及使用者認證的方法。我們可以將 security 設定為 share、user、server、或 domain,分別說明如下:
* share:不需要密碼就可以使用 Samba,所有的使用者會被當作 guest 帳號。
* user:使用者必須要使用合法的帳號密碼才可以登入。合法的使用者必須是系統中的使用者,而且有使用 smbpasswd 加入 Samba 的密碼檔中。
* domain:使用 Windows Domain Server 進行身份認證。使用者必須同時是系統中的真實使用者,並且在 Windows Domain Server 中存在才可以登入。
* server:設定使用另一台 SMB 主機作身份認證。SMB 主機可以是另一台 Samba 伺服器或是 NT Server。
關於 security 的設定相當複雜,建議您使用 user 的模式。如果您有需要使用其它模式,請參考 Samba 網站上關於 smb.conf 的說明。
20.3.3 global 區段的效能調校設定
max open files
設定同時最多可以開啟多少檔案,預設是 10000。我們通常不需要修改它。
socket options
這個項目控制了開啟網路連結 (socket) 時,要設定的選項。預設只有 TCP_NODELAY。如果您有需要調校,請 man setsocopt。
use sendfile
設定下載檔案時是否要使用 sendfile()。當設為 yes 時,在下載檔案時,會使用 sendfile() 這個系統呼叫,而非傳統的讀寫動作。傳統的讀寫動作必須由 kernel 讀取資料,送資料到 Samba,再由 Samba 將資料寫到 Kernel,接著才由 Kernel 送到網路上。而使用 sendfile 時,會變成由 kernel 讀出檔案資料後,直接送到網路上。如此一來,可以大大的提高效率。
20.3.4 global 區段的記錄檔及除錯設定
log file
設定要將 Samba 記錄檔存成什麼檔名。我們可以設定針對不同的使用者、不同的來源存成不同的記錄檔。例如,我們可以設定 log file 為 /var/log/samba/log.%m,表示將記錄檔依不同的來源主機存放,%m 會被取代成為主機名稱。您還可以使用 %d 表示 process id,%l 表示客戶端的 IP,還有更多代號請 man smb.conf。
log level
設定記錄的等級,等級可以設等級的數字可以是 0 到 10。設定為 0 時的記錄最少,設定為 10 的記錄內容最詳細。這個設定值會影響到系統效能,如果等級設得越高,則要記錄的東西越多,自然速度會越慢。
max log size
設定記錄檔最大的大小,預設是 5000。如果設為 0 表示不限制。在記錄檔超出設定值時,Samba 會將該檔案更名為 .old 檔,並建立新的記錄檔。
20.3.5 global 區段的網路資源設定
deadtime
設定當客戶端連線多久沒有動作則自動斷線並離開子程序。當有客戶端連線時,smbd daemon 會產生一支新的子程序來處理客戶連線,但是如果客戶端一直沒有動作,這個子程序的存在只是佔用了記憶體。我們可以設定一段時間沒有動作則自動斷線,以節省資源。而一般的客戶端在斷線後,如果有需要在使用資源,會自動連線,使用者不會有任何感覺。預設並沒有設定自動斷線。
domain master
在 SMB 協定中,同一個 workgroup 的所有電腦中,通常開機最久的電腦會被當做 master browser。當工作群組中的電腦要查詢群組中的主機名稱時,會到該電腦上查詢。如果我們將 domain master 設為 yes,則 nmbd 會告訴工作群組中的電腦這台 Samba 伺服器是 master browser,而 Samba 就會將工作群組中的電腦清單存下來,以供客戶端查詢。建議您將這個項目設為 no,以免佔用系統資源。
hosts allow
設定可以使用 Samba 服務的客戶端來源。預設並沒有設定 host allow,也就是允許任何人連線。以下是幾個設定的範例:
* host allow = 150.233. except 150.233.1.1:表示允許除了 150.233.1.1 外的其它 150.233.x.x 的機器連線。
* host allow = 192.168.0.0/255.255.0.0:表示允許所有 192.168.x.x 連線。
hosts deny
這個項目和 host allow 類似,只是它是用來設定不可以使用 Samba 服務的來源。
interfaces
設定 Samba 只提供服務給此介面的網路卡。如果您有二張網路卡,一張對內,一張對外,則可以設定只允許內部使用 Samba。這個設定可以是網路卡代號、IP/Mask、IP。如果您設定為 fxp*,則表示 fxp0、fxp1 都可以使用。
bind interfaces only
如果沒有將 bind interfaces only 設為 yes,則 Samba 只會限制 smbd 只提供檔案服務給上列 interface 的網卡。而還是允許其它網卡使用 nmbd 服務進行廣播。
max connections
設定最多同時連線的數目,預設是 0 表示沒有限制。
wins support
設定是否支援 wins 伺服器。由於 SMB 名稱查詢是使用廣播的方式。當有不同的子網域時,需要有 wins 伺服器才可以查詢到不同子網域的資料。所以如果您有不同子網域時,您可以設定使用 wins 伺服器,否則不需設定。
wins server
設定 wins 伺服器的 IP。
20.3.6 分享權限設定
本小節將說明分享資料夾時,我們可以對資料夾設定什麼權限。每一個資料夾都是一個獨立的區段,我們可以分別對不同的資料夾設定不同的權限。例如,是否要允許使用者 A 存取、讀寫權限為何等等。
browseable
這個項目設定當使用者連到本伺服器時,在列出所有共用資料夾時,是否要列出這個資料夾。如果設為否,則使用者連線到本機時,不會列出此目錄。但是使用者還是可以使用 \\xxx\share 來直接進入該資料夾。
這項設定的好處是,您可以隱藏不想讓使用者看到的共用資料夾,只有知道路徑的人才可以存取它。
comment
設定資料夾註解。在使用者從網路芳鄰中瀏覽資料夾時,這個註解會出現在資料夾名稱後面。
guest ok
是否允許 guest 帳戶使用本共用資料夾。
hide dot files
是否要將檔名為 . 開頭的檔案當成隱藏檔,預設是 yes。
invalid users
設定不可以使用本共用資料夾的使用者。這個項目可以是一堆用逗號分開的使用者、群組清單。如果是群組名稱,則必須在名稱之前加上 @。
path
設定此共用資料夾在系統中的絕對路徑。
valid users
設定可以使用本共用資料夾的使用者。這個項目可以是一堆用逗號分開的使用者、群組清單。如果是群組名稱,則必須在名稱之前加上 @。如果使用者同時出現在 invalid users 及 valid users,則不可以存取本資料夾。
write list
設定可以對本共用資料夾進入寫入動作的使用者。這個項目可以是一堆用逗號分開的使用者、群組清單。如果是群組名稱,則必須在名稱之前加上 @。
20.4 使用網頁設定 Samba
除了使用文字編輯軟體來修改 smb.conf 並用命令列工具設定使用者資料外,我們可以使用 Samba 內建的網頁介面工具來進行設定。我們在編輯 smb.conf 時,如果要使用中文資料夾名稱時,由於資料夾名稱是 Unicode,我們必須使用 Word 來編輯。但如果我們使用 Samba 的網頁介面工具,預設就是 UTF-8 了,在設定上會容易許多。
首先編輯 /etc/inetd.conf,將最下方 swat 的註解拿掉:
swat stream tcp nowait.400 root /usr/local/sbin/swat swat
最後重新啟動 inetd:
# kill -1 `cat /var/run/inetd.pid`
然後就可以使用瀏覽器以 port 901 連到 Samba Server了。假設 Samba 的 ip 是 192.168.0.1,則輸入 http://192.168.0.1:901,被要求輸入帳號密碼時,請輸入 root 及 root 在系統中的密碼。請注意 root 一定要有密碼,否則無法登入。接著出現下列畫面:
圖 20-4
在 swat 的首面中,有很多說明文件的連結供您參考。
接下來,我們選GLOBALS來看全域設定:
圖 20-5
這裡的每一個選項,我們都可以參考上一小節中的說明來設定,設定完後記得要 「Commit Changes」來使設定生效。
如果要開放一個新的目錄,我們可以選 SHARES 來設定分享的資料夾:
圖 20-6
我們可以在 Create Share 欄位中建立要分享的資料來名稱,再按「Create Share」來新建一個共用資料夾。或是選擇「Choose Share」、「Delete Share」來選擇或刪除已分享的目錄。在設定完資料夾後,您必須重新啟動 smbd 才會生效喔。
其他的各項功能選項說明如下:
* PRINTERS:設定列表機。
* WIZARD:使用設定精靈。
* STATUS:查看 Samba 的狀態,可以在這裡重新啟動 Samba。
* VIEW:觀看設定後的 smb.conf 檔。
* PASSWORD:設定使用者及密碼。
以設定新的使用者為例,如果我們要建立一個新的使用者 friend:
圖 20-7
使用者 friend 必須是系統中的使用者,否則您必須使用 adduser 或 vipw 建立使用者。建立之後就可以在上圖中 User Name 中輸入 friend 並密碼。這個功能取代了使用 smbpasswd -a 來建立帳號的功能。
20.5 Samba 命令列工具介紹
在命令列中有一些工具可以讓我們設定使用者資料、瀏覽目前使用情形等,我這個小節我們先介紹一些基本的命令指令。
20.5.1 smbpasswd 使用者及密碼管理
smbpasswd 是一個用來在命令列管理 Samba 使用者的工具,我們可以用它來新增使用者、修改使用者密碼、甚至可以執行它來修改其它主機上的 samba 密碼。
smbpasswd 這個指令會將 Samba 的使用者資訊存放在另一個名為 smbpasswd 的文字檔中,這個文字檔的位置依你安裝 Samba 時所下的參數而有所不同,如果您以 ports 安裝,則 smbpasswd 位於 /usr/local/private 下,你可以使用文書編輯器去觀看它的內容。
samba 的使用者和系統使用者所使用的密碼檔是分開的,系統中的密碼設定並非 samba 所使用的密碼,但是要加入 samba 的使用者一定要存在於系統中。
一般使用者如果要使用 smbpasswd 指令來修改密碼,只要輸入 smbpasswd 即可,而 root 可以使用一些參數去新增、修改、刪除使用者,其使用格式如下:
# smbpasswd [參數] [使用者] [密碼]
以下我們介紹一些 root 常用的參數:
參數 說明
-a 新增一個使用者,並設定密碼。如果該使用者已存在,則只進行修改密碼的動作。
-d 暫時禁止某一個使用者登入。使用這個參數後,smbpasswd 會在該使用者資料中加一個 D 的符號,如此一來,該使用者便無法登入。下次我們再開放該使用者登入時,他的密碼資料還是維持不變。
-e 開放被禁止登入的使用者登入。這個參數執行後,會將 smbpasswd 中該使用者資料中的 D 等號移除,該使用者便又可以登入了。
-x 刪除一個使用者的資料。
例如,我們想要新增一個使用者 alex,並設定其密碼為 password:
# smbpasswd -a alex password
但我建議您不要在命令列中直接輸入密碼,而是以下列方式來新增使用者:
# smbpasswd -a alex
New SMB password:
Retype new SMB password:
Added user alex.
如果您要刪除使用者 alex:
# smbpasswd -x alex
smbpasswd 還有其他更進一步的功能,您可以 man smbpasswd 以獲得更多資訊。
20.5.2 smbstatus 伺服器狀態檢視
smbstatus 可以讓我們知道目前系統中 Samba 的使用情形。執行 smbstatus 後的資訊如下:
Samba version 3.0.20
Service uid gid pid machine
----------------------------------------------
picture root wheel 36153 desktop (192.168.0.2) Sun Oct 31 23:01:16 2004
public root wheel 36153 desktop (192.168.0.2) Mon Nov 1 14:35:40 2004
mp3 root wheel 36153 desktop (192.168.0.2) Mon Nov 1 10:21:51 2004
video root wheel 36153 desktop (192.168.0.2) Mon Nov 1 10:21:50 2004
Locked files:
Pid DenyMode Access R/W Oplock Name
-------------------------------------------------------
36153 DENY_NONE 0x20089 RDONLY LEVEL_II /home/mp3/song.mp3 Mon Nov 1 17:31:14 200
第一個部份顯示的是目前使用者正在使用的資料夾名稱,而第二個部份則是正在使用的檔案。
20.5.3 nmblookup 名稱查詢
我們可以使用 nmblookup 來查詢網路上 NetBIOS 主機的資訊,您可以用來查詢 Windows 或 Samba 伺服器的電腦名稱、IP 等資訊。假設我們想要查詢 192.168.0.2 這一台機器的 NetBIOS name:
# nmblookup -A 192.168.0.2
Looking up status of 192.168.0.2
DESKTOP <00> - B
DESKTOP <20> - B
WORKGROUP <00> - B
WORKGROUP <1e> - B
上列資訊中,我們可以看到 192.168.0.2 這台機器的名稱為 DESKTOP,其群組為 WORKGROUP。您也可以由 NetBIOS 名稱反查其 IP:
# nmblookup desktop
querying desktop on 192.168.0.255
192.168.0.2 desktop<00>
20.6 Windows 設定
MS windows 系統的設定方面,如果您使用的是 Windows 98/ME,請先確認您有支援「Client for Microsoft Networks」及「File and printer sharing for Microsofe Networks」。而且 Windows 98 的使用者登入系統名稱和您要登入 Samba 的使用者名稱必須相同才行。如果是 Windows 2000/XP 則沒有這個問題。
我們在使用登入 Samba 時,可以從檔案總管或瀏覽器直接輸入 \\192.168.0.1 (伺服器 IP) 或是 \\hostname (您所設定的 netbios name,預設是 hostname)。或者,您可以將某一個共用資料夾設為系統中的網路磁碟機。
我們只要對著某一個資料夾按滑鼠右鍵,選擇「連線網路磁碟機」即可:
圖 20-8
接下來選擇要使用的磁碟機代號:
圖 20-9
最後就會出現一個新的網路磁碟機了:
圖 20-10
由於我們安裝的是 Samba 3.0,所以在共用資料夾內可以同時存在中文、日文、韓文的檔案。
20.7 存取 MS Windows 的網芳資料
如果您要使用 FreeBSD 來存取 MS Windows 的網芳資料,FreeBSD 中內建有 mount_smbfs 這個工具,可以讓我們將所要存取的主機及其目錄掛在檔案系統中。掛入後,存取的方式就好像檔案位於硬碟中一樣,十分方便,而且對於中文的存取也沒有問題。mount_smbfs 是在 4.5-RELEASE 之後才內建的,如果您的系統在 4.5-RELEASE 之前,您必須要自行從 ports 中安裝 /usr/ports/net/smbfs。
在使用 mount_smbfs 時,如果您的 kernel 並未將 SMB protocol 編譯進來也沒關係,系統在使用前會自動載入 smbfs.ko 這個模組。假設我們要存取的主機資料如下:
* IP:192.168.0.2
* 要掛入的分享目錄:software
* 掛入系統中哪一個目錄:/mnt
我們可以使用下列指令來掛入:
# mount_smbfs -I 192.168.0.2 -N '//192.168.0.1/software' /mnt
這裡的參數 I 表示指定 IP 位址,參數 N 表示不須密碼驗證。如果您所要掛入的分享資料夾需要密碼認證,則不要加參數 N。我們在掛入別台電腦的資料夾時,如果沒有指定使用者名稱,內定會以目前所使用的帳號。如果我們要使用別的使用者名稱,可以使用下列方式:
# mount_smbfs -I 192.168.0.2 '//username@192.168.0.1/software' /mnt
將分享的資料夾掛入後,我們就可以使用 FreeBSD 檔案處理的指令,諸如 cp、mv 等來抓取我們所要的檔案,就像是從本機硬碟中使用檔案一樣。
第二十章 SAMBA 網路芳鄰
使用 MS Windows 的人大概都知道我們可以經由「網路上的芳鄰」看到網路中的電腦,並經由共用資料夾來分享檔案、印表機。而在 FreeBSD 中,我們也可以安裝一些軟體來讓 Windows、FreeBSD 的使用者經由網路上的芳鄰共享 FreeBSD 機器中的檔案。使用 FreeBSD 來做為檔案伺服器,可以讓家中、公司的電腦輕易的交換資訊,可以說是非常方便。
本章將介紹如何使用 FreeBSD 架設網路芳鄰,並使用 FreeBSD 去存取 Windows 網路芳鄰的資料。讀完本章後,您將了解下列主題:
* 網路芳鄰的運作原理。
* 安裝及設定 Samba。
* 使用網頁管理 Samba 的設定檔。
* 如何在 Windows 及 FreeBSD 中使用網路芳鄰。
20.1 網路芳鄰簡介
20.1.1 SMB 協定簡介
MS Windows 可以說是目前桌上型電腦中市佔率最高的作業系統,許多人使用 Windows 來進行日常工作。而在 Windows 平台上,使用者可以經由「網路上的芳鄰」來看到不同電腦,並經由設定「共用資料夾」來分享檔案及印表機。Windows 的網路芳鄰其實是使用 SMB/CIFS 通訊協定。
SMB (Server Message Block) 通訊協定最早是在 1980 年代由 IBM 所發展出來,這個通訊協定可以讓不同的電腦共享檔案、印表機、及其它裝置。SMB 最早是運作在 NetBIOS 的網路協上,一開始 IBM 設計了 NetBIOS 只是為了讓網路中少數的電腦可以彼此互相溝通。所以 NetBIOS 的功能比較陽春,在使用上有一些限制。例如,只能使用在區域網路中、跨不過路由器。後來又出現了 NetBEUI (NetBIOS Extend User Interface),也是 IBM 針對 NetBIOS 的改良版。後來又有 NetBIOS over TCP/IP,使得 SMB 協定也可以跑在 TCP/IP 上,並可以經由網際網路存取。在使用 NetBIOS 在存取遠端電腦時,我們可以使用電腦名稱如「\\alex-pc」來存取,而 TCP/IP 只能使用「\\192.168.0.1」這種方式來存取。所以 NetBIOS 也不是一無是處,它提供了比較簡單而易懂的方式。
Microsoft 在 1996 年為了市場考量,將 SMB 改名為 CIFS (Common Internet File System),名稱看起來比較容易了解,顧名思義就是可以在網際網路上使用的檔案系統。所以我們其實不應該稱呼網路上的芳鄰為「網路芳鄰」,而是 SMB/CIFS 通訊協定,就好像我們稱呼 HTTP、FTP 一樣。在 Windows 的世界裡,人們可以使用 SMB/CIFS 來共享檔案。而在 UNIX 的世界裡使用的是 NFS (Network File System);Mac 的世界中則是使用 AppleTalk。我們可以看到不同的作業系統環境中,都有自己的一套方法,不過我們還是可以經由安裝軟體來達成不同平台共享檔案的功能。
20.1.2 Samba 簡介
在 1991 年,澳洲的一位個大學生 Andrew Tridgell 為了要讓 DOS 的機器和 UNIX 的機器可以共享檔案,就在 UNIX 系統中寫了一套 SMB 協定的軟體。經過了一段時間的發展,他想要為這套軟體取一個名字,但又不能直接使用 SMB 這個名字。所以他就翻翻字典,最後找到一個和 SMB 很像的字 Samba。最後 Samba 就開始有長足的發展,加入了許多有志之士。而今,Samba 已經成為 UNIX 世界中 SMB/CIFS 協定的代名詞了。
但為什麼我們要在 UNIX 中使用 Samba 而不直接使用 Windows 的機器來分享檔案呢?以筆者的使用經驗,由於我的 FreeBSD 伺服器是 24 小時開機,在上面安裝了 Samba 之後,網路上的所有電腦都可以使用這台伺服器共享檔案,而不必另外再開一台 Windows 機器。而且,我在編輯網頁、寫程式時,會使用 Samba 將我的網頁資料、程式直接分享出來,再由 Windows 上的文書編輯軟體來進行編輯。存檔後,我不必再使用 FTP 上傳檔案,而是可以直接使用瀏覽器看到編輯的結果,很棒吧。
Samba 的功能可不只有檔案分享,它還可以讓我們使用 UNIX 加入 Windows 的 Domain、ADS,以使用 Windows 的 Domain 使用者權限控管。更多的功能,請參考 Samba 網站的資料。
20.2 安裝設定 Samba
Samba 目前有二個主要的版本:2.2.12 及 3.0.x。2.2.12 已經發展很久了,目前已進入停滯狀態。和 3.0 比較起來,速度稍快、功能較簡單。最大的不同在於 Samba 2.2.12 只支援 code page,而 Samab 3.0 支援 Unicode。Unicode 的支援可以讓我們同時在一個目錄中存放中文、日文、簡體中文等多國語的檔名。所以,筆者建議您安裝 Samab 3.0。
20.2.1 安裝 Samba
Samba 的安裝設定很簡單,我們可以使用 ports 來安裝:
# cd /usr/ports/net/samba3
# make install clean
接著,將出現下列畫面,讓您做一些偏好設定:
圖 20-1
我們維持原本的設定即可,接下來就可以選 OK 繼續編譯了。
20.2.2 基本的設定檔說明
Samba 的設定檔位置為 /usr/local/etc/smb.conf。在安裝完後,設定檔的範本會放在 /usr/local/etc/smb.conf.default,您可以直接複製它來加以修改。
Samba 的設定檔中,一個以中括號括起來的部份就是一個區段,如:[區段名稱] 。除了 [global] 區段外,每一個區段都是一個分享資源的設定。在 [global] 區段中,決定了 Samba 伺服器的主要設定,而其它區段則是不同分享資源的權限設定。[分享資源] 區段可以是印表機或是共用資料夾,我們可以針對不同的目錄設定不同的權限。除了設定的資料外,在 smb.conf 檔案中行首為 ";" 或 "#" 都是註解。
以下為 smb.conf 的主要的設定說明:
#===================== Global Settings =========================
[global]
# workgroup 就是設定電腦的工作群組。
workgroup = Workgroup
# 要使用哪一種安全模式。如果設定為 share,就是任何人都可以存取,無需使用帳號密碼;
# 而設為 user 則是要輸入使用者名稱及密碼。如果我們設為 user,必須要再設定使用者
# 使用者及密碼。我們會在下一小節中做更詳細的說明。
security = user
# Windows 98 及 WinNT SP3 以上會將密碼加密,我們必須將它設為 yes。
encrypt passwords = yes
# 設定可以使用 Samba 的網路介面,可以是 IP/netmask 或是網路卡名稱。
interfaces = fxp1
# 設定新建檔案時的權限為何。Samba 的權限除了看資料夾的權限設定外,還會看 UNIX 的
# 權限。我們將新建檔案的權限設為 0666,新建目錄設為 0777,以讓不同使用者所建立的
# 可以讓有權存取該共享資料夾的使用者存取。
create mask = 0666
directory mask = 0777
# 在下載檔案時,我們使用 FreeBSD 的系統呼叫 sendfile() 以提高下載速度。使用
# sendfile() 可以提高效能近一倍喔!
use sendfile = yes
#========================== Share Definitions ==============
# 這個區段是用來設定我們要分享的資料來。在這個區斷中,有幾個設定的範例可以讓我們參考
# 。以下的範例為設定分享的目錄是 /home/mp3,設定該目錄的分享名稱為 "music",只有
# wheel 群組的使用者才可以寫入。
#
[music]
path = /home/mp3
write list = @wheel
# 另一個範例,假設我們要設定一個上傳區,分享路徑為 /home/upload,具有寫入權限的帳
# 號是 alex 及 wheel 群組,而 samba 群組的使用者只有唯讀的權限。當 security
# 設為 user 時,我們必需先在系統中建立該真實使用者,再使用 smbpasswd 來建立
# Samba 的密碼。必須要注意的是,當您設定某一個使用者對某個目錄具有寫入權限時,該使
# 用者在系統中對於該目錄的 UNIX 權限也必須要有寫入權限才可以喔。
[upload]
path = /home/upload
write list = alex,@wheel
valid users = @samba
上述設定檔中,在全域設定方面,您大概只需要修改「interfaces」部份即可。接下來的設定重點在於各個共用資料夾的設定。共用資料夾可以讓我們分享系統中的某個目錄,分享的名稱以中括號括起來。例如,我們想要分享系統中的 /home/mp3,而使用者連進來後,看到的資料夾名稱為「music」,則我們必須要設定一個區段名為 [music]。在共用資料夾權限設定方面,我們可以使用下列參數:
* path:設定該共用資料夾在系統中的真正路徑。
* invalid users:設定不可以使用此資料夾的使用者。如果是群組名稱,則必須在名稱之前加上 @。有多個使用者及群組時,可以使用逗號分開。
* write list:設定具有讀寫權限的使用者及群組。如果是群組名稱,則必須在名稱之前加上 @。有多個使用者及群組時,可以使用逗號分開。
* valid users:設定具有讀取權限的使用者。如果是群組名稱,則必須在名稱之前加上 @。有多個使用者及群組時,可以使用逗號分開。
* browseable:設定該資料夾是不是要在使用者瀏覽有哪些資料夾時顯示出來。可以設為 yes 或 no。如果設為 no,則該資料夾在瀏覽時並不會出現,而只能直接使用 \\ip\share 來進入該資料夾 (假設名稱為 share)。
當我們連線到一個 Samba 伺服器時,如果「security」模式設為 user,Samba 會先訊問使用者名稱及密碼。接下來,要進入一個共用資料夾時,會經過下列檢查:
* 檢查使用者是否在「invalid users」中,如果有,則不可以存取。
* 檢查使用者是否在「valid users」中,如果有則可以存取。如果使用者不在「invalid users」及「valid users」中,則表示可以存取。
* 檢查使用者是否在「write list」中,如果有,則具有讀寫權限。
基於上述規則,建議您先在「invalid users」中加入不可以使用 Samba 資源的群組,再設定可以讀寫的使用者即可。
您必須特別注意的是,由於 Samba 3.0 支援 Unicode (UTF-8),如果您要將共用資料夾名稱設定為中文,請使用支援 UTF-8 的文書編輯器來編輯 smb.conf,並在存檔時將檔案存成 UTF-8 的純文字格式。Windows 支援 UTF-8 的文書編輯器如 Word、UltraEdit、EmEditor,在存檔時,必須使用 UNIX 的換行格式。以 Word 為例,在存檔時,我們將檔案存成純文字檔 (txt),接下來會出現下列選單:
圖 20-2
接下來,您可以就可以將該檔案放到 FreeBSD 中,並將副檔名 .txt 移除,更名為 smb.conf。還有一點,由於 Windows 的文書編輯軟體會在檔案最開頭加入三個 Unicode 的辨識字元,當您以 ee 打開該檔時,可能看到下列這樣的內容:
嚜璟global]
workgroup = Workgroup
server string = FreeBSD
interfaces = lnc0
security = user
encrypt passwords = Yes
create mask = 0777
我們可以看到檔案第一行的開頭有亂碼,這時候,請使用 ee 刪除開始的三個字元,讓第一行變成 [global] 即可。
小提示
支援 Unicode 的好處是您可以同時使用中文、日文、韓文等多國語。但在共用資料夾名稱中使用中文時,設定會比較麻煩一點。不過您一定要記得,當共用資料夾要設為中文時,smb.conf 一定要存成 UTF-8 格式,否則資料夾名稱會看不到或是變亂碼喔。
對於分享的資料夾除了要在 Samba 設定你想要的權限外,對於該目錄在 UNIX 系統上的讀寫權限也要配合。如果你在 Samba 中的設定都正確,卻發現無法對該資料來寫入,很可能是在系統中的權限沒有正確設定,必須以 chmod 來加以修改。也就是說,如果您設定要分享 /home/mp3,而使用者 alex 登入後無法寫入,可能是 Samba 的權限設定不對,或是該使用者在系統中對於該資料夾本來就沒有寫入權限。這時候,您必須使用 chmod 將 /home/mp3 的權限設為 777,這樣該使用者才可以寫入該目錄。關於更詳細的分享目錄權限,請參考下一小節的說明。
修改完 smb.conf 之後,我們可以使用指令 testparm 來查看我們的設定有沒有語法上的錯誤。
設定完 smb.conf 後,在啟動 Samba 之前,我們必須先增加可以使用 Samba 的使用者密碼。假設我們要新增使用者 alex,請先確定使用者 alex 是 FreeBSD 中的系統帳號,接下來才可以請使用下列指令來設定它的 Samba 密碼:
# smbpasswd -a alex
New SMB password:
Retype new SMB password:
我們在 smbpasswd 中使用了參數 -a,表示新增使用者。如果您只是要修改使用者密碼,則不需要使用參數 -a。一般使用者也可以使用 smbpasswd 來修改自己的密碼。不過一般使用者在修改密碼時,密碼長度一定要大於五個字元喔。其它關於刪除使用者、停用使用者帳號的設定,請參考後續小節的說明。
Samba 會將使用者帳號密碼存放在 /usr/local/private/smbpasswd 中,您可以使用文書編輯器打開該檔案,以查看目前有哪些使用者。
小提示
可以使用 Samba 資源的使用者一定要是系統中的使用者,而且必須先使用 smbpasswd 設定該使用者的密碼喔。
20.2.3 啟動 Samba
完成了設定之後,我們可以啟動 Samba 了。請先編輯 /etc/rc.conf,並加入下列設定:
nmbd_enable="YES"
smbd_enable="YES"
我們在 /etc/rc.conf 設定啟用 nmbd 及 smbd, smbd 這支程式是用來做分享資料的 daemon,而 nmbd 則是用來做名稱服務的 daemon。如果沒有跑 nmbd,您只能使用 IP 連到 Samba。例如,\\192.168.0.1;而有 nmbd 後,您可以使用主機名稱 (hostname) 連到 Samba,例如,\\freebsd (假設您的主機名稱是 freebsd.twbsd.org)。
接下來,請先將 Samba 的啟動程式更名:
# cp /usr/local/etc/rc.d/samba.sh.sample /usr/local/etc/rc.d/samba.sh
最後,我們就可以使用下列指令啟動 Samba 了:
# /usr/local/etc/rc.d/samba.sh start
現在您就可以從 Windows 端連線到 Samba 了,您可以在檔案總管的網址列輸入 \\ip 或 \\hostname 來使用連線資源。
20.3 smb.conf 設定說明
Samba 的設定檔中有很多細項可以讓我們進行微調,建議您可以瀏覽一遍,以了解有什麼是您需要的設定。以下我們就針對比較常用的項目分別說明。
20.3.1 global 區段的基本設定
fstype
我們可以使用 Windows 的連線網路磁碟機功能,將一個共用資料夾變成系統中的網路硬碟。例如,將共用資料夾變成 Z: 磁碟機。如果您點選該網路磁碟機,並查看內容,您會看到它的檔案系統格式為 NTFS,如下圖所示:
圖 20-3
您可以經由設定 fstype 以改變設定。例如,下列設定是將檔案系統變成 UFS2:
fstype = UFS2
netbios name
netbios name 就像是 Windows 中的電腦名稱一樣,如果您檢示工作群組中的電腦,您可以看到預設的是您的 hostname。您可以修改 netbios name 為其它名稱,如 snoopy,這樣一來您就可以使用 \\snoopy 來連到該電腦。
pid directory
設定用來放 smbd 及 nmbd process id 的檔案路徑。預設是 /var/run。
server string
在我們查看網路上的芳鄰時,除了可以看到電腦名稱外,在電腦名稱後還會加入一串電腦描述。預設的描述是 Samba + 版本名稱。您可以任意設定這個字串。在設定時,如果您使用 %v,則 %v 會被取代成為 Samba 的版本名稱。而 %h 則會被取代成為主機名稱。
workgroup
設定工作群組。
20.3.2 global 區段的安全性設定
admin users
設定管理者帳號。預設的管理者帳號為 root。在管理者帳號中的使用者,Samba 不會去檢查該使用者在 UNIX 系統中的權限,而會一律以 root 的身份執行刪除檔案、建立新檔案等動作。預設並沒有設定管理者帳號,也就是沒有其它使用者被設定為具有 root 的權限。如果您要設定使用者 alex 具有管理者帳號的權限,可以加入下列這一行:
admin users = alex
available
available 可以讓我們設定是否要停用 Samba 服務。如果 available 設為 no,則會禁止使用者登入,而且所有登入的動作都會被記錄下來。
create mask
設定新建檔案時的權限為何。Samba 的權限除了看資料夾的權限設定外,還會看 UNIX 的權限。例如,如果我們將 /home/music 設定讓使用者 alex 及 john 都有寫入的權限,當使用者 alex 建立了一個檔案後,而 john 要去刪除該檔案時,因為該檔案的擁有者不是 john,如果檔案的權限是 644,則 john 會無法刪除檔案。我們可以將新建檔案的權限設為 0666,這樣一來,john 也可以刪除使用者 alex 所建立的檔案。這樣設計的好處是我們可以讓所有權限的控制都交由 Samba 的資料夾權限控制,而非 UNIX 權限。
directory mask
這是用來設定新建目錄時權限為何。它的作用和 create mask 差不多,只是會用在目錄的權限上。
encrypt passwords
設定是否要使用加密過的密碼。Windows 98 及 WinNT SP3 以上會將密碼加密,我們必須將它設為 yes。
follow symlinks
設定是否要允許使用者取得、進入 symbolic link 的真的目錄及檔案。預設是 yes,在設為 yes 的情況下,如果您分享了 /home/music,但在該目錄中有一個 symbolic link 指向 /usr/local,則使用者也可以進入到 /usr/local 目錄中。這樣的設定比較危險。例如,如果使用者可以進入系統中對 /home/music 做 symbolic link,則他可以建一個連結到 /etc/master.passwd,這樣使用者就可以從共用資料夾中去存取 master.passwd 這個檔了。
guest account
設定 guest 帳號,預設是 nobody。當我們在共用資料夾權限中設定了 guest ok 為 yes 時,使用者可以使用這個帳號去存取該資料夾,而不需任何密碼。這個使用者一定要是系統中的使用者。
map to guest
是否要將登入錯誤的使用者對映到 guest 使用者而登入,預設是 Never。這個設定只有在 security 不是 share 時才有用。在設定時可以有下列三種模式:
* Never:不會自動將登入失敗的使用者變成 guest 使用者登入。
* Bad User:只有在使用者名稱正確,但密碼錯誤時才會自動將使用者身份變成我們在 guest account 中設定的使用者。
* Bad Password:只要密碼錯誤就自動轉成 guest。
使用自動對映到 guest 使用者的好處是,一般使用者不需要記得自己的密碼就可以登入。但缺點是如果使用者登入失敗,其身份會自動變成 guest,他有可能會無法使用原本自己帳號該有的權限去存取檔案。
null passwords
是否允許使用空白密碼。預設是 no。
security
這個項目可以說是 Samba 設定檔中最重要的項目,它控制了使用者的登入行為及使用者認證的方法。我們可以將 security 設定為 share、user、server、或 domain,分別說明如下:
* share:不需要密碼就可以使用 Samba,所有的使用者會被當作 guest 帳號。
* user:使用者必須要使用合法的帳號密碼才可以登入。合法的使用者必須是系統中的使用者,而且有使用 smbpasswd 加入 Samba 的密碼檔中。
* domain:使用 Windows Domain Server 進行身份認證。使用者必須同時是系統中的真實使用者,並且在 Windows Domain Server 中存在才可以登入。
* server:設定使用另一台 SMB 主機作身份認證。SMB 主機可以是另一台 Samba 伺服器或是 NT Server。
關於 security 的設定相當複雜,建議您使用 user 的模式。如果您有需要使用其它模式,請參考 Samba 網站上關於 smb.conf 的說明。
20.3.3 global 區段的效能調校設定
max open files
設定同時最多可以開啟多少檔案,預設是 10000。我們通常不需要修改它。
socket options
這個項目控制了開啟網路連結 (socket) 時,要設定的選項。預設只有 TCP_NODELAY。如果您有需要調校,請 man setsocopt。
use sendfile
設定下載檔案時是否要使用 sendfile()。當設為 yes 時,在下載檔案時,會使用 sendfile() 這個系統呼叫,而非傳統的讀寫動作。傳統的讀寫動作必須由 kernel 讀取資料,送資料到 Samba,再由 Samba 將資料寫到 Kernel,接著才由 Kernel 送到網路上。而使用 sendfile 時,會變成由 kernel 讀出檔案資料後,直接送到網路上。如此一來,可以大大的提高效率。
20.3.4 global 區段的記錄檔及除錯設定
log file
設定要將 Samba 記錄檔存成什麼檔名。我們可以設定針對不同的使用者、不同的來源存成不同的記錄檔。例如,我們可以設定 log file 為 /var/log/samba/log.%m,表示將記錄檔依不同的來源主機存放,%m 會被取代成為主機名稱。您還可以使用 %d 表示 process id,%l 表示客戶端的 IP,還有更多代號請 man smb.conf。
log level
設定記錄的等級,等級可以設等級的數字可以是 0 到 10。設定為 0 時的記錄最少,設定為 10 的記錄內容最詳細。這個設定值會影響到系統效能,如果等級設得越高,則要記錄的東西越多,自然速度會越慢。
max log size
設定記錄檔最大的大小,預設是 5000。如果設為 0 表示不限制。在記錄檔超出設定值時,Samba 會將該檔案更名為 .old 檔,並建立新的記錄檔。
20.3.5 global 區段的網路資源設定
deadtime
設定當客戶端連線多久沒有動作則自動斷線並離開子程序。當有客戶端連線時,smbd daemon 會產生一支新的子程序來處理客戶連線,但是如果客戶端一直沒有動作,這個子程序的存在只是佔用了記憶體。我們可以設定一段時間沒有動作則自動斷線,以節省資源。而一般的客戶端在斷線後,如果有需要在使用資源,會自動連線,使用者不會有任何感覺。預設並沒有設定自動斷線。
domain master
在 SMB 協定中,同一個 workgroup 的所有電腦中,通常開機最久的電腦會被當做 master browser。當工作群組中的電腦要查詢群組中的主機名稱時,會到該電腦上查詢。如果我們將 domain master 設為 yes,則 nmbd 會告訴工作群組中的電腦這台 Samba 伺服器是 master browser,而 Samba 就會將工作群組中的電腦清單存下來,以供客戶端查詢。建議您將這個項目設為 no,以免佔用系統資源。
hosts allow
設定可以使用 Samba 服務的客戶端來源。預設並沒有設定 host allow,也就是允許任何人連線。以下是幾個設定的範例:
* host allow = 150.233. except 150.233.1.1:表示允許除了 150.233.1.1 外的其它 150.233.x.x 的機器連線。
* host allow = 192.168.0.0/255.255.0.0:表示允許所有 192.168.x.x 連線。
hosts deny
這個項目和 host allow 類似,只是它是用來設定不可以使用 Samba 服務的來源。
interfaces
設定 Samba 只提供服務給此介面的網路卡。如果您有二張網路卡,一張對內,一張對外,則可以設定只允許內部使用 Samba。這個設定可以是網路卡代號、IP/Mask、IP。如果您設定為 fxp*,則表示 fxp0、fxp1 都可以使用。
bind interfaces only
如果沒有將 bind interfaces only 設為 yes,則 Samba 只會限制 smbd 只提供檔案服務給上列 interface 的網卡。而還是允許其它網卡使用 nmbd 服務進行廣播。
max connections
設定最多同時連線的數目,預設是 0 表示沒有限制。
wins support
設定是否支援 wins 伺服器。由於 SMB 名稱查詢是使用廣播的方式。當有不同的子網域時,需要有 wins 伺服器才可以查詢到不同子網域的資料。所以如果您有不同子網域時,您可以設定使用 wins 伺服器,否則不需設定。
wins server
設定 wins 伺服器的 IP。
20.3.6 分享權限設定
本小節將說明分享資料夾時,我們可以對資料夾設定什麼權限。每一個資料夾都是一個獨立的區段,我們可以分別對不同的資料夾設定不同的權限。例如,是否要允許使用者 A 存取、讀寫權限為何等等。
browseable
這個項目設定當使用者連到本伺服器時,在列出所有共用資料夾時,是否要列出這個資料夾。如果設為否,則使用者連線到本機時,不會列出此目錄。但是使用者還是可以使用 \\xxx\share 來直接進入該資料夾。
這項設定的好處是,您可以隱藏不想讓使用者看到的共用資料夾,只有知道路徑的人才可以存取它。
comment
設定資料夾註解。在使用者從網路芳鄰中瀏覽資料夾時,這個註解會出現在資料夾名稱後面。
guest ok
是否允許 guest 帳戶使用本共用資料夾。
hide dot files
是否要將檔名為 . 開頭的檔案當成隱藏檔,預設是 yes。
invalid users
設定不可以使用本共用資料夾的使用者。這個項目可以是一堆用逗號分開的使用者、群組清單。如果是群組名稱,則必須在名稱之前加上 @。
path
設定此共用資料夾在系統中的絕對路徑。
valid users
設定可以使用本共用資料夾的使用者。這個項目可以是一堆用逗號分開的使用者、群組清單。如果是群組名稱,則必須在名稱之前加上 @。如果使用者同時出現在 invalid users 及 valid users,則不可以存取本資料夾。
write list
設定可以對本共用資料夾進入寫入動作的使用者。這個項目可以是一堆用逗號分開的使用者、群組清單。如果是群組名稱,則必須在名稱之前加上 @。
20.4 使用網頁設定 Samba
除了使用文字編輯軟體來修改 smb.conf 並用命令列工具設定使用者資料外,我們可以使用 Samba 內建的網頁介面工具來進行設定。我們在編輯 smb.conf 時,如果要使用中文資料夾名稱時,由於資料夾名稱是 Unicode,我們必須使用 Word 來編輯。但如果我們使用 Samba 的網頁介面工具,預設就是 UTF-8 了,在設定上會容易許多。
首先編輯 /etc/inetd.conf,將最下方 swat 的註解拿掉:
swat stream tcp nowait.400 root /usr/local/sbin/swat swat
最後重新啟動 inetd:
# kill -1 `cat /var/run/inetd.pid`
然後就可以使用瀏覽器以 port 901 連到 Samba Server了。假設 Samba 的 ip 是 192.168.0.1,則輸入 http://192.168.0.1:901,被要求輸入帳號密碼時,請輸入 root 及 root 在系統中的密碼。請注意 root 一定要有密碼,否則無法登入。接著出現下列畫面:
圖 20-4
在 swat 的首面中,有很多說明文件的連結供您參考。
接下來,我們選GLOBALS來看全域設定:
圖 20-5
這裡的每一個選項,我們都可以參考上一小節中的說明來設定,設定完後記得要 「Commit Changes」來使設定生效。
如果要開放一個新的目錄,我們可以選 SHARES 來設定分享的資料夾:
圖 20-6
我們可以在 Create Share 欄位中建立要分享的資料來名稱,再按「Create Share」來新建一個共用資料夾。或是選擇「Choose Share」、「Delete Share」來選擇或刪除已分享的目錄。在設定完資料夾後,您必須重新啟動 smbd 才會生效喔。
其他的各項功能選項說明如下:
* PRINTERS:設定列表機。
* WIZARD:使用設定精靈。
* STATUS:查看 Samba 的狀態,可以在這裡重新啟動 Samba。
* VIEW:觀看設定後的 smb.conf 檔。
* PASSWORD:設定使用者及密碼。
以設定新的使用者為例,如果我們要建立一個新的使用者 friend:
圖 20-7
使用者 friend 必須是系統中的使用者,否則您必須使用 adduser 或 vipw 建立使用者。建立之後就可以在上圖中 User Name 中輸入 friend 並密碼。這個功能取代了使用 smbpasswd -a 來建立帳號的功能。
20.5 Samba 命令列工具介紹
在命令列中有一些工具可以讓我們設定使用者資料、瀏覽目前使用情形等,我這個小節我們先介紹一些基本的命令指令。
20.5.1 smbpasswd 使用者及密碼管理
smbpasswd 是一個用來在命令列管理 Samba 使用者的工具,我們可以用它來新增使用者、修改使用者密碼、甚至可以執行它來修改其它主機上的 samba 密碼。
smbpasswd 這個指令會將 Samba 的使用者資訊存放在另一個名為 smbpasswd 的文字檔中,這個文字檔的位置依你安裝 Samba 時所下的參數而有所不同,如果您以 ports 安裝,則 smbpasswd 位於 /usr/local/private 下,你可以使用文書編輯器去觀看它的內容。
samba 的使用者和系統使用者所使用的密碼檔是分開的,系統中的密碼設定並非 samba 所使用的密碼,但是要加入 samba 的使用者一定要存在於系統中。
一般使用者如果要使用 smbpasswd 指令來修改密碼,只要輸入 smbpasswd 即可,而 root 可以使用一些參數去新增、修改、刪除使用者,其使用格式如下:
# smbpasswd [參數] [使用者] [密碼]
以下我們介紹一些 root 常用的參數:
參數 說明
-a 新增一個使用者,並設定密碼。如果該使用者已存在,則只進行修改密碼的動作。
-d 暫時禁止某一個使用者登入。使用這個參數後,smbpasswd 會在該使用者資料中加一個 D 的符號,如此一來,該使用者便無法登入。下次我們再開放該使用者登入時,他的密碼資料還是維持不變。
-e 開放被禁止登入的使用者登入。這個參數執行後,會將 smbpasswd 中該使用者資料中的 D 等號移除,該使用者便又可以登入了。
-x 刪除一個使用者的資料。
例如,我們想要新增一個使用者 alex,並設定其密碼為 password:
# smbpasswd -a alex password
但我建議您不要在命令列中直接輸入密碼,而是以下列方式來新增使用者:
# smbpasswd -a alex
New SMB password:
Retype new SMB password:
Added user alex.
如果您要刪除使用者 alex:
# smbpasswd -x alex
smbpasswd 還有其他更進一步的功能,您可以 man smbpasswd 以獲得更多資訊。
20.5.2 smbstatus 伺服器狀態檢視
smbstatus 可以讓我們知道目前系統中 Samba 的使用情形。執行 smbstatus 後的資訊如下:
Samba version 3.0.20
Service uid gid pid machine
----------------------------------------------
picture root wheel 36153 desktop (192.168.0.2) Sun Oct 31 23:01:16 2004
public root wheel 36153 desktop (192.168.0.2) Mon Nov 1 14:35:40 2004
mp3 root wheel 36153 desktop (192.168.0.2) Mon Nov 1 10:21:51 2004
video root wheel 36153 desktop (192.168.0.2) Mon Nov 1 10:21:50 2004
Locked files:
Pid DenyMode Access R/W Oplock Name
-------------------------------------------------------
36153 DENY_NONE 0x20089 RDONLY LEVEL_II /home/mp3/song.mp3 Mon Nov 1 17:31:14 200
第一個部份顯示的是目前使用者正在使用的資料夾名稱,而第二個部份則是正在使用的檔案。
20.5.3 nmblookup 名稱查詢
我們可以使用 nmblookup 來查詢網路上 NetBIOS 主機的資訊,您可以用來查詢 Windows 或 Samba 伺服器的電腦名稱、IP 等資訊。假設我們想要查詢 192.168.0.2 這一台機器的 NetBIOS name:
# nmblookup -A 192.168.0.2
Looking up status of 192.168.0.2
DESKTOP <00> - B
DESKTOP <20> - B
WORKGROUP <00> - B
WORKGROUP <1e> - B
上列資訊中,我們可以看到 192.168.0.2 這台機器的名稱為 DESKTOP,其群組為 WORKGROUP。您也可以由 NetBIOS 名稱反查其 IP:
# nmblookup desktop
querying desktop on 192.168.0.255
192.168.0.2 desktop<00>
20.6 Windows 設定
MS windows 系統的設定方面,如果您使用的是 Windows 98/ME,請先確認您有支援「Client for Microsoft Networks」及「File and printer sharing for Microsofe Networks」。而且 Windows 98 的使用者登入系統名稱和您要登入 Samba 的使用者名稱必須相同才行。如果是 Windows 2000/XP 則沒有這個問題。
我們在使用登入 Samba 時,可以從檔案總管或瀏覽器直接輸入 \\192.168.0.1 (伺服器 IP) 或是 \\hostname (您所設定的 netbios name,預設是 hostname)。或者,您可以將某一個共用資料夾設為系統中的網路磁碟機。
我們只要對著某一個資料夾按滑鼠右鍵,選擇「連線網路磁碟機」即可:
圖 20-8
接下來選擇要使用的磁碟機代號:
圖 20-9
最後就會出現一個新的網路磁碟機了:
圖 20-10
由於我們安裝的是 Samba 3.0,所以在共用資料夾內可以同時存在中文、日文、韓文的檔案。
20.7 存取 MS Windows 的網芳資料
如果您要使用 FreeBSD 來存取 MS Windows 的網芳資料,FreeBSD 中內建有 mount_smbfs 這個工具,可以讓我們將所要存取的主機及其目錄掛在檔案系統中。掛入後,存取的方式就好像檔案位於硬碟中一樣,十分方便,而且對於中文的存取也沒有問題。mount_smbfs 是在 4.5-RELEASE 之後才內建的,如果您的系統在 4.5-RELEASE 之前,您必須要自行從 ports 中安裝 /usr/ports/net/smbfs。
在使用 mount_smbfs 時,如果您的 kernel 並未將 SMB protocol 編譯進來也沒關係,系統在使用前會自動載入 smbfs.ko 這個模組。假設我們要存取的主機資料如下:
* IP:192.168.0.2
* 要掛入的分享目錄:software
* 掛入系統中哪一個目錄:/mnt
我們可以使用下列指令來掛入:
# mount_smbfs -I 192.168.0.2 -N '//192.168.0.1/software' /mnt
這裡的參數 I 表示指定 IP 位址,參數 N 表示不須密碼驗證。如果您所要掛入的分享資料夾需要密碼認證,則不要加參數 N。我們在掛入別台電腦的資料夾時,如果沒有指定使用者名稱,內定會以目前所使用的帳號。如果我們要使用別的使用者名稱,可以使用下列方式:
# mount_smbfs -I 192.168.0.2 '//username@192.168.0.1/software' /mnt
將分享的資料夾掛入後,我們就可以使用 FreeBSD 檔案處理的指令,諸如 cp、mv 等來抓取我們所要的檔案,就像是從本機硬碟中使用檔案一樣。