第七章:通用互联网文件系统客户端

典型的办公室通过微软的通用互联网文件共享(Common Internet File Sharing——CIFS)协议共享网络驱动器。CIFS也被称为Windows“网上邻居”(Network Neighborhood)、服务器消息块(Server Message Block——SMB)。

虽然最初仅在MS操作系统上可用,但如今,任何作为公司文件服务器的愿望都支持SMB和CIFS。

严格来说,SMB是一种低级协议。微软认为CIFS是该协议的一种特殊方言(dialect)。

FreeBSD包含smbutil程序,用于查找、挂载和使用CIFS共享作为CIFS客户端。FreeBSD在基础系统中不包括CIFS服务器,但开源CIFS服务器Samba在FreeBSD上运行良好。

使用FreeBSD的CIFS支持与现有的Windows基础架构进行互操作。你不会部署CIFS来支持Unix系统,那使用NFS更合适。

先决条件

在尝试挂载CIFS共享之前,你需要一些信息。首先,获取访问共享的有效用户名和密码,以及Windows域名。你的主机需要能够找到文件服务器;Windows DNS服务器的IP地址将起作用,或者你要从中挂载共享的文件服务的主机名或IP。

在FreeBSD端,你需要加载smbfs.ko内核模块。这就带来了libiconv.ko和libmchain.ko模块。你可以在启动时使用/boot/loader.conf条目自动加载这些文件:

准备好了,可以配置CIFS了。

CIFS 配置

与NFS或iSCSI不同,你只能使用配置文件管理CIFS。CIFS可能比这个两个复杂得多。

主配置文件是/etc/nsmb.conf,但用户可以在$HOME/.nsbrc中进行个人配置。

/etc/nsmb.conf中的任何配置都会覆盖用户的个人设置。

这两文件使用相同的配置语法和关键字,因此本身只介绍nsmb.conf,用户可以在他们的个人配置文件中执行相同类型的配置。

配置文件分为几个部分,每个部分都以方括号的标签开头。适用于每个CIFS连接的设置位于[default]部分。

你可以创建其他标签,按服务器、用户名和共享提供的配置设置,如下所示:

应用于整个服务器的设置将进入以该服务器命名的部分。仅适用于服务器上特定用户的设置位于以服务器和用户名的部分中。仅适用于单个共享的设置位于以服务器、用户和共享名称命名的部分中。

适用CIFS主机中的值配置FreeBSD的CIFS客户端。你无法使用FreeBSD账户凭据登录到Windows主机。

nsmb.conf 关键字

通过在适当的部分中放置关键字和值来配置CIFS。使用等号(=)为关键字赋值。虽然nsmb.conf列出了每个有效的关键字,但你几乎肯定需要这些关键字。

workgroup

workgroup关键字指定Windows域的名称。工作组是域的前身。几乎所有的CIFS服务器都有一个Windows域。

nbns

使用nbns关键字设置NetBIOS(WINS)名称服务器的IP地址。你可以将这句放在[default]部分或特定服务器下。对于大多数环境,请使用域控制器的IP:

虽然现代Windows网络使用DNS来查找主机,但WINS在旧网络上可能仍然有用。许多大公司的后台仍然有WINS。

password

password关键字允许你为用户或共享设置明文密码。是的,明文。

如果必须将密码存储在nsmb.conf中,请绝对确保只有root可以读取该文件。

在多用户系统中,将密码存储在$HOME/.nsmrc中是一个糟糕的主意。但是,在启动时自动给挂载共享需要使用硬编码密码。

FreeBSD允许你为此关键分配一个加密密码。这种加密很容易被逆转,但可以保护密码免受意外暴露。加密密码以双美元符号($$)开头,使用smbutil crypt加密你的密码:

在包含用户信息的部分使用password。

如果服务器的角色需要这种访问权限,而不是使用你自己的账户,请向你的Windows团队申请一个只能挂载所需共享的账户。

总体而言,对于工作组mwl中服务器文件服务器上的用户mwl,你可能会得到一个/etc/nsmb.conf,就像以下示例一样:

给定此简单配置,您可以访问和装载CIFS共享。

使用CIFS

使用CIFS需要找到主机、挂载和卸载共享,并了解权限和情况。

CIFS名称解析

FreeBSD在挂载共享之前,需要找到共享所在的主机。虽然微软已经使用DNS多年,但典型的Windows环境通常有一大堆遗留协议。确保FreeBSD的CIFS客户端可以通过smbutil lookup找到CIFS服务器:

正确答案意味着最简单的CIFS功能可以工作。现在让我们访问一些数据。

如果你在名称解析方面遇到的问题,可能需要使用nsmb.conf的address关键字手动设置要访问的任何主机的IP地址。地址解析应该始终有效,但考虑到CIFS在过去25年中的变化以及一些组织如何构建其环境,有这个选项是很好的。

挂载CIFS

使用mount_smbfs挂载CIFS共享。挂载必须包含Windows用户名,如下所示:

我想使用账户mwl在服务器文件服务器上挂载公司共享。此共享将在/mnt挂载:

系统将提示你输入密码。一旦你提供了有效密码,FreeBSD就会挂载共享,你可以轻松访问Windows服务器上的文档。

使用smbutil lc命令查看你登录的所有服务器:

这台FreeBSD机器连接到一台主机上的一个用户账户。

与任何其他文件系统一样,使用umount可断开CIFS文件系统的连接。

CIFS 文件所有权

Windows和类Unix系统具有完全不同的权限方案。FreeBSD用户名映射到Windows用户名只是偶然的。这意味着你在挂载CIFS共享时需要仔细注意权限。

CIFS挂载默认使用与挂载点相同的权限。如果我在/mnt上挂载共享,文件将获得/mnt使用的root:wheel所有权和mode 755。如果挂载在/home/mwl/mnt上,文件将归用户mwl所有,并获得目录和umask规定的任何权限。

使用mount_smbfs的-u和-g选项为已挂载的文件指定所有者和组。同样,使用-d更改目录mode、-f更改文件的mode。以下示例专门将挂载的文件分配给用户和组smb,并更改权限,以便只有此用户可以访问这些文件:

尽管你在FreeBSD端分配了任何权限,但Windows权限也适用。如果你用来挂载共享的Windows用户没有查看或编辑文件的权限,FreeBSD主机将无法查看或编辑这些文件。——这大概就是执行最严格的权限限制。

CIFS和大小写

微软文件系统不区分大小写。FreeBSD文件系统区分大小写。

FreeBSD倾向于将大小写保留在文件上,但这可能是不可取的。自动化流程可能会发现更容易识别具有一致大小写的文件。

-c标志告诉mount_smbfs为所有内容提供一个一致的大小写。使用 -c l 将所有内容更改为小写(lowercase),而 -c u 则将所有内容更改为大写(uppercase)。