歷史溯源
在早期網路世界當中,檔案數據在不同主機之間的傳輸大多是使用 FTP 這個好用的伺服器軟體來進行傳送。不過,使用FTP 傳輸檔案卻有個小小的問題,那就您無法直接修改主機上面的檔案數據!也就是說您想要更改Linux 主機上的某個檔案時,必需要由 Server 端將該檔案下載到 Client端後才能修改,也因此該檔案在 Server 與 Client 端都會存在。這個時候,萬一如果有一天您修改了某個檔案,卻忘記將數據上傳回主機,那么等過了一陣子之後,如何知道那個檔案才是最新的?!
既然有這樣的問題,可不可以在 Client 端的機器上面直接取用Server 上面的檔案,如果可以在 Client 端直接進行 Server 端檔案的存取,那么在Client 端就不需要存在該檔案數據,也就是說,只要有 Server 上面的檔案資料存在就可以!有沒有這樣的檔案系統( File System )?很高興的是, NetworkFile System, NFS 就是這樣的檔案系統之一!我只要在 Client 端將 Server所提供分享的目錄掛載進來,那么在 Client 的機器上面就可以直接取用 Server上的檔案數據,而且,該數據就像 Client 端上面的partition 一般!而除了可以讓 Unix Like 的機器互相分享檔案的NFS 伺服器之外,在微軟 ( Microsoft ) 上面也有類似的檔案系統,那就是 CommonInternet File System, CIFS 這個咚咚啦!CIFS 最簡單的想法就是目前常見的『網上鄰居』。Windows 系統的計算機可以透過桌面上『網上鄰居』來分享別人所提供的檔案數據。不過,NFS僅能讓 Unix 機器溝通, CIFS 只能讓 Windows 機器溝通。傷腦筋,那么有沒有讓Windows 與 Unix-Like 這兩個不同的平台相互分享檔案數據的檔案系統?
1991 年一個名叫 Andrew Tridgwell 的大學生就有這樣的困擾,他手上有三部機器,分別是跑DOS 的個人計算機、DEC公司的 Digital Unix 系統以及 Sun 的 Unix 系統。在當時,DEC 公司有發展出一套稱為 PATHWORKS 的軟體,這套軟體可以用來分享 DEC 的Unix 與個人計算機的 DOS 這兩個作業系統的檔案數據,可惜讓 Tridgwell 覺得較困擾的是,Sun的 Unix 無法藉由這個軟體來達到數據分享的目的。這個時候 Tridgwell 就想說:『咦!既然這兩部系統可以相互溝通,沒道理Sun 就必需這么苦命吧?可不可以將這兩部系統的運作原理找出來,然後讓 Sun這部機器也能夠分享檔案數據呢?』,為了解決這樣的的問題,這老兄就自行寫了個program 去偵測當 DOS 與 DEC 的 Unix 系統在進行數據分享傳送時所使用到的通訊協定信息,然後將這些重要的信息擷取下來,並且基於上述所找到的通訊協定而開發出 ServerMessage Block (SMB) 這個檔案系統,而就是這套 SMB軟體能夠讓 Unix 與 DOS 互相的分享數據!(註:再次的給他強調一次,在Unix Like 上面可以分享檔案數據的 file system 是 NFS,那么在 Windows 上面使用的『網路鄰居』所使用的檔案系統則稱為Common Internet File System, CIFS )
因此 Tridgwell就去申請了 SMBServer ( Server Message Block 的簡寫 ) 這個名字來做為他撰寫的這個軟體的商標,可惜的是,因為SMB 是沒有意義的文字,因此沒有辦法達成註冊。既然如此的話,那么能不能在字典裡面找到相關的字詞可以做為商標來註冊呢?翻了老半天,呵呵!這個 SA MBA剛好含有 SMB ,又是熱情有勁的拉丁舞蹈的名稱,不如就用這個名字來做為商標好了。如此,這成為我們今天所使用的SAMBA 的名稱由來。
套件安裝
事實上, SAMBA 的安裝一點也不難,而且在各主要 distribution上面都有提供,也都大同小異,所以,比較建議使用distribution 所提供的 RPM 檔案來安裝!當然,也可以自行使用Tarball 來安裝!
①使用 RPM來安裝
使用 RPM 來安裝真是一點都不難。不過,要注意安裝的套件名稱,因為不同的distribution 對於 RPM 檔案的命名都不太一樣!舉例, Red Hat 9 對於SAMBA 這個伺服器總共需要至少三個套件,分別是:
samba:這個套件主要包含了 SAMBA 的主要 daemon檔案 ( smbd 及 nmbd )、 SAMBA 的檔案檔 ( document )、以及其它與 SAMBA 相關的logrotate 設定檔案及開機預設選項檔案等;
samba-common:這個套件則主要提供了 SAMBA 的主要設定檔(smb.conf) 、 smb.conf 語法檢驗的測試程式 ( testparm )等等;
samba-client:這個套件則提供了當 Linux 做為SAMBA Client 端時,所需要的工具指令,例如掛載 SAMBA 檔案格式的執行檔 smbmount等等。
不過,在 Mandrake 9.1 當中,則將 samba 這個套件又分為 samba-server與 samba-doc 兩個套件,所以在 MDK 9.1 則有四個套件需要安裝:samba-server, samba-doc, samba-common, samba-client。
②RPM 的安裝:拿出光碟, mount 上他,然後再將裡頭的samba 套件給他 RPM 上去即可!在最後檢驗的時候,您的系統應該有點像底下這個樣子(以Red Hat 9 為例):
[root@testroot]#rpm -qa | grep samba
samba-common-2.2.7a-8.9.0
redhat-config-samba-1.0.4-1
samba-2.2.7a-8.9.0
samba-client-2.2.7a-8.9.0
注意,上面顯示的例子是Red Hat 9 的檔案,其中那個 redhat-config-samba 是 Red Hat額外提供的設定功能,可以不用安裝。
③使用Tarball 來安裝
一般來說,因為各個 distribution 提供的 SAMBA 的功能都差不多,所以實在沒有必要使用Tarball 來進行額外的安裝與設定,不過,如果您還是想要自己建置自己的 SAMBA的話,可以到 SAMBA 的官方網站上下載 samba 的原始程式代碼,然後在自己的機器上面編譯。
[root@testroot]#wget http://ftp.XX/Unix/Samba/samba-2.2.8a.tar.gz
[root@testroot]#cd /usr/local/src
[root@testsrc]# tar -zxvf /root/samba-2.2.8a.tar.gz
這個時候會有一個目錄跑出來:/usr/local/src/samba-2.2.8a
[root@testsrc]# cd samba-2.2.8a #(在這個目錄中察看一下README )
[[email protected]]# cd source
[root@testsource]# ./configure --prefix=/usr/local/samba\
> --with-automount--with-smbmount --with-pam \
> --with-mmap--with-quotas --with-libsmbclient
1. 請先以 ./configure--help 察看一下 configure 的一些相關的參數用法
2. 如果發生任何錯誤,請不要往下進行make 的動作,因為還是不對的!
3. 萬一發生任何錯誤時,通常是由於一些函式庫找不到的緣故,請參考此目錄下的 config.log這個檔案的內容,裡面會記錄一些錯誤的歷程。
[root@testsource]#make #(開始進行編譯!)
這個過程會花一些時間,因為他會將原始碼(source code) 剛剛設定
並以 gcc 這個compiler 來進行編譯喔!所以會花一些時間
[root@testsource]# make install
將剛剛編譯完成的可執行binary 檔案安裝到 /usr/local/samba 裡面
在這個例子當中,未來您在設定SAMBA 時,必需要到 /usr/local/samba 當中
一般來說,除非 Linux distribution 已經相當的老舊了 (例如 Red Hat6.x 以前的版本),並且在舊的系統上面正在正常的運作一些服務,而僅想要增加SAMBA 的服務,那就只好使用 Tarball 的方式來安裝SAMBA ,否則的話,蠻強烈的建議直接以 RPM 的方法來安裝您的SAMBA 伺服器軟體即可!因為既簡單方便,又容易統一設定。Server端的設定由於 SAMBA 幾乎一定包含在各個主要的 Linux distribution 當中,並且不同版本之間的功能差異也不是很大,所以, 底下的介紹我們都以RPM 安裝的 SAMBA 套件來進行說明。當然啦,即使同樣是 RPM 的檔案,但是在各個Linux distribution 當中, SAMBA 的主要檔案放置的目錄還是可能會不太一樣。不過,因為SAMBA 的設定檔檔名都是不變的 ( smb.conf ),所以,雖然底下我們是以Red Hat 9 為範例,不過,您依舊可以使用 locate, find, whereis 等指令在不同的distribution 系統下找出 SAMBA 主要的設定檔與執行檔喔! ( 這就是為什麼我們喜歡教大家使用vi 以及純文字模式學習 Linux 的原因,因為 一法通,萬法通啊!)
另外,我一開始的範例當中都是針對沒有設定防火牆的情況下所進行設定與測試,如果您的環境裡面已經有架設防火牆的話,那么您應該要先了解防火牆的架構,並將SAMBA 需要的 port 給他開放,否則很難測試成功喔!或者直接察看本章節較後面專門談安全的部分,尤其是iptables 與 /etc/hosts.allow(deny)這部份喔!
套件結構
我們這裡以 Red Hat 9 的 SAMBA 套件來介紹他相關的一些設定檔與執行檔,不過,如果您的distribution 並不是 Red Hat 9 ,那也沒有關係,因為都是大同小異的啦!善用locate 這個指令去搜尋喔!
配置檔案
在較早期的版本中, SAMBA 的設定檔都直接放置在 /etc 底下,後來的版本則將設定檔通通放置到/etc/samba 底下去了 ( 有的 distribution 放在 /etc/smb 有的則是 /etc/samba.d,請使用 locate 搜尋! )。在 /etc/samba 底下的幾個重要的設定檔有: /etc/samba/smb.conf:這個就是SAMBA 最主要的設定檔了!在較為簡單的設定當中,這也是唯一的一個設定檔!此外,這個檔案本身就含有相當豐富的說明,所以,在設定之前,請使用vi 好好的詳細的觀看一下這個檔案吧!這個設定檔主要的設定分為兩部份,分別是[global] 這個設定主機功能的項目,以及接下來的每個分享出去的目錄的屬性設定。
/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 才行。
執行檔案
SAMBA 的執行檔案一般來說,做為 SAMBA Server 的執行檔有 testparm,smbd, nmbd, smbpasswd,至於做為 SAMBA Client 的執行檔主要則是:smbmount,smbclient。 smbd 與 nmbd:這兩個執行檔是那兩個主要的 daemons ,每次啟動 SAMBA 都會使用到的兩個執行檔。
testparm:當設定完成了smb.conf 這個主要設定檔之後,而想要查看一下 SAMBA 的所有設定參數與 smb.conf的設定項目是否正確時,就需要使用這個 testparm 來查看(test parameters 的簡寫!)!所以,每次在修改完 smb.conf之後,請務必要使用 testparm 查看看是否有設定錯誤。
smbpasswd:如果SAMBA 設定的較為嚴格,需要規定使用者的賬號與密碼,那么那個密碼檔案的建立就需要使用smbpasswd 來建置才可以,所以這個指令與建立 SAMBA 的密碼有關。 smbclient:當Linux 主機想要藉由『網路上的芳鄰』的功能來查看別台計算機所分享出來的目錄與裝置時,就可以使用smbclient 來查看啦!這個指令也可以使用在 SAMBA 主機上面,用來查看是否設定成功。
smbmount:在Windows 上面可以設定『網路磁碟驅動器』來連線到主機上面,同樣,在Linux 上面,可以透過 smbmount 來將遠程主機分享的檔案與目錄掛載到Linux 主機上面。不過,其實也可以直接使用 mount 這個指令來進行同樣的功能就是了。
相關目錄
這部份需要較為注意的應該算是 SAMBA的『登錄檔』。因為最近以來,利用『網路上的芳鄰』來進行破壞的病毒是越來越多!也有越來越多的搞怪者會以網路上的芳鄰的相關漏洞進行入侵的伎倆,所以,了解一下登錄檔放置的地點,並且加以分析,可以得到不小的監測。 /usr/share/doc/samba:包含SAMBA 的所有相關的技術手冊。也就是說,當安裝好 SAMBA 之後,系統就已經含有相當豐富而完整的SAMBA 使用手冊。
/var/log/samba:SAMBA 預設的登錄檔案放置目錄。如果 SAMBA 老是設定不起來,又或者懷疑被人家以port 137~139 入侵的話,就到這裡來觀察。
/usr/share/samba/codepages:放置各個語言的支持格式。舉例來說,想讓SAMBA 支持中文,那么就需要 codepage.950 這個檔案的支持。在smb.conf 裡面設定即可。
套用功能
由上面說明的 SAMBA 發展緣由,可以看出, SAMBA 最初發展的主要目就是要用來溝通Windows 與 Unix Like 這兩個不同的作業平台。最大的好處就是不必讓同樣的一份數據放置在不同的地方,搞到後來都不曉得哪一份資料是最新的!而且也可以透過這樣的一個檔案系統讓Linux 與 Windows 的檔案傳輸變得更為簡單!也就是說,可以透過『網路上的芳鄰』來進行Linux 與 Windows 檔案的傳輸。那么 SAMBA 可以進行哪些動作呢?
①分享檔案與印表機服務;
②提供使用者登入 SAMBA 主機時的身份認證,以提供不同身份者的個別數據;
③進行 Windows 網路上的主機名稱解析 (NetBIOS name)
④進行裝置的分享 ( 例如 Zip, CDROM... )
主要部分
兩個守護程式:smbd 和 nmbd(對客戶端提供NetBIOS名服務)
配置檔案:/etc/smb.conf
使用工具:smbclient,smbstatus,smbmount,smbumount,smbprint,smbprint.sysv,smbrun
samba的啟動腳本在/etc/rc.d/init.d/smb
BTW,不要把smb與smp(對稱多處理器)搞混了,更不要把NetBIOS名與DNS里的主機名搞混淆了! samba預設 是把主機名設定成NetBIOS名,這樣通常會超出NetBIOS名的長度限制(16個字元).
SMB方法
當登入的使用者嘗試連線遠端的電腦網路分享,例如 \\server\myshare,Windows 用戶端會在向使用者取得任何使用者名稱或密碼前,自動傳送登入使用者的登入資料至
SMB 伺服器,在這步驟,如果認證失敗,Windows 會彈出一個視窗,詢問使用者名稱和密碼。
一般來說,SMB 對話以下列次序建立:
"TCP Connection" – 建立 3-way handshake (連線) 至 port 139/tcp 或 445/tcp。
"NetBIOS Session Request" – 使用下列 "Calling Names":本機的 NetBIOS name
加上第十六個字元 16th character 0×00:伺服器的 NetBIOS name 加上第十六個字元 0×20
"SMB Negotiate Protocol" – 決定使用的協定方言,會是以下其中一項:PC Network Program 1.0
(Core) – 只是分享層級保全模式;Microsoft Networks 1.03 (Core Plus) – 只是分享層級保全模式;Lanman1.0
(LAN Manager 1.0) – 使用 Challenge/Response Authentication;Lanman2.1 (LAN
Manager 2.1) – 使用 Challenge/Response Authentication; NT LM 0.12 (NT LM 0.12)
- 使用 Challenge/Response Authentication
SMB 對話啟動,密碼會按以下其中一種方法加密 (或不加密): Null (沒有加密);Cleartext (沒有加密); LM
和 NTLM;NTLM;NTLMv2。接著密碼會弄亂並傳送給要求對話的電腦 (諷刺地,這步驟會在要求密碼前做)。
SMB Tree Connect:連線分享的名稱 (例如: \\servername\share);連線至一種服務類型 (例如: IPC$
named pipe)
網路鄰居
在win95的網路鄰居裡面看不到Linux box
注意/etc/smb.conf檔案里以下幾項的設定:
guest account = pcguest(不要照著寫,添實際的名字,你要去創建一個pcguest帳號)
null password = yes (這一點很重要!)
browseable = yes
public = yes
另外把security改為share試試.
仔細讀一讀"man smb.conf".
再說Win95那個破東西,網上鄰居運行一百遍才可能會出來你想要的.
用這個方法試一試:先用smbmount Win95的一個已分享資料夾,用"網路監視器"查看一下,然後再用網上鄰居看.
怎么用
不能用man smbmount看看嗎? 大致是:
smbmount //win95-name/share-dir /mount-point [-I ip地址或主機名] [-c 本機客戶名]
[]表示可選項,本機客戶名可以隨便取.
Samuel Leo補充道:
標準的smbmount使用格式是
smbmount //server/share -c "mount /mnt -u uid -g gid" (註:好像不對吧)
我編譯了一個修改版的smbmount,使用格式為
smbmount //server/share /mnt [passwd] [-Uusername] [-9]
ftp://202.103.190.5/incoming/smbmount.gz (binary)
如果你用redhat,也可以試試最新出的smbwrapper
ftp://202.103.190.5/incoming/smbwrapper.so.gz
設定一下環境變數
LD_PRELOAD=/anywhere/
SMBW_USER=username
SMBW_PASSWORD=passsword
SMBW_WORKGROUP=workgroup #optional
SMBW_DEBUG=4 #optional
SMBW_LOGFILE=smbw.log #optional,default to stderr
SMBW_PREFIX=/smb #optional,default to /smb
export PWD SMBW_USER SMBW_PASSWORD SMBW_WORKGROUP
export SMBW_DEBUG SMBW_LOGFILE SMBW_PREFIX
然後你就可以"ls /smb"看到同組的所有機器名.
"ls /smb/server"看該機的共享清單.
缺點就是太慢,10.10版對execle,execve,…等指定envp的exec仍有bug
不能下執行/smb下的檔案,不能mmap /smb下的檔案.
> 先謝謝各位!
> 我的Pwin95現在可以看到linux了,我保證什麼也未修改過。
> 現在,我從linux上執行:
> smbclient //sjj2/nes(pwin95機器),可看到檔案並顯示:
> smb:\>
> smbclient -L sjj2,可看到sjj0(linux)和sjj2(pwin95)。
> 但是我不能從pwin95上訪問linux(sjj0),雙擊總顯示:
> 找不到機器名或共享名,請確認輸入正確,然後重試。
> 我對smbmount不會用,也找不到能看明白的幫助,因為
> 我不理解mount-point的含義,請指導;linux上的
> smbd和nmbd當然是運行的。
> 再謝各位!請繼續幫忙。smb.conf在前面的貼子中。
Win95的網上鄰居問題太多,別說跟Linux過不去,就是幾台Win95之間連個小網,只要沒有NT伺服器,他們就經常互相找不到。所以,一定要把samba的WINS伺服器功能打開,(wins support = yes),然後把95的WINS伺服器指向他。也許還要加入:
name resolv order = wins hosts bcast
這樣做的話最好讓Linux先於Win95啟動起來!
密碼問題
>;我在RedHat 5.1里可以共享Win98的服務,在Win98的網上鄰居里
>;可以看到LINUX的機子,但提示\\linux\IPC$ 需要口令,輸入口令總
>;不正確,不知該如何設定?
此問題好像不只Linux有,NT也有,原因是連線時沒有用戶名的信息,不要直接點擊圖示,用磁碟映射:\\linux\username的格式.
Win98使用加密的口令認證,而RedHat的SMB預設使用明文認證,所以口令總是不正確。
可以在smb.conf中加入
encrypt passwords = yes
並使用smbpasswd 維護用戶口令
Win98 上選 開始 -> 註銷 ,用 Linux 機器上的用戶名和口令登錄,然後不用輸入口令就可以訪問 Linux 的資源了。這和 NT 上是一樣的。
或者 Linux 機器上的 /etc/smb.conf 里改成 security = share,
guest account = username (username 改成你機器上的一個用戶帳號)。
這樣如果 Win98 不是用 Linux 系統上的用戶帳號登錄的,也可以直接訪問 Linux,其許可權等於 guest account 指定的用戶的許可權。Linux作出改動後要重啟。
註:完全不必重新啟動,可以到/etc/rc.d/init.d下去執行smbd stop,然後再smbd start就可以了(這是在Redhat中).在Linux下要學會儘量不重啟的基本技巧!
傳送明文密碼
如果你用Win98或打過很多補丁的Win95. 如果Samba不提供口令加密是不能登錄的.
1. 執行Win95_PlainPassword.reg允許Win95傳送明文口令
運行REGEDIT,添加:
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP]
"EnablePlainTextPassword"=dword:00000001
2. 升級到最新的Samba,打開口令加密開關.
> BTW:哪一版Samba可設加密校驗,如何設?
我的 Samba 1.9.18p10 就已經可以了.
在 smb.conf 裡面找到
# You may wish to use password encryption. Please read
# ENCRYPTION.txt,Win95.txt and WinNT.txt in the Samba documentation.
# Do not enable this option unless you have read those documents
encrypt passwords = yes
smb passwd file = /usr/private/smbpasswd
這一段就可以了.
相關
smbclient \\NetBIOS-name\share-dir 不對?
這是shell的原因,應該用smbclient \\\\name\\share-dir或者是smbclient '\\name\share-dir'
shell不處理兩個單引號之間的內容.如果你熟悉C語言,應該很清楚為什麼了!
或者使用smbclient //NetBios-name/share-dir 就不存在這個問題。
> 我在我的Linux機器上設好了smb.conf如下(刪去了所有注釋),為什麼NT不認Samba?
把 security = user
改成:security = server
Samba 1.9.18以前的版本還不完全支持NT的所謂"域",2.0.0版正在開發中,對此有不小的進步.
> 多謝姚飛大俠上回的指點。但我在安裝時還是碰到了問題。我選擇了shadow,no pam,
> 還選了disk quota,結果出現
> quotas.c:38:sys/quota.h:No such file or director
> 這以後再不能編譯了。我把選擇該為 shadow no pam,no quota,有編譯,出現:
> cc:internal compoler error:program cc1 got fatal signal 6
> make :*** [smbpass.o] Error!
> 我再把shadow,pam quota 等選項選來選去,總是這個錯誤都不變化了。好像以前編譯
> 通過的就不編了只編譯後面的。我怎樣才能讓它重新編譯?
> slackware 3.4 kernel 2.0.30
> Thanks!
如果你用的是Slackware 3.4的話,應該是shadow,no pam,no quota
大概從1.9.18p4開始就無法正常編譯了,到了smbpass.o必定出這個錯.
解決方法有幾個:
1. 直接下載編譯好的檔案
2. 升級GCC到2.8.1,或者 egcs-1.0.2
3. 升級到Slackware 3.5
> 本人單位財務部門需要裝一台檔案伺服器,我安裝了Redhat 5.1,用 Samba
> 作為檔案伺服器,客戶端使用的是Win95,現在Win95已可以在網上鄰居中找到
> 伺服器,我將已分享資料夾映射為F:盤,經過試驗,大幅度地拷貝檔案都沒問題.
> 但是,因為財務軟體是dos方式下的,當我執行F:\下的帳務程式時,一次、兩次、
> 甚至數次都沒問題,但是若干次後每個客戶端都出現當機現象。我將Samba
> stop一下,再start就可以了,請問這是怎么一回事?以前用NT做伺服器並沒有
> 這樣的現象。
俺原來用RH 4.2,kernel 2.0.30+ samba 1.9.16p11也有同樣的問題update後就ok了,
現在俺用的是kernel 2.0.35 + samba 1.9.18p8
版本
2012年12月04日,Samba 4.0 RC6 發布。