出于各種目的 輕松設(shè)置Samba
在本文中,學(xué)習(xí)以下概念:
- 瀏覽 Samba 服務(wù)器配置文件結(jié)構(gòu)
- 使用 Samba 變量和配置參數(shù)
- 識別對 Server Message Block (SMB)/Common Internet File System (CIFS) 使用的關(guān)鍵 TCP/User Datagram Protocol (UDP) 端口
- 配置 Samba 日志
- 使用 Samba 診斷和調(diào)試問題
Samba 配置文件
與大部分 UNIX 守護(hù)進(jìn)程一樣,Samba 是通過人類可讀的文本文件配置的,而非通過一個(gè)用于編輯二進(jìn)制文件的圖形工具。最重要的配置文件稱為 smb.conf,它包含 Samba 在您的環(huán)境中運(yùn)行所需的所有參數(shù)。
注意:盡管 smb.conf 是設(shè)計(jì)為通過文本編輯器編輯的,Samba 團(tuán)隊(duì)開發(fā)出了一個(gè)基于 web 的工具,名為 Samba Web Administration Tool。另外也有 webmin 等其他工具。重要的是要記住,在運(yùn)行這些工具之前或之后,您仍然可以編輯 smb.conf,因?yàn)槟诓僮饕粋€(gè)文本文件。
Samba 的配置文件有一個(gè)相對簡單的格式,使用三個(gè)不同的結(jié)構(gòu):
- Sections。Sections 將配置文件分成獨(dú)立的部分。例如,一個(gè)文件共享有其自己的區(qū)域。
- Parameters。 Parameters 是鍵值對。鍵是眾所周知的屬性,比如 “read only”。
- Comments。Comments 允許您對配置文件做注解,而不影響不配置,比如指示記載共享信息的服務(wù)臺票證。
Sections
構(gòu)建您自己的提要您可以構(gòu)建一個(gè) RSS、Atom 或 HTML 提要,以便在我們添加新文章或更新內(nèi)容時(shí)收到通知。訪問developerWorks RSS 提要。選擇 Linux 作為專區(qū),Articles 作為類型,輸入 Linux Professional Institute 作為關(guān)鍵字。然后選擇您想要的提要類型。Sections 將配置文件分成不同的部分。您可以將 section 名包含在方括號([])中來開始一個(gè) section。本 section 將持續(xù)到下一 section 被定義或達(dá)到文件的結(jié)尾。
有三個(gè) section 名具有特殊的含義:
- global。該 section 中的所有內(nèi)容都適用于整個(gè)服務(wù)器。如有需要,可在共享級別覆蓋 global 部分中的配置項(xiàng)。
- homes。homes 部分充當(dāng)所有用戶共享的模板,且 Samba 負(fù)責(zé)將用戶名映射到該部分中的配置,每次您想讓用戶進(jìn)入其主目錄時(shí)都幾乎無需配置獨(dú)立的共享。
- printers。該部分類似于 homes,區(qū)別在于它用于打印機(jī)。
如果使用的 section 名不是上述之一,那么會(huì)被看作是文件或打印機(jī)共享。
當(dāng)針對特定共享名的一個(gè)連接請求進(jìn)入 Samba 時(shí),守護(hù)進(jìn)程尋找具有該名稱的、會(huì)定義該共享的屬性的 section。如果未找到這個(gè) section,Samba 瀏覽系統(tǒng)上的用戶列表,看看連接是否是指一個(gè)用戶。如果不是,Samba 查詢系統(tǒng)打印機(jī)列表,看具有該名稱的打印機(jī)是否存在。如果連接匹配用戶,則使用 homes 部分的配置。如果打印機(jī)匹配,則使用 printers 部分。在所有情況下,區(qū)域級配置覆蓋 global 配置部分。
如果上述情況都不匹配,還有最后一項(xiàng)檢查。如果配置了默認(rèn)服務(wù),則使用該服務(wù)。如果沒有,一個(gè)錯(cuò)誤會(huì)傳回客戶端。默認(rèn)情況下,不配置默認(rèn)服務(wù),因此不正確的共享名會(huì)導(dǎo)致錯(cuò)誤。
Parameters
Parameters 采用的形式是 key = value,即將 value 賦給 key。鍵都記錄在 smb.conf 手冊頁中。Samba 配置很大程度上就是了解實(shí)現(xiàn)想要的行為所需的鍵并確定要使用的適當(dāng)?shù)逆I。
Parameters 一般將字符串作為值。Samba 支持宏,允許您根據(jù)共享名或用戶輸入等項(xiàng)目改變參數(shù)的值。例如,homes 部分默認(rèn)設(shè)置為用戶的 UNIX 主目錄,但是您可以使用宏將該參數(shù)用于任何位置,并在連接時(shí)替換文件路徑中的用戶名。宏以 % 字符開頭,會(huì)在需要時(shí)加以討論。
如果一個(gè)參數(shù)的值必須擴(kuò)展到兩行或更多行,除最后一行的所有行必須以反斜杠(\)結(jié)束,就像一個(gè) UNIX shell。
Comments
Comments 以分號(;)或散列字符(哈希符號或 #)開頭。Comments 可用于解釋項(xiàng)目原由、跟蹤變更或顯示 section 邊界。
配置示例
清單 1 顯示 smb.conf 文件示例,說明文件的不同組成部分。
清單 1. 配置文件示例
# This is a comment ; So is this # Remember that all shares need to be entered in the Wiki! -Opsteam [global] workgroup = BIGCO # %v gets expanded to the version of Samba server string = Samba Server Version %v # By default any file starting with . will have the hidden attribute set hide dot files = yes # Home directories come from the UNIX password file # anyone matching a user will use this section [homes] comment = Home directories # dot files will be hidden because it's a global [printers] comment = System printers printable = yes # A share that everyone can see [projecta] path = /var/spool/projects/projecta # Override the global version of hiding dot files hide dot files = no
對于該配置示例特別需要注意的是:
- 使用了兩種不同類型的注釋。一個(gè)以哈希符號開頭,另一個(gè)以分號開頭。
- 該文件定義了一個(gè)名為 projecta 的共享。任何其他共享將自動(dòng)通過系統(tǒng)上定義的用戶和打印機(jī)予以創(chuàng)建。
- server string 參數(shù)將 %v 宏作為其值的一部分。在運(yùn)行時(shí),%v 將被替換為 Samba 的版本。
- 在全局級別,hide dot files 被設(shè)置為 yes,但在 projecta 共享內(nèi)被設(shè)置為 no。主目錄使用 homes 部分中的配置,因此會(huì)隱藏其 dot 文件(比如 .profile)。projecta 文件的 dot 文件可見。
Samba 網(wǎng)絡(luò)交互
Samba 是通過 IP 運(yùn)行的一項(xiàng)網(wǎng)絡(luò)服務(wù),因而它可以與網(wǎng)絡(luò)上也在使用 IP 的其他主機(jī)通信。作為一名 Samba 管理員,您需要理解 Samba 服務(wù)在網(wǎng)絡(luò)上的運(yùn)作方式,以便解決連接問題。
在較高的級別,您可以將 Samba 看作是提供三種不同的網(wǎng)絡(luò)服務(wù):
- 文件和打印共享。提供文件和打印機(jī)給其他網(wǎng)絡(luò)服務(wù)并在其他機(jī)器上使用這些服務(wù)
- 名稱服務(wù)。加入 Microsoft 網(wǎng)絡(luò)所需的名稱解析服務(wù)
- 域服務(wù)。Samba 可取代各種 Microsoft 服務(wù)器角色,比如舊的域控制器,并與較新的 Active Directory Domain Services (AD DS) 服務(wù)器集成
文件和打印共享
文件和打印共享在 smbd 內(nèi)實(shí)現(xiàn),它是 Samba 守護(hù)進(jìn)程之一。Microsoft 在初次涉足 IP 時(shí)其文件共享使用了經(jīng)由 TCP 的基本網(wǎng)絡(luò)輸入/輸出系統(tǒng)(NetBIOS)。該方法使用 TCP 端口 139 將 NetBIOS 封裝在 TCP 會(huì)話內(nèi)。
NetBIOS 協(xié)議包括以下幾個(gè)特性。TCP 端口 139 僅用于會(huì)話服務(wù),即文件傳輸和消息解析。在該端口上不處理名稱查找服務(wù)。
NetBIOS over TCP 有效運(yùn)作,但是 NetBIOS 與 TCP 提供的會(huì)話和可靠性功能之間有重疊。經(jīng)過一些微小的更改之后,就可以在 TCP 之上運(yùn)行 SMB/CIFS 了。該方法被稱為直接宿主,用于簡化協(xié)議。直接宿主發(fā)生在 TCP 端口 445 上。
當(dāng)從協(xié)議集中刪除 NetBIOS 時(shí),Microsoft 需要另一種方式來處理名稱查找。Domain Name System (DNS) 自然是一個(gè)選擇,它是 DNS 形成 AD DS 基礎(chǔ)的原因。
默認(rèn)情況下,Samba 監(jiān)聽端口 139 和 445。您可以使用 smb ports 全局參數(shù)更改這個(gè)行為。例如,smb ports = 445 告訴 Samba 僅監(jiān)聽端口 445。您可以讓 Samba 監(jiān)聽任何您想要監(jiān)聽的端口,不過必須告訴想要連接的任何客戶端使用非標(biāo)準(zhǔn)端口。
如果您不確定 Samba 在監(jiān)聽哪些端口,可以使用 netstat 命令查明。清單 2 顯示運(yùn)行中的該命令。
清單 2. 使用 netstat 查找 SMB 在監(jiān)聽哪個(gè)端口
# netstat -antp | grep smbd # netstat -antp | grep smb tcp 0 0 :::445 :::* LISTEN 2830/smbd tcp 0 0 ::ffff:192.168.1.143:445 ::ffff:192.168.1.147:4724 ESTABLISHED 2877/smbd
清單 2 顯示運(yùn)行的 netstat 命令,通過 grep 為字符串 smb 篩選了輸出。使用的 netstat 選項(xiàng)以數(shù)字格式(-n)顯示所有(-a)TCP(-t)連接,以及所負(fù)責(zé)進(jìn)程(-p)的名稱。該輸出顯示兩行:第一行包含字符串 LISTEN,這表示守護(hù)進(jìn)程在監(jiān)聽傳入的連接。這里守護(hù)進(jìn)程在監(jiān)聽端口 445。第二行顯示 ESTABLISHED 連接,其中 192.168.1.147 連接到本地主機(jī)(192.168.1.143)上的端口 445。因此,通過 清單 2 中的輸出,您可以總結(jié)出 smbd 僅在監(jiān)聽端口 445,且連接了一個(gè)客戶端。
名稱服務(wù)
NetBIOS 提供一個(gè)名稱服務(wù)層,負(fù)責(zé)網(wǎng)絡(luò)瀏覽和名稱查找。例如,通過在 UDP 端口 137 上使用 NetBIOS 名稱服務(wù)請求,解析出了主機(jī) SERVER1 的 IP 地址。對支持角色(比如主瀏覽器)的瀏覽和選擇發(fā)生在 UDP 端口 138,或稱為數(shù)據(jù)報(bào)服務(wù)端口。名稱服務(wù)是在 nmbd 守護(hù)進(jìn)程中實(shí)現(xiàn)的。
重要的是要注意,名稱服務(wù)使用 UDP 而非 TCP。UDP 數(shù)據(jù)包無連接,可廣播到所有主機(jī),而非單一單播流。使用 UDP 的播放功能,就更容易在網(wǎng)絡(luò)上處理 NetBIOS 名稱服務(wù)。
Samba 版本 3 沒有任何參數(shù)用來控制 nmbd 在監(jiān)聽哪些端口,但是 Samba 版本 4 實(shí)現(xiàn)了 nbt port 和 dgram port 全局參數(shù),它們分別控制名稱空間和數(shù)據(jù)報(bào)服務(wù)端口。
您可以使用類似于 清單 2 中的命令顯示哪個(gè)端口 nmbd 開著。這如清單 3 所示。
清單 3. 顯示 nmbd 監(jiān)聽的端口
# netstat -anup | grep nmbd udp 0 0 192.168.1.255:137 0.0.0.0:* 2975/nmbd udp 0 0 192.168.1.143:137 0.0.0.0:* 2975/nmbd udp 0 0 0.0.0.0:137 0.0.0.0:* 2975/nmbd udp 0 0 192.168.1.255:138 0.0.0.0:* 2975/nmbd udp 0 0 192.168.1.143:138 0.0.0.0:* 2975/nmbd udp 0 0 0.0.0.0:138 0.0.0.0:* 2975/nmbd
除了查找 nmbd 而非 smbd 之外,清單 3 中的命令使用 netstat 的 -u 選項(xiàng)查找 UDP 端口而非 TCP 端口。結(jié)果顯示 nmbd 在各個(gè)接口監(jiān)聽端口 137 和 138,且在監(jiān)聽 192.168.1.255 的廣播地址。兩個(gè)名稱服務(wù)端口都依賴于主機(jī)對主機(jī)通信和廣播通信。
域服務(wù)
Samba 團(tuán)隊(duì)在不斷更新軟件,以使其更緊密地與 Microsoft 網(wǎng)絡(luò)集成,并替換 Microsoft 基礎(chǔ)架構(gòu)。為此,Samba 必須枚舉網(wǎng)絡(luò)上的這些基礎(chǔ)架構(gòu)服務(wù)。
這些服務(wù)的大部分都在一定程度上涉及到 Kerberos 和 Lightweight Directory Access Protocol (LDAP)。這些是高級主題,將在后面的文章中更詳細(xì)地介紹。目前,只需知道 Samba 可以做的不僅僅是文件共享。#p#
Samba 使用的端口匯總
表 1 提供 Samba 守護(hù)進(jìn)程監(jiān)聽的與文件共享相關(guān)的端口的匯總。
表 1. Samba 使用的端口匯總
端口 | 協(xié)議 | 服務(wù) | 守護(hù)進(jìn)程 | 描述 |
137 | UDP | netbios-ns | nmbd | NetBIOS 名稱服務(wù) |
138 | UDP | netbios-dgm | nmbd | NetBIOS 數(shù)據(jù)報(bào)服務(wù) |
139 | TCP | netbios-ssn | smbd | NetBIOS over TCP(會(huì)話服務(wù)) |
445 | TCP | microsoft-ds | smbd | 直接托管的 SMB |
服務(wù)列中的標(biāo)記是知名的服務(wù)名稱,它來自一個(gè)名為 /etc/services 的文件。服務(wù)文件幫助應(yīng)用程序?qū)⒎?wù)名稱解析為端口號。該文件還幫助人們將端口號關(guān)聯(lián)到服務(wù)名稱。盡管大部分服務(wù)同時(shí)保留 TCP 和 UDP 端口,應(yīng)用程序不必同時(shí)使用 UDP 和 TCP。當(dāng)兩個(gè)不同的服務(wù)嘗試使用不同協(xié)議上的同一端口號時(shí),保留兩者可消除可能的混淆。
另外值得一提的是,/etc/services 中的端口號和名稱不是強(qiáng)制實(shí)施的。您可以在與預(yù)期的不同的端口上運(yùn)行守護(hù)進(jìn)程,前提是您可以將這一變更傳遞給客戶端。例如,只要您的客戶端不打算在標(biāo)準(zhǔn)端口上對話,您可以在端口 5137 到 5139 和 5445 上運(yùn)行 Samba。
Samba 問題故障排除
Samba 也難免有問題。有時(shí),這些問題是由系統(tǒng)管理員引起的;有時(shí)是由用戶引起的。作為系統(tǒng)管理員,您的工作就是找出問題所在,然后查明解決方法。
測試配置文件
如果 Samba 無法啟動(dòng),或您想檢查配置文件看是否正確,那么 testparm 實(shí)用程序?qū)⒂兴鶐椭?。該?shí)用程序檢查 smb.conf 是否正確。清單 4 顯示出現(xiàn)錯(cuò)誤時(shí) testparm 的結(jié)果。
清單 4. 在一個(gè)不正確的 smb.conf 文件上使用 testparm
# testparm Load smb config files from /etc/samba/smb.conf Unknown parameter encountered: "hide dto files" Ignoring unknown parameter "hide dto files" Processing section "[homes]" Processing section "[printers]" Processing section "[public]" Loaded services file OK. Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions [global] workgroup = MYGROUP server string = Samba Server Version %v passdb backend = tdbsam log file = /var/log/samba/log.%m max log size = 50 cups options = raw << rest of the output omitted >>
testparm 的輸出從文件的位置開始。如果您想指定一個(gè)不同的文件,在命令行上傳遞文件的名稱,如下面的例子:
testparm /home/me/smb.conf
接下來,testparm 抱怨有一個(gè)名為 hide dto files 的無效參數(shù)。實(shí)際上該參數(shù)應(yīng)當(dāng)是 hide dot 文件。
在處理配置文件之后,您就得到一些有關(guān)服務(wù)器角色和配置文件精簡版的信息。該版本將注釋剝離出來,且始終經(jīng)過格式化,因此有時(shí)您會(huì)捕捉到這里漏掉的錯(cuò)誤,同時(shí)在文本編輯器中瀏覽 smb.conf。
在作出更改之后您應(yīng)當(dāng)在您的配置文件上運(yùn)行 testparm。Samba 忽略配置文件中的大多數(shù)印刷錯(cuò)誤,且在啟動(dòng)時(shí)并不總是寫入消息到控制臺。在發(fā)現(xiàn)某些東西不能正常工作之前,您可能不會(huì)捕捉到這類錯(cuò)誤。Testparm 會(huì)提醒您 smb.conf 中的任何印刷錯(cuò)誤。
默認(rèn)情況下,testparm 僅向您展示 smb.conf 中輸入的配置。如果您懷疑您在某個(gè)地方使用了默認(rèn)值,可以使用 -v 選項(xiàng)強(qiáng)制testparm 也顯示默認(rèn)值。
testparm 的另一個(gè)用法是將輸出限制到單一部分或參數(shù)。清單 5 顯示如何使用 testparm 查看 security mask 選項(xiàng)的值。
清單 5. 將 testparm 限制到單一參數(shù)
# testparm -s --parameter-name "security mask" Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[printers]" Processing section "[public]" Loaded services file OK. 0777
在清單 5 中,-s 參數(shù)阻止 testparm 在解析 smb.conf 與將其顯示到屏幕之間的用戶輸入。使用 --parameter name "security mask"詢問 security mask 的值。結(jié)果是 0777,即默認(rèn)值。在該模式下,沒有必要指定 -v 來顯示默認(rèn)值。
作為客戶端進(jìn)行連接
您可以不用到用戶桌面并親自試驗(yàn)一些東西,而是可以在您自己的桌面通過命令行執(zhí)行大量測試。第一個(gè)最簡單的測試是確保您可以連接到 Samba 端口。做到這一點(diǎn)的最簡單的方法是使用 telnet 命令,如清單 6 所示。
清單 6. 測試與 telnet 的連接
# telnet bob 139 Trying 192.168.1.134... telnet: connect to address 192.168.1.134: Connection refused
在清單 6 中,root 用戶在端口 139 上連接到服務(wù)器 bob。您還可以使用端口 445 測試直接托管的 SMB 端口。結(jié)果是 Connection refused,這表示守護(hù)進(jìn)程沒有監(jiān)聽該地址,或防火墻阻止連接。其他結(jié)果,比如 No route to host 或 Connection timed out 如出一轍。
客戶端通常使用一個(gè)名稱而非 IP 地址連接到一臺服務(wù)器。如果您使用 telnet 連接到服務(wù)器名稱,而非 IP 地址,要特別注意返回的 IP 地址。在上述示例中,服務(wù)器(bob) 被解析為 192.168.1.134。有時(shí),您的 DNS 記錄會(huì)有錯(cuò)誤,導(dǎo)致客戶端連接到錯(cuò)誤的地址。
如果您不使用 DNS 進(jìn)行 Windows 名稱解析,那么可以使用 nmblookup 命令執(zhí)行一個(gè) NetBIOS 名稱查詢。清單 7 顯示 bob 服務(wù)器查詢。
清單 7. 為 bob 執(zhí)行一個(gè) NetBIOS 名稱查詢
# nmblookup bob querying bob on 192.168.1.255 192.168.1.138 bob<00>
根據(jù)清單 7,服務(wù)器 bob 的 IP 地址是 192.168.1.138,而非 192.168.1.134,如 清單 6 所示。結(jié)果表示 DNS 出現(xiàn)問題,特別是當(dāng)端口 139 和 445 在 192.168.1.138 上做出反應(yīng)時(shí)。
另一項(xiàng)測試是看看配置文件是否拒絕訪問某一主機(jī)。Testparm 再次在清單 8 中用到。
清單 8. 使用 testparm 檢查訪問
# testparm /etc/samba/smb.conf seanspc 192.168.1.147 Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[printers]" Processing section "[public]" Loaded services file OK. Server role: ROLE_STANDALONE Deny connection from seanspc (192.168.1.147) to homes Deny connection from seanspc (192.168.1.147) to printers Deny connection from seanspc (192.168.1.147) to public
在清單 8 中,有三個(gè)項(xiàng)目被傳遞給 testparm:
- Samba 配置文件的路徑
- 要測試的機(jī)器的 NetBIOS 名稱
- 要測試的機(jī)器的 IP 地址
清單 8 中的輸出顯示拒絕考慮中的機(jī)器訪問所有共享。在這種模式下使用 testparm 時(shí),實(shí)用程序?qū)嶋H上不作為該機(jī)器進(jìn)行連接。相反地,testparm 處理配置文件,以查看是否允許訪問。
如果目前為止的所有測試都成功,您可以嘗試使用 smbclient 實(shí)用程序建立一個(gè)客戶端連接。第一個(gè)測試是要試圖瀏覽共享列表,如清單 9 所示。
清單 9. 顯示機(jī)器的共享
[sean@bob source3]$ smbclient -L '\\bob' Enter sean's password: Anonymous login successful Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.5.6-69.fc13] Sharename Type Comment --------- ---- ------- extdrive Disk Sean Walberg's iMac Disk timemachine Disk IPC$ IPC IPC Service (Samba Server Version 3.5.6-69.fc13) test Printer test Downstairs_Laser Printer HP 6L Cups-PDF Printer Cups-PDF Anonymous login successful Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.5.6-69.fc13] Server Comment --------- ------- BOB Samba Server Version 3.5.6-69.fc13 Workgroup Master --------- ------- MYGROUP BOB WORK SWALBERG-XPLT WORKGROUP IMAC-1FC525
在清單 9 中,用戶在 bob 服務(wù)器上使用 -L 參數(shù)請求共享列表。服務(wù)器名稱以兩個(gè)反斜杠(\\)為前綴,因?yàn)樗且粋€(gè) Universal Naming Convention (UNC) 路徑。在選擇單引號和雙引號時(shí)要小心。單引號插入并將反斜杠看作是轉(zhuǎn)義符。
如果您的服務(wù)器有更多的安全設(shè)置,您可能需要分別使用 -W 和 -U 參數(shù)傳遞用戶名或域。
最后,您可以嘗試連接到一個(gè)共享,方法就是省略掉 -L 參數(shù)并指定到共享的一個(gè)完整的 UNC 路徑。清單 10 顯示客戶端使用不同的工作組和用戶名連接到一臺服務(wù)器。
清單 10. 使用不同的用戶名和域連接到共享
[sean@bob source3]$ smbclient '\\swalberg-xplt\photos' -U swalberg -W WORK Enter swalberg's password: Domain=[WORK] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager] smb: \> dir . D 0 Thu Jan 6 11:39:50 2011 .. D 0 Thu Jan 6 11:39:50 2011 << files omitted >> 38156 blocks of size 4194304. 2938 blocks available smb: \>>
如果這些測試通過,您可以很確定問題與 Samba 配置無關(guān),而是客戶端與服務(wù)器之間或客戶端本身某個(gè)地方有問題。您可以查看下一節(jié)將要介紹的日志,其中就問題所在提供了一些線索。#p#
日志記錄和調(diào)試
日志記錄和故障排除相伴而行。日志允許您回顧歷史,查看是否有錯(cuò)誤發(fā)生并在問題發(fā)生時(shí)獲取有關(guān)問題的更多細(xì)節(jié)。如果您嘗試弄清為何有些東西不能正常運(yùn)作,可以增加日志數(shù)量,直至獲得必要的詳細(xì)程度。Samba 在 smb.conf 中提供了一些參數(shù)來處理日志記錄;您可以一起使用這些參數(shù)來定制生成的日志類型。
Samba 就像一個(gè)傳統(tǒng)的 UNIX 守護(hù)進(jìn)程,在于它可以將日志記錄到 syslog 工具,并生成其自己的日志文件。此外,Microsoft Event Viewer 工具可以連接到一個(gè) Samba 服務(wù)器來提取日志。后一特性的要點(diǎn)在于,Samba 不能直接將日志記錄為事件日志格式:您必須使用 Samba 工具對您的日志文件進(jìn)行后處理。
日志級別
Samba 生成的每條日志消息都有一個(gè) 級別,即從 0 到 10 的一個(gè)整數(shù)。較高級的消息,比如新連接和重要錯(cuò)誤,具有較低的級別。消息調(diào)試具有較高的級別。通過指定您想記錄的日志的最大級別,可以控制日志量。級別為 1 的日志僅記錄優(yōu)先級為 0 或 1 的消息。如果您想要更多的日志記錄,可以使用一個(gè)較高的數(shù)字。
級別大于 3 的任何日志都旨在用于開發(fā)人員,對系統(tǒng)管理員沒有太大的幫助。使用日志級別 0 將避開除一些啟動(dòng)消息和關(guān)鍵錯(cuò)誤之外的任何消息。
要配置日志級別,在 global 部分使用 log level 參數(shù);例如,使用 log level = 2 將日志級別設(shè)置為 2。該設(shè)置記錄優(yōu)先級為 2 或更小的任何消息。
您可以在運(yùn)行時(shí)更改日志級別,方法就是發(fā)送 SIGUSR1 信號給 Samba 進(jìn)程來增加日志級別,或發(fā)送 SIGUSR2 減少日志級別。
您還可以讓您的日志級別更細(xì)粒度一些,僅在某些功能中通過指定想要記錄的類別來增加詳細(xì)程度。這些類別是:
- all。該參數(shù)是可選的:如果您不指定額外的關(guān)鍵字,假定使用all。
- tdb。與不重要的數(shù)據(jù)庫相關(guān)的日志消息,這是 Samba 使用的鍵值存儲。
- printdrivers。打印機(jī)驅(qū)動(dòng)程序管理例程。
- lanman。 NT LAN Manager 調(diào)試。
- smb。 SMB 協(xié)議調(diào)試。
- rpc_parse。遠(yuǎn)程過程調(diào)用(RPCs)解析。
- rpc_srv。服務(wù)器端 RPCs。
- rpc_cli??蛻舳?RPCs。
- passdb。在 Samba 主機(jī)上存儲密碼的舊有方式。
- sam。本地 Samba 帳戶數(shù)據(jù)庫。
- auth。Samba 內(nèi)與用戶身份驗(yàn)證相關(guān)的各個(gè)模塊。
- winbind。用于允許 Microsoft 用戶透明地登錄到 UNIX 系統(tǒng)的組件。
- vfs。為 Virtual File System 模塊調(diào)試消息,允許您通過可插入模塊添加功能到 Samba。
- idmap。在 UNIX 用戶 IDs 與 Microsoft 安全標(biāo)識符之間映射身份。
- quota。與配額處理相關(guān)的消息,同時(shí)由 Microsoft Windows NT 策略和 UNIX 文件系統(tǒng)處理。
- acls。訪問控制列表處理。
- locking。文件鎖定狀態(tài)和錯(cuò)誤。
- msdfs。與 Samba 的分布式文件系統(tǒng)支持相關(guān)的日志消息。
- dmapi。數(shù)據(jù)管理應(yīng)用程序編程接口(API)功能。必須使用第三方 DMAPI 實(shí)現(xiàn)編譯 Samba 來使用該功能。
- registry。Windows 注冊表的模仿。
要使用這些額外的日志記錄,將關(guān)鍵字和值附加到日志級別參數(shù),用冒號(:)分割。例如,log level = 1 winbind:3 將系統(tǒng)默認(rèn)日志級別設(shè)置為 1,并將 winbind 日志級別增加到 3。這一變更可以幫助您調(diào)試有關(guān)單點(diǎn)登錄的問題,而無需淹沒于無關(guān)的日志文件中。
日志文件位置
要更改日志文件的名稱,使用 log file 參數(shù)。您還可以在值中使用宏。一個(gè)常用的設(shè)置是讓一個(gè)客戶端擁有一個(gè)日志文件。為此,請指定:
log file = /var/log/samba/log.%m
該命令將單個(gè)日志文件分割為每個(gè)客戶端一個(gè)文件,其余消息歸入 log.smbd。
如果您想將日志記錄到 syslog,可以指定 syslog = 1 來將級別 1 或 0 的所有日志發(fā)送到本地 syslog 服務(wù)器。Samba 使用LOG_DAEMON 工具并將 Samba 日志級別按照如下優(yōu)先級映射到 syslog:
- LOG_ERR。日志級別 0
- LOG_WARNING。日志級別 1
- LOG_NOTICE。日志級別 2
- LOG_INFO。日志級別 3
- LOG_DEBUG。日志級別 4 或更高
您使用可以過濾傳入的消息并警惕系統(tǒng)管理員的一個(gè)更高級的 syslog 守護(hù)進(jìn)程,這是監(jiān)視您的 Samba 服務(wù)器的一種很好的方式。
日志元數(shù)據(jù)
您可以添加或刪除顯示在帶有更多全局參數(shù)的所有日志條目中的一些消息:
- debug timestamp。添加一個(gè)時(shí)間戳到日志消息,且是默認(rèn)啟用的
- debug uid。記錄生成日志的 Samba 進(jìn)程的用戶和組 IDs
- debug prefix timestamp。繼續(xù)使用時(shí)間戳,但是在生成日志的 Samba 源代碼中刪除有關(guān)位置的信息
- debug pid。記錄生成日志的 Samba 進(jìn)程的進(jìn)程標(biāo)識符
- debug hires timestamp。將時(shí)間戳分辨率改為微秒,而非秒
- debug class。記錄日志消息的類別,如果您要更改某個(gè)類的詳細(xì)程度這會(huì)有所幫助(該選項(xiàng)幫助確定您想要的類。)
日志記錄可幫助您找到問題,或者也可以讓您處于雜亂中。Samba 提供各種日志記錄選項(xiàng);要謹(jǐn)慎使用它們。
系統(tǒng)調(diào)用跟蹤
如果其他方法都失敗了,您可以使用 UNIX 系統(tǒng)工具查看進(jìn)程內(nèi)的狀況。Linux strace 程序允許您跟蹤應(yīng)用程序做出的所有系統(tǒng)調(diào)用。一個(gè)應(yīng)用程序使用系統(tǒng)調(diào)用打開和讀取文件、創(chuàng)建和銷毀進(jìn)程,并與操作系統(tǒng)其余進(jìn)程進(jìn)行交互。
清單 11 顯示 root 用戶跟蹤一個(gè) Samba 進(jìn)程,該進(jìn)程向客戶端拋出一個(gè)錯(cuò)誤。
清單 11. 使用 strace 程序跟蹤進(jìn)程
# ps -ef | grep smb sean 13375 28812 0 21:54 ? 00:00:00 smbd -D root 14294 13593 0 21:55 pts/2 00:00:00 grep smb root 16132 28812 0 Feb27 ? 00:00:36 smbd -D root 28812 1 0 Feb14 ? 00:00:28 smbd -D root 28814 28812 0 Feb14 ? 00:00:00 smbd -D [root@bob /]# strace -e trace=file -p 13375 Process 13375 attached - interrupt to quit << Output omitted >> chdir("/home/sean") = 0 stat64("somedir", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0 stat64("somedir/*", 0xbfcb5f60) = -1 EACCES (Permission denied) getcwd("/home/sean", 4096) = 11 lstat64("/home/sean/somedir", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0 lstat64("/home/sean/somedir/*", 0xbfcb5ffc) = -1 EACCES (Permission denied)
第一個(gè)命令查找 Samba 進(jìn)程列表。由于 Samba 采用所連接用戶的身份,可以輕松將進(jìn)程 13375 識別為屬于該用戶的進(jìn)程。接下來,運(yùn)行帶有兩個(gè)參數(shù)的 strace 命令:-e trace=file 限制與文件相關(guān)的系統(tǒng)調(diào)用的輸出。對于您會(huì)遇到的 Samba 問題,這是一個(gè)很好的初始估計(jì)。第二個(gè)參數(shù) -p 13375 告訴 strace 使用這個(gè)進(jìn)程 ID 連接到運(yùn)行的進(jìn)程。
從該命令的輸出中,您會(huì)看到 smb 在不斷掃描目錄看是否有變更。當(dāng)用戶嘗試有問題的操作時(shí),您可能會(huì)看到如 清單 11 所示的輸出。最后幾個(gè)命令嘗試使用 stat64 調(diào)用獲取目錄內(nèi)有關(guān)文件的信息。結(jié)果是 permission denied,這表示用戶在系統(tǒng)文件級被拒絕,而非由 Samba 拒絕。該命令可以為您提供更多信息來解決問題,比如更改目錄屬性或告訴用戶不允許他/她訪問目錄。
原文:http://www.ibm.com/developerworks/cn/linux/l-lpic3-312-1/index.html?ca=drs-
【編輯推薦】