在本文中,学习以下概念:
Samba 配置文件
与大部分 UNIX 守护进程一样,Samba 是通过人类可读的文本文件配置的,而非通过一个用于编辑二进制文件的图形工具。最重要的配置文件称为 smb.conf,它包含 Samba 在您的环境中运行所需的所有参数。
注意:尽管 smb.conf 是设计为通过文本编辑器编辑的,Samba 团队开发出了一个基于 web 的工具,名为 Samba Web Administration Tool。另外也有 webmin 等其他工具。重要的是要记住,在运行这些工具之前或之后,您仍然可以编辑 smb.conf,因为您在操作一个文本文件。
Samba 的配置文件有一个相对简单的格式,使用三个不同的结构:
Sections
构建您自己的提要您可以构建一个 RSS、Atom 或 HTML 提要,以便在我们添加新文章或更新内容时收到通知。访问developerWorks RSS 提要。选择 Linux 作为专区,Articles 作为类型,输入 Linux Professional Institute 作为关键字。然后选择您想要的提要类型。Sections 将配置文件分成不同的部分。您可以将 section 名包含在方括号([])中来开始一个 section。本 section 将持续到下一 section 被定义或达到文件的结尾。
有三个 section 名具有特殊的含义:
如果使用的 section 名不是上述之一,那么会被看作是文件或打印机共享。
当针对特定共享名的一个连接请求进入 Samba 时,守护进程寻找具有该名称的、会定义该共享的属性的 section。如果未找到这个 section,Samba 浏览系统上的用户列表,看看连接是否是指一个用户。如果不是,Samba 查询系统打印机列表,看具有该名称的打印机是否存在。如果连接匹配用户,则使用 homes 部分的配置。如果打印机匹配,则使用 printers 部分。在所有情况下,区域级配置覆盖 global 配置部分。
如果上述情况都不匹配,还有最后一项检查。如果配置了默认服务,则使用该服务。如果没有,一个错误会传回客户端。默认情况下,不配置默认服务,因此不正确的共享名会导致错误。
Parameters
Parameters 采用的形式是 key = value,即将 value 赋给 key。键都记录在 smb.conf 手册页中。Samba 配置很大程度上就是了解实现想要的行为所需的键并确定要使用的适当的键。
Parameters 一般将字符串作为值。Samba 支持宏,允许您根据共享名或用户输入等项目改变参数的值。例如,homes 部分默认设置为用户的 UNIX 主目录,但是您可以使用宏将该参数用于任何位置,并在连接时替换文件路径中的用户名。宏以 % 字符开头,会在需要时加以讨论。
如果一个参数的值必须扩展到两行或更多行,除最后一行的所有行必须以反斜杠(\)结束,就像一个 UNIX shell。
Comments
Comments 以分号(;)或散列字符(哈希符号或 #)开头。Comments 可用于解释项目原由、跟踪变更或显示 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
对于该配置示例特别需要注意的是:
Samba 网络交互
Samba 是通过 IP 运行的一项网络服务,因而它可以与网络上也在使用 IP 的其他主机通信。作为一名 Samba 管理员,您需要理解 Samba 服务在网络上的运作方式,以便解决连接问题。
在较高的级别,您可以将 Samba 看作是提供三种不同的网络服务:
文件和打印共享
文件和打印共享在 smbd 内实现,它是 Samba 守护进程之一。Microsoft 在初次涉足 IP 时其文件共享使用了经由 TCP 的基本网络输入/输出系统(NetBIOS)。该方法使用 TCP 端口 139 将 NetBIOS 封装在 TCP 会话内。
NetBIOS 协议包括以下几个特性。TCP 端口 139 仅用于会话服务,即文件传输和消息解析。在该端口上不处理名称查找服务。
NetBIOS over TCP 有效运作,但是 NetBIOS 与 TCP 提供的会话和可靠性功能之间有重叠。经过一些微小的更改之后,就可以在 TCP 之上运行 SMB/CIFS 了。该方法被称为直接宿主,用于简化协议。直接宿主发生在 TCP 端口 445 上。
当从协议集中删除 NetBIOS 时,Microsoft 需要另一种方式来处理名称查找。Domain Name System (DNS) 自然是一个选择,它是 DNS 形成 AD DS 基础的原因。
默认情况下,Samba 监听端口 139 和 445。您可以使用 smb ports 全局参数更改这个行为。例如,smb ports = 445 告诉 Samba 仅监听端口 445。您可以让 Samba 监听任何您想要监听的端口,不过必须告诉想要连接的任何客户端使用非标准端口。
如果您不确定 Samba 在监听哪些端口,可以使用 netstat 命令查明。清单 2 显示运行中的该命令。
清单 2. 使用 netstat 查找 SMB 在监听哪个端口
# 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 显示运行的 netstat 命令,通过 grep 为字符串 smb 筛选了输出。使用的 netstat 选项以数字格式(-n)显示所有(-a)TCP(-t)连接,以及所负责进程(-p)的名称。该输出显示两行:第一行包含字符串 LISTEN,这表示守护进程在监听传入的连接。这里守护进程在监听端口 445。第二行显示 ESTABLISHED 连接,其中 192.168.1.147 连接到本地主机(192.168.1.143)上的端口 445。因此,通过 清单 2 中的输出,您可以总结出 smbd 仅在监听端口 445,且连接了一个客户端。
名称服务
NetBIOS 提供一个名称服务层,负责网络浏览和名称查找。例如,通过在 UDP 端口 137 上使用 NetBIOS 名称服务请求,解析出了主机 SERVER1 的 IP 地址。对支持角色(比如主浏览器)的浏览和选择发生在 UDP 端口 138,或称为数据报服务端口。名称服务是在 nmbd 守护进程中实现的。
重要的是要注意,名称服务使用 UDP 而非 TCP。UDP 数据包无连接,可广播到所有主机,而非单一单播流。使用 UDP 的播放功能,就更容易在网络上处理 NetBIOS 名称服务。
Samba 版本 3 没有任何参数用来控制 nmbd 在监听哪些端口,但是 Samba 版本 4 实现了 nbt port 和 dgram port 全局参数,它们分别控制名称空间和数据报服务端口。
您可以使用类似于 清单 2 中的命令显示哪个端口 nmbd 开着。这如清单 3 所示。
清单 3. 显示 nmbd 监听的端口
# 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 选项查找 UDP 端口而非 TCP 端口。结果显示 nmbd 在各个接口监听端口 137 和 138,且在监听 192.168.1.255 的广播地址。两个名称服务端口都依赖于主机对主机通信和广播通信。
域服务
Samba 团队在不断更新软件,以使其更紧密地与 Microsoft 网络集成,并替换 Microsoft 基础架构。为此,Samba 必须枚举网络上的这些基础架构服务。
这些服务的大部分都在一定程度上涉及到 Kerberos 和 Lightweight Directory Access Protocol (LDAP)。这些是高级主题,将在后面的文章中更详细地介绍。目前,只需知道 Samba 可以做的不仅仅是文件共享。#p#
Samba 使用的端口汇总
表 1 提供 Samba 守护进程监听的与文件共享相关的端口的汇总。
表 1. Samba 使用的端口汇总
端口 | 协议 | 服务 | 守护进程 | 描述 |
137 | UDP | netbios-ns | nmbd | NetBIOS 名称服务 |
138 | UDP | netbios-dgm | nmbd | NetBIOS 数据报服务 |
139 | TCP | netbios-ssn | smbd | NetBIOS over TCP(会话服务) |
445 | TCP | microsoft-ds | smbd | 直接托管的 SMB |
服务列中的标记是知名的服务名称,它来自一个名为 /etc/services 的文件。服务文件帮助应用程序将服务名称解析为端口号。该文件还帮助人们将端口号关联到服务名称。尽管大部分服务同时保留 TCP 和 UDP 端口,应用程序不必同时使用 UDP 和 TCP。当两个不同的服务尝试使用不同协议上的同一端口号时,保留两者可消除可能的混淆。
另外值得一提的是,/etc/services 中的端口号和名称不是强制实施的。您可以在与预期的不同的端口上运行守护进程,前提是您可以将这一变更传递给客户端。例如,只要您的客户端不打算在标准端口上对话,您可以在端口 5137 到 5139 和 5445 上运行 Samba。
Samba 问题故障排除
Samba 也难免有问题。有时,这些问题是由系统管理员引起的;有时是由用户引起的。作为系统管理员,您的工作就是找出问题所在,然后查明解决方法。
测试配置文件
如果 Samba 无法启动,或您想检查配置文件看是否正确,那么 testparm 实用程序将有所帮助。该实用程序检查 smb.conf 是否正确。清单 4 显示出现错误时 testparm 的结果。
清单 4. 在一个不正确的 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 的输出从文件的位置开始。如果您想指定一个不同的文件,在命令行上传递文件的名称,如下面的例子:
testparm /home/me/smb.conf
接下来,testparm 抱怨有一个名为 hide dto files 的无效参数。实际上该参数应当是 hide dot 文件。
在处理配置文件之后,您就得到一些有关服务器角色和配置文件精简版的信息。该版本将注释剥离出来,且始终经过格式化,因此有时您会捕捉到这里漏掉的错误,同时在文本编辑器中浏览 smb.conf。
在作出更改之后您应当在您的配置文件上运行 testparm。Samba 忽略配置文件中的大多数印刷错误,且在启动时并不总是写入消息到控制台。在发现某些东西不能正常工作之前,您可能不会捕捉到这类错误。Testparm 会提醒您 smb.conf 中的任何印刷错误。
默认情况下,testparm 仅向您展示 smb.conf 中输入的配置。如果您怀疑您在某个地方使用了默认值,可以使用 -v 选项强制testparm 也显示默认值。
testparm 的另一个用法是将输出限制到单一部分或参数。清单 5 显示如何使用 testparm 查看 security mask 选项的值。
清单 5. 将 testparm 限制到单一参数
# 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 参数阻止 testparm 在解析 smb.conf 与将其显示到屏幕之间的用户输入。使用 --parameter name "security mask"询问 security mask 的值。结果是 0777,即默认值。在该模式下,没有必要指定 -v 来显示默认值。
作为客户端进行连接
您可以不用到用户桌面并亲自试验一些东西,而是可以在您自己的桌面通过命令行执行大量测试。第一个最简单的测试是确保您可以连接到 Samba 端口。做到这一点的最简单的方法是使用 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 上连接到服务器 bob。您还可以使用端口 445 测试直接托管的 SMB 端口。结果是 Connection refused,这表示守护进程没有监听该地址,或防火墙阻止连接。其他结果,比如 No route to host 或 Connection timed out 如出一辙。
客户端通常使用一个名称而非 IP 地址连接到一台服务器。如果您使用 telnet 连接到服务器名称,而非 IP 地址,要特别注意返回的 IP 地址。在上述示例中,服务器(bob) 被解析为 192.168.1.134。有时,您的 DNS 记录会有错误,导致客户端连接到错误的地址。
如果您不使用 DNS 进行 Windows 名称解析,那么可以使用 nmblookup 命令执行一个 NetBIOS 名称查询。清单 7 显示 bob 服务器查询。
清单 7. 为 bob 执行一个 NetBIOS 名称查询
# nmblookup bob querying bob on 192.168.1.255 192.168.1.138 bob<00>
根据清单 7,服务器 bob 的 IP 地址是 192.168.1.138,而非 192.168.1.134,如 清单 6 所示。结果表示 DNS 出现问题,特别是当端口 139 和 445 在 192.168.1.138 上做出反应时。
另一项测试是看看配置文件是否拒绝访问某一主机。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 中,有三个项目被传递给 testparm:
清单 8 中的输出显示拒绝考虑中的机器访问所有共享。在这种模式下使用 testparm 时,实用程序实际上不作为该机器进行连接。相反地,testparm 处理配置文件,以查看是否允许访问。
如果目前为止的所有测试都成功,您可以尝试使用 smbclient 实用程序建立一个客户端连接。第一个测试是要试图浏览共享列表,如清单 9 所示。
清单 9. 显示机器的共享
[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 服务器上使用 -L 参数请求共享列表。服务器名称以两个反斜杠(\\)为前缀,因为它是一个 Universal Naming Convention (UNC) 路径。在选择单引号和双引号时要小心。单引号插入并将反斜杠看作是转义符。
如果您的服务器有更多的安全设置,您可能需要分别使用 -W 和 -U 参数传递用户名或域。
最后,您可以尝试连接到一个共享,方法就是省略掉 -L 参数并指定到共享的一个完整的 UNC 路径。清单 10 显示客户端使用不同的工作组和用户名连接到一台服务器。
清单 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 配置无关,而是客户端与服务器之间或客户端本身某个地方有问题。您可以查看下一节将要介绍的日志,其中就问题所在提供了一些线索。#p#
日志记录和调试
日志记录和故障排除相伴而行。日志允许您回顾历史,查看是否有错误发生并在问题发生时获取有关问题的更多细节。如果您尝试弄清为何有些东西不能正常运作,可以增加日志数量,直至获得必要的详细程度。Samba 在 smb.conf 中提供了一些参数来处理日志记录;您可以一起使用这些参数来定制生成的日志类型。
Samba 就像一个传统的 UNIX 守护进程,在于它可以将日志记录到 syslog 工具,并生成其自己的日志文件。此外,Microsoft Event Viewer 工具可以连接到一个 Samba 服务器来提取日志。后一特性的要点在于,Samba 不能直接将日志记录为事件日志格式:您必须使用 Samba 工具对您的日志文件进行后处理。
日志级别
Samba 生成的每条日志消息都有一个 级别,即从 0 到 10 的一个整数。较高级的消息,比如新连接和重要错误,具有较低的级别。消息调试具有较高的级别。通过指定您想记录的日志的最大级别,可以控制日志量。级别为 1 的日志仅记录优先级为 0 或 1 的消息。如果您想要更多的日志记录,可以使用一个较高的数字。
级别大于 3 的任何日志都旨在用于开发人员,对系统管理员没有太大的帮助。使用日志级别 0 将避开除一些启动消息和关键错误之外的任何消息。
要配置日志级别,在 global 部分使用 log level 参数;例如,使用 log level = 2 将日志级别设置为 2。该设置记录优先级为 2 或更小的任何消息。
您可以在运行时更改日志级别,方法就是发送 SIGUSR1 信号给 Samba 进程来增加日志级别,或发送 SIGUSR2 减少日志级别。
您还可以让您的日志级别更细粒度一些,仅在某些功能中通过指定想要记录的类别来增加详细程度。这些类别是:
要使用这些额外的日志记录,将关键字和值附加到日志级别参数,用冒号(:)分割。例如,log level = 1 winbind:3 将系统默认日志级别设置为 1,并将 winbind 日志级别增加到 3。这一变更可以帮助您调试有关单点登录的问题,而无需淹没于无关的日志文件中。
日志文件位置
要更改日志文件的名称,使用 log file 参数。您还可以在值中使用宏。一个常用的设置是让一个客户端拥有一个日志文件。为此,请指定:
log file = /var/log/samba/log.%m
该命令将单个日志文件分割为每个客户端一个文件,其余消息归入 log.smbd。
如果您想将日志记录到 syslog,可以指定 syslog = 1 来将级别 1 或 0 的所有日志发送到本地 syslog 服务器。Samba 使用LOG_DAEMON 工具并将 Samba 日志级别按照如下优先级映射到 syslog:
您使用可以过滤传入的消息并警惕系统管理员的一个更高级的 syslog 守护进程,这是监视您的 Samba 服务器的一种很好的方式。
日志元数据
您可以添加或删除显示在带有更多全局参数的所有日志条目中的一些消息:
日志记录可帮助您找到问题,或者也可以让您处于杂乱中。Samba 提供各种日志记录选项;要谨慎使用它们。
系统调用跟踪
如果其他方法都失败了,您可以使用 UNIX 系统工具查看进程内的状况。Linux strace 程序允许您跟踪应用程序做出的所有系统调用。一个应用程序使用系统调用打开和读取文件、创建和销毁进程,并与操作系统其余进程进行交互。
清单 11 显示 root 用户跟踪一个 Samba 进程,该进程向客户端抛出一个错误。
清单 11. 使用 strace 程序跟踪进程
# 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)
第一个命令查找 Samba 进程列表。由于 Samba 采用所连接用户的身份,可以轻松将进程 13375 识别为属于该用户的进程。接下来,运行带有两个参数的 strace 命令:-e trace=file 限制与文件相关的系统调用的输出。对于您会遇到的 Samba 问题,这是一个很好的初始估计。第二个参数 -p 13375 告诉 strace 使用这个进程 ID 连接到运行的进程。
从该命令的输出中,您会看到 smb 在不断扫描目录看是否有变更。当用户尝试有问题的操作时,您可能会看到如 清单 11 所示的输出。最后几个命令尝试使用 stat64 调用获取目录内有关文件的信息。结果是 permission denied,这表示用户在系统文件级被拒绝,而非由 Samba 拒绝。该命令可以为您提供更多信息来解决问题,比如更改目录属性或告诉用户不允许他/她访问目录。
原文:http://www.ibm.com/developerworks/cn/linux/l-lpic3-312-1/index.html?ca=drs-
【编辑推荐】