Samba使用大全
-samba伺服器
Samba協議基礎
在NetBIOS出現之後,Microsoft就使用NetBIOS實現了一個網路檔案/列印服務系統,這個系統基於NetBIOS設定了一套檔案分享權限設定協議,Microsoft稱之為SMB(Server Message Block)協議。這個協議被Microsoft用於它們Lan Manager和Windows NT伺服器系統中,實現不同電腦之間共用印表機、串列口和通訊抽象(如具名管道、郵件插槽等)。
隨著Internet的流行,Microsoft希望將這個協議擴充到Internet上去,成為Inter net上電腦之間相互共用資料的一種標準。因此它將原有的幾乎沒有多少技術文檔的SMB協議進行整理,重新命名為 CIFS(Common Internet File System),並打算將它與NetBIOS相脫離,試圖使它成為Internet上的一個標準協議。
因此,為了讓Windows和Unix電腦相整合,最好的辦法即是在Unix電腦中安裝支援SMB/CIFS協議的軟體,這樣Windows客戶就不需要更改設定,就能如同使用Windows NT伺服器一樣,使用Unix電腦上的資源了。Samba是用來實現SMB的一種軟體,它的工作原理是,讓NETBIOS(Windows95近端分享的通訊協議)和SMB(Server Message Block)這兩個協議運行於TCP/IP通訊協定之上,並且使用Windows的NETBEUI協議讓Unix電腦可以在近端分享上被Windows電腦看到。它的功能有:
1.共用Linux磁碟給Win95/NT
2.共用Win95/NT磁碟給Linux機器
3.共用Linux印表機給win95/NT
4.共用win95/NT印表機給Linux機器。
同時它的檔案服務功能比NT系統還高,而且在Windows2000之前就提供了使用者磁碟空間限制的功能。
Samba的配置
在我寫這篇文章的時候,Samba的版本已經到了2.2.2了,需要的可以通過ftp://samba.org/pub/samba/Binary_Pa...011013.i386.rpm得到最新的rpm安裝包。然後執行rpm -Uvh samba-2.2.2-20011013.i386.rpm來安裝或者升級它。安裝完後,可以看見/etc/samba這麼一個目錄,裡面存放和Samba相關的一些檔案,最主要的是smb.conf,現在根據設定檔講講它的配置選項:
全域設定:
workgroup = MYGROUP
定義該Samba伺服器所在的工作群組或者域(如果下面的security=domain的話)。
server string = MY Samba Server
設定機器的描述,當我們通過近端分享訪問的時候可以在備忘裡面看見這個內容,而且還可以使用samba設定的變數。這裡說一下samba定義的變數:
%S = 當前服務名(如果有的話)
%P = 當前服務的根目錄(如果有的話)
%u = 當前服務的使用者名稱(如果有的話)
%g = 目前使用者說在的主工作群組
%U = 目前的交談的使用者名稱
%G = 目前的交談的使用者的主工作群組
%H = 當前服務的使用者的Home目錄
%v = Samba服務的版本號碼。
%h = 運行Samba服務機器的主機名稱
%m = 客戶機的NETBIOS名稱
%L = 伺服器的NETBIOS名稱
%M = 客戶機的主機名稱
%N = NIS伺服器名
%p = NIS服務的Home目錄
%R = 說採用的協議等級(值可以是CORE, COREPLUS, LANMAN1, LANMAN2,NT1)
%d = 當前服務進程的ID
%a = 客戶機的結構(只能識別幾項:Samba,WfWg,WinNT,Win95)
%I = 客戶機的IP
%T = 當前日期和時間
hosts allow = 網路或者主機
這裡可以設定允許訪問的網路和主機IP,比如允許192.168.1.0/24和192.168.2.1/32訪問,就用host allow = 192.168.1. 192.168.2.1 127.0.0.1(網路注意後面加”.”號,各個項目間用空格隔開,記得把本機也加進去)
printcap name = printcapFile
到printcapFile(一般是/etc/printcap)這個檔案中取得印表機的描述資訊
load printers = yes|no
設定是否自動共用印表機而不用設定下面的[printer]一節的相關東西
printing = PrintSystemType
定義列印系統的類型,預設是lprng,可選項有:bsd, sysv, plp, lprng, aix, hpux, qnx。
guest account = pcguest
定義遊客帳號,而且需要把這個帳號加入/etc/passwd,不然它就用預設的nobody
log file = LogFileName
定義記錄檔案的位置LogFileName(一般是用/var/log/samba/%m.log)
max log size = size
定義記錄檔案的大小size(單位是KB,如果是0的話就不限大小)
security = security_level
定義Samba的安全層級,按從低到高分為四級:share,user,server,domain。它們對應的驗證方式如下:
share:沒有安全性的層級,任何使用者都可以不要使用者名稱和口令訪問伺服器上的資源。
user:samba的預設配置,要求使用者在訪問共用資源之前資源必須先提供使用者名稱和密碼進行驗證。
server:和user安全層級類似,但使用者名稱和密碼是遞交到另外一個伺服器去驗證,比如遞交給一台NT伺服器。如果遞交失敗,就退到user安全級。
domain:這個安全層級要求網路上存在一台Windows的主網域控制站,samba把使用者名稱和密碼遞交給它去驗證。
後面三種安全級都要求使用者在本Linux機器上也要系統帳戶。否則是不能訪問的。
password server =
當前面的security設定為server或者domain的時候才有必要設定它。
password level = n
這是設定針對一些SMB客戶像OS/2之類而設的,這樣的系統在發送使用者密碼的時候,會把密碼轉換成大寫再發送,這樣就和samba的密碼不一致,這個參數可以設定密碼裡允許的大寫字母個數,這樣samba就根據這個數目對接收到的密碼進行大小寫重組,以重組過的密碼嘗實驗證密碼的正確性。n越大,組合的次數就越多,驗證時間就越長,安全性也會因此變得越低。例如n=2,使用者的密碼是abcd,但發送出去其實是ABCD,samba就會把這個ABCD進行大小寫重組,組合後的結果可以是: Abcd, aBcd, abCd, abcD,
abcd, ABcd, AbCd, AbcD,aBCd,aBcD,abCD。
所以如果沒有必要,就把n定為是零。這樣的話samba只嘗試兩次,一個是接收到的密碼,另一個嘗試的是這個密碼都是小寫情況。
username level = n
這個是對於使用者名稱的情況,說明和上面一項類似。
encrypt passwords = yes|no
設定是否對密碼進行加密,samba本身有一個密碼檔案/etc/samba/smbpasswd,如果不對密碼進行加密則在驗證會話期間客戶機和伺服器之間傳遞的是純文字密碼,samba直接把這個密碼和Linux裡的/etc/samba/smbpasswd密碼檔案進行驗證。但是在Windows 95 OS/R2以後的版本和Windows NT SP3以後的版本預設都不傳送純文字密碼,要讓這些系統能傳送純文字密碼必須在其註冊表裡更改,比較麻煩,好的方法就是把這裡的這個開關設定為yes。
smb passwd file = smbPasswordFile
設定存放samba使用者密碼的檔案smbPasswordFile(一般是/etc/samba/smbpasswd)。
ssl CA certFile = sslFile
當samba編譯的時候支援SSL的時候,需要指定SSL的認證的位置(一般在/usr/share/ssl/certs/ca-bundle.crt)。
unix password sync = yes|no
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %n
*ReType*new*UNIX*password* %n
*passwd:*all*authentication*tokens*updated*successfully*
這三項設定能否從windows的應用程式修改unix系統的使用者密碼
username map = UsermapFile
指定使用者對應檔(一般是/etc/samba/smbusers),當我們在這個檔案裡面指定一行root = administrator admin的時候,客戶機的使用者是admin或者administrator串連時會被當作使用者root看待。
include = MachineConfFile
指定對不同機器的串連採用不同的設定檔MachineConfFile(一般為了靈活管理使用/etc/samba/smb.conf.%m,由於採用了samba的變數,把設定檔和客戶機的NETBIOS名稱關聯起來,能很容易地控制這些客戶機的許可權和設定)。
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
這個是網路socket方面的一些參數,能實現最好的檔案傳輸效能。相關的選項還有SO_KEEPALIVE、 SO_REUSEADDR、SO_BROADCAST、IPTOS_LOWDELAY、IPTOS_THROUGHPUT、SO_SNDLOWAT(*)、SO_RCVLOWAT(*),帶*號的要指定數值。一般如果在本網,就只用IPTOS_LOWDELAY,如果是有一個本網的,就用IPTOS_LOWDELAY TCP_NODELAY,如果是廣域網路,就試試IPTOS_THROUGHPUT。
interfaces = interface1 interface2
如果有多個網路介面,就必須在這裡指定。如interface = 192.168.12.2/24 192.168.13.2/24
remote browse sync = host(subnet)
這裡指定瀏覽列表同步資訊從哪裡取得, 如果用host(比如192.168.3.25)或者整個子網(192.168.5.255)。
★這裡說明一下什麼是瀏覽(Browse):
在SMB協議中,電腦為了訪問網路資源,就需要瞭解網路上存在的資源清單(例如在Windows下使用近端分享查看可以訪問的電腦),這個機制就被稱為瀏覽(Browse)。雖然SMB協議中經常使用廣播的方式,但如果每次都使用廣播的方式瞭解當前的網路資源(包括提供服務的電腦和各個電腦上的服務資源),就需要消耗大量的網路資源和浪費較長的尋找時間,因此最好在網路中維護一個網路資源的列表,以方便尋找網路資源。只有必要的時候,才重新尋找資源,例如使用Windows下的尋找電腦功能。
但沒有必要每個電腦都維護整個資源清單,維護網路中當前資源清單的任務由網路上的幾個特殊電腦完成的,這些電腦被稱為Browser,這些Browser通過記錄廣播資料或查詢名字伺服器來記錄網路上的各種資源。
Browser並不是事先指定的電腦,而是在普通電腦之間通過自動進行的推舉產生的。不同的電腦可以按照其提供服務的能力,設定在推舉時具備的不同權重。為了保證一個Browser停機時網路瀏覽仍然正常,網路中常常存在多個Browser,一個為主Browser(Master Browser),其他的為備份Browser。★
remote announce = host(subnet)
指定這些機器向網路宣告自己,而不是有Browser得到。
local master = yes|no
這個參數指定nmbd是否試圖成為本地主瀏覽器,預設值是yes,如果設為no則samba伺服器就永遠都不會成為本地主瀏覽器。但即使設定了yes,也不等於samba伺服器就會成為本地主瀏覽器。只是參與本地主瀏覽器選擇。
os level = n
n的值是個整數,決定了nmbd是否有機會成為本地廣播地區的工作群組裡的本地主瀏覽器,預設值是零,零則意味著nmbd失去瀏覽選擇。如果要nmbd更有機會成為本地主瀏覽器的話,可以設為65。
domain master = yes|no
這個參數讓nmbd成為一個域瀏覽器,取得各本地主瀏覽器的瀏覽列表,並將整個域的瀏覽列表遞交給各本地主瀏覽器。
preferred master = yes|no
這個參數指定nmbd是否是工作群組裡的首要的主瀏覽器,如果指定為yes,nmbd在啟動的時候就強制一個瀏覽選擇。
★Domain master和local master
工作群組和域這兩個概念在進行瀏覽時具備同樣的用處,都是用於區分並維護同一組瀏覽資料的多個電腦。事實上他們的不同在於認證方式上,工作群組中每台電腦都基本上是獨立的,獨立對客戶訪問進行認證,而域中將存在一個(或幾個)網域控制站,儲存對整個域中都有效認證資訊,包括使用者的認證資訊以及域內成員電腦的認證資訊。瀏覽資料的時候,並不需要認證資訊,Microsoft將工作群組擴充為域,只是為了形成一種分級的目錄結構,將原有的瀏覽和目錄服務相結合,以擴大Mircrosoft網路服務範圍的一種策略。
工作群組和域都可以跨越多個子網,因此網路中就存在兩種Browser,一種為Domain Master Browser ,用於維護整個工作群組或域內的瀏覽資料,另一種為Local Master Browser,用於維護本子網內的瀏覽資料,它和Domain Master Browser通訊以獲得所有的可瀏覽資料。劃分這兩種Browser 主要是由於瀏覽資料依賴於本地網廣播來獲得資源清單,不同子網之間只能通過瀏覽器之間的交流能力,才能互相交換資源清單。
但是,為了瀏覽多個子網的資源,必須使用NBNS名字伺服器的解析方式,沒有NBNS的協助,電腦將不能獲得子網外電腦的NetBIOS名字。Local Master Browser也需要查詢NetBIOS名字伺服器以獲得Domain Master Browser的名字,以相互交換網路資源資訊。
由於網域控制站在域內的特殊性,因此網域控制站傾向於被用做Browser,主網域控制站應該被用作Domain Master Browser,他們在推舉時設定的權重較大。★
preserve case = yes|no
short preserve case = yes|no
指定拷貝DOS檔案的時候保持大小寫,預設是no
default case = lower|upper
所有的DOS檔案的預設是大寫還是小寫
case sensitive = yes|no
大小寫敏感,一般是no,不然會出現一些問題。
共用設定:
★共用資源:
每個SMB伺服器能對外提供檔案或列印服務,每個共用資源需要被給予一個共用名稱,這個名字將顯示在這個伺服器的資源清單中。如果一個資源的名字的最後一個字母為$,則這個共用名稱就為隱藏共用,不能直接表現在瀏覽列表中,而只能通過直接存取這個名字來進行訪問。在SMB協議中,為了獲得伺服器提供的資源清單,必須使用一個隱藏的資源名字IPC$來訪問伺服器,否則客戶無法獲得系統資源的列表。★
共用設定中有個比較奇怪的段:
[homes],在smb.conf檔案中一般沒有對這個目錄的設定特定內容比如路徑等。當客戶機發出服務要求時,就在smb.conf檔案的其它部分尋找友特定內容的服務。如果沒有發現這些服務,並且提供了homes段時,那麼就搜尋密碼檔案得到使用者的Home目錄。通過Homes段,Samba可以得到使用者的Home目錄並使之共用。下面是這個段的最基本的幾個設定。
[homes]
comment=Home Directory
browseable=no
writable=yes
比較正常的共用的配置如下例:
[MyShare]
comment = grind’s file
path = /home/grind
allow hosts = host(subnet)
deny hosts = host(subnet)
writable = yes|no
user = user(@group)
valid users = user(@group)
invalid users = user(@group)
read list = user(@group)
write list = user(@group)
admin list = user(@group)
public = yes|no
hide dot files = yes|no
create mode = 0755
directory mode = 0755
sync always = yes|no
short preserve case = yes|no
preserve case = yes|no
case sensitive = yes|no
mangle case = yes|no
default case = upper|lower
force user = grind
wide links = yes|no
max connections = 100
delete readonly = yes|no
其中[]裡面的MyShare指定共用名稱,一般就是近端分享裡面可以看見的檔案夾的名字。
comment指的是對改共用的備忘。
path指定共用的路徑,其中可以配合samba變數使用。比如你可以指定path=/data/%m,這樣如果一台機器的NETBIOS名字是grind,它訪問MyShare這個共用的時候就是進入/data/grind目錄,而對於NETBIOS名是glass的機器,則進入/data/glass目錄。
allow hosts和deny hosts和前面的全域設定的方法一樣這裡不再提及。
writeable指定了這個目錄預設是否可寫,也可以用readonly = no來設定可寫。
user設定所有可能使用該共用資源的使用者,也可以用@group代表group這個組的所有成員,不同的項目之間用空格或者逗號隔開。
valid users指定能夠使用該共用資源的使用者和組。
invalid users指定不能夠使用該共用資源的使用者和組。
read list 指定只能讀取該共用資源的使用者和組。
write list指定能讀取和寫該共用資源的使用者和組。
admin list指定能管理該共用資源(包括讀寫和許可權賦予等)的使用者和組。
public指明該共用資源是否能給遊客帳號訪問,這個開關有時候也叫guest ok,所以有的設定檔中出現guest ok = yes其實和public = yes是一樣的。
hide dot files指明是不是像unix那樣隱藏以“.”號開頭的檔案。
create mode指明建立立的檔案的屬性,一般是0755。
directory mode指明建立立的目錄的屬性,一般是0755。
sync always指明對該共用資源進行寫操作後是否進行同步操作。
short preserve case指明不管檔案名稱大小寫。
preserve case指明保持大小寫。
case sensitive指明是否對大小寫敏感,一般選no,不然可能引起錯誤。
mangle case指明混合大小寫。
default case指明預設的檔案名稱是全部大寫還是小寫。
force user強制把建立檔案的屬主是誰。如果我有一個目錄,讓guest可以寫,那麼guest就可以刪除,如果我用force user= grind強制建立檔案的屬主是grind,同時限制create mask = 0755,這樣guest就不能刪除了。
wide links指明是否允許共用外符號串連,比如共用資源裡面有個串連指向非共用資源裡面的檔案或者目錄,如果設定wide links = no將使該串連不可用。
max connections = n設定同時串連數是n。
delete readonly指明能否刪除共用資源裡面已經被定義為唯讀檔案。
有兩類特殊的共用,分別是光碟機和印表機
光碟機的共用設定:
[cdrom]
comment = grind’s cdrom
path = /mnt/cdrom
public = yes
browseable = yes
root preexec = /bin/mount -t iso9660 /dev/cd0 /mnt/cdrom
root postexec = /bin/umount /mnt/cdrom
這裡root preexec指明了串連時用root的身份運行mount命令,而root postexec則指明了斷開時用root身份運行umount,有效實現了對光碟機的共用。
印表機共用的設定:
[printers]
path = /var/spool/samba
writeable = no
guest ok = yes
printable = yes
printer driver = HP LaserJet 5L
這裡printable指明該印表機可以列印, guest ok說明遊客也能列印,path指明列印的檔案隊列暫時放到/var/spool/samba目錄下。printer driver的作用是指明該印表機的類型,這樣我們在安裝網路印表機的時候可以直接自動安裝驅動而不必選擇。
添加使用者:
samba添加使用者比較方便,一般是用smbadduser,用法是smbadduser unixid:netid,舉個例子:如果你的本機有個叫grind的使用者,你用smbadduser grind:grind,這樣從網路位置訪問的時候使用者名稱就用grind,而如果你用了smbadduser grind:glass的話,網路位置訪問的時候提供的使用者名稱就是glass而不是grind了。
關於samba服務端的設定基本就是這些,我想一般應用中所要使用的上面幾乎都覆蓋到了,所以有些不重要的就省略了,如果要更加詳細的資訊可以用man smb.conf參考。/dev/null
3.mf_wrapper是一個magic filter檔案,是相關的一些過濾規則。內容是:
MF_RULE_DIR='/usr/share/printconf/mf_rules'
MF_RULES=$MF_RULE_DIR/mf[[]][[]]-*
TMP_FILE=`mktemp /tmp/printconf.XXXXXX`' 'exit 1
cat ./mf.cfg $MF_RULES | m4 >; $TMP_FILE
if [ -n "$DEBUG" ]; then
case "$DEBUG" in
2)
DEBUGSTRING="--debug --debug"
;;
3)
DEBUGSTRING="--debug --debug --debug"
;; 4)
DEBUGSTRING="--debug --debug --debug --debug"
;;
5)
DEBUGSTRING="--debug --debug --debug --debug --debug"
;;
*)
DEBUGSTRING="--debug"
;;
esac
else
DEBUGSTRING=""
fi
# Run magic filter
/usr/bin/magicfilter-t $TMP_FILE $DEBUGSTRING $*
接下來的操作和ftp的時候命令一樣,用get下載檔案而用put上傳檔案,命令可以用help查看。
還有一種方法是用檔案系統的方式(這種方式要確定你的核心支援smbfs,如果沒有支援的話,編譯核心的時候必須選中File systems--->;Network File Systems--->; SMB file system support (to mount Windows shares etc.) ):
smbmount //IP或者NETBIOS名稱/共用資源名 /本地掛接點 [-o option]
常用的的option有username=,password=,guest(指定為用guest訪問,不用提供密碼,前面的即使用username=guest參數的話也會要求輸入密碼),ro(有時候為了系統安全要指定為唯讀模式),rw,同時多個option的話用逗號隔開。
或者可以用mount -t smbfs [-o option] //IP或者NETBIOS名稱/共用資源名 /本地掛接點來實現同樣的功能。
例子如下:
smbmount //glass/littlep /test -o guest或者mount -t smbfs -o guest //glass/littlep /test,然後就能通過訪問/test來使用網路上的資源了。
如果不需要使用的時候,可以簡單地使用smbumount /test或者umount /test來解除這個掛接。
關於samba的功能(共用Linux磁碟給Win95/NT、共用Linux印表機給win95/NT、共用win95/NT印表機給Linux機器。、共用Win95/NT磁碟給Linux機器),前面兩個屬於samba伺服器的內容而後兩個屬於samba客戶段的內容,在我的兩篇文章中都有介紹了他們的實現方法,但是samba實在是一個強大的工具,無法十分詳細地介紹它地全部功能,而且限於筆者的知識有限,有不到之處請各位指出,還望各位多多交流。