鸟哥的 Linux 私房菜
目录 | Linux 基础篇 | Linux 服务器篇 | Linux 企业应用篇 | 安全管理
     
 
最近更新日期:2006/12/29
在一般的区域网络中 (LAN) 如果都是 Windows 电脑,那么使用‘网络上的芳邻’这个功能,就可以让不同的 Windows 电脑分享彼此的文件啰!但万一这个 LAN 里面有个 Linux 主机时,我怎么让 Linux 也加入这个 Windows 电脑当中的‘网络上的芳邻’呢?也就是说,让 Windows 电脑可以透过‘网络上的芳邻’来存取 Linux 主机上面的文件!呵呵!那就是 SAMBA 这个服务器的主要目的了!SAMBA 是很有用的一个服务器,他可以让您的 Linux 刹那间成为一个文件服务器 (File Server),并提供整个 LAN 里面的 Windows 很简单的就可以对 Linux 主机进行文件的存取动作。不仅如此, SAMBA 也可以让 Linux 上面的印表机成为印表机服务器 (Printer Server) ,鸟哥个人觉得, SAMBA 对于整个 LAN 的贡献真的是很大!那么就赶紧来玩一玩吧! ^_^


大标题的图示本章的行前准备工作
这一章的主要目的为介绍在不同的平台上面利用同样的协定来进行文件的传输, 其实主要就是让 Linux 与 Windows 主机之间能彼此透过‘网络上的芳邻’这个方式来分享文件, 而最主要的目的就是当你的区域网络内办公用的主机大多是 Windows 系统时, 可以透过网芳来存取 Linux 主机上面的资源,让你不觉得有任何不一样! 而阅读之前你至少需要有底下的一些基础概念:

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


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

  • 让文件在两部主机之间直接修改
  • 既然有这样的问题,那么好吧,我可不可以在用户端的机器上面直接取用 server 上面的文件, 如果可以在用户端直接进行 Server 端文件的存取,那么我在用户端就不需要存在该文件资料啰,也就是说, 我只要有 Server 上面的文件资料存在就可以啦!有没有这样的文件系统啊 (File System)! 很高兴的是,前面我们已经提过的 Network File System, 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 Tridgwell 的大学生就有这样的困扰,他手上有三部机器,分别是跑 DOS 的个人电脑、DEC公司的 Digital Unix 系统以及 Sun 的 Unix 系统。在当时, DEC 公司有发展出一套称为 PATHWORKS 的软件,这套软件可以用来分享 DEC 的 Unix 与个人电脑的 DOS 这两个作业系统的文件资料,可惜让 Tridgwell 觉得较困扰的是,Sun 的 Unix 无法藉由这个软件来达到资料分享的目的。

    这个时候 Tridgwell 就想说:‘咦!既然这两部系统可以相互沟通,没道理 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 的主因 ^_^
  • 既然写成了软件,想一想,总是需要注册一下商标吧!因此 Tridgwell 就去申请了 SMBServer (Server Message Block 的简写) 这个名字来做为他撰写的这个软件的商标,可惜的是,因为 SMB 是没有意义的文字,因此没有办法达成注册。既然如此的话,那么能不能在字典里面找到相关的字词可以做为商标来注册呢? 翻了老半天,呵呵!这个 SAMBA 刚好含有 SMB , 又是热情有劲的拉丁舞蹈的名称,不然就用这个名字来做为商标好了! 这成为我们今天所使用的 SAMBA 的名称由来啦! ^_^

    小标题的图示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 做为服务器主机时,鸟哥认为 Linux 毕竟还是比较稳定一点,可以 24 小时且全年无休的努力工作呐。此外,因为目前透过‘网络上的芳邻’来攻击区域网络的 Windows 作业系统的电脑病毒实在是太多了,防不胜防, Linux 对于这样的攻击并没有很大的影响 (因为常见的攻击手法均针对 Windows 而来~),所以也比较安全一些说~

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


    小标题的图示SMB 使用的 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 来介绍。
    鸟哥的图示

    小标题的图示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, 139 三个 port ,且同时会有 UDP/TCP 的监听服务喔!这可不要忘记了! 因为后面设定防火墙的时候,还会使用到这三个 port 的呢!


    小标题的图示连线模式的介绍 (peer/peer, domain model)
    SAMBA 主机的应用相当的广泛,而且可以依照不同的网络连线与使用者帐号、密码的管理方式不同, 来加以不同的类别应用,例如最常见的 Workgroup 及 Domain 两种方式的连线模式呢! 底下我们就是要来谈一谈这两种最常见的区域网络的连线模式 peer/peer 及domain model。

  • peer/peer (Workgroup model):
  • peer 有同等、同辈的意思存在,那么 peer/peer 由字面上的解释来看,当然就是同等地位的 PC 架构了!这是什么意思呢?简单的来说,在区域网络里面的所有 PC 均可以在自己的电脑上面管理自己的帐号与密码, 同时每一台电脑也都具有独力可以执行各项软件的能力,只是藉由网络将各个 PC 连结在一起而已的一个架构, 所以,每一台机器都是可以独立运作的喔!

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

    以下图的架构为例,在这样的架构下,假设 A 君写了一个报告书,而 B 君想要以网络直接取用这个报告书时,他就必须要知道 A 君使用的电脑的帐号与密码,并且 A 君必须要在 PC A 上面启用 Windows 的‘资源分享(或者是共用)’之后,才能够让 B 君连线进入喔 (此时 PC A 为 Server) !而且, A 君可以随时依照自己的喜好来更改自己的帐号与密码,而不受 B 君的影响,不过, B 君就得要取得 A 君同意取得新的帐号与密码后,才能够登入 PC A 喔!反过来说,同样的, A 要取得 B 的资料时,同样需要取得 PC B 的帐号与密码后,才能够顺利登入啊 (此时 PC A 为 Client 喔)!因为 PC A, PC B, PC C 的角色与地位都同时可以为 Client 与 Server ,所以就是 peer/peer 的架构了!

    Peer/Peer 的连线模式
    图一、Peer/Peer 的连线模式

    生活周遭中,哪里看到的这种 peer/peer 的架构呢?想起来了吗?没错!就是藉由 Windows 的‘网络上的芳邻’所达成的‘工作群组(workgroup)’的架构,那就是典型的 peer/peer 架构啦!所以, peer/peer 也可以直接说成 workgroup 的连线架构喔。

    使用 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 的连线模式
    图二、domain model 的连线模式

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

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

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

    大标题的图示SAMBA 服务器的基础设定
    SAMBA 这个套件几乎在所有的 Linux distributions 上面都有提供,因为即使你的 Linux 仅做为个人桌上型电脑使用时, 你依旧可能会需要连线到远端的 Windows 的网芳的,那个时候就得要 samba 提供的用户端软件功能啰! 因此你只要直接安装系统上面提供的预设 samba 版本即可。底下我们会先介绍 samba 服务器,然后在介绍用户端功能喔!


    小标题的图示Samba 所需套件及其套件结构
    目前常见的 samba 版本为 3.x 版,旧版的 2.x 版在设定上有点不一样,因此在进入设定前请先确认你的 samba 版本。 咱们的 CentOS 4.x 提供的是 Samba 3.x 的版本。那么你需要什么套件呢?基本上有这些:
    • samba
      这个套件主要包含了 SAMBA 的主要 daemon 文件 (smbd 及 nmbd)、 SAMBA 的文件档 (document)、以及其他与 SAMBA 相关的 logrotate 设定档及开机预设选项文件等;

    • samba-common
      这个套件则主要提供了 SAMBA 的主要设定档 (smb.conf) 、 smb.conf 语法检验的测试程序 (testparm)等等;

    • samba-client
      这个套件则提供了当 Linux 做为 SAMBA Client 端时,所需要的工具指令,例如挂载 SAMBA 文件格式的执行档 smbmount 等等。
    这三个套件你都得要安装才行喔!如果尚未安装的话,看是要由原版光碟去安装,还是使用 yum 都可以啦! 安装完毕之后,你可以依序察看一下 Samba 的套件结构喔!与他相关的文件基本上有这些东西:
    • /etc/samba/smb.conf
      smb.conf 是 Samba 的主要设定档名,如果你的 distribution 的 SAMBA 设定档不在 /etc/samba/ 目录当中, 那么你应该使用 locate 或 find 等方式将他找出来就好啦。基本上,咱们的 Samba 就仅有这个设定档而已, 且这个设定档本身就是很详细的说明文件了,请用 vi 去查阅他吧!这个文件主要在设定工作群组、 NetBIOS 名称以及分享的目录等相关设定,我们后续要介绍的都是这个文件而已啦!

    • /etc/samba/lmhosts
      这个文件的主要目的在对应 NetBIOS name 与该主机名称的 IP ,事实上他有点像是 /etc/hosts 的功能!只不过这个 lmhosts 对应的主机名称是 NetBIOS name 喔!不要跟 /etc/hosts 搞混了!由于目前 SAMBA 的功能越来越强大,所以通常只要您一启动 SAMBA 时,他就能自己捉到 LAN 里面的相关电脑的 NetBIOS name 对应 IP 的资讯,因此这个文件通常可以不用设定了!

    • /etc/samba/smbpasswd
      这个文件预设并不存在啦!他是 SAMBA 预设的使用者密码对应表。当我们设定的 SAMBA 服务器是较为严密的,需要使用者输入帐号与密码后才能登入的状态时,使用者的密码预设就是放置在这里咯 (当然啰,您可以自行在 smb.conf 里面设定密码放置的地方及密码档名, 不过我们这里都以预设的状态来说明) 。比较需要注意的是,这个文件因为包含了使用者的密码, 当然权限方面要较为注意啦!这个文件的拥有者需要是 root ,且权限设定为 600 才行喔!

    • /etc/samba/smbusers
      由于 Windows 与 Unix-like 在管理员与访客的帐号名称不一致,分别为 administrator 及 root, 为了对应这两者之间的帐号关系,可以使用这个文件来设定。不过这个文件的使用必须要经由 smb.conf 内的‘ username map ’设定项目来启动才行。

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

    • smbd, nmbd
      前几个小节曾经提过的两个主要 daemon 就在这里!

    • smbstatus
      列出目前的 SMB server 的状态,也是很有用途的一个指令啦!

    • smbpasswd
      如果您的 SAMBA 设定的较为严格,需要规定使用者的帐号与密码,那么那个密码文件的建立就需要使用 smbpasswd 来建置才可以的喔!所以这个指令与建立 SAMBA 的密码有关咯!

    • smbclient
      当你的 Linux 主机想要藉由‘网络上的芳邻’的功能来查看别台电脑所分享出来的目录与装置时,就可以使用 smbclient 来查看啦!这个指令也可以使用在自己的 SAMBA 主机上面,用来查看是否设定成功哩!

    • smbmount
      在 Windows 上面我们可以设定‘网络磁碟机’来连接到自己的主机上面,同样的,在 Linux 上面,我们可以透过 smbmount 来将远端主机分享的文件与目录挂载到自己的 Linux 主机上面哪!不过,其实我们也可以直接使用 mount 这个指令来进行同样的功能就是了。

    • nmblookup
      有点类似 nslookup 啦!重点在查出 NetBIOS name 就是了。

    • smbtree
      这玩意就有点像 Windows 系统的网络上的芳邻显示的结果,可以显示类似‘靠近我的电脑’之类的资料, 能够查到工作群组与电脑名称的树状目录分布图,有趣吧!

    • /usr/share/doc/samba-<版本>
      这个目录包含了 SAMBA 的所有相关的技术手册喔!也就是说,当您安装好了 SAMBA 之后,您的系统里面就已经含有相当丰富而完整的 SAMBA 使用手册了!值得高兴吧! ^_^,所以,赶紧自行参考喔!
    大致的套件结构就是这样,底下就准备来讲一个简单的案例吧! ^_^


    小标题的图示基础设定流程与 smb.conf 的主要规划
    既然 Samba 是要加入 Windows 的网芳当中,所以他的设定方式应该是要与网芳差不多才是。所以我们先来聊一聊 Windows 的一些设定方法再说。在早期 Windows 的网芳设定真是很简单,不过也因为太简单, 所以产生的安全问题可是相当的麻烦的。后来在 Windows XP 的 sp2 (服务包第二版) 加入了很多的预设防火墙机制, 因此使用网芳的预设限制常常会是这样的:
    • 主机与主机之间必须要在同一个网络当中 (否则需要修改 Windows 预设防火墙);
    • 最好设定为同一工作群组;
    • 主机的名称不可相同 (NetBIOS name);
    • 专业版 Windows XP 最多仅能提供同时十个用户连线到网芳。
    当你的 Windows 主机群符合上述的条件后,就很容易处理网芳分享的工作啦!分享的步骤是这样的:
    1. 叫出文件总管,然后在要分享的目录、磁碟或装置 (如印表机) 上面按下右键,选择‘共用’,然后就能够设定好分享的资料了;
    2. 最好建立一组给用户使用的帐号与密码,让其他主机的使用者可以透过该帐号密码连线进入网芳;
    真是有够简单的!那么 Samba 怎么设定啊?也是很简单,依据上述的限制以及流程你可以这样想像:
    1. 在 smb.conf 当中设定好工作群组、NetBIOS 主机名、密码使用状态等等与主机相关的资讯;
    2. 在 smb.conf 内设定好预计要分享的目录或装置以及可供使用的使用者资料;
    3. 根据步骤 2 的设定,在 Linux 文件系统当中建立好分享出去的文件或装置的使用权限;
    4. 根据步骤 2 的设定,以 smbpasswd 建立起使用者的帐号及密码
    5. 启动 Samba 的 smbd, nmbd 服务,开始运转哩!
    瞧!根据上面的流程,其实我们最需要知道的就是 smb.conf 这个设定档的资讯就是了。 所以首先我们就要来介绍一下这个文件的设定方式啰!这个文件其实可以分为两部份来看, 一个是主机资讯部分,在 smb.conf 当中以 [global] 作为设定的依据;另一个则是分享的资讯, 以个别的目录名称为依据。你要先知道的是:在 smb.conf 当中, 井字号与分号 (# 跟 ;) 都是注解符号!底下咱们就来谈谈这个咚咚吧!


  • 主机整体参数
  • 在 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 写得太好了!所以建议大家直接前往查阅即可!除此之外,还有登录档方面的资讯, 包括这些参数:
    • log file = 登录档放置的文件,档名可能会使用变数处理;
    • max log size = 登录档最大仅能到多少 Kbytes ,若大于该数字,则会被 rotate 掉。
    还有跟密码有关的参数,包括这几个:
    • security = user, server, domain, share 四选一,这四个设定值分别代表:
      • user :使用 SAMBA 本身的密码资料库,密码资料库与底下的 smb passwd file 有关;
      • share:分享的资料不需要密码即可分享;
      • server, domain:使用外部主机的密码,亦即 SAMBA 是用户端之意,如果设定这个项目, 你还得要提供‘password server = IP’的设定值才行;
    • encrypt passwords = Yes 代表密码要加密,注意那个 passwords 要有 s 才对!
    • smb passwd file = 密码放置的文件,通常是 /etc/samba/smbpasswd 。
    事实上 Samba 的密码方面设定值很多喔,包括你还可以利用 samba 来修改 /etc/passwd 里头的人物的密码呢! 不过这个时候就得需要‘ unix password sync ’以及‘ passwd program ’这两个参数值的帮忙了。 我们这里先谈比较简单的,其他进阶的部分可以 man smb.conf 去进行搜寻查阅喔! ^_^


  • 分享目录参数
  • 在目录参数部分,主要有底下这几个常见的参数喔:
    • [分享名称] :这个分享名称很重要,他是一个‘代号’而已。 举例来说,你在 Windows 当中使用‘共用’来分享网芳时,假设你将‘D:\game’分享出来, 系统不是还会要你输入一个‘在网络上面的名称’吗?假设你输入‘My_Games’这个名称好了, 那么未来大家在网芳看到的这个资料夹 (D:\game) 名称其实是‘\\你的IP\My_Games’啦!
    • comment :这个目录的说明!
    • path :在网芳中显示的名称 [分享名称] 中,所实际进入的 Linux 文件系统。 也就是说,在网芳当中看到的是 [分享] 的名称,而实际操作的文件系统则是在 path 里头所设定的。
    • read only:是否唯读?
    • public :是否让所有可以登入的使用者看到这个项目?
    • writable :是否可以写入?这里需要注意一下喔!那个 read only 与 writable 不是两个蛮相似的设定值吗?如果 writable 在这里设定为 no ,亦即不可写入,那跟 read only 不就互相抵触了!那个才是正确的设定?答案是:最后出现的那个设定值为主要的设定!
    • create mode 与 directory mode 都与权限有关的咯!
    • valid users = 使用者,这个项目可以指定能够进入到此资源的特定使用者。
    因为分享的资源主要与 Linux 系统的文件权限有关,因此里头的设定参数多与权限有关。


  • 变数特性
  • 为了简化设定值,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 喔!重要的很!


    小标题的图示没有密码的 smb.conf 设定(纯测试)
    瞎密?不需要密码就能够使用 SAMBA 主机所提供的目录资源?真假?没错啦,可以达到的。 不过,因为不需要密码就能够登入,虽然你可以设定权限成为唯读,让使用者可以‘瞧瞧而已’, 但是毕竟比较危险,因为如果你不小心将重要资料放置到该分享的目录当中,岂不危险? 所以尽量不要这样设定。不过,我们还是得介绍一下啦!先说明一下我们的设定需求:

  • 主机预计设定的参数状况:
    • 在 LAN 内所有的网芳主机工作群组 (workgroup) 为: vbirdhouse
    • 这部 Linux 主机 (Samba 服务) 的 NetBIOS 名称为: vbirdserver
    • 使用者登入层级设定为: share
    • 仅分享 /tmp 这个目录而已,且取名为: temp
    • Linux 主机的编码格式假设为万国码 (Unicode, 亦即 utf8)
    • 用户端为中文 Windows ,在用户端的软件也使用 big5 的编码
    底下就开始依序来进行 samba 的设定吧!


  • 1. 设定 lmhosts 文件内容 (optional):
  • 我们前面谈到 NetBIOS 名称可以由广播的方式自动取得,而 NetBIOS 也可以透过区域网络内经由一台主控电脑来管理, 此外,你也可以利用自己主机当中的 lmhosts 这个设定档来进行 NetBIOS 与 IP 的对应, 让 NetBIOS 与 TCP/IP 可以对应上关系呐!一般来说,这个文件是可以不必设定的,因为可以经由广播的方式取得对应的嘛! 不过,某些时刻确实可以设定一下,免除一些额外的搜寻时间说。我的区网中电脑名称与 IP 是这样的:
    [root@linux ~]# vi /etc/samba/lmhosts
    127.0.0.1       localhost
    192.168.1.254   vbirdserver
    192.168.1.21    vbirdcpu2
    192.168.1.11    vbirdcpu1
    # 这个文件的内容很简单,与 /etc/hosts 很类似,左边是 IP 右边是主机名称。
    # 只是主机名称必须符合 NetBIOS name 的标准,包括:
    # 主机名称不要超过 15 个字元,不要含有特殊字元等等。
    # 亦可使用 man lmhosts 来查阅喔!
    
    鸟哥区网内常用的有三部主机,除了 Linux 这部机器外,还有两部个人电脑,我将这几部电脑的 NetBIOS name 写到这个文件当中,可以免除 Samba 自己去搜寻啰!而再次强调,这个名称是 NetBIOS name 而非 HOSTNAME 喔!

  • 2. 检查语系资料
  • 过去朋友们在进行 SAMBA 的设定时,最容易发生错误的地方就是在中文档名部分, 绝大部分的朋友只要使用了中文档名,常常会发生一些问题,就是无法顺利的上传下载, 或者是原先的中文档名上传后,却变成奇怪的乱码档名。

    为了解决这个问题,你必须要知道几个项目:
    • 原始文件 (你要分享的文件) 编码的格式为何?一般来说,中文 Windows 的编码预设为 Big5 ;
    • 这个文件放置在 Linux 上,则这部 Linux 的预设语系编码为何?这与 /etc/sysconfig/i18n 有关;
    • 在 Samba 上头的显示编码为何?一般来说与上述的 Linux 预设编码相同即可;
    • 在用户端连接到 Samba 主机的软件之语系编码为何?如果是中文 Windows 作业系统,预设为 Big5。
    你的语系资料必须要在上面这几个环境中进行转换,因此如果你的用户端连上 Samba 的软件编码为 Big5 , 你的 Samba 使用的语系也是 Big5 ,但是 Linux 主机却预设仅支援 utf8 的编码时,而你的 smb.conf 又没有设定好,此时资料传输就会发生一些错误,因此你就会看到很多乱码档名了。

    所以,你至少得要知道你的 Linux 语系编码为何?在 Red Hat 系统 (含我们的 CentOS) 可以查阅 /etc/sysconfig/i18n 这个文件, 如下所示为鸟哥的 i18n :
    [root@linux ~]# cat /etc/sysconfig/i18n
    LANG="en_US.UTF-8"  <==这才是你需要注意的地方!
    SUPPORTED="zh_HK.UTF-8:zh_HK:zh:zh_CN.UTF-8:zh_CN:zh:zh_SG.UTF-8:
    zh_SG:zh:zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en"
    SYSFONT="latarcyrheb-sun16"
    
    由上头看起来,鸟哥预设的语系编码为 en_US.UTF-8,不过尚有支援 zh_TW 这样的中文编码。 先假设鸟哥的编码为万国码 (Unicode) 好了。知道了之后就能够开始处理 smb.conf 啰!


  • 3. 设定 smb.conf 设定档
  • 在这个例子当中我们仅分享 /tmp 这个目录而已,而且假设这个分享出来的目录是可读写的, 另外,我们并没有分享印表机喔!而在 smb.conf 当中的注解符号可以是‘ # ’也可以是‘ ; ’喔!要注意!
    [root@linux ~]# cd /etc/samba
    [root@linux samba]# cp smb.conf smb.conf.raw  <==先备份再说!
    [root@linux samba]# vi 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
    
            # 与登录档有关的设定项目,注意变数 (%m)
            log file = /var/log/samba/%m.log
            max log size = 50
    
            # 这里才是与密码有关的设定项目哩!
            security = share
    
            # 其他预设存在的项目
            socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy = no
            template shell = /bin/false
            winbind use default domain = no
    
    # 底下则是针对 /tmp 的设定而来的!可浏览且可写入喔!
    [temp]
            comment   = Temporary file space
            path      = /tmp
            read only = no
            public    = yes
    
    请您特别留意,在原本的 smb.conf 上面就已经有很多预设值了,这些预设值如果你不知道他的用途, 尽量保留预设值,也可以使用 man smb.conf 去查询该预设值的意义。举例来说, CentOS 4.x 的 smb.conf 预设有针对 server/client 的封包传递项目设定值的 socket options ,也有针对 Windows NT 及 Unix 系统的帐号对应之 idmap uid 之类的设定值,这些设定值在大型的区网架构会使用到,在我们仅有一两部 Linux samba 服务器的环境下.... 应该是可以不予理会的啦!


  • 4. 用 testparm 查阅 smb.conf 的语法设定正确性
  • 在启动 samba 之前,我们务必要了解到 smb.conf 里面语法是否正确,检验的方式使用 testparm 这个指令即可。 测试方式如下:
    [root@linux ~]# testparm
    参数:
    -v :查阅完整的参数设定,连同预设值也会显示出来喔!
    
    [root@linux ~]# 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 parameters
    [global]
            dos charset = cp950
            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
            socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy = No
    
    [temp]
            comment = Temporary file space
            path = /tmp
            read only = No
            guest ok = Yes
    
    上头是语法验证与各个项目的列出,如果你下达 testparm 却出现如下画面那就是有问题:
    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 来作详细的输出, 资料相当的丰富,透过这个您也可以知道你的主机环境设定为何呢! ^_^


  • 5. 启动与观察
  • 启动实在太简单了,利用预设的 CentOS 启动方式来处理即可。
    [root@linux ~]# /etc/init.d/smb start
    [root@linux ~]# netstat -tlunp
    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  10338/smbd
    tcp        0      0 0.0.0.0:445        0.0.0.0:*        LISTEN  10338/smbd
    udp        0      0 192.168.1.254:137  0.0.0.0:*                10343/nmbd
    udp        0      0 0.0.0.0:137        0.0.0.0:*                10343/nmbd
    udp        0      0 192.168.1.254:138  0.0.0.0:*                10343/nmbd
    udp        0      0 0.0.0.0:138        0.0.0.0:*                10343/nmbd
    
    特别注意,在 Samba (网芳) 当中预设会启动多个端口,这包括资料传输的 TCP 端口 (139, 445), 以及进行 NetBIOS 名称解析之类工作的 UDP 端口 (137, 138),所以你才会看到很多资料的。 那么能否仅支援 139 这个必要的端口,关闭 445 呢?可以啊~透过 testparm -v 的观察, 可以发现‘ smb ports = 445 139 ’这个设定值指定两个端口的,因此你可以在 smb.conf 增加这个设定值, 并改为 smb ports = 139 即可。不过,建议先保留预设值啦!


  • 6. 用户端的观察
  • 关于用户端的观察我们会在后续进行介绍。在这里仅是说明如何确定我们的 Samba 设定与服务有顺利的在运作。 我们可以在本机上透过 smbclient 这支程序来处理,他的基本语法是这样的:
    [root@linux ~]# smbclient -L [//主机或IP] [-U 使用者帐号]
    参数:
    -L :仅查阅后面接的主机所提供分享的目录资源;
    -U :以后面接的这个帐号来尝试取得该主机的可使用资源
    
    由于在这个范例当中我们并没有规范使用者的安全等级,所以必须要使用 -U 这个参数。 因此你可以这样看看:
    [root@linux ~]# smbclient -L //127.0.0.1 
    Password:  <==这里按一下 [Enter] 吧!
    Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename   Type  Comment
        ---------   ----  -------
        temp        Disk  Temporary file space
        IPC$        IPC   IPC Service (This is vbird's samba server)
        ADMIN$      IPC   IPC Service (This is vbird's samba server)
    Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Server           Comment
        ---------        -------
        VBIRDSERVER      This is vbird's samba server
    
        Workgroup        Master
        ---------        -------
        VBIRDHOUSE       VBIRDSERVER
    
    上表输出的资讯当中,分享的目录资源 (Sharename) 就是在 smb.conf 当中设定的 [temp] 名称啰! 因此在这里的意思是:任何人都可以进入 //127.0.0.1/temp 这个目录当中, 而这个目录在 Linux 系统其实是 /tmp 目录。至于那个 IPC$ 及 ADMIN$ 则是为了要应付 Windows 环境所必须要存在的项目就是了。

    基本上,到此为止咱们就设定好一个简单的不需要密码即可登入的 Samba 主机了! 你可以先行到用户端软件功能的部分进行挂载测试。 底下我们则预计以简易的需要密码才能够登入 Samba 的方式来设计一个范例吧!


    小标题的图示安全等级为使用者的工作群组设定
    设定一台不需密码即可登入的 Samba server 是非常简单的,不过, 您总不希望某些有机密性质的资料放在不设防的网芳中让大家查阅吧? 举例来说,你总不希望你的家目录被人家随意浏览吧?家目录内可能有你自己的情书呢!^_^

    那怎么办?没关系,我们可以透过 Samba 主机提供的认证方式来进行使用者权限的给予, 也就是说,你在用户端连线到主机时,必须要输入正确的帐号与密码后,才能够登入 Samba 主机查阅到你自己的资料! 那会不会很难啊?不会啦! Samba 本身就提供一个小程序来帮助我们处理密码的建立了, 整个流程还不太难。比较重要的是Samba 使用者帐号必须要存在于 Linux 系统当中 (/etc/passwd), 但是 Samba 的密码与 Unix 的密码文件并不相同。这就比较有点小麻烦~ 没关系,就让我们依样画葫芦来处理一下这个部分的设定吧!

  • 主机预计分享的资源状态
    • 刚刚前一个免密码时的 smb.conf 设定继续保留;
    • 针对 NetBIOS name 的解析方式依序由 lmhosts, broadcast 及 host 来进行解析;
    • 安全等级提升为 user 等级;
    • 密码文件放置到 /etc/samba/smbpasswd 这个文件当中;
    • 密码必须要加密;
    • 每个可使用 samba 的使用者拥有自己的家目录之外, users 这个群组的使用者可以进入 /home/public 目录中, 且在该目录下 users 这个群组的所有人可具有写入的权限喔!
    好了,开始一步步的处理吧!


  • 1. 设定 lmhosts
  • 这部分与前一小节的设定相同,请自行前往查阅喔!


  • 2. 开始设定 smb.conf 文件
  • 在这个范例的设定档当中,我们会新增几个参数,新增的参数部分会用特殊字体圈起来, 引用之前参数的部分则为一般字体。请交互参考看看啰:
    [root@linux ~]# vi /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
            socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy = no
            template shell = /bin/false
            winbind use default domain = no
    
            # 与密码有关的设定项目,包括密码文件所在与加密与否喔!
            security = user
            encrypt passwords = yes
            smb passwd file = /etc/samba/smbpasswd
    
            # 与 NetBIOS name 名称解析有关的设定
            name resolve order = lmhosts bcast host
    
    # 新增的每个使用者家目录及群组用户哩!
    [homes]
            comment = Home directories
            browseable = no
            writable = yes
            valid users = %S
            create mode = 0664
            directory mode = 0775
    [public]
            comment = the user groups work directory
            path = /home/public
            public = yes
            writable = yes
            valid users = @users
    [temp]
            comment   = Temporary file space
            path      = /tmp
            read only = no
            public    = yes
    
    [global] 部分
    在新增的资料部分,主要是与密码文件有关啦!包括安全等级设定为使用本机的密码验证,亦即是‘ security = user ’ 那个项目,而且加上了密码加密。至于 Samba 使用的密码档预设就是 /etc/samba/smbpasswd 这个, 为了增加自己的记忆,干脆直接写到 smb.conf 当中即可。

    至于那个‘ name resolve order ’就有趣了!他说明的是‘这部 Samba 主机针对 NetBIOS name 的解析方式’, 主要的解析方式有几种:
    • lmhosts:直接以 lmhosts 这个文件的内容来对照;
    • wins:利用一台可管理 Windows 网芳的主控电脑来纪录,本 Samba 主机向该部主机 (wins server) 要求 NetBIOS 名称解析结果;
    • host:透过 /etc/hosts 或者是 NIS, DNS 等方式来处理 NetBIOS name 的结果;
    • bcast:在区网中直接透过 NetBIOS 的广播功能处理,亦即是向所有 Samba 主机介面的同一网络主机发出名称解析的需求, 举例来说咱们的 Samba 主机为 192.168.1.254/24 ,则以 bcast 解析 NetBIOS name 时,我们的服务器会主动向 192.168.1.0/24 发送出解析封包的要求啊。
    我们修改了预设值,让 Samba 仅透过 lmhosts, bcast 及 host 的方式进行主机名称的解析啊!

    [homes] 部分
    至于新增的目录方面,[homes] 是个比较特殊的分享名称,他代表 Linux 主机上头的使用者家目录。 我们知道 [homes] 代表的是分享目录的资源名称, 但你总不希望使用 Samba 时找到的资源分享名称为 //127.0.0.1/homes 吧? 所以才会有‘ valid users = %S ’这个设定值,那个 %S 代表拥有可登入 Samba 的所有使用者, 且当他登入后,那个 [homes] 会变成 [帐号] , 请至前一小节的变数部分查询相关的说明。而且使用者的家目录是除了使用者本人外, 并不会开放给其他人浏览的喔 (browseable = no),另外他的 umask 为 002,因为建立新档 (create mode) 预设权限为 0664 ,而建立新目录 (directory mode) 则为 0775 之故。

    [public] 部分
    另一个新增的分享资源比较有趣,我们命名为 [public] ,指向的目录为 /home/public , 有趣的地方在于使用的 valid users = @users 这个设定项目,加上 @ 之后的名称代表着群组之意,意思是说,在 Linux 主机上面可使用 Samba 的帐号中,只要该帐号支援 users 这个群组, 那么理论上他就能够进入 /home/public 目录进行存取的权限。不过能否顺利的存取文件还与 Linux 最底层的文件权限有关。且任何人均可查阅到我们的主机有提供 [public] 这个分享资源 (public = yes 之故)。

    例题:
    在上面的这个设定档当中有提到分享出 /home/public 这个目录, 请问这个目录的权限应该如何设定才是符合我们 Samba 案例的要求?
    答:
      在这个案例当中我们提到任何具有 users 群组的使用者都能够完整的存取 /home/public , 所以这个目录的群组应该属于 users ,且权限至少需为 770 才行。如果 /home/public 预设不存在时, 应该要如此建立:
      [root@linux ~]# mkdir /home/public
      [root@linux ~]# chgrp users /home/public
      [root@linux ~]# chmod 770 /home/public
      
      这样当属于 users 群组的使用者进入到此目录后,才能够进行读写的功能。


  • 3. 设定可使用 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 的使用者当中。这都是很基本的帐号权限概念,如果您觉得这里阅读方面有问题, 若不考虑鸟哥的解释不良,表示你必须要回去读读基础篇了~ ^_^

    好了,假设我的机器里面已经有 dmtsai, nikky, tang 等三人,不过我只想要让 dmtsai 及 nikky 使用 SAMBA 而已的话, 那么如何将这两个使用者加入帐号密码管理文件 /etc/samba/smbpasswd 当中呢?很简单的啦!这样做即可:
    1. 先确认密码档是否存在
    [root@linux ~]# ls -l /etc/samba/smbpasswd
    -rw-------  1 root root 104 Dec 25 23:13 /etc/samba/smbpasswd
    # 注意啊!要这样的权限才可以喔!如果你的 Linux 没有这个文件,请自行建立。
    
    2. smbpasswd 指令功能
    [root@linux ~]# smbpasswd [-adem] username
    参数说明:
       : 如果都没有加上任何一个参数,例如‘ smbpasswd dmtsai ’时,这表示:
         修改 SAMBA 密码档 (/etc/samba/smbpasswd) 里面的 dmtsai 这个帐号的密码!
         也就是说,密码档里面已经存在一个 dmtsai 的帐号了!
    -a : 在 smbpasswd 密码档里面新增一个使用者
    -d : 让在 smbpasswd 密码档里面的某个帐号的使用者暂时无法使用 SAMBA
         当多了 -d 的参数时,在 smbpasswd 里面某个栏位会多出一个 D 的参数,
         代表该帐号目前无法使用喔!
    -e : 与 -d 参数相反,让某个帐号恢复使用!
    -m : 该 username 为机器代码 (Machine Account),这个与 domain model 有关!
    
    2.1 开始新增使用者吧!
    [root@linux ~]# smbpasswd -a dmtsai
    New SMB password: <==在这里输入密码!这个密码不一定要与 /etc/shadow 相同
    Retype new SMB password: <==再输入一次
    Added user dmtsai.
    
    [root@linux ~]# cat /etc/samba/smbpasswd
    dmtsai:501:1B0F61E20F8F2D11AAD3B435B51404EE:F7EDDB3F55CC5DB1FE00D7F755028491:
    [U          ]:LCT-4590969D:
    # 上面的资料为同一行的资料喔!资料为加密过的!
    
    2.2 如果要暂时拒绝一个使用者的登入,可以这样做:
    [root@linux ~]# smbpasswd -d dmtsai
    [root@linux ~]# cat /etc/samba/smbpasswd
    dmtsai:501:1B0F61E20F8F2D11AAD3B435B51404EE:F7EDDB3F55CC5DB1FE00D7F755028491:
    [DU         ]:LCT-4590969D:
    # 就是这个 D !代表的就是暂时 disable 啰!
    [root@linux ~]# smbpasswd -e dmtsai
    
    接下来你可以透过相同的方式来新增 nikky 这个使用者的 Samba 密码,那这两个人就能够使用 Samba 啰。 然后我们就能够开始准备来重新启动 Samba 并且测试看看啰!


  • 4. 重新启动 Samba 并测试
  • 在经过重新启动后,我们所进行的修订才会生效。然后使用 smbclient 来检查看看,是否不同身份会有不一样的浏览结果呢? 赶紧看看:
    [root@linux ~]# testparm
    # 这个动作很重要!每次都要进行!确认你的语法无误后再开始!
    
    [root@linux ~]# /etc/init.d/smb restart
    
    [root@linux ~]# smbclient -L //127.0.0.1
    Password:                   <==直接按下 [Enter] 即可。
    Anonymous login successful  <==是匿名登入喔!
    Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename   Type  Comment
        ---------   ----  -------
        public      Disk  the user groups work directory
        temp        Disk  Temporary file space
        IPC$        IPC   IPC Service (This is vbird's samba server)
        ADMIN$      IPC   IPC Service (This is vbird's samba server)
    
    [root@linux ~]# smbclient -L //127.0.0.1 -U dmtsai
    Password: <==输入 dmtsai 在 smbpasswd 文件中所建立的密码喔!
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename   Type  Comment
        ---------   ----  -------
        public      Disk  the user groups work directory
        temp        Disk  Temporary file space
        IPC$        IPC   IPC Service (This is vbird's samba server)
        ADMIN$      IPC   IPC Service (This is vbird's samba server)
        dmtsai      Disk  Home directories
    
    由上表我们可以发现,经由不同的身份登入可以取得不一样的浏览资料, 所以在使用上面需要特别留意喔!


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

    举上面的例子来说好了,我们在 smb.conf 当中设定 [public] 为可写入,亦即 /home/public 是可写入的。 假设 dmtsai 属于 users 这个群组,因此以 dmtsai 登入 SAMBA 服务器后,对于 /home/public 应该是具有可以读写的能力的!但是,如果你以 root 的身份建立 /home/public 却又忘记修改权限的话, 此时 /home/public 是无法让 users 这个群组写入的,因此 dmtsai 这个使用者当然不具有写入的能力。 这样说,了解鸟哥想要说啥了吗?注意注意喔! ^_^

    上面的设定案例应该蛮足以提供一般家庭用的环境中进行设定了!如果您还要扩充分享的目录与能够登入的使用者, 可以这样做:
    • 利用编辑 smb.conf 来多开放其他的目录,并且特别注意 Linux 在该目录下的权限喔!请使用 chown 与 chmod 吧!
    • 利用 smbpasswd 来新增其他使用者到 /etc/samba/smbpasswd 里面去,如果该帐号并没有出现在 /etc/passwd 里面,请先以 useradd 新增该帐号;
    • 不论进行完任何的设定,请先以 testparm 进行确认,之后以 /etc/init.d/smb restart 来重新启动!
    事实上,SAMBA 的一般用途就是在这个连线的模式中!多使用 SAMBA 来分享您的资源吧!鸟哥都是使用 SAMBA 来做为远端服务器与我的工作机互通有无的重要媒介说~


    小标题的图示设定成为印表机服务器 (CUPS 系统)
    刚刚上面的说明大部分都是针对磁碟与目录的分享来进行 SAMBA 的设定,那么 SAMBA 有没有可能分享出装置呢?举个例子来说,例如那个我们在办公室都会用到的印表机呢?如果说,能够让我们办公室的 File Server 同时提供印表机列印的功能,如此一来,藉由 Linux 这个作业系统可以 24 小时开机的稳定功能,我们就可以随时进行列印啰!所以,底下我们就以 SAMBA 进行印表机列印功能的提供者的角度,来介绍这个 smb.conf 的设定喔!

    在 Linux 底下进行列印的工具很多,不过我们这里要介绍的仅有目前较广为流行的 CUPS (Common Unix Printing System) 这一个。 详细的 CUPS 安装设定方法我们已经在基础篇的 CUPS 章节当中提过, 所以这里我们不再详细说明,仅介绍大致的处理流程就是了。如果你需要较早期的 LPRng 列印系统的话, 建议可以参考底下的资料喔:
    底下就来谈一谈一般常见的流程说明吧:


  • 1 安装印表机与确定启动
  • 再次说明,并不是所有的印表机都被 Linux 所支援的,所以当你想要连结一台印表机到 Linux 系统上头时, 请务必到 http://www.linuxprinting.org/printer_list.cgi 上头去看看是否有被支援喔! 如果没有被支援,那就换一台印表机吧!不要进行垂死的挣扎了....

    如果你的印表机连接埠为使用 USB 或者是平行序列埠的话,那么当你连接上印表机后, 可以利用底下的方式测试看看是否成功的连接上了:
    [root@linux ~]# echo "Hello printer" > /dev/lp0     <==平行序列埠
    [root@linux ~]# echo "Hello printer" > /dev/usb/lp0 <==USB 埠
    
    如果印表机有回应,这表示 OK 的啦!你可以进行底下的工作了。如果你的印表机为网络印表机呢? 就是说印表机有 IP 的情况下,那么该印表机就不需要加入 Samba 啦!因为该印表机本身就可以直接提供用户端连接, 根本不必透过 Samba 来提供网络连线的嘛!当然啦,如果你有特殊需求, 将网络印表机加入 Samba server 来提供给网芳中的其他用户,也是可以的啦!底下直接来看看如何使用 CUPS 吧。


  • 2. 设定 CUPS 的印表机
  • 请先确认你的 CUPS 已经安装妥当了,原则上,你必须要有底下两个套件存在才行:
    • cups-libs
    • cups
    接下来我们可以开始设定 CUPS 了!设定的原则是这样的:
    • 我需要让 192.168.1.0/24 这个网络可以使用印表机
    • 我需要让 192.168.1.0/24 及 127.0.0.0/8 可以管理 CUPS 系统
    然后开始这样做:
    [root@linux ~]# vi /etc/cups/cupsd.conf
    # 底下这个项目在控制谁可以使用 CUPS 系统,约在 772 行左右,
    # 找到这些资料并增加一笔记录:
    <Location />
    Order Deny,Allow
    Deny From All
    Allow From 127.0.0.1
    Allow From 192.168.1.0/24
    </Location>
    
    # 底下的项目则在设定谁可以登入 CUPS 系统的管理介面?
    # 约在 830 行左右,找到这些资料并进行一些细部修改:
    <Location /admin>
    #AuthType Basic
    #AuthClass System
    Order Deny,Allow
    Deny From All
    Allow From 127.0.0.1
    Allow From 192.168.1.0/24
    </Location>
    
    # 在最后一行的地方加上这一句
    Listen 0.0.0.0:631
    # 上面在设定一个不需要密码即可登入的管理环境,是个很粗糙的介面,
    # 建议您自行处理一下认证问题,请参考基础篇的说明。
    
    另外,为了要进行 Windows 相关软件所传来的列印资料,所以我们还需要对 CUPS 作一些额外的设定, 过程也是很简单的:
    [root@linux ~]# vi /etc/cups/mime.convs
    # 大概在最后几行的地方,找到这一行,将注解拿掉!
    application/octet-stream   application/vnd.cups-raw   0   -
    
    [root@linux ~]# vi /etc/cups/mime.types
    # 同样也是在最后面几行的地方,也是将注解拿掉即可!
    application/octet-stream
    
    设定完毕后就可以开始来启动 cups 系统,可以这样做:
    [root@linux ~]# /etc/init.d/cups start
    [root@linux ~]# netstat -tunlp | grep '631'
    tcp 0  0 0.0.0.0:631     0.0.0.0:*    LISTEN   18271/cupsd
    udp 0  0 0.0.0.0:631     0.0.0.0:*             18271/cupsd
    
    那个 631 的端口就是 CUPS 所启动的啦!然后我们可以开始设定印表机了! 由于 CUPS 支援很多不同的印表机连接埠,每种连接埠都不一样,常见的有:
    • USB 连接埠: usb:/dev/usb/lp0
    • 平行序列埠: parallel:/dev/lp0
    • 网络印表机: ipp://ip/印表机型号
    • 网络芳邻印表机: smb://user:password@host/printer
    假设我们的 Samba 上头接了一台 usb 连线的印表机,而我要将这部印表机取名为 hplaser2300 时, 你可以使用浏览器连接到 Samba 主机上头,必须注意到网址喔:

    CUPS 的管理介面示意图
    图三、CUPS 的管理介面示意图

    如上图三所示,先在网址列的地方务必要输入端口才行!然后按下箭头‘ 2 ’所指的地方, 亦即是‘Manage Printer’之后再按下‘Add printer’的按钮,就会出现如下画面, 记得要填写正确的资料喔!

    CUPS 的管理介面示意图
    图四、CUPS 的管理介面示意图

    然后如下图所示,选择正确的装置所在处!我们假设使用的是 USB 的印表机连接埠:

    CUPS 的管理介面示意图
    图五、CUPS 的管理介面示意图

    之后就是选择正确的型号啰,假设这部印表机为 HP 所出产的:

    CUPS 的管理介面示意图
    图六、CUPS 的管理介面示意图

    选择标准的雷射印表机驱动程序吧!

    CUPS 的管理介面示意图
    图七、CUPS 的管理介面示意图

    最后都成功后,就会找到如下所示的画面了。

    CUPS 的管理介面示意图
    图八、CUPS 的管理介面示意图

    到此为止我们可以假设你的 CUPS 已经有一台印表机存在了,即使该印表机目前无法工作, 但是就是有一台印表机嘛!^_^!接下来看看如何将他连结到咱们的 Samba 服务器中吧!


  • 3. 在 smb.conf 当中加入印表机的支援
  • 然后开始告诉 Samba 将这部印表机给他分享出去吧!你需要这样处理:
    [root@linux ~]# vi /etc/samba/smb.conf
    [global]
            .....其他省略.....
            # 这里列出的则是印表机相关的资料啊!
            printcap name = cups
            load printers = yes
            printing      = cups
    [printers]                             <==这个分享的资源名称一定是 printers
            comment     = All Printers
            printable   = yes              <==可以进行列印的功能
            browsable   = yes              <==可以让其他人浏览
            public      = yes
            valid users = @users dmtsai    <==可使用的人员有这些
            path        = /var/spool/samba <==列印伫列的地方,暂存资料
            printer admin = dmtsai         <==这是印表机管理员!需要可使用 SAMBA 者
            .....其他省略.....
    
    基本上透过这样的设定你的 Samba 就能够顺利的提供印表机的服务了! 不过可惜的是,Windows 用户端依旧得要安装印表机的驱动程序才能够使用 Samba 所提供的印表机, 此时真是麻烦兼讨厌啊~有没有可能让 Samba 主动的提供驱动程序给使用者,这样一来用户端就不需要额外去找驱动程序啰! 是可以的,透过 Samba 3.x 即可处理!

    或许你会想,印表机的型号这么多,那么 Linux 该如何提供这些印表机的驱动程序啊?岂不麻烦? 还好啦, CUPS 主要是透过利用 Postscript 的列印语言与印表机沟通的,因此用户端只要取得 postscript 的驱动程序他们就能够使用咱们的 Samba 服务器所提供的印表机了!如此一来, 不论印表机的型号为何,只要他们能够支援 Postscript 的列印格式,OK 搞定!而且 CUPS 官网本身就有提供 CUPS 的 Postscript 驱动程序啰!可以到底下的连结去下载:
    由于 CentOS 4.x 使用的是 1.1.x 版本,所以鸟哥下载的是 cups-samba-5.0rc3.tar.gz 这个文件, 接下来我们要将这个文件解压缩,然后将相关的程序给他安装到正确的目录去。 不过您得要注意的是,除了这个驱动程序外,要支援 Windows 2000/xp 的用户端, 你还得到 Windows XP 的底下目录去下载几个文件:
      C:\WINDOWS\system32\spool\drivers\w32x86\3
    里面的 PS 开头的文件通通下载下来,应该有四个文件的,请将他复制成为小写的文件,并且放置到你 Samba 主机上的 /usr/share/cups/drivers/ 目录下,然后将 cups-samba-5.0rc3.tar.gz 解压缩后执行 ./cups-samba.install 文件, 就能够将驱动程序通通安装到 /usr/share/cups/drivers/ 目录下了!这就是基本的驱动程序说! 在鸟哥的这个目录底下至少含有这几个文件就是了:
    [root@linux ~]# ll /usr/share/cups/drivers
    -r--r--r--  1 root root  14234 Sep 24  2002 cups5.hlp
    -r--r--r--  1 root root 280268 Jan  4  2004 cupsdrv5.dll
    -r--r--r--  1 root root 219540 Jan  4  2004 cupsui5.dll
    -rw-r--r--  1 root root 129024 Dec 27 14:18 ps5ui.dll
    -rw-r--r--  1 root root 455168 Dec 27 14:18 pscript5.dll
    -rw-r--r--  1 root root  27568 Dec 27 14:18 pscript.hlp
    -rw-r--r--  1 root root 792644 Dec 27 14:18 pscript.ntf
    
    上述的文件鸟哥将他打包成为一个文件了,你可以在底下的连结下载:
    不过您得注意,这个文件内的 Windows 资料是由 Windows XP 上面捉来的,所以对于 Windows 98/ME 是没有作用的。 您得自行上网查阅相关的资料下载方式喔。 接下来我们必须要在 smb.conf 里面增加一笔新的分享资料,这个分享资料必须是 [print$] 名称才行! 有点类似这样啦:
    [root@linux ~]# vi /etc/samba/smb.conf
            .....其他省略.....
    [print$]
            comment    = Printer drivers
            path       = /etc/samba/drivers  <==存放印表机驱动程序的目录
            browseable = yes
            read only  = yes
            write list = dmtsai              <==这个驱动程序的管理员
            .....其他省略.....
    
    [root@linux ~]# mkdir /etc/samba/drivers
    [root@linux ~]# chown dmtsai /etc/samba/drivers
    # 因为我们将印表机管理员以及驱动程序管理员的身份设定为 dmtsai 这个使用者,
    # 因此存放的目录也要改变一下权限才行呐!
    
    [root@linux ~]# testparm                 <==测试语法
    [root@linux ~]# /etc/init.d/smb restart  <==重新启动
    
    [root@linux ~]# smbclient -L //127.0.0.1 -U dmtsai
    Password: <==输入密码先
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Sharename    Type      Comment
        ---------    ----      -------
        print$       Disk      Printer drivers
        hplaser2300  Printer   HP Laser Jet 2300 printer
    # 瞧!有看到一台印表机以及驱动程序所在的分享资料啰!
    
    现在我们的要告知 Samba 说,我们的 CUPS 可提供 Windows 2000/XP 用户端的驱动程序, 所以用户不需要自行设定他们的驱动程序哩!要由 cups 告知 Samba 是由 cupsaddsmb 这个指令来搞定的, 整个指令的执行很简单的:
    [root@linux ~]# cupsaddsmb -H [SAMBA 主机名] -h [CUPS 主机名] \
    >   -a -v -U [使用者帐号]
    参数:
    -H :后续接的是 Samba 主机名,本机的话可以直接用 localhost 即可;
    -h :后续接的为 CUPS 的主机名,同样的可使用 localhost 即可;
    -a :搜寻所有可用的印表机;
    -v :列出更多的资讯;
    -U :印表机管理员
    
    范例:利用前面的说明将印表机驱动程序挂上 SAMBA
    [root@linux ~]# cupsaddsmb -H localhost -U dmtsai -a -v
    Password for dmtsai required to access localhost via SAMBA: <==输入 dmtsai 密码
    # 这里会闪过很多的讯息,说明已经安装了某些资讯,底下鸟哥仅列出简单的讯息而已。
    putting file /usr/share/cups/drivers/pscript5.dll as 
    \W32X86/pscript5.dll (1438.5 kb/s) (average 1342.5 kb/s)
    
    Printer Driver hplaser2300 successfully installed.
    
    Succesfully set hplaser2300 to driver hplaser2300.
    
    [root@linux ~]# ll /etc/samba/drivers
    drwxr-xr-x  3 dmtsai dmtsai 4096 Dec 27 14:40 W32X86
    
    最后在驱动程序的存放目录会多出一个 W32X86 的目录,你可以查询一下该目录的内容, 那就是预计要给用户端使用的驱动程序啦!这样就搞定了!不过,为了将所有的资料通通驱动, 建议您将 CUPS 及 SAMBA 通通重新启动吧!
    [root@linux ~]# /etc/init.d/cups restart
    [root@linux ~]# /etc/init.d/smb restart
    

  • 4. 一些问题的克服:
  • 如果一切顺利的话,你在 Windows 用户端应该可以顺利的连接到印表机啰! 开心吧!不过,如果你曾经印错资料,那么该如何进入 Linux 的 Samba 主机将该资料移除呢? 你最好知道底下的几个指令,关于这些指令的进阶用法则请自行给他 man man 看了:
    [root@linux ~]# lpstat -a
    hplaser2300 accepting requests since Jan 01 00:00
    # 列出所有可用的印表机状态
    
    [root@linux ~]# lpq
    hplaser2300 is ready
    no entries
    # 列出印表机的工作,若有列印工作存在时,会如下所示:
    hplaser2300 is ready and printing
    Rank    Owner   Job  File(s)                 Total Size
    active  dmtsai   5   smbprn.00000003 测试页  42954752 bytes
    
    [root@linux ~]# lprm all
    # 移除所有等待中的列印工作!
    
    列印工作就是这样进行的啦!赶紧试看看吧!


    小标题的图示安全性管理
    使用 SAMBA 其实是有一定程度的危险性的,这是因为很多网络攻击的蠕虫就是透过 NetBIOS 来攻击的! 因此,在搭建好了 SAMBA 之后,请记得将权限方面的工作做好!权限方面的工作除了 smb.conf 内的设定外, Linux 文件系统的 r, w, x 权限也是相当重要的喔!我们底下就简单的介绍一下一些基本的安全性管理吧!


  • 利用 iptables 来管理
  • 最简单的管理登入 SAMBA 的方法就是透过 iptables 啦!详细的说明我们已经在 防火墙章节当中提过了,所以这里不在详加说明。 要知道的是,如果你仅要针对底下的范围开放 Samba 时,可以这样想:
    • 仅针对 192.168.1.0/24 这个网络开放 SAMBA;
    • SAMBA 的 port 有 137~139 tcp/udp;
    • SAMBA 主机的网络卡为 eth0
    所以 iptables.rule 规则当中应该要加入这几项:
    iptables -A INPUT -p tcp -i eth0 -s 192.168.1.0/24 --dport 139     -j ACCEPT
    iptables -A INPUT -p udp -i eth0 -s 192.168.1.0/24 --dport 137:138 -j ACCEPT
    
    当然啦!这是很简单很简单的防火墙规则,您必须要依据您的环境自行修改 (通常修改那个 192.168.1.0/24 网段即可!) 。除了 iptables 必须要开放之外,您还需要将管制 daemon 是否能够进出的 TCP Wrappers 开放才行呐!如果万一您看到 /etc/hosts.deny 里面多了这一行:
    [root@linux ~]# cat /etc/hosts.deny
    ALL : ALL
    
    不要怀疑,很可能会造成不只 SAMBA 不能动作而已~连其他的 daemon 都可能会无法动作呢!所以,请将这一行拿掉吧! 或者是将适合的 daemon 开放在 /etc/hosts.allow 文件里面喔!


  • smb.conf 的设定值
  • 事实上 Samba 已经有许多防火墙机制啦!那就是 hosts allow 及 hosts deny 这两个参数。 通常我们只要使用 hosts allow 即可,那么没有写入这个设定项目的其他来源就会被拒绝连线的! 举例来说,如果你只想要让本机、192.168.1.11, 192.168.1.21 使用 SAMBA 而已,那么可以这样写:
    [root@linux ~]# vi /etc/samba/smb.conf
    [global]
            # 跟安全有关
            hosts allow = 127. 192.168.1.11 192.168.1.21
    	smb ports = 139
    
    如此一来不但只有数部主机可以登入我们的 SAMBA 服务器,而且 Samba 只能以标准的 port 139 来连结, 关闭 Windows 常用且有点问题的 port 445 呢!这样会比较好一些啦! 未来如果还有人想要连结你的 Samba 时,将他加入 hosts allow 后面即可! 不难吧! ^_^


  • 利用 Quota 限制使用者空间使用
  • quota 是磁碟配额限制的一个 daemon ,您可以依据不同的使用者来加以限制他们能够使用的硬碟空间, 前提是‘该磁碟空间必须是一个独立的 partition ’才行,不建议针对根目录 ‘ / ’进行 quota !这也是为什么我们在主机规划时特别建议大家独立出一个 partition 来进行硬碟规划的原因!关于 quota 的详细用法在‘ 鸟哥的 Linux 私房菜--基础学习篇’里面已经谈得很清楚了, 这里我们不再详谈!只给大家来做个练习就是了!

    例题:
    在规划主机的时候,我将 /dev/hda2 独立一个 partition 给 /home 这个目录,现在想要规划 quota 针对 dmtsai 这个使用者进行磁碟配额的限制,他的 hardlimit 为 50mb 而 softlimit 为 40mb ,请问整个动作应该如何进行?
    答:
    1. 编辑修改 /etc/fstab ,使得 /dev/hda2 这个 partition 成为如下模样:
      /dev/hda2 /home  ext3  defaults,usrquota,grpquota 1 1
      修改完毕之后,请千万记得使用 mount -a 查询看看有没有设定错误 (上面总共只有六个栏位喔!), 这个动作如果发生错误,那么请记得再次的进行 /etc/fstab 的修改!请特别留意啊!因为写错的话, 很容易造成无法正常开机的窘境!

    2. 上述动作确定没有问题之后,请重新开机启动 quota 的支援:
      sync; sync; sync; reboot
    3. 执行底下的指令,建立 quota 所需要的设定文件:
      quotacheck -avug
      特别注意,如果上述的动作发生‘找不到设定档’的意思的讯息时,您可以这样做:
      touch /home/aquota.user; touch /home/aquota.group
      然后再进行一次 quotacheck 即可!

    4. 启动 quota 啰:
      quotaon -av
    5. 设定 bird 的磁碟配额:
      edquota -u dmtsai
      Disk quotas for user dmtsai (uid 501):
      Filesystem   blocks    soft  hard inodes  soft  hard 
      /dev/hdb2        32  40000  50000     8     0     0
      因为我们只针对硬碟空间,不针对 inode 做限制,所以只要前面的数字修订即可!请注意,数字的单位为 kbytes !


  • 关于备份
  • 跟 SAMBA 最有关的当然就是使用者的资讯啰!所以,您应该要备份的就是使用者的资料,以及 Samba 相关的设定资料了!比较相关的有几个咚咚:
    • /etc (因为含有 /etc/passwd 以及 /etc/samba 里面的资料,所以建议可以全部给他备份下来 )
    • /home (还是可以察看一下,是否有其他非必要的!不过,一般来说,都会是备份的个人资料比较多啦!)
    • 其他由 smb.conf 里面设定开放的目录。
    无论如何,备份还是挺重要的!

    小标题的图示主机安装时的规划与中文磁区挂载
    现在您知道 Samba 服务器的功能是用来作为文件服务器的,每个使用者都可以拥有家目录, 并透过网芳的功能来连结到 Samba 服务器中。这就有个问题啦,那就是你的使用者如果太多, 并且将他们的重要资料都放到这部 Samba 主机上头的话,那肯定 /home 未来会有点不足啊! 所以 /home 所在的磁碟或许可以使用大一点的硬碟,或者使用磁碟阵列,使用 LVM 也是个不错的方案。 底下为简单的思考方向:
    • 在安装 Linux 的时候,建议不需要安装 X Window ;
    • 在规划 Linux 时,/home 最好独立出一个 partition ,而且硬碟空间最好能够大一些;
    • /home 独立出来的 partition 可以单独进行 quota 的作业,以规范每个使用者能够使用的最大硬碟容量;
    • 由于 SAMBA 可以做为印表机服务器,所以建议印表机可以直接连接在 Linux 主机的列印埠 (LPT1, USB...);
    • 由于 SAMBA 一般来说都仅针对内部 (LAN) 主机进行开放,所以,可能的话 SAMBA 主机直接使用内部保留 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/hd[a-d][1-16] /mount/point
    
    其中 iocharset 指的是本机的语系编码方式, codepage 则与远端软件有关。因为我们是在本机进行挂载, 所以实际上使用 iocharset 这个参数即可啦!更多说明则请看下节的用户端设定部分啰!

    大标题的图示Samba 用户端软件功能
    现在你已经搭建好了 Samba 服务器啦!有服务器当然要有用户端来使用才是好的服务器嘛!不然要这个服务器干嘛? 而我们假设区域网络内有 Windows/Linux 系统,这两种系统都是透过 NetBIOS over TCP/IP 来连上 Samba 主机的, 在设定之前你必须要知道的有几件事:
    • 在区网内的主机最好具有相同的工作群组,且具有不同的主机名称;
    • Windows XP pro. 最多仅能允许十个用户同时连接到网芳;
    • 你可以在网芳当中看到的通常是相同群组的主机;
    • 可以使用‘搜寻’-->‘电脑’-->‘输入 IP’来查到 Samba 主机;
    • Windows 的网芳预设仅有同一网络的主机才能登入!
    接下来咱们就分别依照 Windows XP 及 Linux 系统来做说明吧!


    小标题的图示Windows 系统的使用
    在 Windows 上面的搜寻实在挺简单的,你有好几种方法可以处理:
    • 打开‘文件总管’,‘网络上的芳邻’、‘整个网络’、‘Microsoft Windows Network’ 就能看到属于您群组的所有电脑主机了!

    • ‘开始’、‘搜寻’、‘文件或资料夹’、‘电脑或人员’、‘网络上的电脑’, 然后在出现的方框当中填写正确的 IP ,按下‘搜寻’即可! 这个方法可以适用于不在同一个群组当中的网络主机喔!
    举例来说,如果想要连接到我们的 Samba 主机的话,而又不知到这部 Samba 主机的 NetBIOS name , 那利用搜寻的结果会有点类似如下的图示:

    Windows XP 用户端搜寻示意图
    图九、Windows XP 用户端搜寻示意图

    上图九中先在左侧的地方输入正确的 IP 后,按下搜寻,如果一切顺利的话那么右上方就会出现这部 Samba 主机的说明了。 双击一下该主机名称,就会出现右下方的项目!瞧!那就是我们所设定的几个基本项目的啦!真是好高兴! 然后你就可以开始进入相对应的目录进行资料的存取了,就这么简单。 如果是印表机的话,那么你将滑鼠移动到印表机的上方,按下右键后可以选择‘连线’的项目, 如下所示:

    Windows XP 用户端连线印表机示意图
    图十、Windows XP 用户端连线印表机示意图

    如果一切顺利的话,嘿嘿!你就可以在点选‘开始’、‘设定’、‘印表机和传真’后所出现的视窗看到这部印表机啰! 真是好棒呐! ^_^


  • 让 Windows 系统的网芳支援不同网络的 IP 连线
  • 由于 Windows XP sp2 这个作业系统版本预设的防火墙仅开放相同网络的 IP 来源使用本机的网芳资料, 所以如果是不同的网络想要使用时,预设是无法穿透 Windows 防火墙的。此时你可以修改一下防火墙的设定啊! 请叫出控制台,然后点选‘Windows 防火墙’就会出现如下的图示了:

    Windows XP 服务器防火墙示意图
    图十一、Windows XP 服务器防火墙示意图

    按照上图的说明,依序点选‘例外’、‘文件及印表机共用’、‘编辑’后, 就会出现该防火墙机制所管理的端口以及可连线的网络,如下图所示:

    Windows XP 服务器防火墙示意图
    图十二、Windows XP 服务器防火墙示意图

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

    Windows XP 服务器防火墙示意图
    图十三、Windows XP 服务器防火墙示意图

    选择自订的方式来设定能够使用你 Windows 网芳资料的来源 IP 或网段即可,然后确定之后即可处理呐! 这样一来,及时我们的 Linux 不与 Windows 同在一个网络中,也能够登入 Windows 存取网芳资料哩。


  • 透过 port 445 的特殊登入方式
  • 如果你知道 Samba 主机有分享出 port 445 ,并且他已经分享了某个目录时,举例来说, 我们的 192.168.1.254 有分享出 public 这个分享资源名称时,那么这个目录的完整写法为:‘ \\192.168.1.254\public ’,我们可以透过‘开始’、‘执行’来处理这个玩意儿! 如下所示:

    Windows XP 透过 port 445 连线
    图十四、Windows XP 透过 port 445 连线

    如果可以登入的话就会顺利登入,否则就会弹出一个要你输入帐号密码的视窗,输入正确的资料即可! 呼呼!真过瘾~除此之外,我们还可以登入别人 Windows 主机的 C 或 D 槽喔!写法则变成这样:
      \\192.168.1.21\c$
    所以说,怕了吧!俺还真害怕~所以啊,Samba 没必要时,那个 port 445 应该是可以关闭的吧!

    小标题的图示Linux 系统的使用
    咱们的 Samba 有提供 Linux 网芳的用户端功能喔!也就是说 Linux 可以挂载 Samba 主机也能挂载 Windows 提供的网芳啦! 主要是透过 smbclient 来观察,再以 smbmount 或 mount 来挂载磁区哩。先来介绍一下 smbclient 这个指令吧:
    1. 关于查询的功能
    [root@linux ~]# smbclient -L //[IP|hostname] [-U username]
    [root@linux ~]# smbclient -L //127.0.0.1 -U dmtsai
    Password:
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    ....分享的资源输出省略....
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    
        Server           Comment
        ---------        -------
    
        Workgroup        Master
        ---------        -------
        VBIRDGRP         VBIRD_OP_2
        VBIRDHOUSE       VBIRDSERVER
    # 从这里可以知道在目前网络当中有多少个工作群组与主要的名称解析主机
    
    除了这个先前用过的查询功能之外,我们可以这样简易使用网芳的:
    2. 利用类似 FTP 的方式登入远端主机
    [root@linux ~]# smbclient '//[IP|hostname]/资源名称' [-U username]
    # 意思是使用某个帐号来直接登入某部主机的某个分享资源,举例如下:
    [root@linux ~]# smbclient '//127.0.0.1/dmtsai' -U dmtsai
    Password:
    Domain=[VBIRDSERVER] OS=[Unix] Server=[Samba 3.0.10-1.4E.9]
    smb: \> dir
    # 在 smb 底下其实就是在 //127.0.0.1/dmtsai 这个目录底下啦!所以,
    # 我们可以使用 dir, get, put 等常用的 ftp 指令来进行资料传输了!
    ?   :列出所有可以用的指令,常用!
    cd  :变换到远端主机的目录
    del :杀掉某个文件
    lcd :变换本机端的目录
    ls  :察看目前所在目录的文件
    dir :与 ls 相同
    get :下载单一文件
    mget:下载大量文件
    mput:上传大量文件
    put :上传单一文件
    rm  :删除文件
    # 其他的指令用法请参考 man smbclient 喔!
    
    事实上,使用 smbclient 一点也不方便,因为使用的是 ftp 的功能语法,有点怪怪的~能不能像 Windows 那样,可以直接连线网络磁碟机啊?这当然没有问题!不过就需要藉由 smbmount 来协助了!smbmount 可以将远端主机分享出来的目录整个给他 mount 到本机的 mount point (某个目录),如此一来, 远端主机的目录就好像在我们本机的一个 partition 一样喔!可以直接执行复制、编辑等动作!这可就好用的多了! 底下我们来谈一谈怎么用这个 smbmount 吧!
    [root@linux ~]# smbmount //IP/分享资源 /挂载点 [-o options]
    参数:
    -o 后面接的参数 (options) 常用的有底下这些:
       username=你的登入帐号:例如 username=dmtsai
       password=你的登入密码:需要与上面 username 相对应啊!
       iocharset=本机的语系编码方式,如 big5 或 utf8 等等;
       codepage=远端主机的语系编码方式,例如繁体中文为cp950
    
    范例一:以 dmtsai 的身份将其家目录挂载至 /mnt/samba 中
    [root@linux ~]# smbmount //127.0.0.1/dmtsai /mnt/samba
    > -o username=dmtsai,password=pw_test,codepage=cp950
    [root@linux ~]# df
    //127.0.0.1/dmtsai  20161024  3088896  17072128  16% /mnt/samba
    
    经由 smbmount 的动作,我们就可以轻易的将远端分享出来的咚咚给他挂载到自己 Linux 本机上面!好用的很~事实上,原本 mount 这个指令如果有支援 smbfs 的话, 那也就可以直接挂载网络上的芳邻分享出来的目录了!例如上面的例子当中,我们也可以这样下达指令:
    mount -t smbfs //127.0.0.1/dmtsai /mnt/samba \
    -o username=dmtsai,password=pw_test,codepage=cp950,iocharset=big5
    
    更详细的 mount 用法,请 man mount 或者看考‘鸟哥的 Linux 私房菜 -- 基础学习篇’的内容喔! ^_^


  • 查询 NetBIOS name 与 IP 及其他相关资讯:
  • 现在我们可以透过一些 NetBIOS 相关的功能来取得 NetBIOS name ,不过,如果你还想要知道这个 NetBIOS name 的其他资讯时, 例如 IP、分享的资源等等,那可以使用 nmblookup 这个指令来搞定即可。他是这么使用的:
    [root@linux ~]# 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 资料;
    
    范例一:藉由本机找出 vbirdserver 这部主机的 IP 位址
    [root@linux ~]# nmblookup -U localhost vbirdserver
    querying vbirdserver on 127.0.0.1
    192.168.1.254 vbirdserver<00>
    
    范例二:找出 vbirdserver 的 MAC 与 IP 等资讯:
    [root@linux ~]# nmblookup -S vbirdserver
    querying vbirdserver on 192.168.1.255
    192.168.1.254 vbirdserver<00>
    Looking up status of 192.168.1.254
            VBIRDSERVER     <00> -         B <ACTIVE>
            ..__MSBROWSE__. <01> - <GROUP> B <ACTIVE>
            VBIRDHOUSE      <1e> - <GROUP> B <ACTIVE>
    
            MAC Address = 00-00-00-00-00-00 <==因为是本机资料,所以 MAC 会成为这样
    

  • 利用 smbstatus 观察 SAMBA 的状态
  • 如果想要查阅目前 SAMBA 有多人人来连线且哪些资源分享已经被使用的话,可以这样看:
    [root@linux ~]# smbstatus [-pS] [-u username]
    参数:
    -p :列出已经使用 SAMBA 连线的程序 PID ;
    -S :列出已经被使用的资源分享状态;
    -u :只列出某个使用者相关的分享资料
    
    范例一:列出目前主机完整的 Samba 状态
    [root@linux ~]# smbstatus
    Samba version 3.0.10-1.4E.9
    PID     Username      Group         Machine
    -------------------------------------------------------------------
     4973   dmtsai        dmtsai        127.0.0.1    (127.0.0.1)
    # 上面列出的是与 PID 有关的资讯,可用 smbstatus -p 单纯列出
    
    Service      pid     machine       Connected at
    -------------------------------------------------------
    dmtsai        4973   127.0.0.1     Thu Dec 28 10:58:36 2006
    # 上面列出的则是分享资源,那个 Service 就是分享的目录。
    
    你可以透过这个小程序来了解到目前有多少人使用你的 SAMBA 的啦!

    大标题的图示服务器进阶管理
    除了前面提到的几个资讯之外,在这里我们也来谈谈如何让你的 Samba 作更多的事情! 包括将 Windows 使用者的家目录放到 Samba 上头呢!^_^


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

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

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

    PDC 是个很复杂的环境,他可以达到的功能相当的多,而且密码的验证也不必在同一台 PDC 主机上面, 不过这里我们不谈那么复杂的东西,只是做一个简单的练习,因此底下的这部 PDC 使用自己的密码来进行验证, 并且也管理自己所分享出去的资源啰!整个基本的设定流程应该是这样的:
    • 设定好 PDC 主机的 TCP/IP 与 Windows 主机的网络,这个你应该已知如何处理了;
    • 设定 PDC 的角色定位,因为 PDC 管理自己的密码,所以 security = user
    • PDC 最好拥有整个网络的名称解析权力,亦即成为主要的名称解析器;
    • 需有 netlogon 资源分享,提供 windows 2000/XP pro. 用户端的登入之用;
    • 由于 Windows 需读入个人设定档,预设目录为 profile,Linux 系统需预先设定此目录;
    • 增加 PDC 上的使用者帐号以及机器代码 (machine account) 等等
    • 在 Windows 2000/XP pro. 个人电脑上设定成为 PDC 的用户端。
    底下咱们就来依序处理处理先!


  • 0. 设定 lmhosts 或 /etc/hosts 对应 Netbios 与 IP
  • 由于我们的 Samba 即将成为整个网络的名称解析者,因此你最好将整个网络的 NetBIOS name 与 IP 的对应写入此这个文件当中。当然啦,如果你的网络 IP 的取得为 DHCP ,那这个文件就不要写了吧! 以我们这个案例为例,这个文件的内容应该是:
    [root@linux ~]# vi /etc/samba/lmhosts
    127.0.0.1       localhost
    192.168.1.254   vbirdserver
    192.168.1.21    vbirdcpu2
    192.168.1.11    vbirdcpu1
    

  • 1. 设定 smb.conf 成为具有 PDC 的能力
  • 假设我们要让 PDC 用户端登入时可以取得他自己的家目录,那么需要这样处理:
    [root@linux ~]# vi /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
            socket options    = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            dns proxy         = no
            template shell    = /bin/false
            winbind use default domain = no
            security          = user
            encrypt passwords = yes
            smb passwd file   = /etc/samba/smbpasswd
            printcap name     = cups
            load printers     = yes
            printing          = cups
    
            # 与 PDC 有关的一些设定值:
            # 底下几个设定值处理成为本区域网络内的主要名称解析器
            preferred master = yes
            domain master    = yes
            local master     = yes
            wins support     = yes
            # 作业系统 (OS) 等级越高才能成为主网络的控制者,一般 NT 为 32,
            # Windows 2000 为 64 ,所以这里我们设定高一点,但不可超过 255
            os level = 200
            # 底下则是设定能否利用 PDC 登入,且登入需要进行哪些动作:
            domain logons = yes
            logon drive   = K:          <==登入后家目录挂载成 Windows 哪一槽
            logon script  = startup.bat <==每个使用者登入后会自动执行的程序
            time server   = yes         <==自动调整 Windows 时间与 Samba 同步
            admin users   = root        <==预设的管理员帐号!预设为 root 
    # 因为鸟哥不喜欢在 Samba 当中使用 root ,所以这里你也可以指定成其他帐号。
    
    # 这个在指定登入者能够进行的工作,里面主要是具有许多执行程序:
    [netlogon]  <==与前面的 logon script 有关,该程序放置在这里
       comment         = Network Logon Service
       path            = /home/samba/netlogon  <==你要自己主动建立此目录
       writable        = no
       write list      = root
       follow symlinks = yes
       guest ok        = yes
    
    [homes]
            comment = Home directories
            browseable = no
            writable = yes
            valid users = %S
            create mode = 0664
            directory mode = 0775
    [temp]
            comment   = Temporary file space
            path      = /tmp
            read only = no
            public    = yes
    
    [root@linux ~]# testparm
    [root@linux ~]# /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]:指定利用网络登入时首先去查询的目录资源。

  • 2. 建立所需要的目录与文件
  • 先来建立 [netlogon] 内所需要的资料好了,那就是一个目录:
    [root@linux ~]# mkdir -p /home/samba/netlogon
    
    接下来我们还得要建立允许使用者执行的文件,就是那个 startup.bat 才行! 注意一下,我们这里假设使用者家目录为 K 槽,而 Samba 额外分享的 temp 则为 L 槽, 那你可以这样做:
    [root@linux ~]# vi /home/samba/netlogon/startup.bat
    net time \\vbirdserver /set /yes
    net use K: /home
    net use L: \\vbirdserver\temp
    # 这个文件的格式为:net use [device:] [directory]
    
    # 再将该文件转成 DOS 的断行格式才行!因为是提供给 Windows  系统嘛!
    [root@linux ~]# unix2dos /home/samba/netlogon/startup.bat
    [root@linux ~]# cat -A /home/samba/netlogon/startup.bat
    net time \\vbirdserver /set /yes^M$
    net use K: /home^M$
    net use L: \\vbirdserver\temp^M$
    # 瞧见吗?会多出个奇怪的 ^M 符号,那就是 Windows 断行字元。
    

  • 3. 建立使用者
  • 在 Samba 里面建立使用者就是利用 smbpasswd 这个指令而已,我们已经建立过,所以这里不再说明。 但是由于我们需要 root 这个帐号来管理 PDC 与 Windows 用户端之间连线建立时所需要的权限, 所以你必须要建立起这个使用者才行。建立的方法很简单,直接这样做吧:
    [root@linux ~]# smbpasswd -a root
    
    另外,我们都知道 Windows XP pro. 的使用者设定档会被放置到‘ C:\Documents and Settings\使用者帐号 ’目录中, 在该目录底下会有类似桌面、我的最爱、应用程序设定、启动、我的文件夹啊等等的, 这些东西会放置到 Samba PDC 的哪里去备份啊?其实是放置到:
      /home/使用者帐号/profile/
    目录下的,该目录预设会被主动的建立起来,不过偶而会有一些权限错误的问题~伤脑筋~ 所以你可以预先处理该目录,以 chmod 或 chown 来改变成该使用者可以存取的权限。 另外,为了避免困扰,对于新增的使用者而言,你可以这样做:
    [root@linux ~]# mkdir /etc/skel/profile
    
    那以后新增的使用者都有可以存放来自 Windows 的特殊设定档目录喔!比较好管理啰~ 当然啦,使用 useradd 新增使用者后,记得也要使用 smbpasswd -a username 来让该使用者可以使用 Samba 喔!


  • 4. 建立机器码帐号
  • 由于 PDC 会针对 Windows 用户端的主机名称 (NetBIOS name) 进行主机帐号检查, 所以我们也要为用户端的主机名称进行帐号的设定。咦!啥是主机帐号? 一般使用者帐号是英文或数字,主机帐号则在该帐号最后面加上一个钱字号‘$’即可! 举例来说, vbirdcpu2 这部主机可设定的帐号名称为 vbirdcpu2$。

    而我们知道要使用 smbpasswd 增加的使用者必须要在 /etc/passwd 当中, 因此要建立这个帐号你就得要这样做:
    [root@linux ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdcpu2$
    [root@linux ~]# useradd -M -s /sbin/nologin -d /dev/null vbirdcpu1$
    
    会增加 -M -s -d 等参数的原因是因为不想要让这个帐号具有可以登入的权限, 因此将这个主机帐号设定的比较怪一点~ ^_^~接下来让 Samba 知道这个帐号是主机帐号, 所以你应该要这样做:
    [root@linux ~]# smbpasswd -a -m vbirdcpu1$
    [root@linux ~]# smbpasswd -a -m vbirdcpu2$
    
    这样便加入主机帐号啰!而我们的 Samba PDC 也就可以透过‘主机帐号’来判断 Windows 用户端能否连上来, 若连接上 PDC 与 Windows 用户端后,接下来一般使用者帐号就可以在 windows 用户端登入了!


  • 5. Windows XP Pro. 用户端的连线与登入
  • 请注意,底下的方法仅是用于 Windows 2000, Windows XP 专业版 (Pro.),一般的 Windows XP home 版本是不支援的! 如果你用户端的主机是随机版的 Windows XP ,通常是 Windows XP home ,那底下的方法可能就无法适用啰! 要连接上 Samba PDC 的过程也是挺简单的,你可以这样做:
    1. 确认 windows 用户端的网络与主机名称

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

      Windows 用户端连上 PDC 的方式
      图十五、Windows 用户端连上 PDC 的方式

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

    2. 设定主机名称与网络名称

      接下来我们要设定这部 Windows XP pro. 要连结到区域网络上的哪部 PDC 上面, 亦即是处理主机帐号以及 Samba PDC 负责的网络 (domain) 啦! 在图十五按下‘网络识别’后,分别在出现的视窗当中选择:

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


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

      Windows 用户端连上 PDC 的方式
      图十六、Windows 用户端连上 PDC 的方式

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

      Windows 用户端连上 PDC 的方式
      图十七、Windows 用户端连上 PDC 的方式

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

      Windows 用户端连上 PDC 的方式
      图十八、Windows 用户端连上 PDC 的方式

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

      Windows 用户端连上 PDC 的方式
      图十九、Windows 用户端连上 PDC 的方式

      恭喜您,这就表示已经连接上 Samba PDC 啰!我们希望所有的使用者都直接由 Samba PDC 管理,所以这里请填写 ‘此时不新增使用者’吧!按下一步去。

    3. 如果发生错误情况

      如果老是发生错误讯息为‘使用的帐户是电脑帐户。请使用您的通用使用者帐户或本机使用者帐户来存取这台服务器’时, 你可以这样做的:

      • 先察看一下 /var/log/samba 里面的登录档资讯,尤其是 vbirdcpu2.log 关于这部主机的资讯呐;
      • 如果还是无法解决,可以在 lmhosts 里面增加 vbirdcpu2 的 IP 与主机名称的对应,然后将 samba 整个关掉‘/etc/init.d/smb stop’,等待一段时间让 NetBIOS 的名称解析时间逾时,再重新启动 samba ‘/etc/init.d/smb start’,然后再重新做一次输入 root 的密码那个动作

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

    4. 重新开机并以新的网络名称登入

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

      Windows 用户端连上 PDC 的方式
      图二十、Windows 用户端连上 PDC 的方式

      请输入你在 Samba PDC 上面拥有的帐号与密码,当然啦,上图中最底下的选项最重要! 现在这部 Windows 主机可以使用他自己的帐号登入,也可以透过 Samba 主机来登入喔! 粉不错啦! ^_^

    5. 观察使用者的家目录与设定档

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

      Windows 用户端连上 PDC 的方式
      图二十一、Windows 用户端连上 PDC 的方式

      呵呵!该连上的通通连结上来啰!你也可以在自己的家目录 (K 槽) 新增移除资料的!是否很不错啊! ^_^! 而当你登出之后,你在 Windows 桌面上头所进行的各项个人化设定通通会被移动到 /home/dmtsai/profile 当中喔! 如果不相信的话,请自行前往 Samba 主机上头瞧一瞧就知道了。

    6. 一些使用上面的技巧

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

      所以,你应该将一些文件资料放置到你的家目录下,亦即 K 槽当中,尽量不要使用 Windows 预设的‘我的文件夹’, 因为‘我的文件夹’会将资料移动到 /home/username/profile/My Documents 目录下,同样的, 储存到桌面的资料会被放置到 /home/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) 是没有作用的!请先确认才行喔!


    小标题的图示问题克服
    通常我们在设定 SAMBA 的时候,如果是以 Workgroup 的方式来进行 smb.conf 的设定时,几乎很容易就可以设定成功了!并没有什么很困难的步骤。不过,万一还是无法成功的设定起来, 请务必察看登录档,也就是在 /var/log/samba 里面的资料!在这里面的资料当中,您会发现:咦! 怎么这么多文件啊!因为我们在 smb.conf 里面设定了:
      log file = /var/log/samba/%m.log
    那个 %m 是指 Client 的 NetBIOS Name 的意思,所以,当有个 vbirdcpu2 的主机来登入我们的 vbirdserver 主机时,那么登入的资讯就会被纪录在 /var/log/samba/vbirdcpu2.log 文件喔!而如果万一来源 IP 并没有 Netbios name 的时候,那么很可能是一些错误讯息,这些错误讯息就会被纪录到 log.smbd, log.nmbd 里面去了!所以,如果您要察看某部电脑连上您的 SAMBA 主机发生了什么问题时,特别要留意这个登录档的形式喔!

    另外,如果您的 SAMBA 明明已经启动完成了,却偏偏老是无法成功,又无法查出问题时,建议先关闭 Samba 一阵子,再重新启动:
      /etc/init.d/smb stop
    在我的案例当中,确实有几次是因为 PID 与 NetBIOS 的问题,导致整个 SAMBA 怪怪的~所以完整的关闭之后, 经过一阵子的短暂时间,再重新启动,应该就可以恢复正常了!

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


    小标题的图示使用者修改 samba 密码
    有个问题是,我们知道使用者可以透过 passwd 修改 /etc/shadow 内的密码,那么使用者可否修改 samba 在 /etc/samba/smbpasswd 内的密码呢?可以啊!直接输入 smbpasswd 就能够修改自己的密码了! 非常简单吧~不过,如果想要让 /etc/shadow 与 /etc/samba/smbpasswd 同步的话, 那就得要动点手脚了~您可以参考底下这两个连结来处理呢。

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

    那该怎么办?其实可以透过 ACL 来管理某个目录的单一使用者权限啦!所以说, 权限的管理不必透过 smb.conf 的设定,只要透过 ACL 来管理就能够达到你所需要的目的了。 关于 ACL 的说明我们在前面的认识网络安全当中已经提过了, 这里不再啰唆,请自行前往查阅呐! ^_^

    大标题的图示重点回顾
    • Samba 名称的由来是因为需包含没有意义的 SMB server 之故;
    • SAMBA 可以让 Linux 与 Windows 直接进行文件系统的使用;
    • SAMBA 是由 Andrew Tridgwell 在 1991 年的时候利用不同平台所发展出来的;
    • SAMBA 主要架构在 NetBIOS 上发展的,且以 NetBIOS over TCP/IP 克服 NetBIOS 无法跨路由的问题;

    大标题的图示课后练习
    • 一般来说, SAMBA 使用的设定档放置在哪里?档名为何?
    • 使用的档名为 smb.conf ,通常会放置在 /etc/samba/smb.conf 里面,不过,最好可以使用 rpm -qc packagename 来查询!
    • 哪一个指令可以用来判断 smb.conf 这个设定档的正确性?
    • 当我们修改完 smb.conf 之后,记得要以 testparm 来进行 samba 的确认!
    • 哪一个指令可以用来察看 SAMBA 主机分享出什么目录?
    • 利用 smbclient 即可:‘smbclient -L NetBiosName -U username ’!
    • smbmount 的功能为何?
    • 在 Linux 系统上面,将 Windows 的网络上的芳邻,或者是 Linux 的 SAMBA 所提供分享的资源挂载到自己的系统下!
    • 我今天使用 smbpasswd 去新增一位使用者 badbird,让他可以登入我的 Linux SAMBA 主机,但是无论如何就是无法新增。您认为原因可能是什么?
    • 由于 Samba 使用者的资讯必须要存在于 /etc/passwd 里面,既然无法新增,应该先确认 badbird 这个使用者已经存在于 Linux 系统当中了!如果还是无法新增,则需要查阅 smb.conf 的设定,看看是否 /etc/samba/smbpasswd 这个密码文件不存在?

    大标题的图示参考资料

    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 是错的!

     
         
    中国存储网 ChinaStor.com排版整理
    原文作者鸟哥,主页,更多Linux学习资料在线看:Linux系统管理员手册 - Linux命令大全 - Linux调用大全- Linux专栏 - 国产Linux