在本文中,将学习以下概念:
- Server Message Block (SMB) 和 Common Internet File System (CIFS) 协议
- 使用 CIFS 的特性和优势
- 将 CIFS 共享装载到 Linux 客户端上
本文帮助您准备 Linux Professional Institute's (LPI) Mixed Environment 特性考试 (302) 的主题 312 下的目标 314.1。该目标的权值为 3。
本文假设您拥有 Linux 命令行函数的工作知识,理解 Samba 配置的基础知识。您应该熟悉 smb.conf 配置文件的总体结构,还应该理解 Linux 装载本地和远程文件系统的基本操作(使用
mount 命令和 /etc/fstab 文件)。熟悉标准 Linux 文本模式 ftp 命令会对您有帮助,但这不是必须掌握这些知识。
在说明如何使用 Linux 作为 SMB/CIFS 服务器的客户端之前,可以先回顾协议的特点,看看它们与 Linux 文件系统要求相比较有何不同,这些有助于您的理解。这种比较分为两部分:检查原始 SMB 协议,调查新的 CIFS 扩展更改 SMB 基础的方式。您可能需要查看关于 LPI 目标 310.1 的一些 developerWorks 文章,这些文章介绍了 SMB/CIFS 背后的一些基本概念(请参阅 参考资料中的链接)。
从网络的角度来看,SMB 提供了几项独特的特性,包括它自己的计算机命名系统(Network Basic Input/Output System [NetBIOS] 名称)、工作组以及用户身份验证协议。为了理解 SMB 和 CIFS 如何用作 Linux 文件共享客户端的协议,最重要的特性是该协议所提供的元数据集。
元数据 是与文件关联的数据,但并不是文件的一部分。元数据包括文件的时间戳、所有者、权限,甚至文件的名称。毫无疑问,您可能熟悉 Linux 计算机上的文件元数据的某些常用特性,可能还熟悉 Linux 和其他操作系统(如 Windows)之间的某些差异。由于 SMB 是专门针对 DOS、Windows 和 IBM Operating System/2® (OS/2) 进行设计的,它共享了这些操作系统的多个元数据特性。最重要的是,SMB 缺少对 UNIX® 和 Linux 元数据的支持,比如,所有权、组和大多数权限。SMB 也缺少对符号链接和硬链以及其他特殊文件类型(比如设备节点)的支持。SMB 提供一些 Linux 通常无法理解的一些元数数据类型,例如隐藏、存档 和系统 位。您可以将 Read-only (只读)位映射到 Linux 的 Write permission(写权限)位。
SMB 的另一个局限是,它的文件大小被限制为 2GiB。在如今备份文件、多媒体文件等文件大小均达到数 GB 的世界中,这种限制明显存在问题。
为了解决 SMB 与 Linux 的文件系统预期之间的这些差异,Linux 的 SMB 客户端要么只能忽略它们,要么只能提供 “伪造” 数据的选项。这些选项类似于在 Linux 上装载 NT 文件系统 (NTFS) 或文件分配表 (FAT) 文件系统时所使用的选项。幸运的是,CIFS 提供了更多更好的选项来处理这些限制。
您还应该知道 SMB 所用的网络端口,以及用户数据报协议 (UDP) 端口 137 与 138(用于名称解析和数据报服务)和 TCP 端口 139(用于会话服务,即大多数文件传输)。如果您需要使用低层网络诊断工具调试 SMB,则需要掌握这些信息。
在 20 世纪 90 年代中期,Microsoft® 决定将 SMB 的名称改为 CIFS,同时为其添加了一组新特性。这些特性包括对符号、硬链接和更大文件的支持。除原来的端口 139 之外,CIFS 还支持在端口 445 上进行服务器访问。
在 CIFS 中,Microsoft 自己对 SMB 的扩展至少与其他厂商对 SMB 的扩展同等重要。特别是,被称为 UNIX 扩展 的 CIFS 特性集对文件的所有权、权限和一些 UNIX 风格的其他元数据都提供了支持。如果客户端和服务器都支持这些特性,与仅支持 SMB 的服务器相比,您在 Linux 上利用 CIFS 服务器的效果会好得多。如您所料,Windows Server® 操作系统不支持这些扩展,所以只有在您的 Linux 客户端连接到 Samba 服务器时才能使用它们。该服务器还必须配置以下全局选项:
unix extensions = Yes |
在 Samba 3.0 版中,该选项默认设置为 No,但 Samba 3.0 将默认值改为
Yes,所以您并不需要明确设置该选项。
在某些方面,从 Linux 访问 SMB/CIFS 服务器的最简单方法是使用称为
smbclient 的文本模式实用工具。这个程序类似于经典的 ftp 客户端程序,所以,如果您熟悉 ftp,那么使用 smbclient 应该没有什么问题。如果不熟悉
ftp,该程序背后的原理是,向服务器发起一个连接,该连接不 涉及以传统方式装载共享。您改为通过键入命令来查看、删除、下载或上传文件。
要使用 smbclient,您需要键入它的名称,后面跟服务名称,所采用的形式是 //服务器/服务,比如,//TANGO/GORDON 访问 TANGO 服务器上的 GORDON 共享。根据服务器的配置,您可能会看到要求输入密码的提示。如果输入正确,您就可以输入各种命令来访问服务器上的文件。表 1 总结了部分重要的 smbclient 命令;请参考该实用工具的主页,了解有关特殊命令的更多信息。
表 1:重要的 smbclient 命令
| 命令 | 效果 |
|---|---|
? 或
help | 显示命令摘要 |
cd | 更换成服务器上的某个新目录 |
del | 删除一个文件 |
dir 或
ls | 显示当前目录(或指定目录)中的文件 |
exit 或
quit | 结束会话 |
get | 将一个文件从服务器传输到客户端 |
lcd | 更换本地计算机上的工作目录 |
md 或
mkdir | 在服务器上创建一个目录 |
mget | 将多个文件从服务器传输到客户端 |
more | 使用您的本地寻呼程序显示一个远程文件 |
mput | 将多个文件从客户端传输到服务器 |
put | 将一个文件从客户端传输到服务器 |
rd 或
rmdir | 删除一个目录 |
rename | 重命名服务器上的一个文件 |
rm | 删除服务器上的一个或多个文件 |
默认情况下,smbclient 使用您的当前用户名来连接服务器;然而,您可以使用 -U 选项来更换您的用户名。实际上,还提供了其他命令行选项,包括无需进入
smbclient 的交互模式就能传输文件的选项。因此,您可以在脚本中使用 smbclient 来执行自动文件传输。请参考该程序的主页,了解有关该主题的详细信息。
在实际使用中,smbclient 会话可能类似于列表 1。
列表 1. smbclient 会话示例
$ smbclient //TANGO/GORDON/ Enter gordon's password: Domain=[RINGWORLD] OS=[Unix] Server=[Samba 3.4.12] smb: \> cd mystuff smb: \mystuff\> ls . D 0 Mon May 16 19:20:08 2011 .. D 0 Mon May 16 19:18:12 2011 xv-3.10a-1228.1.src.rpm 3441259 Tue May 18 19:09:26 2010 License.txt 27898 Mon May 16 19:17:15 2011 xorg.conf 1210 Fri Jan 21 04:18:13 2011 51198 blocks of size 2097152. 2666 blocks available smb: \mystuff\> get xorg.conf getting file \mystuff\xorg.conf of size 1210 as xorg.conf (9.4 KiloBytes/sec) (average 9.4 KiloBytes/sec) smb: \mystuff\> exit |
提示:
smbclient 是一个很好的调试工具。它很简单,使您能够通过装载共享以外的其他方式访问您的网络,如果您想针对某个问题进行调试,这是一个很有帮助的方式。
虽然 smbclient 是一个有用的工具,但它无法为您提供您所习惯的类似于 Windows 客户端的服务器无缝访问。如果您需要进行这样的访问,则必须使用其他工具来装载 SMB/CIFS 共享。您可以使用标准的 Linux
mount 命令来实现此操作,也可以编辑您的 /etc/fstab 文件,在计算机启动时自动装载 SMB/CIFS 共享。
您可以使用与装载本地卷或网络文件系统 (NFS) 导出相同的
mount 命令来装载 SMB/CIFS 共享。您可以将文件系统类型指定为
cifs;在大多数情况下,mount 根据该命令的语法判断出要使用该驱动程序。或者,您可以直接调用辅助程序
mount.cifs。原则上,只有设备规范不同于装载本地文件系统,因此,要装载 TANGO 服务器的 GORDON 共享,则需要以 root 用户的身份键入以下内容:
# mount //TANGO/GORDON /mnt |
但是,在实践中,这种用法存在一个问题:它将
root 作为用户名传递给服务器。如果服务器不允许 root 用户登录,那么装载尝试就会失败。您可以通过使用
-o user=name 选项将用户名传递给服务器,从而修正这个问题:
# mount -o user=gordon //TANGO/GORDON /mnt Password: |
还有其他几个通过 -o
选项传递给 mount 的可用装载选项。表 2 总结了最有用的选项。请访问
mount.cifs 主页,了解有关其他选项的信息。
表 2:重要的 mount.cifs 选项
| 选项 | 效果 |
|---|---|
user=name 或
username=name
| 指定发送给服务器的用户名。 |
password=pass | 指定发送给服务器的密码。如果未指定密码,那么 mount.cifs 会使用 PASSWD 环境变量的值;如果未设置该变量值,程序会提示用户,要求其输入密码。 |
credentials=filename | 指定含有用户名、密码和工作组名称(可选)的文件。每个值都用单独的行显示,其开头分别为字符串
username=、password= 和
workgroup=。 |
uid=UID | 设定拥有从共享装载的文件的用户的用户 ID (UID)。 |
gid=GID | 类似于 uid=UID 选项,但该选项影响组 ID (GID) 而不是 UID。 |
file_mode=mode | 以数字形式设置将从服务器分配给文件的文件模式(权限)。 |
dir_mode=mode | 类似于 file_mode=mode,但该选项影响目录而不是文件。 |
guest | 防止提示输入密码。此选项通常只在共享支持来宾访问时才有效。 |
hard | 如果服务器变得不可访问,试图访问服务器上的文件的进程将挂起,直到服务器恢复。 |
soft | 如果服务器变得不可访问,试图访问服务器上的文件的进程将接收错误消息。这是默认行为。 |
如果您连接到支持 CIFS UNIX 扩展的服务器,通常不必使用 uid、gid、file_mode 和
dir_mode 选项。不过,在某些情况下,您可以使用这些特性来覆盖服务器所提供的值。还要注意,所有这些选项都会影响文件 在客户端上 的出现方式;在服务器上的权限和所有权不会受到这些选项的影响。
装载 SMB/CIFS 共享后,您可以访问它,就像访问本地卷或 NFS 卷一样。您可以使用
cp 复制文件,使用
rm 删除文件,直接使用文本编辑器或其他程序编辑文件,等等。不过,请记住,如果服务器不支持某个特性,那么您可能无法使用它。例如,除非该服务器支持 UNIX 扩展,否则您无法使用 chmod 命令来更改文件模式。(chmod 的部分例外是,您可以改变写入权限,这些权限已被反向映射到 SMB 的只读位。)
当您使用完共享后,您可以使用
umount 命令卸载它,就好像它是一个本地文件系统一样:
# umount /mnt |
如果您希望在一台计算机上永久装载 SMB/CIFS 共享,您可以通过在 /etc/fstab 中添加一个条目来实现这一点。该进程与 mount 命令到 /etc/fstab 条目的任何其他转换的工作方式非常相近。然而,在这里需要特别注意 表 2
中的一个选项 credentials。由于大多数 SMB/CIFS 服务器都使用密码进行身份验证,如果您预计到要使用 /etc/fstab 来装载共享,则必须永久保存密码。使用 password
选项可以将密码直接存储在 /etc/fstab 中,但不建议采用这种做法;因为该计算机的所有用户都必须能够读取 /etc/fstab 文件,所有人都应该可以读取以这种方式存储的密码。使用 credentials 使您可以将密码存储在一个只有 root 用户可以读取的文件中,从而提高密码的安全性。
SMB/CIFS 共享的有效密码条目可能具有以下类似形式:
//TANGO/BACKUPS /saveit cifs credentials=/etc/samba/creds.txt 0 0 |
相关的凭据文件可能具有以下类似形式:
username=buuser password=Iw2bUmS[t |
注意:请务必赋予凭据文件适合的权限:一般是 0600 或 0400,以及 root 用户或者其凭据存储在该文件中的用户所拥有的所有权。
配置就绪后,当您重新启动计算机或键入
mount -a时,会自动装载 //TANGO/BACKUPS 共享。如果该特性不能正常工作,请验证用户名和密码是否正确,使用
mount 命令进行测试,并执行其他常规疑难解答程序。
本系列下一篇文章是 “学习 Linux, 302 (混合环境):NetBIOS 和 WINS”,涉及使用 Windows Internet Name Service (WINS) 进行名称解析和浏览,这使计算机可以在计算机和共享的类似树的层次结构中定位网络共享。
学习
- "学习 Linux,302(混合环境):概念" (developerWorks,2011 年 2 月) 描述了 SMB 和 CIFS 的基本原理。
- Samba Wiki 包含一个 有关 CIFS UNIX 扩展的页面,该页面提供有关这些特性的详细技术信息。
- 在 LPIC
Program 站点查找 LPI 的 Linux 系统管理认证的三个级别的详细目标、任务列表和样例问题。特别是要查看 LPI-302 详细目标 以及 任务和样例问题。
- 复习 developerWorks 上的整个 LPI 考试备考系列,学习 Linux 基础知识,根据 2009 年 4 月以前的 LPI 考试目标准备系统管理员认证考试。
-
修订后的 LPIC 考试备考资源 提供一个由 LPI 维护的其他认证培训资源清单。
- 观看 developerWorks 演示中心 ,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
