運維日記009 - 認識Linux上的桑巴舞——Samba
什麼是Samaba?
在現代的辦公局域網絡中,大部分的工作站使用的是Windows系統,而這類機器沒有使用NFS Server訪問Linux主機的能力。Windows系統之間使用Microsoft和IBM合作開發的SMB(Server Message Block)協議來進行文件或打印機等設備之間的共享。而Samba就是Linux專爲SMB而設計的服務器系統,這樣Windows工作站與Linux工作站就可以方便的溝通起來。
爲什麼要取Samba這個怪名字呢?原來,Samba這套系統是一個名叫Andrew Tridgell的博士生通過逆向工程分析SMB通信協議而開發出來的。軟件開發出來以後,Andrew Tridgell爲這套系統註冊商標,一開始申請用SMBServer作爲商標。但是,因爲SMB是沒有意義的文字,所以無法註冊爲商標。這位老兄開始翻開字典,就像給孩子取名字一樣苦苦查找,突然發現Samba剛好含有SMB,又是一個熱情有勁的拉丁舞的的名稱,所以就用這個名字作爲了商標。
自從有了Samba,微軟表示很不滿意,因爲Samba使得Linux的工作站可以無縫的融入到Windows工作組中,並分走了Windows的奶油和蛋糕嘛!所以微軟一直通過各自方式試圖阻撓Samba。直到2007年,微軟在歐盟的反壟斷案中敗訴,然後被強制要求向Samba公開他們的網絡控制協議,這件事情之後,微軟纔開始慢慢學習和Samba接觸。在2011年微軟甚至還向Samba社區提交了一段補丁代碼。Samba 團隊的 Chris Hertel 在文章中寫道:“在過去的年月裏,收到來自微軟的補丁代碼是一件無法想象的事情,但是時代已經變了,戰爭也該結束。對於軟件專利我仍然持否定態度,因爲它阻止了軟件的創新。但是現在,在爲建立一個更強大的社區和提高SMB的互操作性的戰鬥前線上,微軟和我們並肩作戰。“
安裝Samba
假如你還不知曉自己的系統內是否已經安裝了Samba,可以通過如下命令獲知:
# smbd -V
Version 3.6.9-164.el6
如果像上面那樣可以順利的看到版本信息,則表示Samba已經安裝好了。否則,你還需用安裝Samba相關套件。
在RHEL6中,Samba服務的包組是CIFS file server。CIFS即網絡文件共享系統(Common Internet File System),就是通過SMB協議而構成的網絡文件系統。現在我們來安裝它:
# yum groupinstall "CIFS file server"
Samba主要是由兩個服務程序構成:
smbd
負責驗證用戶身份,提供文件與打印機的共享服務。nmbd
提供WINS(Windows Internet Name Service)服務,也就是查詢Windows主機名稱所對應的IP地址服務。這相當於SMB局域網上的DNS服務。
配置Samba
在RHEL6下安裝好Samba後,主配置文件位置在/etc/samba/smb.conf。雖然有system-config-samba這樣的圖形化配置工具,但功能有限,Redhat仍然建議用戶通過手動編輯配置文件的方式配置Samba。smb.conf文件比較長,我們先來看開頭一段:
[global]
# ----------------------- Network Related Options -------------------------
#
# workgroup = NT-Domain-Name or Workgroup-Name, eg: MIDEARTH
#
# server string is the equivalent of the NT Description field
#
# netbios name can be used to specify a server name not tied to the hostname
#
# Interfaces lets you configure Samba to use multiple interfaces
# If you have multiple network interfaces then you can list the ones
# you want to listen on (never omit localhost)
#
# Hosts Allow/Hosts Deny lets you restrict who can connect, and you can
# specifiy it as a per share option as well
#
workgroup = MSHOME
server string = Samba Server Version %v
netbios name = RH6_Samba_111
; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
hosts allow = 127. 192.168.1.
整個smb.conf是由多個區段(section)構成的。上面列出了global段定義關於整體的參數,比如工作組名稱、NetBIOS主機名、監聽的網卡等等。從這段配置文件可見,smb.conf的註釋相當詳細,所以只要讀註釋基本就能夠了解每個配置參數的作用了。在我上面的配置中:
workgroup = MSHOME
,將NT域名或者工作組名稱設置爲MSHOME。在CIFS中,根據主機不同的功能將它們劃分到不同的域或者工作組中以方便管理。域與工作組在規模和管理方式上都有所不同:工作組一般不超過20臺主機,而域可以管理上千臺主機;而域需要配置單獨的域控制器(Domain Controller),而工作組不需要;域的管理是在Domain Controller上集中管理的,而工作組是在每臺主機上單獨配置的。
server string = Samba Server Version %v
,是一段顯示給訪問者的描述信息。這裏我使用了默認設置。
netbios name = RH6_Samba_111
,NetBIOS主機名稱。這一行把該主機在CIFS中的主機名稱設置爲”RH6_Samba_111“,如果註釋掉該行,會使用hostname作爲NetBIOS主機名稱。
; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
,該行指定Samba服務監聽在哪些網卡上,註釋掉該行表示監聽所有網卡。
hosts allow = 127. 192.168.1.
,該行定義哪些網段的主機可以訪問本Samba服務。這裏我定義了127網段和192.168.1網段可以訪問。
接下來的很多配置我們看註釋就能明白,不再一一描述。下面我們看一下share區段:
#============================ Share Definitions ==============================
[homes]
comment = Home Directories
browseable = no
writable = yes
; valid users = %S
; valid users = MYDOMAIN\%S
當SMB客戶端連接到此主機時,Samba會自動以用戶帳號名建立一個家目錄(Home Directory)。writable = yes
表示用戶可以在家目錄中寫入文件。browseable = no
表示除了用戶自己可以瀏覽本家目錄的資源外,其他用戶是不可以瀏覽的。
再往下看到最後幾行:
# A publicly accessible directory, but read only, except for people in
# the "staff" group
[public]
; comment = Public Stuff
path = /data
public = yes
; writable = yes
printable = no
; write list = +staff
這裏定義了本Samba服務所共享的資源。[public]
爲該共享資源訪問點的名稱;path = /data
定義了共享資源的位置;public = yes
規定了該目錄爲公開共享,即無需密碼即可訪問;printable = no
定義了該資源不是一個打印機而是磁盤;; writable = yes
註釋掉該行表示該目錄爲只讀;; write list = +staff
,這裏可以設定一個組,該組用戶可以寫入該共享目錄。
這裏把/data目錄作爲共享資源,所以我們必須事先建立好這個目錄,並設置好目錄的權限:
# mkdir -m 755 /data
假如你的系統開啓了SELinux,則還必須修改共享目錄的SELinux上下文屬性。這裏爲了簡便起見,事先關閉了SELinux,所以就無需設置了。
設定好smb.conf文件後,可以用testparm工具檢驗此配置文件的語法是否有錯誤。testparm會列出你的設定值,對於沒有明確定義的參數,則會列出它們的默認值。
# testparm -v -s
不同於其他服務,Samba自己會注意smb.conf配置文件的變化,因此不必重新啓動Samba來使新的配置文件生效。然而,Samba採用的策略是定期檢查,因此要想使你的配置文件立刻生效,除非重啓smbd daemon:
# service smb restart
Samba用戶和密碼
每個Samba用戶必須有一個本地賬號身份。你可以把一個Linux本地用戶作爲作爲Samba用戶,你也可以通過/etc/samba/smbusers文件把一些Samba的虛用戶映射爲本地用戶賬號。如:
# cat /etc/samba/smbusers
root = administrator admin
nobody = guest pcguest smbguest
這裏可以看到,系統將administrator和admin這樣的虛用戶映射爲root本地賬號,而將guest、pcguest、smbguest這樣的虛用戶映射爲nobody本地賬號。建立Samba用戶和密碼的方法是使用smbpasswd命令,如:
# smbpasswd -a Jimmy
即建立了一個名爲Jimmy的Samba用戶,當然前提是本地系統內應該有一個Jimmy用戶,否則smbpasswd建立Samba用戶會失敗。
連接Samba服務器
我們用客戶端連接一下Samba服務器,測試一下Samba服務器是否正常。在Linux中,有客戶端有兩種方式連接Samba服務器。
- smbclient
我們可以安裝並使用smbclient這個Samba客戶端工具。
# yum install samba-client
用smbclient登陸Samba服務器,看看服務器共享了哪些資源:
$ smbclient -L //moban-c/
Enter wjm's password:
Anonymous login successful
Domain=[MSHOME] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Sharename Type Comment
--------- ---- -------
public Disk Public Stuff
IPC$ IPC IPC Service (Samba Server Version 3.6.9-164.el6)
Anonymous login successful
Domain=[MSHOME] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Server Comment
--------- -------
Workgroup Master
--------- -------
L參數即list,列出Samba服務器所有共享的資源。在上面這條命令中提示輸入密碼時我們直接回車,即使用匿名用戶登陸。這時我們只看到一個共享資源即public。下面我們使用Jimmy用戶登陸一下看看:
$ smbclient -L //moban-c/ -U Jimmy
Enter Jimmy's password:
Domain=[MSHOME] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Sharename Type Comment
--------- ---- -------
public Disk Public Stuff
IPC$ IPC IPC Service (Samba Server Version 3.6.9-164.el6)
Jimmy Disk Home Directories
Domain=[MSHOME] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Server Comment
--------- -------
Workgroup Master
--------- -------
在提示輸入密碼時,輸入剛纔用smbpasswd建立的Jimmy的Samba服務密碼,以Jimmy用戶登入Samba服務器,可以看到兩個共享資源,一個爲public,另一個爲Jimmy的主目錄。
我們可以用smbclient訪問一下public這個共享資源:
$ smbclient //moban-c/public -U Jimmy
Enter Jimmy's password:
Anonymous login successful
Domain=[MSHOME] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \>
smbclient支持如put、get這樣的類似於FTP的命令,但這樣畢竟不太方便。我們還可以使用類似CIFS的方式訪問Samba服務器,這樣就可以像操作本地文件一樣訪問Samba共享資源了。
- CIFS
可以通過mount命令掛載遠端Samba服務的共享資源:
# mount //192.168.1.111/public /mnt -o username=Jimmy
Password for Jimmy@//192.168.1.111/public:
輸入Jimmy的Samba服務密碼即可成功掛載,從此就像操作本地文件一樣訪問Samba共享資源了。
實戰:Samba服務實現小組協同工作
考慮這樣一個情形:小組內有Tom、Alice和Jimmy三個用戶,三個用戶都使用的是Windows工作站。小組配置了一臺Linux服務器,並安裝了Samba服務。我們在Linux服務器上共享一個目錄/smbshare給三個用戶使用,每個用戶都可以訪問並修改別人建立的文件,但是不能刪除別人的文件而只能刪除自己的文件。該如何實現呢?
1、create Linux local users & groups
在Linux服務器上創建Tom、Alice和Jimmy三個用戶,並創建一個組,三個用戶應屬於同一個組:
# useradd Tom
# useradd Alice
# useradd Jimmy
# groupadd IT
# usrmod -G IT Tom
# usermod -G IT Alice
# usermod -G IT Jimmy
注意,這裏並不需要給用戶設置密碼。因爲這三個用戶僅僅是通過Samba客戶端訪問該Linux主機的Samba服務,而並不會直接登陸到該Linux主機。
2、create the share directory & set it properly
需要創建共享文件夾/smbshare,但更重要的是設置好它的權限。因爲每個用戶都可以修改別人的文件,所以需要設置SGID;又因爲只能刪除自己的文件,不能刪除別人的文件,所以需要設置Sticky位。因此該目錄的權限應該爲3770。
# mkdir -m 3700 /smbshare
# chgrp IT /smbshare
假如你開啓了SELinux,可能還需要做如下設置:
# chcon -t samba_share_t /smbshare
3、modify the Samba configuration file
vim打開/etc/samba/smb.conf,增加以下段:
[ITshare]
comment = IT share Stuff
path = /smbshare
public = no
writable = yes
printable = no
write list = +IT
browseable = yes
4、create the Samba usrs & passwords
將三個用戶設置爲Samba用戶:
# smbpasswd -a Tom
# smbpasswd -a Alice
# smbpasswd -a Jimmy
5、restart the smbd service:
# service smb reload
or
# service smb restart
好了,Tom、Alice和Jimmy已經可以愉快的合作了。