Samba在Unix-like作業系統上實作了微軟Windows作業系統的「網路上的芳鄰」所使用的伺服器訊息區塊(SMB, Server Message Block),又稱網路文件共享系統(CIFS, Common Internet File System),可以讓同一個網路上的機器共享檔案、操作印表機或是其它週邊設備。也就是說,透過Samba,運行Unix-like作業系統的機器也可以成為Windows作業系統的「網路上的芳鄰」。
安裝Samba
要在Ubuntu Server上安裝Samba,可以直接在終端機中執行以下指令:
Samba使用的TCP連接埠為139(共享檔案用),UDP連接埠為137(名稱解析用)和138(少量資料傳遞用),可以使用以下指令來查看Samba是否有確實安裝成功。
ss
指令可以顯示出Socket相關的資訊。-l
參數可以只顯示正在監聽中的連線。若使用ss
指令時都沒給任何參數的話,會忽略掉監聽中的連線。-t
參數可以只顯示TCP連線。-u
參數可以只顯示UDP連線。-t
參數和-u
參數一起用時就表示可以只顯示TCP和UDP連線。-n
參數可以讓連接埠數字直接被輸出,而不是用一個名稱代替。-p
參數可以顯示佔用連線的行程。
如上圖,如果有看到TCP有在監聽連接埠139,而UDP也有在監聽連接埠137和138的話,就表示Samba安裝成功了!此時這台Linux機器就會出現在同一網路下的同一個工作群組(預設群組名稱是WORKGROUP
)的Windows機器的「網路上的芳鄰」中。
Samba預設會開啟nmbd
和smbd
這兩個守護行程(daemon),前者用負責管理和解析名稱,後者用於共享檔案。但如果是使用Active Directory的話,還需要執行winbindd
和samba
這個服務,前者用來轉換NT系統的名稱,後者用於提供AD功能以及共享檔案。
安裝SMB客戶端
上一節使用sudo apt install samba
只會安裝SMB的伺服器。如果連SMB的客戶端都安裝,那就要使用以下指令:
查看網路上的芳鄰
使用以下指令可以列出目前網路中所有的工作群組,以及其下的可用節點。這個指令必須要安裝SMB客戶端才可以使用。
分享Linux作業系統上的檔案或是印表機
要設定Linux作業系統上的哪些檔案或是印表機可被分享的話,需要去編輯Samba的設定檔/etc/samba/smb.conf
。它預設的模樣長成這樣:
global
區塊主要可以設定工作群組的名稱和密碼驗證。有以下幾個主要欄位:
netbios name
:NetBIOS是nmbd
所使用的協定。NetBIOS名稱即為要在其它SMB客戶端顯示出來的名稱。如果不設定這個欄位,就會以主機名稱(hostname)作NetBIOS名稱。netbios aliases
:NetBIOS名稱別名。log file
:記錄檔的寫入路徑。%m
可被取代為記錄來源的守護行程的名稱,如nmbd、smbd。workgroup
:工作群組名稱。server string
:伺服器描述。realm
:設定Kerberos和AD(Active Directory)的網域名稱。passdb backend
:存放帳號密碼的資料庫格式和來源路徑。可以使用的格式有單純的smbpasswd
和支援儲存額外資訊的tdbsam
,以及透過LDAP來存取帳號資訊的ldapsam
。如果沒有提供檔案路徑的話,smbpasswd
會預設使用/etc/samba/smbpasswd
,tdbsam
會預設使用/var/lib/samba/private/passdb.tdb
,ldapsam
會預設使用ldap://localhost
。username map
:可以指定一個使用者名稱對應檔的檔案路徑。用來將多個使用者名稱對應到同一個使用者名稱,一行為一筆對應資料。例如root = administraor admin
,可以將administraor
和admin
都對應到root
。也可以使用「@群組名稱」的方式,將該群組下的所有使用者名稱都對應到同一個Samba的使用者名稱,例如:users = @sales
。unix password sync
:是否讓Linux作業系統的使用者密碼跟著Samba使用者的密碼同步做變動。security
:Samba的安全性。預設會根據其它欄位來決定要使用以下哪個設定值:share
:僅檢查密碼,不檢查使用者名稱,只要密碼有被任一使用者使用就可以通過。也可以設定only user = yes
,讓Samba只允許username
指定的使用者名稱所使用的密碼。user
:使用passdb backend
設定的帳號密碼來做使用權限驗證。ads
:讓Samba伺服器成為AD網域的一員。domain
:用Windows NT Primary或是Backup Domain Controller來驗證帳號密碼。wins support
:WINS(Windows Internet Name Service)伺服器專門用來查詢NetBIOS所對應的IP位址,類似DNS的定位,只不過是用於SMB網路。這個欄位可以設定Samba伺服器本身是否也要提供WINS。wins server
:指定一個WINS伺服器IP位址,用來查詢NetBIOS所對應的IP位址。
guest ok
:是否啟用訪客帳號。預設為no
。guest account
:設定訪客的使用者名稱。預設為nobody
。map to guest
:將某些情況認定為訪客存取。可以設定的值有Never
、Bad User
、Bad Password
、Bad Uid
(用在security
是ads
或是domain
時)。
其它的區塊即為要分享的資源,具有特殊意義的區塊名稱列表如下:
homes
:共享使用者的家目錄。可以控制每個使用者的家目錄是否允許其它使用者來存取。printers
:共享所有印表機。印表機資源比較特別的地方是它的區塊內有個printable
設定項目,可以控制印表機是否允許列印。當然,也可以針對單獨的印表機來撰寫獨立的區塊,該區塊必須還要使用printer name
欄位來指定印表機名稱。
把錢字號$
加到區塊名稱的結尾的話,可以使該區塊所指定資源變成是隱藏的資源。區塊名稱會顯示在SMB客戶端上。
這些區塊都有以下幾個主要欄位:
path
:對於homes
來說,這個欄位用來設定家目錄路徑的格式,預設是/home/%S
,其中的%S
會取代成使用者名稱。對於印表機資源的區塊來說,這個欄位設定的是列印時需要用來暫存檔案的目錄。對於其它資源的區塊,這個欄位是設定要共享出去的目錄。comment
:資源的註解。browseable
:是否讓這個區塊的資源可以被索引。如果不能的話那麼就只能利用完整路徑來存取這個區塊的資源。guest ok
:這個欄位可覆寫global
區塊的guest ok
欄位的設定。valid users
:指定允許存取這個區塊的資源的使用者。以空格分隔多筆資料。invalid users
:指定不允許存取這個區塊的資源的使用者。以空格分隔多筆資料。hosts allow
:指定允許存取這個區塊的資源的主機名稱、NIS網路群組名稱(以@
開頭)或是Inet。以空格分隔多筆資料。hosts deny
:指定不允許存取這個區塊的資源的主機名稱、NIS網路群組名稱(以@
開頭)或是Inet。以空格分隔多筆資料。interfaces
:指定允許存取這個區塊的網路介面,需提供該網路介面的Inet。以空格分隔多筆資料。writable
:指定這個區塊的資源是否可被新增與寫入。read only
:指定這個區塊的資源是否是唯讀的。這個欄位的功用正好跟writable
是相反的。
舉個實例,若我們想要將/home/magiclen/shared-files
這個目錄與人共享,可以在/etc/samba/smb.conf
加上以下區塊:
[shared] comment = Magic Shared Files path = /home/magiclen/shared-files guest ok = no browseable = yes writable = yes
設定好後必須讓Samba重新載入設定檔,可以使用以下指令:
如此一來目錄就可以被分享出去啦!
用testparm
檢查Samba的設定檔是否有誤
testparm
指令可以檢查Samba的設定檔是否有誤,不需要讓Samba重啟或是重新載入設定檔。
查看Samba的連線狀態
以下指令可以查看Samba的連線狀態:
管理使用者帳號
smbpasswd
指令可以管理SMB的使用者帳號。-a
參數可以增加使用者。-x
參數可以移除使用者。這邊要注意的是,SMB的使用者之帳號名稱必須也要存在於Linux作業系統的使用者帳號中。
例如要新增一個名為magiclen
的使用者帳號,指令如下:
查詢指定NetBIOS名稱的IP
nmblookup
指令可以用來查詢指定NetBIOS名稱的IP,使用方法如下:
可以搭配smbtree
指令來尋找可用的NetBIOS名稱。
例如:
如果有使用WINS伺服器的話,可以加上-U
參數來指定WINS伺服器的位址。
掛載SMB
先使用以下指令安裝CIFS的工具:
接著就可以直接使用mount
指令來手動掛載SMB了。檔案系統的部份必須使用cifs
,指令格式如下:
mount
指令的-o
參數可以是檔案系統的選項設定,可以透過username
和password
的設定值來指定存取CIFS所需的使用者帳號和密碼。不過通常我們不會把密碼直接打在指令上,如果不設定password
的話,mount
指令會在之後才要求使用者輸入。
例如:
如果要自動掛載的話,可以在/etc/fstab
設定檔中加上如以下格式的資料: