摘要 在中小型網絡、企業內部網中利用Linux建立文件服務器一個很好的解決方案,本文是一篇利用Samba構建文件服務器的簡明指南。 Linux 是一個優秀的操作系統,尤其是它的網絡功能,可以與各種操作系統輕松連接,實現多種網絡服務。由於Linux系統的高穩定性和可靠性,以及低廉的價格,使它受到越來越多用戶的青睐。在一些中小型網絡,或者企業的內部網中,利用Linux建立文件服務器是一個很好的解決方案。針對企業內部網中的絕大部分客戶機采用Windows的情況,我們可以通過使用Samba來實現文件服務器功能。 Samba是在Linux及Unix上實現SMB(Server Message Block)協議的一個免費軟件,由服務器及客戶端程序構成。這裡我們只介紹服務器程序。 我們首先介紹一些SMB協議的情況。SMB協議是建立在NetBIOS協議之上的應用協議,是基於TCP138、139兩個端口的服務。NetBIOS出現之後,Microsoft就使用NetBIOS實現了一個網絡文件/打印服務系統。這個系統基於NetBIOS設定了一套文件共享協議,Microsoft稱之為SMB(Server Message Block)協議。這個協議被用於Lan Manager和Windows服務器系統中,實現不同計算機之間共享打印機和文件等。因此,為了讓Windows和Unix/Linux計算機相集成,最好的辦法就是在Unix/Linux計算機中安裝支持SMB協議的軟件。這樣使用Windows的客戶端不需要更改設置,就能像使用Windows NT或windows 2000服務器一樣,使用Unix/Linux計算機上的共享資源了。Samba使SMB協議運行在NetBIOS協議上,並且使用Windows的NetBEUI協議讓Unix/Linux服務器可以在Windows的網絡鄰居上被訪問到。 Samba的服務器程序可以實現以下主要功能: ◆ 文件及打印共享; ◆ 計算機名與IP的解悉; ◆ WINS服務的支持; ◆ 用戶權限設置(如果配合Linux 的Quota還可以實現用戶磁盤空間配額)。 安裝 Samba有兩種安裝方式: 1.安裝RPM包 我們以Red Hat為例: mount -t iso9660 /dev/cdrom /mnt/cdrom cd /mnt/cdrom/RedHat/RPMS rpm -ivh Samba*.rpm 或者升級安裝 rpm -Uvh Samba*.rpm 2.安裝Samba源代碼 tar -zxvf Samba*.tar.gz cd /Samba/src ./configure ./ make dep ./make ./make install 配置 Samba安裝後,可以看見/etc/samba這樣一個目錄,裡面存放著與Samba相關的一些文件,如lmhosts、smb.conf、smbpasswd 等。smb.conf是Samba的核心,一切的功能配置都在這個文件中,它有許多不同的配置選項。為避免混淆,我們要介紹一些對於Samba 正確操作必不可少的參數設置。在配置這個文件前先介紹一下Samba中的環境變量。 %S代表共享名; %P代表共享的主目錄; %u代表共享的用戶名; %g代表用戶所在的工作組; %U代表用戶名; %G代表當前對話的用戶的主工作組; %H代表用戶的共享主目錄; %v代表Samba服務器的版本號; %h代表Samba服務機器的主機名; %m代表客戶機NetBIOS名稱; %L代表服務器NetBIOS名稱; %M代表客戶機的主機名; %N代表NIS服務器名; %p代表NIS服務的Home目錄; %I代表客戶機的IP; %T代表系統當前日期和時間。 使用cd 命令進入smb.conf 所在的目錄,啟動常用的文本編輯器,例如vi、emacs等等。 1.smb.conf的全局設置 [global] # workgroup = NT-Domain-Name or Workgroup-Name server string = MY Samba Server hosts allow = 192.168.1. 192.168.2. 127. printcap name = /etc/printcap load printers = yes/no printing = bsd 第一行告訴 Samba 我們定義該Samba服務器所在的工作組名或者域名;第二行告訴 Samba對於此服務器的描述。接下來可以設置允許訪問的網絡和主機IP。上例就允許IP為192.168.1.0/24、192.168.2.1/24及127.0.0.0/8的主機訪問該服務器。緊接著是在/etc/printcap這個文件中取得打印機的描述信息,並設定是否自動共享打印機。下一行則是定義了打印系統的類型,其缺省值是bsd,並且有lprng、sysv、plp、bsd、aix和hpux等幾個可選項。 log file = /var/log/samba/log.%m max log size = 0 上面這兩行則是Samba日志的相關定義。其記錄文件的位置是放在/var/log/samba/%m.log。後面的一條是定義日志記錄文件的大小,單位是KB,如果是0的話就不限大小。 2.Samba安全性設置 Samba不使用標准Unix口令來認證用戶。因為當Windows發送以明文表示的口令時, 其都以加密形式發送 SMB/CIFS口令,這樣就與標准Unix 口令散列不兼容了。換句話說,Samba沒有辦法使用標准Unix PassWord散列來驗證 Windows 加密的口令是否正確。但幸運的是,Samba提供了許多方法來將這兩個數據庫同步。下面介紹Samba安全性的設置。 guest account = nobody security = user password server = encrypt passwords = yes/no 其中第一行定義Samba缺省的用戶賬號,這個賬號必須在/etc/passwd中。第二行則聲明了Samba的安全級別,分為share、user、server和domain四級。它們分別對應的驗證方式為:share是沒有安全性的級別,任何用戶都可以不要用戶名和口令訪問服務器上的資源;user是Samba的默認配置,要求用戶在訪問共享資源之前必須先提供用戶名和密碼進行驗證;server和user安全級別類似,但用戶名和密碼是遞交到另外一個服務器去驗證,如果遞交失敗,就退到user安全級;domain這個安全級別要求網絡上存在一台Windows的域控制器,Samba把用戶名和密碼遞交給它驗證。需要注意的是都要求此用戶是本Linux機器上的系統賬戶。當前面的security設定為server或domain的時候,才有必要設定password server。它可以是域名,也可以是機器的IP。encrypt passwords這個選項則設置是否對密碼進行加密。Samba本身有一個密碼文件/etc/samba/smbpasswd,如果不對密碼進行加密,則在驗證期間客戶機和服務器之間傳遞的是明文密碼。 smb passwd file = /etc/samba/smbpasswd username map =/etc/smbusers 以上兩行分別設置了存放Samba用戶密碼的文件是/etc/samba/smbpasswd,以及指定用戶映射文件是/etc/samba/smbusers。如果我們在這個文件裡面指定一行root = administrator,客戶機的用戶是administrator,連接時會被當作用戶root看待。 3.網絡和主機的性能設置 除了以上的用戶權限設置外,還有關於網絡和主機的性能設計。 include = /etc/smb.conf.%m 指定對不同機器的連接采用不同的配置文件。一般為了管理使用/etc/samba/smb.conf.%m,采用Samba變量,把配置文件和客戶機的NetBIOS名稱關聯起來,能很容易地控制這些客戶機的權限和設置。 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 這是網絡Socket方面的一些參數,能實現最好的文件傳輸性能。 interfaces = 192.168.12.2/24 192.168.13.2/24 接口選項在機器碰巧有多個網絡接口時特別有用,它可以指定在哪個網絡接口上使用。 remote announce = 192.168.1.255 192.168.2.44 上面命令指定了浏覽列表同步信息從哪裡取得,例如可以從192.168.2.44或整個子網中獲得。 4.系統的兼容性設置 os level = 33 上面這個參數值是個整數,決定了nmbd是否有機會成為本地廣播區域工作組裡的本地主浏覽器。默認值是零,則意味著nmbd失去浏覽選擇。如果要nmbd有機會成為本地主浏覽器的話,可以設為33。 domain master = yes/no 用戶設置上面參數可以讓nmbd成為一個域控制器,取得域的各個列表,並將整個域的列表遞交給本地浏覽器。 preferred master = yes/no preserve case = yes/no short preserve case = yes/no default case = lower/upper case sensitive = yes/no 以上幾個參數分別指定nmbd是否是工作組裡首要的主浏覽器。如果指定為yes,nmbd啟動時候強制選擇一個浏覽;接下來的幾項是用戶指定拷貝DOS文件的時候是否保持大小寫,缺省是no,也就是不保持。所有DOS文件的缺省是大寫,小寫不敏感,因此這項一般設置為no。 5.主機名的查詢設置 從根本上說,可以把Wins看做是本地的動態 DNS 數據庫。當Samba作為Wins服務器運行的時侯,同一子網上每個與Windows 兼容的機器都會向Samba注冊它的IP地址和NetBIOS名稱(又稱“計算機名”)。這可以讓Windows 機器使用Samba的Wins數據庫來請求特定NetBIOS名稱的IP地址。 domain controller = domain logons = yes name resolve order = wins lmhosts bcast wins support = yes wins server = w.x.y.z 以上參數告訴用戶主域控制器名,說明了登陸時是否以域模式登陸,指定了把服務器名轉化成IP的解析順序和是否提供Wins服務支持,並提供Wins服務器的IP地址。 6.特定內容設置 在smb.conf文件中,一般沒有對目錄設定特定內容。當用戶發出服務請求時,就在smb.conf文件的其它部分查找有特定內容的服務。如果沒有發現這些服務,並且提供了homes段時,那麼就搜索密碼文件得到用戶的Home目錄。通過homes段,Samba可以得到用戶的Home目錄並使之共享。下面是這個段的最基本的幾個設置。 [homes] comment = Home Directory browseable = yes writable = yes [public] comment = Public Stuff path = /home/samba public = yes writable = yes printable = no write list = @staff 其中[]裡面的public指定共享名,一般就是網絡鄰居裡面可以看見的文件夾的名字。comment指的是對共享的備注。path指定共享的路徑,其中可以配合samba變量使用。這樣如果一台機器的NetBIOS名字是nmslinux,它訪問public這個共享的時候就進入/home/samba目錄。allow hosts和deny hosts與前面全局設置的方法一樣,這裡不再提及。writeable指定了這個目錄缺省是否可寫,也可以用readonly = no來設置可寫。user設置所有可能使用該共享資源的用戶,也可以用@group代表group這個組的所有成員。valid users指定能夠使用該共享資源的用戶和組。invalid users指定不能夠使用該共享資源的用戶和組。read list指定只能讀取該共享資源的用戶和組。write list指定能讀取和寫該共享資源的用戶和組。 7.其它參數設置 admin list指定能管理該共享資源(包括讀寫和權限賦予等)的用戶和組。 public指明該共享資源是否能給游客賬號訪問,所以有的配置文件中出現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指明能否刪除共享資源裡被定義為只讀的文件。 smb.conf配置舉例 下面就以我的計算機的smb.conf配置來舉例(如圖1)。 圖1 # Samba config file created using SWAT # from nms.sjbj.net.cn (127.0.0.1) # Date: 2002/07/17 02:43:48 # Global parameters [global] workgroup = SJBJ.NET.CN netbios name = NMSLINUX server string = nmslinux(Samba Server) encrypt passwords = Yes log file = /var/log/samba/%m.log max log size = 0 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 dns proxy = No printing = lprng [homes](如圖2) comment = Home Directories valid users = %S read only = No create mask = 0664 directory mask = 0775 browseable = No 圖2 [shared](如圖3、如圖4) path = /home/smb.shared read only = No guest ok = Yes 圖4 控制服務器的運行: # /etc/rc.d/init.d/smb start (開啟服務器) # /etc/rc.d/init.d/smb stop (關閉服務器) 增加Samba用戶 # useradd new # passwd new #smbadduser new:new #smbpasswd new 或者 #smbadduser root:root #smbpasswd root 通過以上配置,我們就可以在一個局域網內建立自己的文件服務器。