伺服器安裝與設定 - Samba Server


國網中心 & 青草湖社區大學

王順泰 (c00wht00@nchc.gov.tw)

1. 介紹

    在 Windows 環境中,我們通常透過網路芳鄰來達成彼此機器間的資源分享工作,但是若想要與 Unix-Based 作業系統間做到資源分享,就會比較困難。一般在 Windows 與 Unix-Based 作業系統間,我們都會利用 FTP 或 NFS 來做檔案交換的工作,但這只能做到單方面資源的要求,而無法達到雙向互通。幸好 Samba Server 的出現可以解決這個難題。

    何謂 Samba?簡單來講 Samba 是一套可在 UNIX 或是可使用 TCP/IP 的 Unix-Based 的作業系統上運作的伺服器軟體,Samba 整合了 SMB(Send Message Block)協定與 NetBIOS 協定,使其運作在 TCP/IP 協定上,所以透過 Samba 可以很簡單地讓 Windows 的網路芳鄰找到 Samba 機器,也就是說它能夠讓 Unix-Based 伺服器與其他微軟 Windows 伺服器互動時,看起來就像是個微軟 Windows 伺服器。舉凡 Windows 網路芳鄰可以做的事情 Samba 都可以勝任,例如:檔案和印表機的分享與支援等。

    那麼我們該如何建立一個 Samba Server 呢?當然,我們需要一台可以運作的主機,在上面還需要有一個平穩強大的作業系統(在此就採用大家最為熟悉的 Linux)。當然,我們還需要一套 Samba Server 的軟體,Samba 是一個免費且開放源碼的伺服器軟體,也支援多種的作業平台,本例中我們用的版本是 2.2.7,假如要查看是否有最新的版本請到 Samba 的家:http://www.samba.org/

 

2. 安裝

2.1 如何取得

    Samba 如同 Linux 眾多的 package 一樣會有版本的更新,新版本通常會增加新的功能或是修正一些 bug,我們可以參考 Samba 的家 http://www.samba.org/ 以得到最新的消息。我們可以從美國的 mirror 站取得最新的版本。請按我

另外也可以到國網中心的 opensource 網站上取得。請按我 

2.2 編譯與安裝

原始程式編譯及安裝

首先將原始程式檔解壓縮。

解壓縮:

[root@root]# tar zxvf samba-2.2.7.tar.gz -C /usr/local/src

 

 

執行 configure 指令進行設定。

更換目錄:

[root@root]# cd /usr/local/src/samba-2.2.7/source

執行 configure 進行設定:

[root@source]# ./configure --prefix=/usr/local/samba 

 

 

 

 

進行編譯。在編譯完成後,需執行安裝步驟。

編譯:

[root@source]# make 

安裝:

[root@source]# make install

複製設定檔:

[root@source]# cp /usr/local/src/samba-2.2.7/examples/smb.conf.default /usr/local/samba/lib/smb.conf  

 

 

 

 

 

 

Debian apt-get 安裝

利用 apt-get 來安裝:

[root@root]# /usr/bin/apt-get install samba

 

 

RPM 安裝

在取得 apache rpm 套件後,執行 rpm -ivh 檔名。

[root@root]# /usr/bin/rpm -ivh samba-2.2.7.i386.rpm

 

 

3. 檔案介紹

/usr/local/samba/bin 目錄下有不少與 Samba 運作相關執行檔與應用程式,以下介紹幾個較常用到的程式檔案:

  • smbclient:可以用來登入其他 Unix-Based 的 Samba Server,或是連接 Windows 機器,也可以測試自己的 Samba Server 是否運作正常。 
  • smbstatus:可用來顯示目前 client 端連接到 Samba Server 的連線狀況。
  • smbpasswd:可以建立登入到 Samba Server 的登入密碼。
  • testparm :可以用來測試 smb.conf 組態檔定義是否語法正確。 
  • testprns :可以用來測試定義在 printcap 檔裡的列表機。 
  • nmblookup:可以用來測試自己的 Samba Server 是否正確啟動。 

4. 設定

4.1 smb.conf 檔的設定

這個設定檔是 Samba 最重要的設定檔,因為它關係著 Samba Server 是否能正常運作或許多權限上的設定。說明如下:

Global Settings

##
## Basic Server Settings
##

workgroup

語法:workgroup = <工作群組>
預設:
workgroup = MYGROUP

設定 Samba Server 的工作群組。

例:

workgroup = MYGROUP

-> 設定 Samba Server在 Windows 網路芳鄰上所處的工作群組為 MYGROUP。

 

 

 

netbios name

語法:netbios name =  <伺服器名稱> 
預設:無

設定 Samba Server 的名稱,如果不加入這行則使用 Linux 系統的的主機名稱〈hostname〉。

例:

netbios name = chanel

-> 設定出現在 Windows 網路芳鄰上的 Samba Server 名稱為 chanel。

 

 

 

server string

語法:server string = <說明>
預設:
server string = Samba Server

設定Samba Server 的伺服器註解。

例:

server string = This is a Samba Server

-> 設定出現在 Windows 網路芳鄰上的 Samba Server 註解為 'This is a Samba Server'。

 

 

 

hosts allow

語法:hosts allow = <IP 位址> ...
預設:
; hosts allow = 192.168.1. 192.168.2.0./24 192.168.3.0/255.255.255.0 127.0.0.1

限制可以允許何台機器連到 Samba Server,多參數 <IP 位址> 間須以空格隔開,表示法可以為:

  • 完整的 IP 位址。例:192.168.1.1
  • 網路位址。例:192.168.1.
  • 網路遮罩。例:192.168.1.0/255.255.255.0
  • 網域名稱。例:.nchc.gov.tw

例:

hosts allow = 192.168.1. 192.168.3.0/255.255.255.0 127.0.0.1

-> 表示允許網路位址為 192.168.1. 上的機器、網路位址為 192.168.3. 上的機器、IP 位址為 127.0.0.1 的機器連到自己的 Samba Server。

 

 

 

 

guest account

語法:guest account = <帳號名稱> 
預設:; guest account = pcguest 

設定 Samba Server 上的試用帳號。在 Linux 系統中需先要有這個新設定的帳號,在 Samba 中才能新增此帳號。新增方法請參考 5.3 節。

例:

guest account = pcguest

-> 設定 Samba Server 上的試用帳號為 pcguest。

 

 

 

log file

語法:log file = <檔名>
預設:log file = /usr/local/samba/var/log.%m

設定 Samba Server 的記錄檔的儲存位置與檔名。〈%m代表來源的機器名稱〉

例:

log file = /usr/local/samba/var/logfile

-> 設定記錄檔檔名為 logfile 且儲放在 /usr/local/samba/var 目錄中。

 

 

 

log level

語法:log level = <數字>
預設:; level = 1

設定記錄運作過程訊息的多寡。所設定的 <數字> 的級數越多則記錄檔的內容將會越多。

例:

log level = 1

-> 設定記錄級數為 1,即指記錄關鍵訊息。

 

 

 

max log size

語法:max log size = <KB>
預設:
max log size = 50

設定 Samba Server 所能儲存的最大記錄訊息容量,即記錄檔的最大容量。單位:KB。

例:

max log size = 50

-> 設定記錄檔最大容量為 50 KBytes。

 

 

 

security

語法:security = <等級>
預設:security = user

設定存取資源分享的控制方式。共有四種:

  • share:使用者不需要帳號及密碼即可登入 Samba Server。 
  • user:使用者需要有帳號及密碼才能登入 Samba Server,而檢查帳號及密碼的工作是本台 Samba Server 負責。 
  • server:使用者需要有帳號及密碼才能登入 Samba Server,而檢查帳號及密碼的工作是由另一台 (可以是 Windows NT/2000/XP 的機器或 Samba Server) 負責。
  • domain:指定 Windows NT/2000/XP 伺服機來驗證檢查帳號及密碼的工作。

例:

security share

-> 設定使用者不需要帳號及密碼即可登入 Samba Server。

 

 

 

include

語法:include = <設定檔路徑與檔案名稱>
預設:; include = /usr/local/samba/lib/smb.conf.%m

定 Samba Server 的設定檔路徑與檔名, %m 是機器的名稱 。

例:

include = /usr/local/samba/lib/smb.conf 

-> 設定 Samba Server 設定檔的存放路徑與檔名為 /usr/local/samba/lib/sam.conf。

 

 

 

##
## Network Browsing
##

local master

語法:local master = <(no)/(yes)>
預設:; local master = no

設定 Samba Server 是否要擔當 Local Master Browser LMB) 的角色。Local Master Browser 負責收集本地網路的 Browse List 資源。通常無特殊原因都會設成 no。

例:

local master = no

-> 表示 Samba Server 不要設成為 Local Master Browser。

 

 

 

domain master

語法:domain master = <(no)/(yes)>
預設:
; domain master = yes

設定 Samba Server 是否要擔當 Domain Master Browser (DMB) 的角色。Domain Master Browser 會負責收集其它子網路的 Browse List 資源。通常無特殊原因都會設成 no。

例:

domain master = no

-> 表示 Samba Server 不要設成為 Domain Master Browser。

 

 

 

os level

語法:os level = <數字>
預設:; os level = 20

設定 Samba Server 的 os level。os level 從 0 到 255。Windows NT 作業系統的 os level 為 33,Windows 95/98 的 os level 是 1。若要拿 Samba Server 當 LMB 或 DMB 則它的 os level 至少要大於 NT 的 33 以上。

例:

os level = 20

-> 表示 Samba Server 不要設成為 Domain Master Browser。

 

 

 

preferred master

語法:preferred master = <(yes)/(no)>
預設:
; preferred master = yes

設定 Samba Server 是否要擔當 Primary Domain Controller (PDC) 的角色。PDC 會負責追蹤網路帳戶所進行的一切變更。通常無特殊原因都會設成 no。同一網域內不可有兩個主機設定為 PDC,它們每 5 分鐘會搶主控權一次。

例:

preferred master = no

-> 表示 Samba Server 不要設成為 Primary Domain Controller。

 

 

 

##
## WINS & Name Resolution
##

wins support

語法:wins support = <(no)/(yes)>
預設:
; wins support = yes

設定 Samba Server 是否要向網路提供 WINS 服務。通常無特殊原因都會設成 no,除非所處網路上沒有機器提供 WINS 服務且須要此台 Samba Server 提供 WINS 服務才要設 yes。注意:'wins support' 與 'wins server' 只能選一個。

例:

wins support = no

-> 設定 Samba Server 不要提供 WINS 服務。 

 

 

 

wins server

語法:wins server = <IP 位址>
預設:
; wins server = w.x.y.z

設定 Samba Server 是否要使用別台機器所提供的 WINS 服務。通常無特殊原因都會設成 no,除非所處網路上有一台機器有提供 WINS 服務才要設 yes。注意:'wins support' 與 'wins server' 只能選一個。

例:

wins server = 192.168.1.1

-> 表示 Samba Server 要使用 192.168.1.1 所提供的 WINS 服務。 

 

 

 

##
## Passwords & Authentication
##

password server

語法:password server = <IP 位址或機器名稱>
預設:
; password server = <NT-Server-Name>

設定那一台伺服器 (包括 Windows 或 Samba 系統) 上的密碼,作為使用者登入時驗證的密碼。注意:此一項需配合 security = server 時,才可設定本參數。

例:

password server = 192.168.1.1

-> 表示 Samba Server 要使用 192.168.1.1 所提供的密碼。 

 

 

 

encrypt passwords

語法:encrypt passwords =  <(yes/no)>
預設:; encrypt passwords = yes

設定是否對 Samba 的密碼檔做編碼動作。

例:

overwrite yes real

-> 表示屬於 real 群組的使用者可以執行 overwrite 指令。

 

 

 

smb passwd file

語法:smb passwd file = <檔案路徑與名稱>
預設:無

設定 Samba 自己的密碼檔路徑與檔名。

例:

smb passwd file = /usr/local/samba/private/smbpasswd

-> 設定 Samba 自己的密碼檔路徑與檔名為 /usr/local/samba/private/smbpasswd。

 

 

 

unix password sync

語法:unix password sync = <(yes/no)>
預設:; unix password sync = yes

設定當 Linux 系統增加使用者時,是否自動將該使用者的密碼加到 Samba 的 smbpasswd 內。此設定還需配合 passwd chat。

例:

unix password sync = no

-> 設定不需與新增作業系統使用者時做同步。

 

 

 

##
## Printing
##

load printers

語法:load printers = <(yes/no)> 
預設:load printers = yes

設定是否允許使用者使用 Samba Server 所分享出來的印表機。

例:

load printers

-> 表示允許使用者使用 Samba Server 所分享出來的印表機。

 

 

 

printcap name

語法:printcap name = <檔名>
預設:; printcap name = lpstat

設定 Samba Server 印表機的分享設定。

例:

printcap name = /etc/printcap

-> 設定 Samba Server 參考 /etc/printcap 檔的印表機設定。

 

 

 

printing

語法:printing = <系統型態>
預設:
; printing = bsd

設定 Samba Server 印表機所使用的列印系統。目前所支援的列印系統包括有:bsd, sysv, plp, lprng, aix, hpux, qnx。

例:

printing = bsd

-> 設定 Samba Server 的列印系統為 bsd 型態。

 

 

 

Share Definitions

[homes]
    comment = Home Directories
    browseable = no
    writable = yes
    valid users = %S

使用者本身的家目錄。當使用者以 Samba 使用者身份登入 Samba Server 後, Samba Server 底下會看到自己的家目錄〈目錄名稱是使用者自己的帳號〉。[homes] 底下的指令請參考以下說明

[分享的資源名稱]
    <指令1> = (參數)
    <指令2> = (參數)
     ............................ 

要提供分享資源時,須先把欲分享的資源名稱以 [ ] 符號括住,底下通常會帶指令與參數來表示此資源的設定與存取權限等。指令的種類與用法請參考以下說明。

  • comment:註解說明。
  • path:分享資源的完整路徑名稱,除了路徑要正確外,目錄的權限也需設對。
  • browseable:在瀏覽資源中是否顯示分享名稱,若為否則必須指定分享路徑才能存取。
  • vaild users:資源僅允許分享給所設定的名單成員。
  • public:是否公開分享。若為否則須進行身份驗證。
  • guest ok:是否公開分享。若為否則須進行身份驗證。
  • read only:設定資源是否以唯讀方式來分享。它與 writeable = no 是一樣的,兩者若一樣時則以最後一個設定為主。
  • writeable:設定資源是否以可寫方式來分享。writeable = no 與 read only = yes 是一樣的,兩者若一樣時則以最後一個設定為主。
  • write list:若設定為唯讀時,只有在此設定的名單內的成員才可以做寫入動作。
  • create mask:建立檔案時所給的權限。
  • directory mask:建立目錄時所給的權限。
  • printable:是否允許列印。
  • force group:指定存取資源時須以此設定的群組使用者進入才能存取。
  • force user:指定存取資源時須以此設定的使用者進入才能存取。

例:

[tmp]
   comment = Temporary file space
   path = /tmp
   read only = no
   public = yes

-> 表示所提供分享的資源名稱為 tmp,註解說明為 ''Temporary file space',真正可供存取的目錄為 /tmp 目錄,不是以唯讀方式來分享,任何人不須進行身份驗證即可存取此資源。

 

[myshare]
   comment = Mary's and Fred's stuff
   path = /usr/somewhere/shared
   valid users = mary fred
   public = no 
   writable = yes
   create mask = 0765

-> 表示所提供分享的資源名稱為 myshare,註解說明為 'Mary's and Fred's stuff',真正可供存取的目錄為 /usr/somewhere/shared 目錄,資源不是公開的僅提供給 mary 與 fred 兩位使用者存取,使用者可以以可寫方式來使用,所產生檔案的權限為 0765

 

 

 

 

 

 

 

 

 

 

 

 

4.2 測試 smb.conf 的設定

測試 smb.conf 是一件相當重要的事,因為 smb.conf 設定的正確與否關係到 Samba Server 能否正常運作,我們可以用 testparm 這個程式來測試 smb.conf 是否有問題。

[root@root]# /usr/local/samba/bin/testparm

Load smb config files from /usr/local/samba/lib/smb.conf
Processing section "[homes]"
Processing section "[printers]"
Loaded services file OK.
Press enter to see a dump of your service definitions
.......

 

 

 

 

 

 

5. 啟動與應用程式

當設定完 smb.conf 之後,Samba 的設定步驟就算完成了。現在我們要來看看如何啟動 Samba Server。

5.1 啟動 Samba Server

啟動 Samba Server 之前必須要先要確認在 /etc/services 檔案裡面這些句子沒有被註解掉:

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

 

 

 

 

 

Samba 的啟動方式有二種:一種是以 daemon 的形式,另一種則是以 inetd superserver 的形式。

以 inetd 方式啟動

若以 inetd 的形式來啟動,則須將以下指令寫在 /etc/inetd.conf 中:

netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd smbd
netbios-ns dgram udp wait root /usr/local/samba/bin/nmbd nmbd

 

 

 

以 daemon 方式啟動

利用 daemon 的形式有一個好處,那就是 Samba Server 對需求連線能夠以較的快的速度來回應。若以 daemon 的形式,則可將以下指令寫在 /etc/rc.d/rc.local 中:

/usr/local/samba/sbin/smbd -D -d1
/usr/local/samba/sbin/nmbd -D -d1 -G <GroupName> -n <ComputerName>


注意:<GroupName> 與 <ComputerName> 必須填上在 Windows 中的工作群組與電腦名稱。

 

 

 

 

5.2 測試

5.2.1 列出已分享的資源

可以執行以下指令來列出 Samba Server 已分享了那些資源

[root@root]# /usr/local/samba/bin/smbclient -L <Samba主機名稱>

added interface ip=192.168.0.5 bcast=192.168.0.255 nmask=255.255.255.0
Password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 2.2.7]

Sharename  Type    Comment
---------        ----      -------
IPC$           IPC       IPC Service (Samba Server)
ADMIN$    Disk      IPC Service (Samba Server)
lp                Printer  Generic dot-matrix printer entry
share           Disk     Share Directories

Server Comment
--------- -------
CHANEL Samba Server

Workgroup Master
--------- -------
MYGROUP

 

 

 

 

 

 

 

 

 

 

 

 

5.2.2 測試自己所分享的資源

我們可以藉由 smbclient 來連上網路上的資源,這裡先來測試是否可以連上自己所分享的資源,用法如下:

smbclient "//<主機名稱>/<資源服務名稱>"

假設主機名稱為 chanel,它所開放出來的資源服務名叫 share,則可以由以下指令來連到它所分享出來得資源:

[root@root]# /usr/local/samba/bin/smbclient "//chanel/share"

added interface ip=192.168.0.5 bcast=192.168.0.255 nmask=255.255.255.0
Password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 2.2.7]
smb: \> ls
. D 0 Wed Dec 4 16:47:13 2002
.. D 0 Fri Nov 29 11:02:33 2002
apache_1.3.27.tar.gz 2306052 Tue Dec 3 09:52:44 2002
httpd-2.0.43.tar.gz 4835188 Tue Dec 3 09:52:45 2002
wu-ftpd-2.6.2.tar.gz 354784 Tue Dec 3 09:52:45 2002
samba-2.2.7.tar.gz 5325678 Wed Dec 4 16:34:34 2002

37553 blocks of size 131072. 27924 blocks available

 

 

 

 

 

 

 

 

 

 

5.2.3 使用 Windows 系統連接到自己所分享的資源

若自己可以成功地連到自己所分享的資源,接下來可以找一台 Windows 作業系統的機器,可於 [開始] -> [執行]:(開啟) 處輸入以下指令即會出現分享的視窗:

\\<主機名稱>\<資源服務名稱>

\\<IP 位址>\<資源服務名稱>


5.3 建立 Samba 使用者的帳號 

由於 Samba Server 所使用的密碼檔和 Linux 是採用不同的密碼檔,所以要自行再轉換。做法如下:

 

先將 /usr/local/src/samba-2.2.7/source/script/mksmbpasswd.sh 檔的權限更改成可執行:(註:mksmbpasswd.sh 檔為轉換 Samba 密碼檔所須的 shell script 檔)

[root@root]# chmod u+x /usr/local/src/samba-2.2.7/source/script/mksmbpasswd.sh

將末加密的 /etc/passwd 檔轉換為有加密碼的 smbpasswd 檔:

[root@root]# cat /etc/passwd | /usr/local/src/samba-2.2.7/source/script/mksmbpasswd.sh > /usr/local/samba/private/smbpasswd

為安全起見,更改 smbpasswd 檔權限: 

[root@root]# chmod u+rw /usr/local/samba/private/smbpasswd

 

更改使用者的 Samba 密碼:

[root@root]# /usr/local/samba/bin/smbpasswd <使用者名稱>

 

 

 

 

 

 

 

 

 

若欲新增 Samba 新使用者,必須先於 Linux 系統中新增使用者,才能於 Samba 中新增使用者,做法如下:

新增一位 Linux 的使用者:

[root@root]# /usr/sbin/adduser --disabled-login --no-create-home --shell /bin/false test

〈註:--diabled-login: 無法登入、--no-create-home: 不要產生家目錄、--shell: 指定所使用的 shell 為 /bin/false〉

新增 Samba 使用者:

[root@root]# /usr/local/samba/bin/smbpasswd -a test

New SMB password:
Retype new SMB password:
Added user test.

 

 

 

 

 

 

 

注意:security 項必須要設定成 user〈security = user〉,使用者才能用他的帳號與密碼登入 Samba Server。

 

5.4 相關應用程式

5.4.1 查看目前連線狀態

我們可以藉由 smbstatus 指令來查看目前有那些人連到自己  Samba 機器的那些資源:

 

[root@root]# /usr/local/samba/bin/smbstatus

Samba version 2.2.7
Service uid gid pid machine
----------------------------------------------
share nobody nogroup 23990 killer (192.168.0.11) Thu Dec 5 10:50:08 2002
IPC$ nobody nogroup 23990 killer (192.168.0.11) Thu Dec 5 10:50:08 2002
IPC$ nobody nogroup 23990 killer (192.168.0.11) Thu Dec 5 10:50:08 2002
IPC$ nobody nogroup 23990 killer (192.168.0.11) Thu Dec 5 10:50:08 2002

No locked files

 

 

 

 

 

 

 

5.4.2 查看目前網路上有那些機器

我們可以藉由 findsmb 指令來查看目前網路上有那些機器:

[root@root]# /usr/local/samba/bin/findsmb

*=DMB
+=LMB
IP ADDR        NETBIOS NAME   WORKGROUP/OS/VERSION
---------------------------------------------------------------------
192.168.0.1    TIFFANY                [PCDT] [Unix] [Samba 2.2.3a]
192.168.0.5    CHANEL                 [MYGROUP] [Unix] [Samba 2.2.7]
192.168.0.11  KILLER                 +[PCDT] [Windows 5.0] [Windows 2000 LAN Manager]

 

 

 

 

 

 

5.4.3 查詢 netbios 名稱或 workgroup 的機器

我們可以藉由 nmblookup 指令來查詢 netbios 名稱的資訊或 workgroup 的機器資訊:

[root@root]# /usr/local/samba/bin/nmblookup TIFFANY

querying CHANEL on 192.168.0.255
192.168.0.1 TIFFANY<00>

[root@root]# /usr/local/samba/bin/nmblookup PCDT

querying PCDT on 192.168.0.255
192.168.0.11 PCDT<00>
192.168.0.1 PCDT<00>

 

 

 

 

 

 

 

6. 參考資料

  1. The Unofficial Samba HOWTO: http://hr.uoregon.edu/davidrl/samba.html
  2. SAMBA Project Documentation: http://us1.samba.org/samba/docs/Samba-HOWTO-Collection.html
  3. Study Area: http://www.study-area.net/linux/servers/linux_samba.htm