服务器架设篇 - CentOS 5.x

第十六章、文件服务器之二:SAMBA 服务器

关于 SAMBA 这个 File server 的设置方法介绍喔!

最近更新时间: 2011/03/31

本文数据主要针对 CentOS 5.x 的系统进行说明,而 CentOS 5.x 已经在 2017 年 3 月份正式不再进行维护,事实上,在 2012 年底几乎就不再维护了。 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 CentOS 5 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
如果想要共用文件,在 Linux 对 Linux 的环境下,最简单的方法就是通过 NIS 这玩意儿了!至于 Windows 对 Windows 的环境下,最简单的方法则是『网上邻居』啊。那如果你的区网中有 Windows 也有 Linux 而且想要共用文件系统的话,那该怎办? 那就使用 Samba 服务器吧!Samba 可以让 Linux 加入 Windows 的网芳支持,让异质平台可以共用文件系统! 非常好用的呦!不仅如此, Samba 也可以让 Linux 上面的打印机成为打印机服务器 (Printer Server)。鸟哥个人觉得, Samba 对于整个区网的贡献真的是很大啦!

16.1 什么是 SAMBA

在这个章节中,我们要教大家跳的是热情有劲的巴西 SAMBA 舞蹈... 喔不~搞错了~是要向大家介绍 SAMBA 这个好用的服务器啦!咦!怪了! 怎么服务器的名称会使用 SAMBA 呢?还真是怪怪的呢!那么这个 SAMBA 服务器的功能是什么呢?另外, 它最早是经由什么样的想法而开发出来的呢?底下就让我们慢慢的谈一谈吧!

16.1.1 SAMBA 的发展历史与名称的由来

在早期的网络世界当中,文件数据在不同主机之间的传输大多是使用 FTP 这个好用的服务器软件来进行发送。不过使用 FTP 传输文件却有个小小的问题, 那就是你无法直接修改主机上面的文件数据!也就是说,你想要更改 Linux 主机上面的某个文件时,你必须要将该文件自服务器下载后才能修改。 也因此该文件在服务器与用户端都会存在。这个时候,万一如果有一天你修改了某个文件, 却忘记将数据上传回主机,那么等过了一阵子之后,呵呵,你如何知道那个文件才是最新的?


  • 让文件在两部主机之间直接修改: NFS 与 CIFS

既然有这样的问题,那么好吧,我可不可以在用户端的机器上面直接使用服务器上面的文件, 如果可以在用户端直接进行服务器端文件的访问,那么我在用户端就不需要存在该文件数据啰,也就是说, 我只要有 Server 上面的文件数据存在就可以啦!有没有这样的文件系统啊! 很高兴的是,第十三章的 NFS 就是这样的文件系统之一啦!我只要在用户端将 Server 所提供分享的目录挂载进来, 那么在用户端的机器上面就可以直接取用 Server 上的文件数据啰,而且, 该数据就像是我用户端上面的 partition 一般,真是好用!

而除了可以让 Unix Like 的机器互相分享文件的 NFS 服务器之外,在微软 (Microsoft) 操作系统上面也有类似的文件系统,那就是 Common Internet File System, CIFS 这个咚咚啦!CIFS 最简单的想法就是目前常见的『网上邻居』咯! Windows 系统的电脑可以通过桌面上『网上邻居』来分享别人所提供的文件数据哩!真是方便。 不过,NFS 仅能让 Unix 机器沟通, CIFS 只能让 Windows 机器沟通。伤脑筋,那么有没有让 Windows 与 Unix-Like 这两个不同的平台相互分享文件数据的文件系统呢?


  • 利用封包侦测逆向工程发展的 SMB Server

在 1991 年一个名叫 Andrew Tridgell 博士班研究生就有这样的困扰,他手上有三部机器,分别是跑 DOS 的个人电脑、DEC公司的 Digital Unix 系统以及 Sun 的 Unix 系统。在当时, DEC 公司有发展出一套称为 PATHWORKS 的软件,这套软件可以用来分享 DEC 的 Unix 与个人电脑的 DOS 这两个操作系统的文件数据,可惜让 Tridgell 觉得较困扰的是,Sun 的 Unix 无法借由这个软件来达到数据分享的目的 (注1)。

这个时候 Tridgell 就想说:『咦!既然这两部系统可以相互沟通,没道理 Sun 就必需这么苦命吧?可不可以将这两部系统的运作原理找出来,然后让 Sun 这部机器也能够分享文件数据呢?』, 为了解决这样的的问题,他老兄就自行写了个 program 去侦测当 DOS 与 DEC 的 Unix 系统在进行数据分享发送时所使用到的通信协定信息,然后将这些重要的信息截取下来, 并且基于上述所找到的通信协定而开发出 Server Message Block (SMB) 这个文件系统,而就是这套 SMB 软件就能够让 Unix 与 DOS 互相的分享数据啰!

Tips 鸟哥 再次的给他强调一次,在 Unix Like 上面可以分享文件数据的 file system 是 NFS,那么在 Windows 上面使用的『网上邻居』所使用的文件系统则称为 Common Internet File System, CIFS

  • 取名 SAMBA 的主因 ^_^

既然写成了软件,想一想,总是需要注册一下商标吧!因此 Tridgell 就去申请了 SMBServer (Server Message Block 的简写) 这个名字来做为他撰写的这个软件的商标,可惜的是,因为 SMB 是没有意义的文本,因此没有办法达成注册。既然如此的话,那么能不能在字典里面找到相关的字词可以做为商标来注册呢? 翻了老半天,呵呵!这个 SAMBA 刚好含有 SMB , 又是热情有劲的拉丁舞蹈的名称,不然就用这个名字来做为商标好了!这成为我们今天所使用的 SAMBA 的名称由来啦! ^_^

16.1.2 SAMBA 常见的应用

由上面说明的 SAMBA 发展缘由,你就应该不难知道, SAMBA 最初发展的主要目就是要用来沟通 Windows 与 Unix Like 这两个不同的作业平台,那么 SAMBA 可以进行哪些动作呢?想一想网芳能做的吧!

  • 分享文件与打印机服务;
  • 可以提供用户登录 SAMBA 主机时的身份认证,以提供不同身份者的个别数据;
  • 可以进行 Windows 网络上的主机名称解析 (NetBIOS name)
  • 可以进行设备的分享 (例如 Zip, CDROM...)

底下我们来谈几个 SAMBA 服务器的应用实例吧!


  • 利用软件直接编修 WWW 主机上面的网页数据

相信很多人都是利用个人电脑将网页制作完毕之后,再以类似 FTP 之类的服务将网页上传到 WWW 主机的, 但这样有个困扰,那就是同时在用户端与 WWW 主机上头都有一份网页数据,常常会忘记哪一份是最新的, 最麻烦的是,有时候下载下来的文件已经经过好多修改了,却在下次的 FTP 作业,不小心又下载一次旧数据, 结果将已经修改过的数据覆盖过去~天呐!又要重写一遍.....真是讨厌!

如果你有安装 SAMBA 服务器的设置的话,那么通过『网芳』的功能,直接连接远程服务器所提供的目录, 如此一来你可以直接在你的个人电脑上面修改主机的文件数据,只有一份正确的数据而已喔! 这就有点像是『在线编修』呢,一修改完成,在 Internet 上面可以立刻检验,方便的很呐!


  • 做成可直接连接的文件服务器

在鸟哥过去待过的实验室中,由于电脑数量不多,研究生常常会使用到不同的电脑 (因为大家都得抢没有人用的电脑啊!) ,此外,也常常有研究生拿自己的 NoteBook 来工作,因此,有些团队的数据就分散在各个电脑当中,使用上相当的不方便。 这个时候,鸟哥就使用 SAMBA 将硬盘空间分享出来,由于用户要登录 SAMBA 这个服务器主机时需要输入用户数据 (帐号与密码),而不同的登录者会取得不一样的目录资源,所以可以避免自己的数据在公用电脑上面被窥视, 此外,在不同的公用电脑上面都可以登录 SAMBA 主机,数据的使用上面真是相当的棒啊!


  • 打印机服务器

SAMBA 除了分享文件系统外,也可以分享打印机喔,鸟哥的研究室好几部电脑就是直接以 Linux 分享的打印机来印制报告的。你会说『啊 Windows 也可以办的到啊!没有什么了不起的!』是啊。 但是鸟哥认为,用 Linux 做为服务器主机时毕竟还是比较稳定一点,可以 24 小时且全年无休的努力工作呐。此外,因为目前通过『网上邻居』来攻击局域网路的 Windows 操作系统的电脑病毒实在是太多了,防不胜防, Linux 对于这样的攻击并没有很大的影响 (因为常见的攻击手法均针对 Windows 而来~),所以也比较安全一些说~


SAMBA 的应用挺广泛的,尤其对于局域网路内的电脑来说,更是一项不可多得的好用的服务器, 虽然或许你会说,SAMBA 的功能不过是模仿 Windows 的网芳以及 AD 相关的软件, 那我直接使用 Windows 不就 OK 了?可惜的是, Windows XP 对于网芳的连接限制依版本而有所不同, 以企业常见的专业版 (Professional) 来说,他仅能提供最多同时十个连接到网芳的连接能力,这...不太够用吧! 所以啰,SAMBA 稳定、可靠又没有限制连接数,值得学习吧!^_^!更多的应用你可以自行发掘呐!

16.1.3 SAMBA 使用的 NetBIOS 通信协定

事实上,就像 NFS 是架构在 RPC Server 上面一样, SAMBA 这个文件系统是架构在 NetBIOS (Network Basic Input/Output System, NetBIOS) 这个通信协定上面所开发出来的。既然如此,我们当然就要了解一下 NetBIOS 啰!

最早 IBM 发展出 NetBIOS 的目的仅是要让局域网路内少数电脑进行网络链接的一个通信协定而已, 所以考虑的角度并不是针对大型网络,因此,这个 NetBIOS 是无法跨路由的 (Router / Gateway)。这个 NetBIOS 在局域网路内实在是很好用, 所以微软的网络架构就使用了这个咚咚来进行沟通的呐!而 SAMBA 最早发展的时候,其实是想要让 Linux 系统可以加入 Windows 的系统当中来分享使用彼此的文件数据的,所以当然 SAMBA 就架构在 NetBIOS 发展出来啰。

不过 NetBIOS 是无法跨路由的,因此使用 NetBIOS 发展起来的服务器理论上也是无法跨越路由的呢! 那么该服务器的使用范围不就受限相当的多了?好在,我们还有所谓的 NetBIOS over TCP/IP 的技术呢!这是什么样的技术啊?

举个例子来说好了,我们知道 TCP/IP 是目前网络连接的基本协定,现在我们将 NetBIOS 想成是一封明信片, 这个明信片只能让你自己欣赏而已,如果今天我们要将这个明信片送到远方的朋友那边时!就需要通过邮件系统 (例如邮局啦、国际快递啦等等的) 来发送了!这个 TCP/IP 就可以视为邮件传递系统啦!通过这个 NetBIOS over TCP/IP 的技术,我们就可以跨路由的使用 SAMBA 服务器所提供的功能咯! 当然啦,目前 SAMBA 还是比较广泛的使用在 LAN 里面说。

Tips 鸟哥 或许你会发现在 Windows 网络设置里面常常看到 NetBEUI 这个咚咚,那是什么呢?那个是 NetBIOS Extened User Interface 的简写,也是 IBM 在 NetBIOS 发展出来之后的改良版本。虽然这两者的技术不太相同, 不过,我们只要知道一些简单的概念就可以了!所以,在这里我们不针对 NetBEUI 来介绍。

16.1.4 SAMBA 使用的 daemons

NetBIOS 当初发展时就着眼在局域网路内的快速数据交流,而因为是定义在局域网路内,因此他并没有使用类似 TCP/IP 之类的传输协定,也就不需要 IP 的设置。如此一来数据如何在两部主机之间交流呢? 其实主机在 NetBIOS 协定当中的定义为使用『NetBIOS Name』,每一部主机必须要有不同的 NetBIOS Name 才行, 而文件数据就是在不同的 NetBIOS name 之间沟通啰!我们以一个网芳的设置来作简单的说明好了:

  1. 取得对方主机的 NetBIOS name 定位该主机所在:

    当我们想要登录某部 Windows 主机使用他所提供的文件数据时,必需要加入该 Windows 主机的群组 (Workgroup),并且我们的机器也必需要设置一个主机名称,注意喔,这个主机名称跟 Hostname 是不一样的,因为这个主机名称是架构在 NetBIOS 协定上的,我们可以简单的称呼他为 NetBIOS Name。在同一个群组当中,NetBIOS Name 必需要是独一无二的喔!

  2. 利用对方给予权限访问可用资源:

    在我们找到该主机名称后,是否能登录该对方主机或者是取用对方主机所提供的资源, 还要看对方 Windows 主机有没有提供我们使用的权限呐!所以,并不是登录该 Windows 主机之后我们就可以无限制的取用该主机的文件资源了。也就是说,如果对方主机允许你登录, 但是却没有开放任何资源让你取用,呵呵,登录主机也无法查看对方的硬盘里面的数据的啦!

我们的 SAMBA 则是通过两支服务来控制这两个步骤,分别是:

  • nmbd :这个 daemon 是用来管理工作群组啦、NetBIOS name 啦等等的解析。主要利用 UDP 协定打开 port 137, 138 来负责名称解析的任务;

  • smbd :这个 daemon 的主要功能就是用来管理 SAMBA 主机分享的目录、文件与打印机等等。 主要利用可靠的 TCP 协定来传输数据,开放的端口口为 139 及 445(不一定存在) 。

所以啰, SAMBA 每次启动至少都需要有这两个 daemons 喔!这可不要忘记啰!而当我们启动了 SAMBA 之后,主机系统就会启动 137, 138 这两个 UDP 及 139 这一个 TCP 端口口,这可不要忘记了! 因为后面设置防火墙的时候,还会使用到这三个 port 的呢!

16.1.5 连接模式的介绍 (peer/peer, domain model)

SAMBA 服务器的应用相当的广泛,而且可以依照不同的网域连接方式,与不同的用户帐号密码的控管方式来进行分类。 例如最常见的 Workgroup 及 Domain 两种方式的连接模式呢!底下我们就是要来谈一谈这两种最常见的局域网路的连接模式: peer/peer (对等模式) 及 domain model (主控模式)。


  • peer/peer (Workgroup model, 对等模式):

peer 有同等、同辈的意思存在,所以由字面上来看,peer/peer 当然就是指两部主机的地位相等啰! 这是什么意思呢?简单的说,假如在局域网路里面的所有 PC 均可以在自己的电脑上面管理自己的帐号与密码, 同时每一部电脑也都具有独力运行各项软件的能力,只是借由网络将各个 PC 链接在一起而已的一个架构, 所以,每一部机器都是可以独立运作的喔!

这样的架构在目前小型办公室里面是最常见的。例如办公室里面有十个人,每个人桌上可能都安装有一套 Windows 操作系统的个人电脑,而这十部电脑都可以独立进行办公室软件的运行啊、独立上网啊、独立玩游戏啊等等的, 因为这十部电脑都可以独立运作,所以不会有一部电脑关掉,其他的电脑就无法工作的情况发生,这就是 peer/peer 的典型架构。

那在这样的架构底下,要如何通过网络连接来取得对方的数据呢?举例来说,以下图的架构为例,在这样的架构下,假设 vbird (PC A) 写了一个报告书,而 dmtsai (PC B) 想要以网络直接取用这个报告书时,那 dmtsai 就必须要知道 vbird 使用的密码,并且 vbird 必须要在 PC A 上面激活 Windows 的『资源分享(或者是共用)』之后,才能够让 dmtsai 连接进入喔 (此时 PC A 为 Server) !而且, vbird 可以随时依照自己的喜好来更改自己的帐号与密码,而不受 dmtsai 的影响。不过,dmtsai 就得要取得 vbird 同意取得新的帐号与密码后,才能够登录 PC A 喔!反过来说,同样的, vbird 要取得 dmtsai 的数据时,同样需要取得 PC B 的帐号与密码后,才能够顺利登录啊 (此时 PC A 为 Client 喔)!因为 PC A, PC B 的角色与地位都同时可以为 Client 与 Server ,所以就是 peer/peer 的架构了!

peer/peer 连接的示意图
图 16.1-1、peer/peer 连接的示意图

使用 peer/peer 的架构的好处是每部电脑均可以独立运作,而不受他人的影响!不过, 缺点就是当整个网域内的所有人员都要进行数据分享时,光是知道所有电脑里面的帐号与密码,就会很伤脑筋了! 所以, Peer/Peer 的架构是比较适合 (1)小型的网域,或者是 (2)没有需要常常进行文件数据分享的网络环境,或者是 (3)每个用户都独自拥有该电脑的拥有权(就是说,该电脑是用户的,而不是公用的啦!) 而,如果该单位的所有 PC 均是公有的 (例如学校的电脑教室环境),而且你需要统一控管整个网域里面的帐号与密码的话, 那就得使用底下的 domain models 了!


  • domain model (主控模式)

假设今天你服务的单位有 10 部电脑,但是你的单位有 20 个员工,这也就是说,这 20 个员工轮流抢着用这 10 部电脑。如果每部电脑都如同 peer/peer 的架构时,那么每部电脑都需要输入这 20 个员工的帐号与密码来提供他们登录喔。而且,今天假如有个员工想要变更自己的密码时,就需要到 10 台电脑上面进行密码变更的作业!否则他就必须要记得这 10 部电脑里面,那一部电脑是记忆那一个密码...好烦那~

如果上述是这样的情况,使用 peer/peer 架构就不是一个好方法了!这个时候就需要借由 domain model 来达成你的需求啦!所谓的 domain model 概念其实也很简单,既然使用电脑资源需要帐号与密码, 那么我将所有的帐号与密码都放置在一部主控电脑 (Primary Domain Controller, PDC) 上面,在我的网域里面,任何人想要使用任何电脑时,都需要在屏幕前方输入帐号与密码,然后通通借由 PDC 服务器的辨识后,才给予适当的使用权限。也就是说,不同的身份还具有不一样的电脑资源使用权限就是了! 例如底下的图标:

domain model 连接的示意图
图 16.1-2、domain model 连接的示意图

PDC 服务器控管整个网域里面的各个机器 (PC A ~ PC D) 的帐号与密码的信息,假如今天有个用户帐号名称为 vbird ,且密码为 12345 时,他不论使用哪一部电脑 (PC A ~ PC D) 只要在屏幕前方输入 vbird 与他的密码,则该机器会先到 PDC 上面查验是否有 vbird 以及 vbird 的密码,并且 PDC 主机会给予 vbird 这个用户相关的电脑资源使用权限。当 vbird 在任何一部主机上面登录成功后,他就可以使用相关的电脑资源了!

这样的架构比较适合人来人往的企业架构,当系统管理员要控管新进人员的电脑资源使用权时,可以直接针对 PDC 来修改就好了,不需要每一部主机都去修修改改的,对于系统管理员来说,这样的架构在控管帐号资源上,当然是比较简单的啦!

各种架构适用的环境与适用的人都不相同,并没有那个是最好啦!请依照你的工作环境来选择连接的模式啰!当然, SAMBA 可以达到上述两种模式的啦!底下我们会分别来介绍喔!

16.2 SAMBA 服务器的基础设置

SAMBA 这个软件几乎在所有的 Linux distributions 上面都有提供,因为即使你的 Linux 仅做为个人台式机使用时, 你依旧可能会需要连接到远程的 Windows 网芳,那个时候就得要 samba 提供的用户端软件功能啰! 因此你只要直接安装系统上面提供的缺省 samba 版本即可。底下我们会先介绍 samba 服务器,然后再介绍用户端功能喔!

16.2.1 Samba 所需软件及其软件结构

目前常见的 samba 版本为 3.x 版,旧版的 2.x 版在设置上有点不一样,因此在进入设置前请先确认你的 samba 版本。 咱们的 CentOS 5.x 提供的是 Samba 3.x 的版本。那么你需要什么软件呢?基本上有这些:

  • samba: 这个软件主要提供了 SMB 服务器所需的各项服务程序 (smbd 及 nmbd)、 的文档档、以及其他与 SAMBA 相关的 logrotate 设置档及开机缺省选项文件等;

  • samba-client: 这个软件则提供了当 Linux 做为 SAMBA Client 端时,所需要的工具指令,例如挂载 SAMBA 文件格式的 mount.cifs、 取得类似网芳相关树状图的 smbtree 等等;

  • samba-common: 这个软件提供的则是服务器与用户端都会使用到的数据,包括 SAMBA 的主要设置档 (smb.conf)、语法检验指令 (testparm) 等等;

这三个软件你都得要安装才行喔!如果尚未安装的话,使用 yum 去装好它吧!安装完毕之后,你可以依序察看一下 Samba 的软件结构喔!与它相关的设置档基本上有这些:

  • /etc/samba/smb.conf: 这是 Samba 的主要设置档,基本上,咱们的 Samba 就仅有这个设置档而已,且这个设置档本身就是很详细的说明文档了,请用 vim 去查阅它吧!主要的设置项目分为服务器的相关设置 (global),如工作群组、NetBIOS 名称与密码等级等, 以及分享的目录等相关设置,如实际目录、分享资源名称与权限等等两大部分。

  • /etc/samba/lmhosts: 早期的 NetBIOS name 需额外设置,因此需要这个 lmhosts 的 NetBIOS name 对应的 IP 档。 事实上它有点像是 /etc/hosts 的功能!只不过这个 lmhosts 对应的主机名称是 NetBIOS name 喔!不要跟 /etc/hosts 搞混了!目前 Samba 缺省会去使用你的本机名称 (hostname) 作为你的 NetBIOS name,因此这个文件不设置也无所谓。

  • /etc/sysconfig/samba: 提供启动 smbd, nmbd 时,你还想要加入的相关服务参数。

  • /etc/samba/smbusers: 由于 Windows 与 Linux 在管理员与访客的帐号名称不一致,例如: administrator (windows) 及 root(linux), 为了对应这两者之间的帐号关系,可使用这个文件来设置

  • /etc/samba/{passdb.tdb,secrets.tdb}: 管理 Samba 的用户帐号/密码时,会用到的数据库文件;

  • /usr/share/doc/samba-<版本>: 这个目录包含了 SAMBA 的所有相关的技术手册喔!也就是说,当你安装好了 SAMBA 之后,你的系统里面就已经含有相当丰富而完整的 SAMBA 使用手册了!值得高兴吧! ^_^,所以,赶紧自行参考喔!

至于常用的指令文件方面,若分为服务器与用户端功能,则主要有底下这几个数据:

  • /usr/sbin/{smbd,nmbd}:服务器功能,就是最重要的权限管理 (smbd) 以及 NetBIOS name 查找 (nmbd) 两个重要的服务程序;

  • /usr/bin/{tdbdump,tdbtool}:服务器功能,在 Samba 3.0 以后的版本中,用户的帐号与密码参数已经转为使用数据库了!Samba 使用的数据库名称为 TDB (Trivial DataBase)。 既然是使用数据库,当然要使用数据库的控制指令来处理啰。tdbdump 可以察看数据库的内容,tdbtool 则可以进入数据库操作接口直接手动修改帐密参数;

  • /usr/bin/smbstatus:服务器功能,可以列出目前 Samba 的连接状况, 包括每一条 Samba 连接的 PID, 分享的资源,使用的用户来源等等,让你轻松管理 Samba 啦;

  • /usr/bin/{smbpasswd,pdbedit}:服务器功能,在管理 Samba 的用户帐号密码时, 早期是使用 smbpasswd 这个指令,不过因为后来使用 TDB 数据库了,因此建议使用新的 pdbedit 指令来管理用户数据;

  • /usr/bin/testparm:服务器功能,这个指令主要在检验设置档 smb.conf 的语法正确与否,当你编辑过 smb.conf 时,请务必使用这个指令来检查一次,避免因为打字错误引起的困扰啊!

  • /sbin/mount.cifs:用户端功能,在 Windows 上面我们可以设置『网络磁盘机』来连接到自己的主机上面。在 Linux 上面,我们则是通过 mount (mount.cifs) 来将远程主机分享的文件与目录挂载到自己的 Linux 主机上面哪!

  • /usr/bin/smbclient:用户端功能,当你的 Linux 主机想要借由『网上邻居』的功能来查看别台电脑所分享出来的目录与设备时,就可以使用 smbclient 来查看啦!这个指令也可以使用在自己的 SAMBA 主机上面,用来查看是否设置成功哩!

  • /usr/bin/nmblookup:用户端功能,有点类似 nslookup 啦!重点在查出 NetBIOS name 就是了。

  • /usr/bin/smbtree:用户端功能,这玩意就有点像 Windows 系统的网上邻居显示的结果,可以显示类似『靠近我的电脑』之类的数据, 能够查到工作群组与电脑名称的树状目录分布图!

大致的软件结构就是这样,底下就准备来讲一个简单的案例吧!这样比较好介绍设置档项目啦!

16.2.2 基础的网芳分享流程与 smb.conf 的常用设置项目

既然 Samba 是要加入 Windows 的网芳服务当中,所以它的设置方式应该是要与网芳差不多才是。所以我们先来聊一聊 Windows 的一些网芳设置方法再说。在早期 Windows 的网芳设置真是很简单,不过也因为太简单, 所以产生的安全问题可是相当的麻烦的。后来在 Windows XP 的 SP2 (服务包第二版) 之后加入了很多的缺省防火墙机制, 因此使用网芳的缺省限制常常会是这样的:

  • 服务器与用户端之间必须要在同一个网域当中 (否则需要修改 Windows 缺省防火墙);
  • 最好设置为同一工作群组;
  • 主机的名称不可相同 (NetBIOS name);
  • 专业版 Windows XP 最多仅能提供同时 10 个用户连接到同一台网芳服务器上。

工作群组与主机名称的设置,你可以在『我的电脑』按右键,选择内容后去修订相关的设置值。当你的 Windows 主机群符合上述的条件后,就很容易处理网芳分享的工作啦!分享的步骤一般是这样的:

  1. 叫出文件总管,然后在要分享的目录、磁盘或设备 (如打印机) 上面按下右键,选择『共用』,然后就能够设置好分享的数据了;
  2. 最好创建一组给用户使用的帐号与密码,让其他主机的用户可以通过该帐号密码连接进入使用网芳分享的资源;
例题:
假设你打开 Windows XP 的文件总管,在 D:\VBird\Data 这个目录下,你按下右键选『共用与安全性』,之后,在出现的窗口中, 你选择:『你了解这个安全风险,但仍不要运行精灵而共用文件,请按这里』,然后勾选:『在网络上共用这个文件夹』, 最后共用的名称你输入了:『VBGame』,请问,假设你的 IP 是 192.168.100.100 ,那么你的用户会看到什么网址列?
答:
网芳的资源名称通常的写法是:『 \\IP\分享资源名称』,我们的分享资源名称为 VBGame,因此最终这个分享的资源名称应该是:『 \\192.168.100.100\VBGame 』才对!很多朋友都会写成:『 \\192.168.100.100\VBird\Game 』那错得很离谱喔!

真是有够简单的!那么 Samba 怎么设置啊?也是很简单,依据上述的限制以及流程你可以这样想像:

  1. 服务器整体设置方面:在 smb.conf 当中设置好工作群组、NetBIOS 主机名、密码使用状态 (无密码分享或本机密码) 等等;
  2. 规划准备分享的目录参数:在 smb.conf 内设置好预计要分享的目录或设备以及可供使用的帐号数据;
  3. 创建所需要的文件系统:根据步骤 2 的设置,在 Linux 文件系统当中创建好分享出去的文件或设备,以及相关的权限参数;
  4. 创建可用 Samba 的帐号:根据步骤 2 的设置,创建所需的 Linux 实体帐号,再以 pdbedit 创建使用 Samba 的密码;
  5. 启动服务:启动 Samba 的 smbd, nmbd 服务,开始运转哩!

根据上面的流程,其实我们最需要知道的就是 smb.conf 这个设置档的信息就是了。 所以首先我们就要来介绍一下这个文件的设置方式啰!这个文件其实可以分为两部份来看, 一个是主机信息部分,在 smb.conf 当中以 [global] (全领域) 作为设置的依据;另一个则是分享的信息, 以个别的目录名称为依据。另外,由于 Samba 主要是想加入网芳功能,因此在 smb.conf 内的很多设置都与 Windows 类似喔:

  • 在 smb.conf 当中,井字号与分号 (# 跟 ;) 都是注解符号;
  • 在这个设置档中,大小写是没关系的!因为 Windows 没分大小写!


  • smb.conf 的服务器整体参数: [global] 项目

在 smb.conf 这个设置档当中的设置项目有点像底下这样:

# 会有很多加上 # 或 ; 的注解说明,你也可以自行加上来提醒自己相关设置
[global]
   参数项目 = 设置内容
   ....

[分享资源名称]
   参数项目 = 设置内容
   ....

在 [global] 当中的就是一些服务器的整体参数了,包括工作群组、主机的 NetBIOS 名称、字符编码的显示、注册表的设置、 是否使用密码以及使用密码验证的机制等等,都是在这个 [global] 项目中设置的。至于 [分享资源名称] 则是针对你开放的目录来进权限方面的设置,包括谁可以浏览该目录、是否可以读写等等参数。 在 [global] 部分关于主机名称信息方面的参数主要有:

  • workgroup = 工作群组的名称:注意,主机群要相同;
  • netbios name = 主机的 NetBIOS 名称啊,每部主机均不同;
  • server string = 主机的简易说明,这个随便写即可。

另外,过去常常让用户心生不满的语系显示问题方面,你务必要清楚的知道的是,SAMBA 服务器上面的数据 (例如 mount 磁盘分区的参数以及原本的数据编码), SAMBA 服务器显示的语系, Windows 用户端显示的语系, Windows 用户端连上 SAMBA 的软件 都需要符合设置值才行!在新版的 3.x 上面有数个提供这些语系转换的设置喔,如下所示:

  • display charset = 自己服务器上面的显示编码, 例如你在终端机时所查阅的编码信息。一般来说,与底下的 unix charset 会相同。
  • unix charset = 在 Linux 服务器上面所使用的编码,一般来说就是 i18n 的编码啰! 所以你必须要参考 /etc/sysconfig/i18n 内的『缺省』编码。
  • dos charset = 就是 Windows 用户端的编码了! 一般来说我们的繁体中文 Windows 使用的是 big5 编码,这个编码在 Samba 内的格式被称为『 cp950 』喔!

关于语系编码,建议你参考一下讨论区的这一篇:

我们的网友 eyesblue 写得太好了!所以建议大家直接前往查阅即可!在这里鸟哥将该文章内容作个例题来玩玩。

例题:
假设你的 Samba 使用的语系 /etc/sysconfig/i18n 显示的是『 LANG="zh_TW.big5" 』, 而预计要分享的目标 Windows 系统是 XP,那么你的语系数据应该如何设置?
答:
由于 Linux, Windows XP 都使用 big5 编码,因此设置值应该是:
        unix charset    = cp950
        display charset = cp950
        dos charset     = cp950

除此之外,还有注册表方面的信息,包括这些参数:

  • log file = 注册表放置的文件,文件名可能会使用变量处理;
  • max log size = 注册表最大仅能到多少 Kbytes ,若大于该数字,则会被 rotate 掉。

还有网芳开放分享时,安全性程度有关的密码参数,包括这几个:

  • security = share, user, domain:三选一,这三个设置值分别代表:

    • share:分享的数据不需要密码,大家均可使用 (没有安全性);
    • user :使用 SAMBA 服务器本身的密码数据库,密码数据库与底下的 passdb backend 有关;
    • domain:使用外部服务器的密码,亦即 SAMBA 是用户端之意,如果设置这个项目, 你还得要提供『password server = IP』的设置值才行;

  • encrypt passwords = Yes 代表密码要加密,注意那个 passwords 要有 s 才对!

  • passdb backend = 数据库格式,如前所述,为了加快速度, 目前密码档已经转为使用数据库了!缺省的数据库格式微 tdbsam ,而缺省的文件则放置到 /etc/samba/passwd.tdb。

事实上 Samba 的密码方面设置值很多喔,包括你还可以利用 samba 来修改 /etc/passwd 里头的人物的密码呢! 不过这个时候就得需要『 unix password sync 』以及『 passwd program 』这两个参数值的帮忙了。 我们这里先谈比较简单的,其他高端的部分可以 man smb.conf 去进行搜索查阅喔! ^_^


  • 分享资源的相关参数设置 [分享的名称]

这部分就是我们在前面的小范例当中说明的,要将 (1)哪个实际的目录 (2)分享成什么名称?中刮号里面放的是『分享名称』! 那在这个分享名称内常见的参数有:

  • [分享名称] :这个分享名称很重要,它是一个『代号』而已。记得回去看看 16.2.2 里面提到的那个范例;

  • comment :只是这个目录的说明而已!

  • path :这个分享名称实际会进入的 Linux 文件系统 (目录)。 也就是说,在网芳当中看到的是 [分享] 的名称,而实际操作的文件系统则是在 path 里头所设置的。

  • browseable :是否让所有的用户看到这个项目?

  • writable :是否可以写入?这里需要注意一下喔!那个 read only 与 writable 不是两个蛮相似的设置值吗?如果 writable 在这里设置为 yes ,亦即可以写入,如果 read only 同时设置为 yes , 那不就互相抵触了!那个才是正确的设置?答案是:最后出现的那个设置值为主要的设置!

  • create mode 与 directory mode 都与权限有关的咯!

  • writelist = 用户, @群组,这个项目可以指定能够进入到此资源的特定用户。 如果是 @group 的格式,则加入该群组的用户均可取得使用的权限,设置上会比较简单!

因为分享的资源主要与 Linux 系统的文件权限有关,因此里头的设置参数多与权限有关。


  • smb.conf 内的可用变量功能

为了简化设置值,Samba 提供很多不同的变量给我们来使用,主要有底下这几个变量喔:

  • %S:取代目前的设置项目值,所谓的『设置项目值』就是在 [分享] 里面的内容!举例来说,例如底下的设置范例:
    [homes]
       valid users = %S
       ....
    
    因为 valid users 是允许的登录者,设置为 %S 表示任何可登录的用户都能够登录的意思~今天如果 dmtsai 这个用户登录之后,那个 [homes] 就会自动的变成了 [dmtsai] 了!这样可以明白了吗? %S 的用意就是在替换掉目前 [ ] 里面的内容啦!
  • %m:代表 Client 端的 NetBIOS 主机名称喔!
  • %M:代表 Client 端的 Internet 主机名称喔!就是 HOSTNAME。
  • %L:代表 SAMBA 主机的 NetBIOS 主机名称。
  • %H:代表用户的家目录。
  • %U:代表目前登录的用户的用户名
  • %g:代表登录的用户的群组名称。
  • %h:代表目前这部 SAMBA 主机的 HOSTNAME 喔!注意是 hostname 不是 NetBIOS name 喔!
  • %I:代表 Client 的 IP 咯。
  • %T:代表目前的日期与时间

以上就是在 smb.conf 上头常看到的几种设置项目,相信初次接触 Samba 的朋友,看到上头写的数据肯定是一头雾水的! 我们底下用几个小范例来实际的介绍 smb.conf 的设置后,你就会知道这些参数如何应用了! 记得,看完底下的下范例后,要回来再将这些参数的意义瞧一瞧, 而且若有其他额外的参数须知,务必自行 man smb.conf 喔!重要的很!

Tips 鸟哥 时代变动太快,版本变动太多~要讲完所有的参数实在是很难的一件事~所以在这里鸟哥只讲一些常用的设置项目, 很多细项就得要靠各位看官自己努力了~文末也有列出很多 Samba 的在线资源,记得要查察看!

16.2.3 不需密码的分享 (security = share, 纯测试)

瞎密?不需要密码就能够使用 SAMBA 主机所提供的目录资源?真假?没错啦,可以达到的。不过,因为不需要密码就能够登录, 虽然你可以设置权限成为唯读,让用户可以『瞧瞧而已』,但是毕竟比较危险。 因为如果你不小心将重要数据放置到该分享的目录当中,岂不危险?所以尽量不要这样设置,所以标题才会讲:『纯测试』嘛!


  • 0. 假设条件

在底下的案例中,服务器 (192.168.100.254) 预计设置的参数状况为:

  • 在 LAN 内所有的网芳主机工作群组 (workgroup) 为: vbirdhouse
  • 这部 Samba 服务器的 NetBIOS 名称 (netbios name) 为: vbirdserver
  • 用户认证层级设置 (security) 为: share
  • 取消原本有放行的 [homes] 目录;
  • 仅分享 /tmp 这个目录而已,且取名为: temp
  • Linux 服务器的编码格式假设为万国码 (Unicode, 亦即 utf8)
  • 用户端为中文 Windows ,在用户端的软件也使用 big5 的编码

老实说, netbios name 几乎可以不用设置了,因为现在我们都用 IP 进行网芳连接,不一定会使用主机名称嘛! 所以这一版当中,鸟哥取消了 lmhosts 的设置值喔!好了,底下就开始依序来进行 samba 的设置吧!


  • 1. 设置 smb.conf 设置档

由于我们有设置语系相关的数据,因此得要先查查看,到底我们 Linux 服务器的语系是否为 utf8 呢?检查方法如下:

[root@www ~]# cat /etc/sysconfig/i18n
LANG="zh_TW.UTF-8"  <==确实是出现了 utf8 喔!

如上所示,确实是 utf8 啊!而在这个例子当中我们仅分享 /tmp 这个目录而已,而且假设这个分享出来的目录是可读写的, 另外,我们并没有分享打印机喔!而在 smb.conf 当中的注解符号可以是『 # 』也可以是『 ; 』喔!要注意!

[root@www ~]# cd /etc/samba
[root@www samba]# cp smb.conf smb.conf.raw  <==先备份再说!
[root@www samba]# vim smb.conf
# 1. 先设置好服务器整体环境方面的参数
[global]
        # 与主机名称有关的设置信息
        workgroup     = vbirdhouse
        netbios name  = vbirdserver
        server string = This is vbird's samba server

        # 与语系方面有关的设置项目喔,为何如此设置请参考前面的说明
        unix charset    = utf8
        display charset = utf8
        dos charset     = cp950

        # 与注册表有关的设置项目,注意变量 (%m)
        log file = /var/log/samba/%m.log
        max log size = 50

        # 这里才是与密码有关的设置项目哩!
        security = share

        # 修改一下打印机的加载方式,不要加载啦!
        load printers	= no

# 2. 分享的资源设置方面:主要得将旧的注解,新的加入!
#    先取消 [homes], [printers] 的项目,然后针对 /tmp 的设置,可浏览且可写入喔
[temp]                                     <==分享资源名称
        comment    = Temporary file space  <==简单的解释此资源
        path       = /tmp                  <==实际 Linux 分享的目录
        writable   = yes                   <==是否可写入?在此例为是的
        browseable = yes                   <==能不能被浏览到资源名称
        guest ok   = yes                   <==单纯分享时,让用户随意登录的设置值

请你特别留意,在原本的 smb.conf 上面就已经有很多默认值了,这些默认值如果你不知道他的用途, 尽量保留默认值,也可以使用 man smb.conf 去查找该默认值的意义。上述的设置是完全控制用户的认证层级的呦!


  • 2. 用 testparm 查阅 smb.conf 的语法设置正确性

在启动 samba 之前,我们务必要了解到 smb.conf 里面语法是否正确,检验的方式使用 testparm 这个指令即可。 测试方式如下:

[root@www ~]# testparm
选项与参数:
-v :查阅完整的参数设置,连同默认值也会显示出来喔!

[root@www ~]# testparm
Load smb config files from /etc/samba/smb.conf
Processing section "[temp]"   <==看有几个中括号,若中刮号前出现消息,则有错误
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions <==按 Enter 继续

[global]   <==底下就是刚刚在 smb.conf 里头设置的数据!
        dos charset = cp950
        unix charset = utf8
        display charset = utf8
        workgroup = VBIRDHOUSE
        netbios name = VBIRDSERVER
        server string = This is vbird's samba server
        security = SHARE
        log file = /var/log/samba/%m.log
        max log size = 50
        load printers = No

[temp]
        comment = Temporary file space
        path = /tmp
        read only = No
        guest ok = yes

上头是语法验证与各个项目的列出,如果你下达 testparm 却出现如下画面那就是有问题:

[root@www ~]# testparm
Load smb config files from /etc/samba/smb.conf
Unknown parameter encountered: "linux charset" <==中括号前为错误消息!
Ignoring unknown parameter "linux charset"
Processing section "[temp]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

如果发现上述的错误,这表示你的 smb.conf 有个『 linux charset 』的设置参数,不过 smb.conf 其实是不支持这个参数的。 可能的问题是 samba 2.x 与 samba 3.x 有一些项目的支持已经不存在了,所以你使用旧版的 2.x 设置档来 3.x 上头运行时,就会出现问题。此外,『打字错误』也是很常见的一个问题呐!赶紧测试一下语法先, 然后根据 smb.conf 存在的项目去进行修改吧。

如果你想要了解 samba 的所有设置 (包括没有在 smb.conf 里头设置的默认值),可以使用 testparm -v 来作详细的输出, 数据相当的丰富,通过这个你也可以知道你的主机环境设置为何呢! ^_^


  • 3. 服务器端的服务启动与端口口观察

启动实在太简单了,利用缺省的 CentOS 启动方式来处理即可。

[root@www ~]# /etc/init.d/smb start
[root@www ~]# chkconfig smb on
[root@www ~]# netstat -tlunp | grep mbd
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address        Foreign Address State   PID/Program name
tcp        0      0 0.0.0.0:139          0.0.0.0:*       LISTEN  3905/smbd
tcp        0      0 0.0.0.0:445          0.0.0.0:*       LISTEN  3905/smbd
udp        0      0 192.168.100.254:137  0.0.0.0:*               3908/nmbd
udp        0      0 0.0.0.0:137          0.0.0.0:*               3908/nmbd
udp        0      0 192.168.100.254:138  0.0.0.0:*               3908/nmbd
udp        0      0 0.0.0.0:138          0.0.0.0:*               3908/nmbd

特别注意,在 Samba 当中缺省会启动多个端口口,这包括数据传输的 TCP 端口口 (139, 445),以及进行 NetBIOS 名称解析之类工作的 UDP 端口口 (137, 138),所以你才会看到很多数据的。那么能否仅支持 139 这个必要的端口口,关闭 445 呢?可以啊~通过 testparm -v 的观察,可以发现『 smb ports = 445 139 』这个设置值指定两个端口口的,因此你可以在 smb.conf 增加这个设置值,并改为 smb ports = 139 即可。不过,建议先保留默认值啦!


  • 4. 假设自我为用户端的检验 (缺省用 lo 接口)

关于用户端的观察我们会在后续进行介绍。在这里仅是说明如何确定我们的 Samba 设置与服务有顺利的在运作。 我们可以在本机上通过 smbclient 这支程序来处理,它的基本查找语法是这样的:

[root@www ~]# smbclient -L [//主机或IP] [-U 用户帐号]
选项与参数:
-L :仅查阅后面接的主机所提供分享的目录资源;
-U :以后面接的这个帐号来尝试取得该主机的可使用资源

由于在这个范例当中我们并没有规范用户的安全等级 (share),所以不必使用 -U 这个选项,因此你可以这样看看:

[root@www ~]# smbclient -L //127.0.0.1 
Password:  <==因为不需要密码,因此这里按一下 [Enter] 吧!
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]

        Sharename       Type      Comment
        ---------       ----      -------
        temp            Disk      Temporary file space
        IPC$            IPC       IPC Service (This is vbird's samba server)
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]

        Server               Comment
        ---------            -------
        VBIRDSERVER          This is vbird's samba server

        Workgroup            Master
        ---------            -------
        VBIRDHOUSE

上表输出的信息当中,分享的目录资源 (Sharename) 就是在 smb.conf 当中设置的 [temp] 名称啰! 因此在这里的意思是:任何人都可以进入 //127.0.0.1/temp 这个目录当中, 而这个目录在 Linux 系统其实是 /tmp 目录。至于那个 IPC$ 则是为了要应付 Windows 环境所必须要存在的项目就是了。那么该如何使用这个资源呢?接下来我们可以利用 mount 这个指令来测试看看啰:

[root@www ~]# mount -t cifs //127.0.0.1/temp /mnt
Password: <==因为没有密码,所以这里还是按 Enter 即可
[root@www ~]# df
文件系统               1K-区段      已用     可用 已用% 挂载点
....(前面省略)....
//127.0.0.1/temp       1984016     35884   1845720   2% /mnt

[root@www ~]# cd /mnt
[root@www mnt]# ll  <==以上这两个动作要进行!才会知道有没有权限的问题!
[root@www mnt]# cd ; umount /mnt

确实可以挂载的起来,所以,测试完毕后,就将这个挂载的数据卸载吧。关于 mount 的用法,我们会在后面的小节继续介绍。


基本上,到此为止咱们就设置好一个简单的不需要密码即可登录的 Samba 服务器了! 你可以先行到用户端软件功能的部分进行更细部的挂载测试。 接下来,让我们以简易的需要密码才能够登录 Samba 的方式来设计一个范例吧!

16.2.4 需帐号密码才可登录的分享 (security = user)

设置一部不需密码即可登录的 Samba server 是非常简单的,不过, 你总不希望某些有机密性质的数据放在不设防的网芳中让大家查阅吧? 举例来说,你总不希望你的家目录被人家随意浏览吧?家目录内可能有你自己的情书呢!^_^

那怎么办?没关系,我们可以通过 Samba 服务器提供的认证方式来进行用户权限的给予, 也就是说,你在用户端连接到服务器时,必须要输入正确的帐号与密码后,才能够登录 Samba 查阅到你自己的数据! 那会不会很难啊?不会啦! Samba 本身就提供一个小程序来帮助我们处理密码的创建了,整个流程还不太难。

比较重要的是 Samba 用户帐号必须要存在于 Linux 系统当中 (/etc/passwd), 但是 Samba 的密码与 Unix 的密码文件并不相同 (这是因为 Linux 与网芳的密码验证方式及编码格式不同所致)。 这就比较有点小麻烦~没关系,就让我们依样画葫芦来处理一下这个部分的设置吧!


  • 0. 假设条件

由于用户层级会改变成 user 的阶段,因此 [temp] 已经没有必要存在!请将该设置删除或注解。 而服务器方面的整体数据则请保留,包括工作群组等等的数据,并添加底下的数据:

  • 用户认证层级设置 (security) 为: user
  • 用户密码文件使用 TDB 数据库格式,缺省文件为: /etc/samba/passwd.tdb;
  • 密码必须要加密;
  • 每个可使用 samba 的用户均拥有自己的家目录;
  • 设置三个用户,名称为 smb1, smb2, smb3 ,且均加入 users 为次要群组。此三个用户 Linux 密码为 1234, Samba 密码则为 4321;
  • 分享 /home/project 这个目录,且资源名称取名为: project;
  • 加入 users 这个群组的用户可以使用 //IP/project 资源,且在该目录下 users 这个群组的用户具有写入的权限。

好了,开始一步步的处理吧!


  • 1. 设置 smb.conf 设置档与目录权限相关之设置

在这个范例的设置档当中,我们会添加几个参数,添加的参数部分会用特殊字体圈起来, 引用之前参数的部分则为一般字体。请交互参考看看啰:

# 1. 开始设置重要的 smb.conf 文件呦!
[root@www ~]# vim /etc/samba/smb.conf
[global]
        workgroup       = vbirdhouse
        netbios name    = vbirdserver
        server string   = This is vbird's samba server
        unix charset    = utf8
        display charset = utf8
        dos charset     = cp950
        log file        = /var/log/samba/%m.log
        max log size    = 50
        load printers	= no

        # 与密码有关的设置项目,包括密码文件所在格式喔!
        security = user          <==这行就是重点啦!改成 user 层级
        passdb backend = tdbsam  <==使用的是 TDB 数据库格式!

# 2. 分享的资源设置方面:删除 temp  加入 homes 与 project
[homes]                                   <==分享的资源名称
        comment        = Home Directories
        browseable     = no               <==除了用户自己外,不可被其他人浏览
        writable       = yes              <==挂载后可读写此分享
        create mode    = 0664             <==创建文件的权限为 664
        directory mode = 0775             <==创建目录的权限为 775

[project]                                 <==就是那三位用户的共享资源
        comment    = smbuser's project
        path       = /home/project        <==实际的 Linux 上面的目录位置
        browseable = yes                  <==可被其他人所浏览到资源名称(非内容)
        writable   = yes                  <==可以被写入
        write list = @users               <==写入者有哪些人的意思

# 2. 每次改完 smb.conf 你都需要重新检查一下语法正确否!
[root@www ~]# testparm  <==详细的 debug 请自行处理啰!

在上表当中比较有趣的设置项目主要有:

  • [global] 修改与添加的部分:security 设置为 user 层级,且使用『passdb backend = tdbsam』这个数据库格式,因此密码档会放置于 /etc/samba/passwd.tdb 内。 此外,缺省密码就是加密的,因此不需要额外使用其他的设置参数来规范;

  • [homes] 这个用户资源分享部分: homes 是最特殊的资源分享名称,因为 Linux 上面的每位用户均有家目录,例如 smb1 的家目录位于 /home/smb1/ ,那当 smb1 用户使用 samba 时,她就会发现多了个 //127.0.0.1/smb1/ 的资源可用,而 smb2 就在 //127.0.0.1/smb2/ 这个资源。由于不可浏览 (browseable),所以除了用户可以看到自己的家目录资源外,其他人是无法浏览的。此外,为了规范权限,而多了 create mode 与 directory mode 两个设置值 (此值可设置也可不理会);

  • [project] 这个用户资源分享部分:当我们添加一个共用资源时, 最重要的就是规范资源名称。在此例中我们使用 project 这个资源名称来指向 /home/project ,也就是说, //127.0.0.1/project 代表的是 /home/project 的意思。此外,能够使用这个资源的帐号,为加入 users 这个群组的用户喔! 通过 write list 这个项目比较单纯,如果是早期的设置,可能会使用 valid users ,但近来鸟哥比较偏好 write list 设置项目。 不过能否顺利的访问文件还与 Linux 最底层的文件权限有关。

千万不要忘记了,除了设置档之外,详细的目录权限与帐号设置等规范也要设置好!底下我们用范例来进行此项工作!

例题:
我们预计要分享 /home/project 目录,这个目录的权限该如何设置?
答:
因为是要开放给 users 群组,而共享群组的权限通常是『 2770 』这个含有 SGID 的特殊旗标功能。因此这个目录应该如此设置才好:
[root@www ~]# mkdir /home/project
[root@www ~]# chgrp users /home/project
[root@www ~]# chmod 2770 /home/project
[root@www ~]# ll -d /home/project
drwxrws--- 2 root users 4096  3月 23 14:02 /home/project/


  • 2. 设置可使用 Samba 的用户帐号与密码

设置用户帐号是很重要的一环,因为设置错误的话,当然也就任何人都没有办法登录的!在这里我们必须先要说明一下 Linux 的文件系统与 SAMBA 设置的用户登录权限的相关性!

  • 在 Linux 这个系统下,任何进程都需要取得 UID 与 GID (User ID 与 Group ID) 的身份之后,才能够拥有该身份的权限,也才能够适当的进行访问文件等动作!

  • 关于 Linux 这个系统的 UID 与 GID 与帐号的相对关系,一般记录在 /etc/passwd 当中,当然也能通过 NIS, ldap 等方式来取对应;

  • SAMBA 仅只是 Linux 底下的一套软件,使用 SAMBA 来进行 Linux 文件系统时,还是需要以 Linux 系统下的 UID 与 GID 为准则!

如果上面这几点说明你没有问题了,现在就来看一下当我们在 Windows 电脑上面以网上邻居来连接 Linux 并且进行数据的访问时,会是怎样的一个情况呢?

我们需要通过 SAMBA 所提供的功能来进行 Linux 的访问,而 Linux 的访问是需要取得 Linux 系统上面的 UID 与 GID 的,因此,我们登录 SAMBA 服务器时,所利用 SAMBA 取得的其实是 Linux 系统里面的相关帐号!这也就是说,在 SAMBA 上面的用户帐号,必须要是 Linux 帐号中的一个!

所以说,在不考虑 NIS 或 LDAP 等其他帐号的验证方式,单纯以 Linux 本机帐号 (/etc/passwd) 作为身份验证时, 在 Samba 服务器所提供可登录的帐号名称,必须要存在于 /etc/passwd 当中! 这是一个很重要的概念!例如你要先有 dmtsai 在 /etc/passwd 当中后,才能将 dmtsai 加入 Samba 的用户当中。这都是很基本的帐号权限概念,如果你觉得这里阅读方面有问题, 若不考虑鸟哥的解释不良,表示你必须要回去读读基础篇了~ ^_^

现在我们知道需要添加 smb1, smb2, smb3 三个用户,且这三个用户需要加入 users 群组。此外,我们之前还创建过 student 这个用户,假设这四个人都需要能用 Samba 服务,那么除了添加用户之外,我们还需要利用 pdbedit 这个指令来处理 Samba 用户功能喔!

# 1. 先来创建所需要的各个帐号,但假设 student 已经存在了喔!
[root@www ~]# useradd -G users smb1
[root@www ~]# useradd -G users smb2
[root@www ~]# useradd -G users smb3
[root@www ~]# echo 1234 | passwd --stdin smb1
[root@www ~]# echo 1234 | passwd --stdin smb2
[root@www ~]# echo 1234 | passwd --stdin smb3

# 2. 使用 pdbedit 指令功能
[root@www ~]# pdbedit -L [-vw]            <==单纯的察看帐号信息
[root@www ~]# pdbedit -a|-r|-x -u 帐号    <==添加/修改/删除帐号
[root@www ~]# pdbedit -a -m -u 机器帐号   <==与 PDC 有关的机器码
选项与参数:
-L :列出目前在数据库当中的帐号与 UID 等相关信息;
-v :需要搭配 -L 来运行,可列出更多的消息,包括家目录等数据;
-w :需要搭配 -L 来运行,使用旧版的 smbpasswd 格式来显示数据;
-a :添加一个可使用 Samba 的帐号,后面的帐号需要在 /etc/passwd 内存在者;
-r :修改一个帐号的相关信息,需搭配很多特殊参数,请 man pdbedit;
-x :删除一个可使用 Samba 的帐号,可先用 -L 找到帐号后再删除;
-m :后面接的是机器的代码 (machine account),与 domain model 有关!

# 2.1 开始添加用户吧!
[root@www ~]# pdbedit -a -u smb1
new password: <==输入 4321 这个密码瞧瞧
retype new password: <==再输入一次吧!
Unix username:        smb1 <==底下为输入正确后的显示结果!
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3543230400-1112688072-56473324-1000
Primary Group SID:    S-1-5-21-3543230400-1112688072-56473324-513
Full Name:
Home Directory:       \\vbirdserver\smb1
HomeDir Drive:
Logon Script:
Profile Path:         \\vbirdserver\smb1\profile
Domain:               VBIRDSERVER
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    三, 23  3月 2011 14:28:43 CST
Password can change:  三, 23  3月 2011 14:28:43 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
# 你可以发现其实消息非常的多!若需修改细部设置,请 man pdbedit 吧!
[root@www ~]# pdbedit -a -u smb2
[root@www ~]# pdbedit -a -u smb3
[root@www ~]# pdbedit -a -u student

# 2.2 查找目前已经存在的 Samba 帐号
[root@www ~]# pdbedit -L
smb1:2004:
student:500:student
smb2:2005:
smb3:2006:
# 仅会列出帐号与 UID 而已呦!

# 2.3 尝试修改与删除 smb3 这个帐号看看
[root@www ~]# smbpasswd smb3
New SMB password: 
Retype new SMB password:
# 修改密码比较特殊,管理密码参数是使用 pdbedit,修改密码得要用 smbpasswd 呦!

[root@www ~]# pdbedit -x -u smb3
[root@www ~]# pdbedit -Lw
# 此时你就看不到 smb3 这个用户啰!所以测试完请立即将它加回来!

以后如果有需要添加额外的用户帐号,若该帐号原本不存在,则使用 useradd 再以 pdbedit -a 去添加。 若已经存在于 Linux 的实体帐号,直接用 pdbedit -a 添加即可。同时要注意,管理 TDB 数据库格式建议使用 pdbedit 这个新的玩意儿来处理,smbpasswd 仅剩下修改密码的功能需记忆即可!


  • 3. 重新启动 Samba 并进行自我测试

在经过重新启动后,我们所进行的修订才会生效。然后使用 smbclient 来检查看看,是否不同身份会有不一样的浏览结果呢? 赶紧看看:

[root@www ~]# /etc/init.d/smb restart

# 1. 先用匿名登录试看看!
[root@www ~]# smbclient -L //127.0.0.1
Password:                   <==直接按下 [Enter] 即可。
Anonymous login successful  <==有看到匿名的字样了!
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]

        Sharename       Type      Comment
        ---------       ----      -------
        project         Disk      smbuser's project
        IPC$            IPC       IPC Service (This is vbird's samba server)
Anonymous login successful
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]
....(底下省略)....

# 2. 再使用 smb1 这个帐号登录试看看!
[root@www ~]# smbclient -L //127.0.0.1 -U smb1
Password: <==输入 smb1 在 pdbedit 所创建的密码!
Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]

        Sharename       Type      Comment
        ---------       ----      -------
        project         Disk      smbuser's project
        IPC$            IPC       IPC Service (This is vbird's samba server)
        smb1            Disk      Home Directories <==多了这玩意儿!
Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]
....(底下省略)....

由上表我们可以发现,经由不同的身份登录可以取得不一样的浏览数据, 所以在使用上面需要特别留意喔!接下来,让我们开始来自我挂载测试看看!

[root@www ~]# mount -t cifs //127.0.0.1/smb1 /mnt -o username=smb1
Password: <==确定是输入正确的密码喔!
retrying with upper case share name
mount error 6 = No such device or address
Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)
# 竟然发生不明原因的错误,请参考 /var/log/samba/${IP}.log 内的错误说明

[root@www ~]# tail /var/log/samba/127.0.0.1.log
[2011/03/23 15:25:53, 0] smbd/service.c:make_connection_snum(1013)
  '/home/smb1' does not exist or permission denied when connecting 
  to [smb1] Error was 拒绝不符权限的操作
# /home/smb1 不可能不存在,也不可能权限错误,故开始怀疑为 SELinux 的问题?

[root@www ~]# setenforce 0  <==先关闭 SELinux 看看
[root@www ~]# mount -t cifs //127.0.0.1/smb1 /mnt -o username=smb1
Password: <==确定是输入正确的密码喔!
[root@www ~]# df
文件系统               1K-区段      已用     可用 已用% 挂载点
....(中间省略)....
//127.0.0.1/smb1      25396668    176676  23914256   1% /mnt
# 果然挂载上来!那确定是 SELinux 的问题了!请依照 /var/log/messages 
# 的内容自行克服相关的问题!

[root@www ~]# umount /mnt; setenforce 1

自我测试是非常重要的!因为 Samba 是会对外提供服务的,因此 SELinux 会特别『关照』一下这个服务!包括缺省用户家目录不会有开放的权限、缺省的 SELinux type 不对就无法使用 (你可以自己尝试挂载 //127.0.0.1/project 就知道啥原因啰!),所以,自行测试完毕就能够理解哪个地方的 SELinux 没有设置妥当!详细的设置请到后续安全性设置去查阅。

Tips 鸟哥 根据网友回报,因为之前我们设置的 security 是 share,而且已经使用 Windows 系统测试过,在同一部 Windows 系统上面重复测试时,会发生无法登录的情况。建议直接将 windows 系统重新开机清除前一次登录的信息即可! ^_^

  • 4. 关于权限的再说明与累加其他分享资源的方式:

有的时候你会发现,明明在 smb.conf 当中已经设置了 writable 可写入,用户登录的身份也没有问题, 为啥就是无法挂载或写入呢?是否是服务器设置哪里还有问题啊?非也非也!主要的问题常常是来自于 Linux 文件系统的权限啦!

举上面的例子来说,当你无法挂载却发现 Linux 传统权限是对的,那么肯定是 SELinux 出问题~这部份得要用 setsebool 与 chcon 或 restorecon 等指令来克服。另外就是,我们在 smb.conf 当中设置 [project] 为可写入,亦即 /home/project 是可写入的。假设 smb1 属于 users 这个群组,因此以 smb1 登录 SAMBA 服务器后,对于 /home/project 应该是具有可以读写的能力的!但是,如果你以 root 的身份创建 /home/project 却又忘记修改权限的话, 此时 /home/project 是无法让 users 这个群组写入的,因此 smb1 这个用户当然不具有写入的能力。 这样说,了解鸟哥想要说啥了吗?注意注意喔! ^_^

那如果你还要扩充分享的目录与能够登录的用户时,可以这样做:

  • 利用编辑 smb.conf 来开放其他的目录资源,并且特别注意 Linux 在该目录下的权限喔!请使用 chown 与 chmod 吧!
  • 利用 pdbedit 来添加其他可用 Samba 的帐号,如果该帐号并没有出现在 /etc/passwd 里面,请先以 useradd 添加该帐号;
  • 不论进行完任何的设置,请先以 testparm 进行确认,之后以 /etc/init.d/smb restart 来重新启动!

事实上,SAMBA 的一般用途就是在这个连接的模式中!多使用 SAMBA 来分享你的资源吧!鸟哥都是使用 SAMBA 来做为远程服务器与我的工作机互通有无的重要媒介说~

16.2.5 设置成为打印机服务器 (CUPS 系统)

时至今日,打印机的网络功能已经很强悍了!甚至也有支持无线网络的打印机,因此每台打印机都可以独立作为各个 PC 的独自的打印机,老实说也没有必要进行 Samba 的网络打印机服务器啦!但毕竟还是有些比较旧型的机种, 或者买不起有内置网络的打印机时,那么 Samba 的打印机服务器还是有存在的价值啰。

在 Linux 底下进行打印的服务很多,不过我们这里要介绍的仅有目前较广为流行的 CUPS (Common Unix Printing System) 这一个。 详细的 CUPS 安装设置方法我们已经在基础篇第三版第二十一章 CUPS 当中提过,所以这里我们不再详细说明,仅介绍大致的处理流程就是了。如果你需要较早期的 LPRng 打印系统的话, 建议可以参考底下的数据喔:

Tips 鸟哥 在这个小节中,鸟哥假设你的打印机并不是网络打印机,而是使用 USB 接口连接的打印机格式。如果你的打印机真的有支持网络, 那建议直接参考打印机手册来设置即可,不需要安装 Samba 打印机。因为某些厂牌的打印机网络卡有特殊的功能, 例如 HP 的网卡通常还支持某些特殊的打印功能 (双面、多页打印等),这些功能通过服务器重新分享时,可能会遗失!

  • 0. 假设条件

既然要分享打印机,就得要有打印机啊!鸟哥使用对 Linux 支持度较高的 HP LaserJet P2015dn 这部打印机为例, 不使用网络功能,单纯使用 USB 连接到 Samba 服务器上。

  • CUPS 连接到 USB 打印机,并且开放非本机的 IP 来源使用此打印机;
  • 使用 CUPS 内置的打印机驱动程序;
  • 前往 HP 打印机官网取得 Windows 操作系统的驱动程序;


  • 1. 安装打印机与确定打印机的连接正常

再次说明,并不是所有的打印机都被 Linux 所支持的,所以当你想要链接一部打印机到 Linux 系统上头时, 请务必到 http://www.openprinting.org/printers 上头去看看是否有被支持喔! 如果没有被支持,那就换一部打印机吧!不要进行垂死的挣扎了...

如果你的打印机连接端口为使用 USB 或者是平行串口的话,那么当你连接上打印机后, 可以利用底下的方式测试看看是否成功的连接上了:

[root@www ~]# lsusb
Bus 001 Device 002: ID 03f0:3817 Hewlett-Packard LaserJet P2015 series
Bus 001 Device 001: ID 0000:0000
[root@www ~]# ll /dev/usb/lp0
crw-rw---- 1 root lp 180, 0  3月 23 16:57 /dev/usb/lp0
# 看得出来,已经有个 lp0 的打印机啰!测试打印一下吧!

[root@www ~]# echo "Hello printer" > /dev/usb/lp0

如果打印机有回应,这表示 OK 的啦!你可以进行底下的工作了。


  • 2. 设置 CUPS 与打印机的连接

缺省 CUPS 都会打开,不过,我们在前面的第七章曾经将这个服务关闭! 所以这里要重新设置与启动才行。本章节 CUPS 的设置原则是这样的:

  • 我需要让 192.168.100.0/24 这个网域可以使用打印机
  • 我需要让 192.168.100.0/24 及 127.0.0.0/8 可以管理 CUPS 系统

然后开始这样做:

[root@www ~]# vim /etc/cups/cupsd.conf
# 1. 让监听的接口开放在所有接口!
# Listen localhost:631  <==约在第 19 行左右,改成如下:
Listen 0.0.0.0:631

# 2. 让内部网域能够进行 CUPS 的浏览与管控
<Location />        <==约在 32 行左右,添加能够让内网其他 IP 浏览者
  Order allow,deny
  Allow From 127.0.0.0/8
  Allow From 192.168.100.0/24
</Location>

<Location /admin>       <==约在 39 行左右,添加能够管理 CUPS 者
  Encryption Required   <==因为这里的关系,所以可能会用 https://IP 喔!
  Order allow,deny
  Allow From 127.0.0.0/8
  Allow From 192.168.100.0/24
</Location>

设置完毕后就可以开始来启动 cups 系统,可以这样做:

[root@www ~]# /etc/init.d/cups start
[root@www ~]# chkconfig cups on
[root@www ~]# netstat -tunlp | grep '631'
tcp     0   0 0.0.0.0:631       0.0.0.0:*      LISTEN      2667/cupsd
udp     0   0 0.0.0.0:631       0.0.0.0:*                  2667/cupsd

那个 631 的端口口就是 CUPS 所启动的啦!要注意的是,开放接口得要给 0.0.0.0 才对呦!然后我们可以开始设置打印机了! 由于 CUPS 支持很多不同的打印机连接端口,每种连接端口都不一样,常见的有:

  • USB 连接端口: usb:/dev/usb/lp0
  • 网络打印机: ipp://ip/打印机型号
  • 网络芳邻打印机: smb://user:password@host/printer

之所以要加上 192.168.100.0/24 可以控制服务器 CUPS 的原因在于...鸟哥的服务器没有 X 窗口啦! 所以需要通过平时的工作机连上服务器才行啊!此时,将 CUPS 开放在区网内可以控制的功能就很重要啦! 此外,因为鸟哥的主机所在环境问题,这部 192.168.100.254 还有一个接口为 192.168.1.10,鸟哥在 cupsd.conf 里面也加入这个网段了 (上面的范例中并没有特别强调),所以底下的图标你会看到很多 192.168.1.10 的 IP ,不要害怕!那是正常的! ^_^!好了,请打开浏览器,在网址列输入: https://192.168.100.254:631 (底下则是 192.168.1.10)

用 CUPS 设置 USB 打印机
图 16.2-1、用 CUPS 设置 USB 打印机

如上图所示,由于我们使用的是 https 这个需要凭证的连接模式,因此就会出现这个不受信任的网站消息。 没关系,你直接按下『我了解安全风险』后,再选择『添加例外网站』即可出现如下图标:

用 CUPS 设置 USB 打印机
图 16.2-2、用 CUPS 设置 USB 打印机

如果这部主机真的是你的,那么就选择箭头 2 所指的那个『永久保存』吧!最后按下箭头 3 所指的『确认安全例外』即可!如果一切顺利,就会出现如下的 CUPS 设置图标:

用 CUPS 设置 USB 打印机
图 16.2-3、用 CUPS 设置 USB 打印机

在上头的欢迎图标当中,由于我们是想要创建打印机,因此点击箭头所指的那个按钮来创建打印机吧!

用 CUPS 设置 USB 打印机
图 16.2-4、用 CUPS 设置 USB 打印机

创建打印机时,最重要的是那个打印队列 (上面方框中的第一个,名称的那个玩意儿),在这里鸟哥取名为 hpljp2015dn 的打印机名称,这个名称很重要,是未来分享出的打印机名字啰!至于位置与描述就随便你填啰。 当你按下『继续』后,就会出现如下图标:

用 CUPS 设置 USB 打印机
图 16.2-5、用 CUPS 设置 USB 打印机

在上面的图标中,你应该要选择的是我们这部 USB 的打印机设备才对。该设备是由 HAL 服务所自动侦测到的, 如果你没有看到任何 USB 的打印机,那可能就得要查找一下打印机电源是否正确的打开了! 点击他吧!

用 CUPS 设置 USB 打印机
图 16.2-6、用 CUPS 设置 USB 打印机

接下来 CUPS 会帮你选择一个相对较佳的驱动程序,但鸟哥比较喜欢中文支持 (有 zh_TW 啊!看到没?), 因此才选择上述图标当中的那个激光打印机的项目。选完后请按下『加入打印机』按钮吧!

用 CUPS 设置 USB 打印机
图 16.2-7、用 CUPS 设置 USB 打印机

如果一切设置妥当,那么接下来就是要输入 root 的帐号与密码来修改打印机的设置档。 请填入你的 Linux 里面的 root 帐密吧!

用 CUPS 设置 USB 打印机
图 16.2-8、用 CUPS 设置 USB 打印机

如果一切都没有问题,那么打印机就应该已经建置妥当。你可以点击图 16.2-3 那个画面内的『打印机』分页, 然后就会看到上图的显示。如果你只有一部打印机,那么可以点箭头 1 所指的『设为默认值』项目, 如果想要知道打印机到底有没有成功的连接,那可以点击箭头 2 的『打印测试页』啊!如果都正常没问题, 那么你的系统已经有一部打印机被 CUPS 所管理,且这部打印机在网络的网址为:

  • http://服务器IP:631/printers/打印机队列名称
  • http://192.168.100.254:631/printers/hpljp2015dn

接下来看看如何将它链接到咱们的 Samba 服务器中吧!


  • 3. 在 smb.conf 当中加入打印机的支持 (Optional)

开始告诉 Samba 将这部打印机给他分享出去吧!你需要这样处理:

[root@www ~]# vim /etc/samba/smb.conf
[global]
        # 得要修改 load printers 的设置,然后添加几个数据
        load printers = yes
        cups options  = raw       <==可支持来自 Windows 用户的打印工作
        printcap name = cups
        printing      = cups      <==与上面这两个在告知使用 CUPS 打印系统

[printers]                        <==打印机一定要写 printers 喔!
        comment = All Printers
        path    = /var/spool/samba<==缺省把来自 samba 的打印工作暂时放置的队列
        browseable = no           <==不被外人所浏览啦!有权限才可浏览
        guest ok   = no           <==与底下两个都不许访客来源与写入(非文件系统)
        writable   = no
        printable  = yes          <==允许打印很重要的一项工作!

[root@www ~]# testparm  <==若有错误,请自行处理一下
[root@www ~]# /etc/init.d/smb restart

基本上通过这样的设置你的 Samba 就能够顺利的提供打印机的服务了!不过可惜的是,Windows 用户端依旧得要安装打印机的驱动程序才能够使用 Samba 所提供的打印机,此时真是麻烦兼讨厌啊~有没有可能让 Samba 主动的提供驱动程序给用户,这样一来用户端就不需要额外去找驱动程序啰!是可以的,通过 Samba 3.x 即可处理!就这么巧, CentOS 的 Samba 就是 3.x 呢!所以我们可以通过底下的方式来处理。


  • 4. 让 Samba 主动提供驱动程序给 Windows 用户使用

另外,或许你会想,打印机的型号这么多,那么 Linux 该如何提供这些打印机的驱动程序啊?岂不麻烦? 还好啦, CUPS 主要是通过利用 Postscript 的打印语言与打印机沟通的,因此用户端只要取得 postscript 的驱动程序他们就能够使用咱们的 Samba 服务器所提供的打印机了!如此一来, 不论打印机的型号为何,只要他们能够支持 Postscript 的打印格式,OK 搞定!而且 CUPS 官网本身就有提供 CUPS 的 Postscript 驱动程序啰!可以到底下的链接去下载:

很棒的是,因为我们是 CentOS 5.x 有支持 rpm 软件封装的系统,因此可以直接下载 cups-windows-6.0-1.i386.rpm 这个文件即可,直接安装这个 rpm 文件就能够取得 cups 对 Windows 的打印机驱动程序了。 这个文件安装完毕之后,会将驱动程序放置于 /usr/share/cups/drivers/ 里头呦! 不过你得要注意的是,除了这个驱动程序外,要支持 Windows 2000 以后出产的 Windows 版本, 你还得到 Windows XP 底下的目录去下载几个 32 比特支持的文件:

  • Win XP 32 比特:C:\WINDOWS\system32\spool\drivers\w32x86\3

将该目录下里面的 PS 开头的文件通通下载下来,应该有四个文件的,请将他拷贝成为文件名小写的文件,并且放置到你 Samba 服务器上的 /usr/share/cups/drivers/ 目录下,该目录内放置的这就是基本的驱动程序说! 在鸟哥的这个目录底下至少含有这几个文件就是了:

[root@www ~]# ll /usr/share/cups/drivers
-rw-r--r-- 1 root root    803  4月 20  2006 cups6.inf
-rw-r--r-- 1 root root     72  4月 20  2006 cups6.ini
-rw-r--r-- 1 root root  12568  4月 20  2006 cupsps6.dll
-rw-r--r-- 1 root root  13672  4月 20  2006 cupsui6.dll  <==上面为 cups 提供
-rw-r--r-- 1 root root 129024  3月 24 13:29 ps5ui.dll    <==底下为 Win XP 提供
-rw-r--r-- 1 root root 455168  3月 24 13:29 pscript5.dll
-rw-r--r-- 1 root root  27568  3月 24 13:29 pscript.hlp
-rw-r--r-- 1 root root 792644  3月 24 13:29 pscript.ntf

上述的文件鸟哥将他打包成为一个文件了,你可以在底下的链接下载:

不过你得注意,这个文件内的 Windows 数据是由 32 比特的 Windows XP 上面捉来的,所以对于 Windows 98/ME 是没有作用的。同时,对于 64 比特的其他较晚期的 Windows 7 等系统可能就得要重新处理了! 你得自行上网查阅相关的数据下载方式喔。接下来我们必须要在 smb.conf 里面增加一笔新的分享数据,这个分享数据必须是 [print$] 名称才行!有点类似这样啦:

[root@www ~]# vim /etc/samba/smb.conf
[global]
....(设置保留原本数据)....
[homes]
....(设置保留原本数据)....
[printers]
....(设置保留原本数据)....
[print$]
        comment    = Printer drivers
        path       = /etc/samba/drivers  <==存放打印机驱动程序的目录
        browseable = yes
        guest ok   = no
        read only  = yes
        write list = root                <==这个驱动程序的管理员
[project]
....(设置保留原本数据)....

[root@www ~]# mkdir /etc/samba/drivers
[root@www ~]# chcon -t samba_share_t /etc/samba/drivers
# 由于缺省的 CUPS 仅有 root 能管理,因此我们以 root 作为打印机管理员;
# 同时 SELinux 的类型也要修订如上的方式!那 root 就得要加入 samba 的支持才行:
[root@www ~]# pdbedit -a -u root

[root@www ~]# testparm                 <==测试语法
[root@www ~]# /etc/init.d/smb restart  <==重新启动

[root@www ~]# smbclient -L //127.0.0.1 -U root
Password: <==输入 root 在 samba 的密码先
Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
        project         Disk      smbuser's project
        IPC$            IPC       IPC Service (This is vbird's samba server)
        hpljp2015dn     Printer   鸟哥实验室的一部激光打印机
        root            Disk      Home Directories
# 瞧!有看到一部打印机以及驱动程序所在的分享数据啰!

现在我们要告知 Samba 说,我们的 CUPS 可提供 Windows 用户端的驱动程序,所以用户不需要自行设置他们的驱动程序哩! 要由 cups 告知 Samba 是由 cupsaddsmb 这个指令来搞定的,整个指令的运行很简单的:

[root@www ~]# cupsaddsmb [-H SAMBA 服务器名] [-h CUPS 服务器名] \
>   -a -v [-U 用户帐号]
选项与参数:
-H :后续接的是 Samba 服务器名,本机的话可以直接用 localhost 即可;
-h :后续接的为 CUPS 的服务器名,同样的可使用 localhost 即可;
-a :自动搜索出所有可用的 CUPS 打印机;
-v :列出更多的信息;
-U :打印机管理员

# 利用前面的说明将打印机驱动程序挂上 SAMBA (注意 CUPS 管理员缺省是 root)
[root@www ~]# cupsaddsmb -H localhost -U root -a -v
需要 root 的密码以通过 SAMBA 访问 localhost:<==输入 root 在 SAMBA 密码
# 这里会闪过很多的消息,说明已经安装了某些信息,底下鸟哥仅列出简单的消息而已。
正在运行命令:smbclient //localhost/print$ -N -A /tmp/cupsXzBTmn -c
“mkdir W32X86;put /tmp/cupsyu3WEe W32X86/hpljp2015dn.ppd;...

正在运行命令:smbclient //localhost/print$ -N -A /tmp/cupsXzBTmn -c
“put /usr/share/cups/drivers/cups6.ini W32X86/cups6.ini;...

正在运行命令:rpcclient localhost -N -A /tmp/cupsXzBTmn -c“adddriver 
"Windows NT x86" "hpljp2015dn:pscript5.dll:hpljp2015dn.ppd:....
Printer Driver hpljp2015dn successfully installed.

正在运行命令:rpcclient localhost -N -A /tmp/cupsXzBTmn -c“setdriver 
hpljp2015dn hpljp2015dn”
Succesfully set hpljp2015dn to driver hpljp2015dn.

[root@www ~]# ll /etc/samba/drivers
drwxr-xr-x 3 root root 4096  3月 24 16:41 W32X86  <==这就是驱动程序目录

最后在驱动程序的存放目录会多出一个 W32X86 的目录,你可以查找一下该目录的内容, 那就是预计要给用户端使用的驱动程序啦!这样就搞定了!不过,为了将所有的数据通通驱动, 建议你将 CUPS 及 SAMBA 通通重新启动吧!

[root@www ~]# /etc/init.d/cups restart
[root@www ~]# /etc/init.d/smb restart

  • 5. 一些问题的克服:

如果一切顺利的话,你在 Windows 用户端应该可以顺利的连接到打印机啰! 开心吧!不过,如果你曾经印错数据,那么该如何进入 Linux 的 Samba 主机将该数据移除呢? 你最好知道底下的几个指令,关于这些指令的高端用法则请自行给他 man 看看了:

# 1. 列出所有可用的打印机状态
[root@www ~]# lpstat -a
hpljp2015dn 从 西元2011年03月23日 (周三) 22时56分54秒 开始接受请求

# 2. 查找目前缺省打印机的的工作情况
[root@www ~]# lpq
hpljp2015dn 已就绪
没有项目
# 列出打印机的工作,若有打印工作存在时 (例如关掉打印机再印测试页),会如下所示:
hpljp2015dn 已就绪并正在打印
等级    拥有人  工作    文件                            总计  大小
active  root    2       Test Page                       17408 byte

# 3. 删除所有的工作项目喔!
[root@www ~]# lprm -
# 加上那个减号 (-) 代表移除所有等待中的打印工作!

打印工作就是这样进行的啦!赶紧试看看吧!接下来探讨一下相关的防火墙与安全性的讨论!

16.2.6 安全性的议题与管理

使用 SAMBA 其实是有一定程度的危险性的,这是因为很多网络攻击的蠕虫、病毒、木马就是通过网芳来攻击的! 为了抵挡不必要的连接,所以 CentOS 5.x 缺省的 SELinux 已经关闭了很多 Samba 连接的功能, 因此缺省情况下,很多用户端的挂载可能会有问题。此外,仅开放有权限的网域来源,以及通过 smb.conf 来管理特定的权限,也是很重要的!同时,Linux 文件系统的 r, w, x 权限也是需要注意的喔! 我们底下就简单的介绍一下一些基本的安全性管理吧!


  • SELinux 的相关议题:

其实就如同第七章 (7.4.5) 里面提到的,我们通过注册表的内容就能够知道如何解决 SELinux 对各个服务所造成的问题了。不过,既然我们知道服务是 Samba 了,能不能找出与 Samba 有关的 SELinux 规则呢?当然可以!基本的 Samba 规则主要有:

[root@www ~]# getsebool -a | grep samba
samba_domain_controller --> off  <==PDC 时可能会用到
samba_enable_home_dirs --> off   <==开放用户使用家目录
samba_export_all_ro --> off      <==允许唯读文件系统的功能
samba_export_all_rw --> off      <==允许读写文件系统的功能
samba_share_fusefs --> off
samba_share_nfs --> off
use_samba_home_dirs --> off      <==类似用户家目录的开放!
virt_use_samba --> off

看吧!几乎所有的规则缺省都是关闭的!所以我们需要慢慢的打开啊!目前我们仅会用到用户的家目录以及分享成为可读写, 不过似乎仅要 samba_enable_home_dirs 那个项目设置妥当即可喔!因此我们可以这样做:

[root@www ~]# setsebool -P samba_enable_home_dirs=1
[root@www ~]# getsebool -a | grep samba_enable_home
samba_enable_home_dirs --> on

这样用户挂载他们的家目录时 (例如 smb1 使用 //127.0.0.1/smb1/) 就不会出现无法挂载的怪问题了!此外, 由于分享成为 Samba 的目录还需要有 samba_share_t 的类型。那我们还有分享 /home/project 还记得吗?那个目录也需要修订喔! 这样做看看:

[root@www ~]# ll -Zd /home/project
drwxrws---  root users root:object_r:user_home_dir_t    /home/project/

[root@www ~]# chcon -t samba_share_t /home/project
[root@www ~]# ll -Zd /home/project
drwxrws---  root users root:object_r:samba_share_t      /home/project/

如果你分享的目录不只是 Samba ,还包括 FTP 或者是其他的服务时,那可能就得要使用 public_content_t 这个大家都能够读取的类型才行!若你还有发现任何 SELinux 的问题,请依照 /var/log/messages 里面的信息去修订吧!


  • 防火墙议题:利用 iptables 来管理

最简单的管理登录 SAMBA 的方法就是通过 iptables 啦!详细的说明我们已经在第九章防火墙中提过了,所以这里不再详加说明。 要知道的是,如果你仅要针对底下的范围开放 Samba 时,可以这样想:

  • 仅针对 192.168.100.0/24, 192.168.1.0/24 这两个网域开放 SAMBA 使用权
  • SAMBA 激活的 port UDP: 137, 138 及 TCP: 139, 445;

所以 iptables.allow 规则当中应该要加入这几项:

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
# 加入底下这几行!
iptables -A INPUT -i $EXTIF -p tcp -s 192.168.100.0/24 -m multiport \
         --dport 139,445 -j ACCEPT
iptables -A INPUT -i $EXTIF -p tcp -s 192.168.1.0/24 -m multiport \
         --dport 139,445 -j ACCEPT
iptables -A INPUT -i $EXTIF -p udp -s 192.168.100.0/24 -m multiport \
         --dport 137,138 -j ACCEPT
iptables -A INPUT -i $EXTIF -p udp -s 192.168.1.0/24 -m multiport \
         --dport 137,138 -j ACCEPT
[root@www ~]# /usr/local/virus/iptables/iptables.rule

这是很简单很简单的防火墙规则,你必须要依据你的环境自行修改 (通常修改那个 192.168.1.0/24 网段即可!)。 由于 smbd 及 nmbd 并不支持 TCP Wrappers ,所以你也只能通过 iptables 来控制了~


  • 防火墙议题: 通过内置的 Samba 设置 (smb.conf)

事实上 Samba 已经有许多防火墙机制啦!那就是在 smb.conf 内的 hosts allow 及 hosts deny 这两个参数。 通常我们只要使用 hosts allow 即可,那么没有写入这个设置项目的其他来源就会被拒绝连接的!这是比较严格的设置。 举例来说,如果你只想要让本机、192.168.100.254, 192.168.100.100, 192.168.1.0/24 使用 SAMBA 而已,那么可以这样写:

[root@www ~]# vim /etc/samba/smb.conf
[global]
        # 跟防火墙的议题有关的设置
        hosts allow = 127. 192.168.100.254 192.168.100.100 192.168.1.
[homes]
....保留原始设置....
[root@www ~]# testparm
[root@www ~]# /etc/init.d/smb restart

这个设置值的内容支持部分比对,因此 192.168.1.0/24 只要写出前面三个 IP 段即可 (192.168.1.)。 如此一来不但只有数部主机可以登录我们的 SAMBA 服务器,而且设置值又简单!不像 iptables 写的落落长~ 鸟哥建议在防火墙议题方面,只要使用 iptables 或 hosts allow 其中一项即可,当中又以 hosts allow 较为建议唷! 当然啦,如果你是针对区网开放的,那么设置 iptables 防火墙反而是比较好的呦!因为不需要更动到 smb.conf 设置档嘛!让服务的设置变的比较单纯些~


  • 文件系统议题:利用 Quota 限制用户磁盘使用

既然网芳是要分享文件系统给用户的,那么想当然尔,各个 Samba 用户们确实会将数据放置到你的 Samba 服务器上嘛! 那万一单个用户随便上传个数百 GB 的容量到你的 Samba 服务器,而且常常给你随意访问一番, 会不会造成文件系统分配不公或者是带宽方面的问题呢?想想就觉得是『会嘛!』那怎办?就通过 Quota 磁盘配额啊! 磁盘配额我们在基础篇第三版第十五章已经谈过,在本书第一章 (1.2.2-3) 里面也已经有实作过, 在底下请你依据第一章的后续动作来处理吧!

例题:
我们预计分配 smb1, smb2, smb3 在他们自己的家目录下,各拥有 300MB/400MB (soft/hard) 的磁盘配额限量,那该如何做?
答:
请先依据第一章的 Quota (1.2.2-3) 相关数据处理完:
  • /etc/fstab 加入 /home 挂载点的 usrquota,grpquota 等设置值;
  • 重新挂载 /home ,让 Quota 实际被支持;
  • 以 quotacheck -avug 创建 Quota 的数据库文件;
  • 启动 Quota ;
假若你已经于第一章就处理完毕了,那么这一题就非常简单喔!通过 edquota -u smb1 来处理即可!
[root@www ~]# edquota -u smb1
Disk quotas for user smb1 (uid 2004):
  Filesystem                blocks  soft    hard    inodes  soft   hard
  /dev/mapper/server-server     56  300000  400000       7     0      0

[root@www ~]# edquota -p smb1 smb2
[root@www ~]# edquota -p smb1 smb3
[root@www ~]# repquota -ua
*** Report for user quotas on device /dev/mapper/server-server
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
smb1      --      56  300000  400000              7     0     0
smb2      --      56  300000  400000              7     0     0
smb3      --      56  300000  400000              7     0     0

16.2.7 主机安装时的规划与中文磁区挂载

现在你知道 Samba 服务器的功能是用来作为文件服务器的,每个用户都可以拥有家目录,并通过网芳的功能来链接到 Samba 服务器中。这就有个问题啦,那就是你的用户如果太多,并且将他们的重要数据都放到这部 Samba 服务器上头的话,那肯定 /home 未来会有点不足啊!所以 /home 所在的磁盘或许可以使用大一点的硬盘, 或者使用磁盘数组,使用 LVM (基础学习篇第三版十五章) 也是个不错的方案。 底下为简单的思考方向:

  • 在安装 Linux 的时候,建议不需要安装 X Window ;
  • 在规划 Linux 时,/home 最好独立出一个 partition ,而且硬盘空间最好能够大一些;
  • /home 独立出来的 partition 可以单独进行 quota 的作业,以规范用户的最大硬盘用量;
  • 无网卡的打印机 (USB) 可直接链接到 Linux 主机再通过 Samba 分享;
  • 由于 SAMBA 一般来说都仅针对内部 (LAN) 主机进行开放,所以,可能的话 SAMBA 主机直接使用 private IP 来设置即可,当然啦, SAMBA 是否使用 private IP 还得视你的整个网域的 IP 网段的特性来规划。 以鸟哥研究室来说,因为实验室所有电脑的 IP 都是 Public IP,那么 SAMBA 如果使用 Private IP 反而会让大家都无法连接上啊! ^_^
  • 如果你的 SAMBA 主机使用 Public IP 时,请特别留意规范好防火墙的设置,尽量仅让 LAN 内的电脑可以连接进来即可,不要对 Internet 开放喔!

另外,如果你的 Samba 服务器需要挂载含有中文的 partition 时,譬如说你将原本 Windows XP 的 FAT32 文件系统挪到 Linux 系统下,此时如果用一般模式来挂载该分区时,一些中文文件名可能会无法被顺利的显示出来。 这个时候你就得需要这样做了:

mount -t vfat -o iocharset=big5,codepage=950 /dev/sd[a-p][1-15] /mount/point

其中 iocharset 指的是本机的语系编码方式, codepage 则与远程软件有关。因为我们是在本机进行挂载, 所以实际上使用 iocharset 这个参数即可啦!更多说明则请看下节的用户端设置部分啰!

16.3 Samba 用户端软件功能

现在你已经架设好了 Samba 服务器啦!有服务器当然要有用户端来使用才是好的服务器嘛!不然要这个服务器干嘛? 而我们假设局域网路内有 Windows/Linux 系统,这两种系统都是通过 NetBIOS over TCP/IP 来连上 Samba 服务器的, 在设置之前你必须要知道的有几件事:

  • 在区网内的主机最好具有相同的工作群组,且具有不同的主机名称;
  • Windows XP pro. 最多仅能允许十个用户同时连接到自己的网芳;
  • 你可以在网芳当中看到的通常是相同群组的主机;
  • 可以使用『搜索』-->『电脑』-->『输入 IP』来查到 Samba 主机;
  • Windows 的网芳缺省仅有同一 IP 网段的主机才能登录 (Windows 防火墙设置)!

接下来咱们就分别依照 Windows XP 及 Linux 系统来做说明吧!

16.3.1 Windows 系统的使用

在 Windows 上面的搜索网络上的网芳主机实在挺简单的,你有好几种方法可以处理:

  • 打开『文件总管』,『网上邻居』、『整个网络』、『Microsoft Windows Network』 就能看到属于你群组的所有电脑主机了!

  • 『开始』、『搜索』、『文件或文件夹』、『电脑或人员』、『网络上的电脑』,然后在出现的方框当中填写正确的 IP ,按下『搜索』即可!这个方法可以适用于不在同一个群组当中的网络主机喔!

举例来说,如果想要连接到我们的 Samba 主机的话,而又不知到这部 Samba 主机的 NetBIOS name , 那利用搜索的结果会有点类似如下的图标:

Windows XP 用户端搜索示意图
图 16.3-1、Windows XP 用户端搜索示意图

上图中先在左侧的地方输入正确的 IP 后,按下搜索,如果一切顺利的话那么右上方就会出现这部 Samba 服务器的说明了。 双击一下该主机名称,就会出现右下方的项目!瞧!那就是我们之前所设置的几个基本项目的啦!真是好高兴! 然后你就可以开始进入相对应的目录进行数据的访问了,就这么简单。 如果是打印机的话,那么你将鼠标移动到打印机的上方,按下右键后可以选择『连接』的项目,如下所示:

Windows XP 用户端连接打印机示意图
图 16.3-2、Windows XP 用户端连接打印机示意图

如果一切顺利的话,嘿嘿!你就可以在点击『开始』、『设置』、『打印机和传真』后所出现的窗口看到这部打印机啰! 真是好棒呐! ^_^!另外,如果你想要每次 Windows 开机后都自动的将某个网芳的目录自动挂载到文件总管内呢? 那么可以使用底下的方式,在要挂载的目录上按下右键:

Windows XP 用户端连接网络磁盘机
图 16.3-3、Windows XP 用户端连接网络磁盘机

选择网络磁盘机之后就会出现如下的图标,你可以自己调整想要的盘符,例如缺省的 Z 槽, 那么以后你的文件总管中就会生出一个 Z 槽,该磁盘槽就代表 \\192.168.1.10\project 那个分享的目录啰!

Windows XP 用户端连接网络磁盘机
图 16.3-4、Windows XP 用户端连接网络磁盘机


  • 让 Windows 系统的网芳支持不同网域的 IP 连接

由于网芳的资安问题越来越严重,因此 Windows XP 之后的版本都缺省仅开放本机 IP 网域的网芳连接而已。 如果你的 Windows 想要让别人可以在 Internet 或不同的 IP 网段对你连接时,你就得修改一下防火墙的设置啊! 请叫出控制台,然后点击『Windows 防火墙』就会出现如下的图标了:

Windows XP 服务器防火墙示意图
图 16.3-5、Windows XP 服务器防火墙示意图

按照上图的说明,依序点击『例外』、『文件及打印机共用』、『编辑』后, 就会出现该防火墙机制所管理的端口口以及可连接的网域,如下图所示:

Windows XP 服务器防火墙示意图
图 16.3-6、Windows XP 服务器防火墙示意图

你可以将四组端口口通通改变成你所需要的 IP 来源,或者是将他设置为任何电脑都能连接。 不过,鸟哥不建议喔!可以参考底下的作法:

Windows XP 服务器防火墙示意图
图 16.3-7、Windows XP 服务器防火墙示意图

选择自订的方式来设置能够使用你 Windows 网芳数据的来源 IP 或网段即可,然后确定之后即可处理呐! 这样一来,即使我们的 Linux 不与 Windows 同在一个网域中,也能够登录 Windows 访问网芳数据哩。


  • 通过 port 445 的特殊登录方式

如果你知道 Samba 服务器有激活 port 445 ,并且他已经分享了某个目录时,举例来说,我们的 192.168.100.254 有分享出 project 这个分享资源名称时,那么这个目录的完整写法为:『 \\192.168.100.254\project 』, 我们可以通过『开始』、『运行』来处理这个玩意儿!如下所示:

Windows XP 通过 port 445 连接
图 16.3-8、Windows XP 通过 port 445 连接

如果可以登录的话就会顺利登录,否则就会弹出一个要你输入帐号密码的窗口,输入正确的数据即可! 呼呼!真过瘾~除此之外,我们还可以登录别人 Windows 主机的 C 或 D 槽喔!写法则变成这样:

  • \\192.168.1.21\c$

所以说,怕了吧!俺还真害怕~所以啊,Samba 没必要时,那个 port 445 应该是可以关闭的吧!

16.3.2 Linux 系统的使用


  • smbclient:查找网芳分享的资源,以及使用类似 FTP 的方式上传/下载网芳

咱们的 Samba 有提供 Linux 网芳的用户端功能喔!也就是说 Linux 可以挂载 Samba 服务器也能挂载 Windows 提供的网芳啦!主要是通过 smbclient 来观察,再以 mount 来挂载文件系统哩。先来介绍一下 smbclient 这个指令吧:

# 1. 关于查找的功能,例如查出 192.168.100.254 的网芳数据
[root@client ~]# smbclient -L //[IP|hostname] [-U username]
[root@client ~]# smbclient -L //192.168.100.2541 -U smb1
Password:
Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]

        Sharename       Type      Comment
        ---------       ----      -------
        IPC$            IPC       IPC Service (This is vbird's samba server)
        project         Disk      smbuser's project
        print$          Disk      Printer Drivers
        hpljp2015dn     Printer   鸟哥实验室的一部激光打印机
        smb1            Disk      Home Directories <==等一下用这个当范例
Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
        VBIRDHOUSE           VBIRDSERVER
# 从这里可以知道在目前网域当中有多少个工作群组与主要的名称解析主机

除了这个先前用过的查找功能之外,我们可以这样简易使用网芳的:

# 2. 利用类似 FTP 的方式登录远程主机
[root@client ~]# smbclient '//[IP|hostname]/资源名称' [-U username]
# 意思是使用某个帐号来直接登录某部主机的某个分享资源,举例如下:
[root@client ~]# smbclient '//192.168.100.254/smb1' -U smb1
Password:
Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_5.1]
smb: \> dir
# 在 smb: \> 底下其实就是在 //192.168.100.254/dmtsai 这个目录底下啦!所以,
# 我们可以使用 dir, get, put 等常用的 ftp 指令来进行数据传输了!
?   :列出所有可以用的指令,常用!
cd  :变换到远程主机的目录
del :杀掉某个文件
lcd :变换本机端的目录
ls  :察看目前所在目录的文件
dir :与 ls 相同
get :下载单一文件
mget:下载大量文件
mput:上传大量文件
put :上传单一文件
rm  :删除文件
exit:离开 smbclient 的软件功能
# 其他的指令用法请参考 man smbclient 喔!

  • mount.cifs:直接挂载网芳成为网络磁盘机

事实上,使用 smbclient 一点也不方便,因为使用的是 ftp 的功能语法,有点怪怪的~能不能像 Windows 那样,可以直接连接网络磁盘机啊?这当然没有问题!不过就需要借由 mount.cifs 来协助了!

早期的 Samba 主要是提供 smbmount 或 mount.smbfs 这个指令来挂载 (smbfs 是 SMB filesystem 的缩写), 不过这个指令已经被可以进行比较好的编码判断的 mount.cifs 所取代啦!mount.cifs 可以将远程服务器分享出来的目录整个给他挂载到本机的挂载点,如此一来, 远程服务器的目录就好像在我们本机的一个分区一样喔!可以直接运行拷贝、编辑等动作!这可就好用的多了! 底下我们来谈一谈怎么用这个 mount.cifs 吧!

[root@client ~]# mount -t cifs //IP/分享资源 /挂载点 [-o options]
选项与参数:
-o 后面接的参数 (options) 常用的有底下这些:
   username=你的登录帐号:例如 username=smb1
   password=你的登录密码:需要与上面 username 相对应啊!
   iocharset=本机的语系编码方式,如 big5 或 utf8 等等;
   codepage=远程主机的语系编码方式,例如繁体中文为cp950

# 范例一:以 smb1 的身份将其家目录挂载至 /mnt/samba 中
[root@client ~]# mkdir /mnt/samba
[root@client ~]# mount -t cifs //192.168.100.254/smb1 /mnt/samba \
> -o username=smb1,password=4321,codepage=cp950
[root@client ~]# df
文件系统               1K-区段      已用     可用 已用% 挂载点
//192.168.100.254/smb1
                      25396668    176724  23914208   1% /mnt/samba

经由 mount 的动作,我们就可以轻易的将远程分享出来的咚咚给他挂载到自己 Linux 本机上面!好用的很~更详细的 mount 用法,请 man mount!


  • nmblookup:查找 NetBIOS name 与 IP 及其他相关信息:

现在我们可以通过一些 NetBIOS 相关的功能来取得 NetBIOS name ,不过,如果你还想要知道这个 NetBIOS name 的其他信息时, 例如 IP、分享的资源等等,那可以使用 nmblookup 这个指令来搞定即可。他是这么使用的:

[root@client ~]# nmblookup [-S] [-U wins IP] [-A IP] name
选项与参数:
-S :除了查找 name 的 IP 之外,亦会找出该主机的分享资源与 MAC 等;
-U :后面一般可接 Windows 的主要名称管理服务器的 IP ,可与 -R 互用;
-R :与 -U 互用,以 Wins 服务器来查找某个 Netbios name;
-A :相对于其他的参数, -A 后面可接 IP ,藉 IP 来找出相对的 NetBIOS 数据;

# 范例一:借由 192.168.100.254 找出 vbirdserver 这部主机的 IP 地址
[root@client ~]# nmblookup -U 192.168.100.254 vbirdserver
querying vbirdserver on 192.168.100.254
192.168.100.254 vbirdserver<00>
192.168.1.10 vbirdserver<00>    <==之前鸟哥就说有两个 IP 嘛!俺的主机!

# 范例二:找出 vbirdserver 的 MAC 与 IP 等信息:
[root@client ~]# nmblookup -S vbirdserver
querying vbirdserver on 192.168.100.255  <==在区网内广播开始找!
192.168.100.254 vbirdserver<00>          <==找到 IP 啰!
Looking up status of 192.168.100.254
        VBIRDSERVER     <00> -         B <ACTIVE>
        ..__MSBROWSE__. <01> - <GROUP> B <ACTIVE>
        VBIRDHOUSE      <00> - <GROUP> B <ACTIVE>

  • smbtree:网上邻居浏览器显示模式!

如果你想要使用类似 Windows 上面,可以一看就明了各个网芳所分享的资源时,你能使用 smbtree 来直接查找喔! 这个指令更简单!直接输入就能用:

[root@client ~]# smbtree [-bDS]
选项与参数:
-b :以广播的方式取代主要浏览器的查找
-D :仅列出工作群组,不包括分享的资源
-S :列出工作群组与该工作群组下的电脑名称 (NetBIOS) 不包括各项资源目录

# 范例一:列出目前的网芳树状相关图
[root@client ~]# smbtree
Password:  <==直接按 [Enter] 即可!
VBIRDHOUSE
    \\VBIRDSERVER               This is vbird's samba server
        \\VBIRDSERVER\hpljp2015dn   鸟哥实验室的一部激光打印机
        \\VBIRDSERVER\print$        Printer Drivers
        \\VBIRDSERVER\project       smbuser's project
        \\VBIRDSERVER\IPC$          IPC Service (This is vbird's samba server)

[root@client ~]# smbtree -S
Password:
VBIRDHOUSE
    \\VBIRDSERVER               This is vbird's samba server
# 此时仅有工作群组与电脑名称而已呢!

  • smbstatus:观察 SAMBA 的状态

其实这个指令算是服务器的相关功能啦!因为它主要的目的是查阅目前 SAMBA 有多少人来连接, 且哪些资源分享已经被使用等等的信息。所以如果你想要使用这个软件,请先安装 samba 喔!简单用法如下:

[root@www ~]# smbstatus [-pS] [-u username]
选项与参数:
-p :列出已经使用 SAMBA 连接的进程 PID ;
-S :列出已经被使用的资源分享状态;
-u :只列出某个用户相关的分享数据

# 范例一:列出目前主机完整的 Samba 状态
[root@www ~]# smbstatus
Samba version 3.0.33-3.29.el5_5.1
PID     Username      Group         Machine
-------------------------------------------------------------------
 2656   smb1          smb1          ksu-dic      (192.168.1.101)
 3800   smb1          smb1          192.168.100.254 (192.168.100.254)
 3979   smb1          smb1          192.168.100.100 (192.168.100.100)
# 上半部主要在列出目前连接的状态中,主要来自那个用户端机器与登录的用户名

Service  pid     machine          Connected at
---------------------------------------------------
smb1     3800   192.168.100.254  Tue Mar 29 23:10:56 2011
smb1     3979   192.168.100.100  Wed Mar 30 00:28:39 2011
IPC$     2656   ksu-dic          Tue Mar 29 15:11:30 2011
# 这部分则显示出,目前有几个目录被使用了?那个 smb1 代表 //IP/smb1/ 喔!

你可以通过这个小程序来了解到目前有多少人使用你的 SAMBA 的啦!

16.4 以 PDC 服务器提供帐号管理

我们在 16.1.5 约略谈过 PDC 这个玩意儿,他可以让用户在电脑教室的任何一个地方,都用同一组帐号密码登录, 并可取得相同的家目录等数据,这与我们之前谈到的,在 Linux 底下使用 NIS 搭配 NFS 是很类似的作法! 只是它是用在 Windows 上头就是了。那如何完成呢?我们底下就来谈谈这个玩意儿!^_^

16.4.1 让 Samba 管理网域用户的一个实作案例

前面介绍的内容都是属于 Peer/Peer 的连接状况,也就是 Samba 服务器与 Windows 用户端其实是平等地位的啦! 所以 Windows 用户端需要知道 Samba 服务器内的帐号密码数据后,才能够顺利的使用 Samba 的资源。 不过,这样的方式在较大型一些的局域网路环境可能就会有点困扰,例如学校的环境。

举例来说,如果你有一个电脑教室里面有 50 部 Windows XP Pro. 的个人电脑,由于电脑教室大家都会使用, 因此里面这 50 部个人电脑有使用还原精灵,也就是每次电脑重新开机后整个操作系统就会还原成原本的样子。 但我们知道用户总是需要有个人家目录吧?他们总不希望这次的工作在重新开机后就失去了~ 所以我们可以利用一部主机来让他们保存数据啊!那就是 Primary Domain Controller (PDC) 服务器。

其实 Samba PDC 的作用很简单,就是让 Samba PDC 成为整个局域网路的领域管理员 (domain controller), 然后让 Windows 主机加入这个领域,未来用户利用 Windows 登录时,(1)Windows 会前往 PDC 服务器取得用户的帐号密码, 同时 (2)PDC 还会发送用户的重要数据到那部 Windows 个人电脑上,而 Windows 电脑上的用户注销时, (3)该用户修改过的数据也会回传给 PDC 。如此一来不管这个用户在哪一部个人电脑上面登录, 他都能够取得正确的个人数据!很棒的作用吧!

PDC 是个很复杂的环境,他可以达到的功能相当的多,而且密码的验证也不必在同一部 PDC 主机上面, 不过这里我们不谈那么复杂的东西,只是做一个简单的练习,因此底下的这部 PDC 使用 Linux 自己的密码来进行验证, 并且也只管理自己所分享出去的资源啰!至于假设网络环境与相关工作群组参数如下:

一个简易的 PDC 实作案例相关参数示意图
图 16.4-1、一个简易的 PDC 实作案例相关参数示意图

整个基本的设置流程应该是这样的:

  • 区网电脑环境设置:整体网域设置好,尤其 Windows 的工作群组与电脑名称及 IP 等参数;
  • PDC 设置:因为 PDC 管理自己的密码,所以 security = user;
  • PDC 最好拥有整个网域的名称解析权力,亦即成为主要的名称解析器;
  • 需有 netlogon 资源分享,提供 windows 2000/XP pro. 用户端的登录之用;
  • 由于 Windows 需读入个人设置档,缺省目录为 profile,Linux 系统需预先设置此目录;
  • 增加 PDC 上的用户帐号以及机器代码 (machine account) 等等
  • 在 Windows 2000/XP pro. 个人电脑上设置成为 PDC 的用户端。

底下咱们就来依序处理处理先!

16.4.2 PDC 服务器的建置

PDC 服务器的创建非常的麻烦,需要一步一步的实作进行,挺讨厌的。而且,由于建置 PDC 的环境主要在管理整个区网内的 Windows 电脑,因此每部 Windows 电脑的主机名称与相关参数要先确定下来,如同上一小节的图标内, 每部电脑的角色定位都需要清楚才行。清楚了各个电脑的角色后,接下来就能够慢慢的实作进行啰!


  • 1. 建置 NetBIOS 与 IP 对应的数据:设置 lmhosts 与 /etc/hosts

由于我们的 Samba 即将成为整个网域的名称解析者,因此你最好将整个网域的 NetBIOS name 与 IP 的对应写入 lmhosts 文件当中。如果你的区网是以 DHCP 发放 IP 的,那么你最好搭配 DNS 系统去建置你的主机名称对应信息, 否则主机名称对应不起来,总是有点困扰。在这个案例中,由于鸟哥使用的 NetBIOS name (如 vbirdserver) 与主机名称 (如 www.centos.vbird) 并不相同,因此这里建议需要修改 lmhosts 才好。

[root@www ~]# vim /etc/samba/lmhosts
127.0.0.1       localhost      <==这行是缺省存在的,不要动他,底下的请自行添加
192.168.100.254 vbirdserver
192.168.100.1   vbirdwinxp
192.168.100.2   vbirdwin7
192.168.100.100 vbirdlinux

[root@www ~]# vim /etc/hosts
192.168.100.254 www.centos.vbird        vbirdserver
192.168.100.100 client.centos.vbird     vbirdlinux
192.168.100.1   vbirdwinxp
192.168.100.2   vbirdwin7

由于 Linux 上的 Samba 很多数据还是与 TCP/IP 的主机名称有关,所以除了 lmhosts 之外,建议还是处理一下 /etc/hosts 比较妥当!这样就行啦!


  • 2. 建置 PDC 主设置:处理 smb.conf

假设我们要让 PDC 用户端登录时可以取得他自己的家目录,那么需要这样处理:

[root@www ~]# vim /etc/samba/smb.conf
[global]
        workgroup       = vbirdhouse   <==请务必确认一下工作群组与主机名称
        netbios name    = vbirdserver
        server string   = This is vbird's samba server
        unix charset    = utf8
        display charset = utf8
        dos charset     = cp950
        log file        = /var/log/samba/%m.log
        max log size    = 50
        security        = user
        passdb backend  = tdbsam
        load printers   = yes
        cups options    = raw
        printcap name   = cups
        printing        = cups

        # 与 PDC 有关的一些设置值:
        # 底下几个设置值处理成为本局域网路内的主要名称解析器
        preferred master = yes
        domain master    = yes
        local master     = yes
        wins support     = yes
        # 操作系统 (OS) 等级越高才能成为主网域的控制者,一般 NT 为 32,
        # Windows 2000 为 64 ,所以这里我们设置高一点,但不可超过 255
        os level      = 100
        # 底下则是设置能否利用 PDC 登录,且登录需要进行哪些动作:
        domain logons = yes
        logon drive   = K:              <==登录后家目录挂载成 Windows 哪一槽
        logon script  = startup.bat     <==每个用户登录后会自动运行的程序
        time server   = yes             <==自动调整 Windows 时间与 Samba 同步
        admin users   = root            <==缺省的管理员帐号!缺省为 root 
        logon path    = \\%N\%U\profile <==用户的个人化设置
        logon home    = \\%N\%U         <==用户的家目录位置!

# 这个在指定登录者能够进行的工作,里面主要是具有许多运行程序:
[netlogon]  <==与前面的 logon script 有关,该程序放置在这里
   comment         = Network Logon Service
   path            = /winhome/netlogon  <==你要自己主动创建此目录
   writable        = no
   write list      = root
   follow symlinks = yes
   guest ok        = yes

[homes]
....(底下保留原本设置)....

[root@www ~]# testparm
[root@www ~]# /etc/init.d/smb restart

上面的设置有几个地方比较有趣一点:

  • time server:要使 Samba 与 Windows 主机的时间同步,使用这个项目;
  • logon script:当用户以 Windows 用户端登录后,Samba 可以提供一支批量档,让用户去设置好他们自己的目录配置。整个配置的内容记录在 startup.bat 当中。 你要注意的是,这个 startup.bat 文件名可以随意更改,不过他必须要放置到 [netlogon] 所指定的目录内;
  • logon drive:那么这个家目录要挂载到那个分区? 在 Windows 底下大多以 C, D, E... 做为磁盘的代号,你这里可以指定一下家目录要放置成为那个磁盘代号;
  • admin users:指定这个 Samba PDC 的管理员身份。
  • [netlogon]:指定利用网络登录时首先去查找的目录资源。
  • logon path:用户登录后,会取得的环境设置数据在哪? 我们知道用户会有一堆环境数据,例如桌面等,这些东西都放置到这里来。使用的变量中, %N 代表 PDC 服务器的位置, %U 则代表用户的 Linux 家目录。因此最终你得要有 ~someone/profile 的目录才可以
  • logon home:用户的家目录,缺省与 Linux 的家目录相同位置。


  • 3. 创建 Windows 用户端登录时所需的设置数据 netlogon 目录

先来创建 [netlogon] 内所需要的数据好了,那就是一个目录。由于鸟哥预计将所有的 PDC 数据通通放置到 /winhome 当中,包括用户家目录,因此很多东西都需要修订喔!包括后来的 SELinux 肯定会出问题的~

[root@www ~]# mkdir -p /winhome/netlogon

接下来我们还得要创建允许用户运行的文件,就是那个 startup.bat 才行! 注意一下,我们这里假设用户家目录为 K 槽,那你可以这样做:

[root@www ~]# vim /winhome/netlogon/startup.bat
net time \\vbirdserver /set /yes
net use K: /home
# 这个文件的格式为:net use [device:] [directory]

# 再将该文件转成 DOS 的断行格式才行!因为是提供给 Windows  系统嘛!
[root@www ~]# unix2dos /winhome/netlogon/startup.bat
[root@www ~]# cat -A /winhome/netlogon/startup.bat
net time \\vbirdserver /set /yes^M$
net use K: /home^M$
# 瞧见吗?会多出个奇怪的 ^M 符号,那就是 Windows 断行字符。


  • 4. 创建 Windows 专用的用户

因为鸟哥预计将用户全部挪到 /winhome 底下,而且每个用户家目录应该还要有 profile 目录存在才行, 为了避免麻烦,所以我们先到 /etc/skel 去处理一下,然后才创建帐号,最后才产生 samba 用户吧! 产生 samba 用户可以使用 pdbedit 也能够直接使用 smbpasswd -a ,因为没有要用特殊的参数, 所以,Samba 用户就用旧的 smbpasswd 来处理即可。

[root@www ~]# mkdir /etc/skel/profile
[root@www ~]# useradd -d /winhome/dmtsai dmtsai
[root@www ~]# useradd -d /winhome/nikky  nikky
[root@www ~]# smbpasswd -a root
[root@www ~]# smbpasswd -a dmtsai
[root@www ~]# smbpasswd -a nikky
[root@www ~]# pdbedit -L
dmtsai:2007:
root:0:root
nikky:2008:
smb1:2004:
student:500:student
smb2:2005:
# 重点是需要有画底线的那几个人物出现才行呦!

[root@www ~]# ll /winhome
drwx------ 4 dmtsai dmtsai 4096  3月 30 16:51 dmtsai
drwxr-xr-x 2 root   root   4096  3月 30 15:41 netlogon
drwx------ 4 nikky  nikky  4096  3月 30 16:51 nikky
# 用户的家目录不是在 /home 而是在 /winhome 里头才是对的呦!

那以后添加的用户都有可以存放来自 Windows 的特殊设置档目录喔!比较好管理啰~ 当然啦,使用 useradd 添加用户后,记得也要使用 smbpasswd -a username 来让该用户可以使用 Samba 喔!


  • 5. 创建机器码帐号

由于 PDC 会针对 Windows 用户端的主机名称 (NetBIOS name) 进行主机帐号检查, 所以我们也要为用户端的主机名称进行帐号的设置。咦!啥是主机帐号? 一般用户帐号是英文或数字,主机帐号则在该帐号最后面加上一个钱字号『$』即可! 举例来说, vbirdwinxp 这部主机可设置的帐号名称为 vbirdwinxp$。

而我们知道要使用 smbpasswd 增加的用户必须要在 /etc/passwd 当中,因此要创建这个帐号你就得要这样做:

[root@www ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdwinxp$
[root@www ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdwin7$

会增加 -M -s -d 等参数的原因是因为不想要让这个帐号具有可以登录的权限, 因此将这个主机帐号设置的比较怪一点~ ^_^~接下来让 Samba 知道这个帐号是主机帐号,所以你应该要这样做:

[root@www ~]# smbpasswd -a -m vbirdwinxp$
[root@www ~]# smbpasswd -a -m vbirdwin7$

这样便加入主机帐号啰!而我们的 Samba PDC 也就可以通过『主机帐号』来判断 Windows 用户端能否连上来, 若连接上 PDC 与 Windows 用户端后,接下来一般用户帐号就可以在 windows 用户端登录了!


  • 6. 修改安全性相关数据

由于我们创建的帐号目录在 /winhome 底下,并非正规的 CentOS 目录,所以最重要的 SELinux 可能会跑掉~ 所以,我们还得要修订 SELinux 才行!方法很简单,将 SELinux type 转为 samba_share_t 即可!

[root@www ~]# chcon -R -t samba_share_t /winhome

由于 SELinux 的数据是会继承上层目录的,因此未来添加的用户,理论上,就不需要重新修订 SELinux 的文件类型了。 但是,如果你老是发现登录 PDC 的帐号却无法取得家目录,那么就观察 /var/log/messages 内的数据来修订吧!

16.4.3 Wimdows XP pro. 的用户端

请注意,底下的方法仅适用于 Windows 2000, Windows XP 专业版 (Pro.),一般的 Windows XP home 版本是不支持的! 如果你用户端的主机是随机版的 Windows XP ,通常是 Windows XP home ,那底下的方法可能就无法适用啰! 要连接上 Samba PDC 的过程也是挺简单的,你可以这样做: (至于 Windows 7 对于 Samba 的版本要求较高,官方网站是说得高于 3.3.x 以上版本才有支持)


  • 1. 确认 windows 用户端的网域与主机名称

首先我们必须要确认 Windows 用户端的工作群组与主机名称跟咱们的 Samba PDC 相同, 确认的方式在局域网路里面已经提过了,这里在强调一次。将鼠标移动到『我的电脑』上面,按下右键, 选择『内容』,然后点击『电脑名称』,会出现如下图标:

Windows 用户端连上 PDC 的方式流程示意图
图 16.4-2、Windows 用户端连上 PDC 的方式流程示意图

如上图所示,你要先确认箭头 1 处指的主机名称与工作群组,在我们这个案例当中的工作群组为 vbirdhouse, 这部 Windows 主机的 NetBIOS 名称则为 vbirdwinxp 喔!如果不对的话,请按下『变更』来设置, 并且重新开机。重新开机完毕后再到上图的画面当中,按下箭头 2 所指的网络识别处。


  • 2. 设置主机名称与网域名称

接下来我们要设置这部 Windows XP pro. 要链接到局域网路上的哪部 PDC 上面,亦即是处理主机帐号以及 Samba PDC 负责的网域 (domain) 啦!在图 16.4-2 按下『网络识别』后,分别在出现的窗口当中选择:

  1. 下一步;
  2. 这台电脑是公司网络的一部份,而且我在工作时用来连接到其他电脑(T)
  3. 我的公司使用一或多个网域的网络(C)
  4. 下一步

然后就会出现如下的窗口:

Windows 用户端连上 PDC 的方式流程示意图
图 16.4-3、Windows 用户端连上 PDC 的方式流程示意图

请依序填写 Samba 主机上面的管理员帐号与密码,要注意这个密码是记录于 Samba 中的那个,可不是 /etc/shadow 喔!别搞混了~这是 Samba 服务器的设置呢。输入之后按下一步吧,通常都会出现找不到正确主机的画面,如下所示:

Windows 用户端连上 PDC 的方式流程示意图
图 16.4-4、Windows 用户端连上 PDC 的方式流程示意图

鸟哥也觉得很奇怪,老是告诉我找不到!不过没有关系,这里我们依旧再填一次主机的 NetBIOS name 以及群组名称, 如上图所示,然后继续按下一步,就会出现如下的画面啦:

Windows 用户端连上 PDC 的方式流程示意图
图 16.4-5、Windows 用户端连上 PDC 的方式流程示意图

这次就给他输入正确的管理员帐号与密码,记得最后面的网域就是工作群组名称,别写错了。 处理完毕后给他按下确定吧!然后就会出现如下画面:

Windows 用户端连上 PDC 的方式流程示意图
图 16.4-6、Windows 用户端连上 PDC 的方式流程示意图

恭喜你,这就表示已经连接上 Samba PDC 啰!我们希望所有的用户都直接由 Samba PDC 控管,所以这里请填写 『此时不添加用户』吧!按下一步去。


  • 3. 重新开机并以新的网域名称登录

在图 16.4-6 之后请重新开机,开机后整个画面会有点类似这样:

Windows 用户端连上 PDC 的方式流程示意图
图 16.4-7、Windows 用户端连上 PDC 的方式流程示意图

为了保护我们的系统,因此得要按下 [ctrl]+[alt]+[del] 三个组合按键后,才会出现如下的登录画面:

Windows 用户端连上 PDC 的方式流程示意图
图 16.4-8、Windows 用户端连上 PDC 的方式流程示意图

目前系统上面就会有两个可选择的帐号管理模式,一个是本机帐号一个是 PDC 提供的帐号,那我怎知登录者是哪个管理模式? 所以你就得要按下上述画面的『选项』,才会出现『登录到』的那一行数据。出现的两个数据分别是:

  • VBIRDWINXP(此电脑):这就是你的电脑名称,亦即是以本机帐号登录;
  • VBIRDHOUSE:就是 PDC 的 workgroup 项目,通过 PDC 的帐号来尝试登录。

现在请输入你在 Samba PDC 上面拥有的帐号与密码来尝试登录吧!那如果你输入的帐号密码是对的,却发现如下的画面时, 肯定是某些文件权限或者是 SELinux 设置错误!请参考 /var/log/messages 或 /var/log/samba/* 里面的注册表来修改!

使用 PDC 帐号登录却发现权限错误的图标
图 16.4-9、使用 PDC 帐号登录却发现权限错误的图标


  • 4. 观察用户的家目录与设置档

如果你可以顺利登录的话,打开文件总管后应该可以看到类似下方的画面:

登录 PDC 后,取得的家目录状态
图 16.4-10、登录 PDC 后,取得的家目录状态

呵呵!该连上的通通链接上来啰!你也可以在自己的家目录 (K 槽) 添加移除数据的!是否很不错啊! ^_^! 而当你注销之后,你在 Windows 桌面上头所进行的各项个人化设置通通会被移动到 /winhome/dmtsai/profile 当中喔! 如果不相信的话,请自行前往 Samba 服务器上头瞧一瞧就知道了。

16.4.4 Wimdows 7 的用户端

很抱歉,由于 Windows 7 的 PDC 支持仅在 Samba 3.3.x 以上版本才有该补丁 (patch),而我们目前的版本为 3.0.x, 因此目前暂时无法提供 Windows 7 的相关加入动作。根据发布公告显示, CentOS 6.x 使用的是 samba 3.5.x 版本, 所以,让我们期待新的版本所带来的优势吧! ^_^!如果你有急切的需求,可以参考:

16.4.5 PDC 之问题克服

如果老是发生错误消息为『使用的帐户是电脑帐户。请使用你的通用用户帐户或本机用户帐户来访问这台服务器』时, 你可以这样做的:

  • 先察看一下 /var/log/samba 里面的注册表信息,尤其是 vbirdwinxp.log 关于这部主机的信息呐;

  • 如果还是无法解决,可以在 lmhosts 里面增加 vbirdwinxp 的 IP 与主机名称的对应,然后将 samba 整个关掉『/etc/init.d/smb stop』,等待一段时间让 NetBIOS 的名称解析时间逾时,再重新启动 samba 『/etc/init.d/smb start』,然后再重新做一次输入 root 的密码那个动作

在鸟哥尝试过的案例中,上面第二个步骤挺有效的!不过,还是得要察看 /var/log/samba 里面的登录信息才行喔!


  • 一些 Windows 帐号在 Windows 系统上面的使用技巧

虽然 PDC 很好用,不过你要注意的是,每次你使用 PDC 上头的帐号登录 Windows 用户端主机时, Windows 主机会由 /winhome/username/profile/ 当中加载所需要的数据, 并暂时启动一个文件夹在 Windows 系统的 C:\Documents and Settings\username 当中,如果你的家目录下的 profile 数据太多时, 光是传输就会花去很多时间的!

所以,你应该将一些文件数据放置到你的家目录下,亦即 K 槽当中,尽量不要使用 Windows 缺省的『我的文档夹』, 因为『我的文档夹』会将数据移动到『 /winhome/username/profile/My Documents/ 』目录下,同样的, 保存到桌面的数据会被放置到『 /winhome/username/profile/桌面/ 』目录中,那样在登录与注销时会花去很多时间喔! 这个小地方也要注意的呢! ^_^

好了,关于 SAMBA 的 PDC 作法我们就谈到这里,还有更多的信息你可以前往这个章节最后面的参考数据所列出的网址去查阅, 因为还有很多的作法呐!事实上,鸟哥觉得在一个网域当中,如果有多部的 Windows NT 主机,例如 Windows 2000/XP pro. 这一类的比较稳定的个人使用桌面版本时,使用 PDC 就很有用了!因为 Windows 2000/XP pro. 也是一个多人的操作系统,不像 Windows 98 是单人的操作系统。所以,当使用 Windows 2000/XP pro. 而无法登录 PDC 时,你是无法使用 Windows 2000/XP pro. 上面的任何的信息的。 但是在 Windows 98 上面若无法正确的登录,你仍然具有该电脑的主控权喔!

另外,设置 Windows 用户端之前,请先确认你的 Windows 是什么版本? 上述的动作对于 Windows XP 家用版 (Home), Windows 7 是没有作用的!请先确认才行喔!

16.5 服务器简单维护与管理

除了上述的正规作法之外,其实还有一些稍微重要的事情要跟大家分享的!

16.5.1 服务器相关问题克服

通常我们在设置 SAMBA 的时候,如果是以单一主机的工作群组 (Workgroup) 的方式来进行 smb.conf 的设置时,几乎很容易就可以设置成功了!并没有什么很困难的步骤。不过,万一还是无法成功的设置起来, 请务必察看注册表,也就是在 /var/log/samba/ 里面的数据!在这里面的数据当中,你会发现:咦! 怎么这么多文件啊!因为我们在 smb.conf 里面设置了:

  • log file = /var/log/samba/%m.log

那个 %m 是指用户端电脑的 NetBIOS Name 的意思,所以,当有个 vbirdwinxp 的主机来登录我们的 vbirdserver 主机时,那么登录的信息就会被纪录在 /var/log/samba/vbirdwinxp.log 文件喔!而如果万一来源 IP 并没有 Netbios name 的时候,那么很可能是一些错误消息,这些错误消息就会被纪录到 log.smbd, log.nmbd 里面去了!所以,如果你要察看某部电脑连上你的 SAMBA 主机发生了什么问题时,特别要留意这个注册表的形式喔!

另外,如果你的 SAMBA 明明已经启动完成了,却偏偏老是无法成功,又无法查出问题时,建议先关闭 Samba 一阵子,再重新启动:

  • /etc/init.d/smb stop

在鸟哥过去的案例当中,确实有几次是因为 PID 与 NetBIOS 的问题,导致整个 SAMBA 怪怪的~所以完整的关闭之后, 经过一阵子的短暂时间,再重新启动,应该就可以恢复正常了!

还有,万一你在进行写入的动作时,老是发现『你没有相关写入的权限!』,不要怀疑,几乎可以确定是 Permission 的问题,也就是 Linux 的权限与 SAMBA 开放的权限并不相符合,或者是 SELinux 在搞鬼!无论如何, 你必须要了解能不能写入 Linux 磁盘,看的是 PID 的权限与 Linxu 文件系统是否吻合,而那个 smb.conf 里面设置的相关权限只是在 SAMBA 运作过程当中『预计』要给用户的权限而已,并不能取代真正的 Linux 权限喔!所以,万一真的发现该问题存在, 请登录 Linux 系统,查验一下该对应的目录的 permission 吧!^_^

另外,通常造成明明已经查到分享 (smbclient -L 的结果),却老是无法顺利挂载的情况,主要有底下几个可能的原因:

  • 虽然 smb.conf 设置正确,但是设置值『 path 』所指定的目录却忘记创建了 (最常见的呆样!);
  • 虽然 smb.conf 设置为可读写,但是目录针对该用户的权限却是唯读或者是无权限;
  • 虽然权限全部都正确,但是 SELinux 的类型却错误了!
  • 虽然全部的数据都是正确的,但是 SELinux 的规则 (getsebool -a) 却没有顺利启动。

上述都是一些常见的问题,更多问题的解决方案,请参考最正确的注册表信息吧! ^_^

16.5.2 让用户修改 samba 密码同时同步更新 /etc/shadow 密码

有个问题是,我们知道用户可以通过 passwd 修改 /etc/shadow 内的密码,而且用户也能够自行以 smbpasswd 修改 Samba 的密码。如果用户是类似 PDC 的用户,那么这些用户理论上就很少使用 Linux 啦!那么想一想, 能否让用户在修改 Windows 密码 (就是 Samba) 时,同步更新 Linux 上面的 /etc/shadow 密码呢? 答案是可行的啦!而且动作并不困难~因为 smb.conf 里头已经提供了相对应的参数设置值!你可以参考底下的网站数据:

鸟哥做个总结,基本上你需要的是 smb.conf 里面 [global] 的几个设置值:

[root@www ~]# vim /etc/samba/smb.conf
[global]
# 保留前面的各项设置值,并添加底下三行即可:
        unix password sync  = yes                <==让 Samba 与 Linux 密码同步
        passwd program      = /usr/bin/passwd %u <==以 root 调用修改密码的指令
        pam password change = yes                <==并且支持 pam 模块!

[root@www ~]# testparm
[root@www ~]# /etc/init.d/smb restart

接下来,当你以一般用户 (例如 dmtsai) 修改 samba 的密码时,就会像这样:

[dmtsai@www ~]$ smbpasswd
Old SMB password:  <==得先输入旧密码,才能输入新密码
New SMB password:
Retype new SMB password:
Password changed for user dmtsai <==这就是成功的字样!

# 若出现底下的字样,应该就是你的密码输入被限制了!例如输入的密码字符少于 6 个!
machine 127.0.0.1 rejected the password change: Error was : Password restriction.
Failed to change password for dmtsai

16.5.3 利用 ACL 配合单一用户时的控管

想像一个案例,如果你是学校的网管人员,有个兼任老师向你申请帐号,主要是要在很多班级内取得同学的专题数据。 因为该老师是兼任的,你或许担心一不小心该教师就将同学的辛苦数据给销毁,倒不是教师们故意的, 而是很多时候...不熟嘛!这个时候如果你将该老师加入同学的群组,然后偏偏同学们所在的目录是群组可写入的话, 那么该教师就能够拥有可读写的权限了,也就容易造成一些莫名的灾难~

那该怎么办?其实可以通过 ACL 来管理某个目录的单一用户权限啦!所以说, 权限的管理不必通过 smb.conf 的设置,只要通过 ACL 来管理就能够达到你所需要的目的了。 关于 ACL 的说明我们在基础学习篇第三版第十四章已经提过了, 这里不再啰唆,请自行前往查阅呐! ^_^

16.6 重点回顾

  • 由 Tridgell 利用逆向工程分析网芳得到 Server Message Block 协定的产生;
  • Samba 名称的由来是因为需包含没有意义的 SMB server 之故;
  • SAMBA 可以让 Linux 与 Windows 直接进行文件系统的使用;
  • SAMBA 主要架构在 NetBIOS 上发展的,且以 NetBIOS over TCP/IP 克服 NetBIOS 无法跨路由的问题;
  • Samba 使用的 daemon 主要有管理分享权限的 smbd 以及 NetBIOS 解析的 nmbd
  • Samba 使用的模式主要有单机的 workgroup 方式,以及网域控管的 PDC 模式;
  • Samba 的主设置档之文件名为 smb.conf
  • smb.conf 内,主要区分为 [global] 服务器整体设置与 [share] 分享的资源两大部分
  • Samba 用户帐号控管主要的设置值为 security = {share,user,domain} 等
  • Samba 用户端可使用 smbclient 以及 mount.cifs 进行网芳的挂载
  • 新版的 Samba 缺省使用数据库记录帐号信息,添加帐号用 pdbedit ,修改密码则用 smbpasswd
  • Samba 主要支持 CUPS 的打印机服务器
  • 在权限控管方面,最容易出错的为 SELinux 的规则与类型 (SELinux type)
  • 在 PDC 的设置方面,由于与主机名称相关性很高,建议设置 lmhosts 文件内容为宜

16.7 本章习题

  • 一般来说, SAMBA 使用的设置档放置在哪里?文件名为何?
    使用的文件名为 smb.conf ,通常会放置在 /etc/samba/smb.conf 里面,不过,最好可以使用 rpm -qc packagename 来查找!
  • 哪一个指令可以用来判断 smb.conf 这个设置档的正确性?
    当我们修改完 smb.conf 之后,记得要以 testparm 来进行 samba 的确认!
  • 哪一个指令可以用来察看 SAMBA 主机分享出什么目录?
    利用 smbclient 即可:『smbclient -L NetBiosName -U username 』!
  • 在 Linux 用户端挂载网芳的文件系统主要是依据哪个指令来达成的?
    就是通过 mount.cifs 或 mount -t cifs 来达成的!
  • 我今天使用 smbpasswd 去添加一位用户 badbird,让他可以登录我的 Linux SAMBA 主机,但是无论如何就是无法添加。你认为原因可能是什么?
    由于 Samba 用户的信息必须要存在于 /etc/passwd 里面,既然无法添加,应该先确认 badbird 这个用户已经存在于 Linux 系统当中了!

16.8 参考数据与延伸阅读

修改历史:
2001/09/17:好久以前曾经完成的一项任务 ^_^
2003/07/26:将 2001/09/17 所写的内容做了大幅度的修订,增加原理以及更多的设置项目!
2003/09/10:将 PDC 部分补充的更完整,因为加入了个人化的 Profiles 在 /home/samba/profiles 当中了!同时加入课后练习喔
2003/09/30:加入了 CUPS 打印机的支持!
2005/10/17:Samba 2.2 在中文编码上面与最新的 samba 3.0.x 版本不同。请参考: 中文编码 网友的详细说明喔!
2006/12/20:将旧的文章移动到 此处
2006/12/29:终于写完了 Samba 了!将 PDC 改写,很多乱乱的地方都改掉了~
2007/04/12:原本对 homes 的说明中,那个 umask 应该是 002 ,原先的 022 是错的!
2010/06/11:一直误会了作者的名字,名称为 Andrew Tridgell 而不是 Tridgwell !抱歉了!
2011/03/18:将旧的基于 CentOS 4.x 的文章移动到 此处
2011/03/31:终于搞定了 Samba ,光是实作就花去鸟哥大部分的时间了~累毙!
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计