|
國網中心 & 青草湖社區大學
王順泰 (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. 參考資料
- The Unofficial Samba HOWTO: http://hr.uoregon.edu/davidrl/samba.html
- SAMBA Project Documentation: http://us1.samba.org/samba/docs/Samba-HOWTO-Collection.html
- Study Area: http://www.study-area.net/linux/servers/linux_samba.htm
|