第十七章 SAMBA 网络芳邻

17.1 安装 Samba

在MS windows 系统中,我们可以使用 "网络上的芳邻"。而 FreeBSD 中也有软件可以让你在 windows 的网芳中看到 FreeBSD,甚至可以让 FreeBSD 存取 windows 的网芳数据。这就是 Samba 这套软件的功能。

Samba 的安装设定很简单,我们可以使用 ports 来安装:

# cd /usr/ports/net/samba
# make install clean

接着,将出现图 17-1 的画面,让您做一些偏好设定:

图 17-1

我们选择 syslog、acl、quota、recyle。syslog 让我们可以将 samba 的执行讯息经由 syslogd 记录下来。ACL 是 Access Control List 的缩写,您可以在 Windows NT 中设定档案权限,samba 可将 Windows 的权限对映在 FreeBSD 中。Quota 可支持使用者配额设定,而 recycle 就是资源回收筒。完成后就可以选 OK 继续编译了。

安装完后,组态文件的范本会放在 /usr/local/etc/smb.conf.default,我们可以直接复制它来加以修改:

# cd /usr/local/etc/
# cp smb.conf.default smb.conf

Samba 的组态设定除了可以使用文字编辑软件来修改 smb.conf 外,我们还可以使用浏览器连到 Samba 以图形化接口来设定。

我们先来介绍一下 smb.conf 档案的内容,在 smb.conf 档案中行首为 ";" 或 "#" 都是批注。我们可以 man smb.conf 来读取设定说明。修改完 smb.conf 之后,我们可以使用指令 "testparm" 来查看我们的设定有没有语法上的错误。以下为 smb.conf 的主要的设定说明:

#===================== Global Settings =========================
[global]

# workgroup 就是设定计算机的工作群组。
   workgroup = 企管系

# server string 相当于在 NT 中的计算机描述,就是你的计算机要叫什么
# 名字
   server string = Samba 服务器

# 这个设定可以限制联机来源,以增加安全性。我们可以在这里限制
# 只有
# 本地的机器才可以联机。
;   hosts allow = 192.168.1. 192.168.2. 127.

# 如果希望自动加载列表机清单,而不要一台台设定,可以设为 yes。
   load printers = yes

# 如果你要自己设定 guest account,可以将这里的批注拿掉,并在
# /etc/passwd 中加入该账号。如果不设定,预设的账号是 nobody。
;  guest account = pcguest

# Samba 会将每个使用者的使用记录存成 log.使用者,因此我们在
# /var/log 中建立一个目录来统一存放这些档案。
   log file = /var/log/samba/log.%m

# log 檔最大是多少 Kb
   max log size = 50

# 要使用哪一种安全模式。在 Windows 9X 的网芳中,我们可以设
# 密码,而在 Windows NT 中,我们可以设定使用者名称及密码。
# 如果在这里设定为 share,就是只使用密码;而设为 user 则是
# 要输入使用者名称及密码。如果我们设为 user,client 端在浏
# 览网芳时,windows 会自动输入使用者名称为登入 windows 时所
# 使用的名称。我们必须要在 samba 中加入相对的使用者及密码。
# 我们等一下会以图形接口说明如何设定。
   security = user
# 当 security = server 时,可以指定密码服务器
;   password server =

# Windows 98 及 WinNT SP3 以上会将密码加密,我们必须将它设为 yes
  encrypt passwords = yes

# 设定 Samba 可以使用多个接口,如果你有多张网络卡,可以在这里设定
# 假设你的 ip 是 140.115.25.25,子网掩码是 255.255.255.0,你可以设
# 为 140.115.25.25/24
   interfaces = 192.168.1.1/24

# Windows Internet Name Serving Support Section:
;   wins support = yes

# WINS Server - 设定 WINS Server
;   wins server = w.x.y.z

# for Traditional Chinese Users
# 要在网芳中使用中文必需加入下列设定
client code page=950
; coding system=cap
valid chars = 0xb9

#========================== Share Definitions ==============
# 这个区断是用来设定我们要分享的数据来。在这个区断中,有几个
# 设定的范例可以让我们参考。例如,我们要分享的目录是
# /home/share,设定该目录的分享名称为 "共享软件",只可以读取
# 不能写入,而且不必使用密码,设定为 guest ok=yes 必须要有
# security = share 的配合
#
[共享软件]
   path = /home/share
   guest ok = Yes
   writeable =no
   browseable = yes

# 另一个范例,假设我们要一个上传区,分享路径为 /home/upload,
# 可以使用的账号是 friend,我们必需先用 vipw 建立 friend 的帐
# 号,加入下行
# friend:*:60000:65534::0:0:Samba user:/home/upload:/sbin/nologin
# 接着再以指令 smbpasswd -a friend 来建立密码。然后在修改
#  upload 目录的权限 chown friend /home/upload
[上传区]
    path = /home/upload
    username = friend
    read only = No

对分享的数据夹除了要在 samba 设定你想要的权限外,对于该目录在 UNIX 系统上的读写权限也要配合。如果你在 Samba 中的设定都正确,却发现无法对该数据来写入,很可能是在系统中的权限没有正确设定,必须以 chmod 来加以修改。完成了设定之后,我们可以启动 Samba 了:

# /usr/local/etc/rc.d/samba.sh.sample

如果要在一开机就启动 Samba:

# cp /usr/local/etc/rc.d/samba.sh.sample /usr/local/etc/rc.d/samba.sh

17.2 Samba 命令列工具介绍

在命令列中有一些工具可以让我们设定使用者数据、浏览目前使用情形等,除了命令列的工具外,我们也可以使用图型接口来管理。我这个小节我们先介绍一些基本的命令指令。

17.2.1 smbpasswd

smbpasswd 是一个用来在命令列管理 samba 使用者的工具,我们可以用它来新增使用者、修改使用者密码、甚至可以执行它来修改其它主机上的 samba 密码。

smbpasswd 这个指令会将 samba 的使用者信息存放在另一个名为 smbpasswd 的文字文件中,这个文字文件的位置依你安装 samba 时所下的参数而有所不同,如果您以 ports 安装,则 smbpasswd 位于 /usr/local/private 下,你可以使用文书编辑器去观看它的内容。

samba 的使用者和系统使用者所使用的密码文件是分开的,系统中的密码设定并非 samba 所使用的密码,但是要加入 samba 的使用者一定要存在于系统中。

一般使用者如果要使用 smbpasswd 指令来修改密码,只要输入 smbpasswd 即可,而 root 可以使用一些参数去新增、修改、删除使用者,其使用格式如下:

# smbpasswd [参数] [使用者] [密码]

以下我们介绍一些 root 常用的参数:

参数 说明
-a 新增一个使用者,并设定密码。如果该使用者已存在,则只进行修改密码的动作。
-d 暂时禁止某一个使用者登入。使用这个参数后,smbpasswd 会在该使用者数据中加一个 D 的符号,如此一来,该使用者便无法登入。下次我们再开放该使用者登入时,他的密码数据还是维持不变。
-e 开放被禁止登入的使用者登入。这个参数执行后,会将 smbpasswd 中该使用者数据中的 D 等号移除,该使用者便又可以登入了。
-x 删除一个使用者的数据。

例如,我们想要新增一个使用者 alex,并设定其密码为 password:

# smbpasswd -a alex password

但我建议您不要在命令列中直接输入密码,而是以下列方式来新增使用者:

# smbpasswd -a alex
New SMB password:
Retype new SMB password:
Added user alex.

如果您要删除使用者 alex:

# smbpasswd -x alex

smbpasswd 还有其它更进一步的功能,您可以 man smbpasswd 以获得更多信息。

17.2.2 smbstatus

smbstatus 可以让我们知道目前系统中 samba 的使用情形。执行 smbstatus 后的信息如下:

Samba version 2.2.8a
Service      uid      gid      pid     machine
----------------------------------------------
picture      root     wheel    36153   desktop  (192.168.0.2) Sun Oct 31 23:01:16 2004
public       root     wheel    36153   desktop  (192.168.0.2) Mon Nov  1 14:35:40 2004
mp3          root     wheel    36153   desktop  (192.168.0.2) Mon Nov  1 10:21:51 2004
video        root     wheel    36153   desktop  (192.168.0.2) Mon Nov  1 10:21:50 2004

Locked files:
Pid    DenyMode   Access    R/W      Oplock     Name
-------------------------------------------------------
36153  DENY_NONE  0x20089   RDONLY   LEVEL_II  /home/mp3/song.mp3   Mon Nov  1 17:31:14 200

第一个部份显示的是目前使用者正在使用的数据夹名称,而第二个部份则是正在使用的档案。

17.2.3 nmblookup

我们可以使用 nmblookup 来查询网络上 NetBIOS 主机的信息,您可以用来查询 windows 或 samba 服务器的计算机名称、IP 等信息。假设我们想要查询 192.168.0.2 这一台机器的 NetBIOS name:

# nmblookup -A 192.168.0.2
Looking up status of 192.168.0.2
       DESKTOP         <00> -         B 
       DESKTOP         <20> -         B 
       WORKGROUP       <00> -  B 
       WORKGROUP       <1e> -  B 

上列信息中,我们可以看到 192.168.0.2 这台机器的名称为 DESKTOP,其群组为 WORKGROUP。您也可以由 NetBIOS 名称反查其 IP:

# nmblookup desktop
querying desktop on 192.168.0.255
192.168.0.2 desktop<00>

17.3 使用 swat 设定

除了使用文字编辑软件来修改 smb.conf 外并用命令列工具设定使用者数据名,我们可以使用 Samba 内建的 swat 来进行设定。首先编辑 /etc/inetd.conf,将最下方 swat 的批注拿掉:

swat stream tcp nowait.400 root /usr/local/sbin/swat swat

接着再确认 /etc/services 中有没有下面这一行,如果没有则自行加入:

swat 901/tcp

最后重新启动 inetd:

# kill -1 `cat /var/run/inetd.pid`

然后就可以使用浏览器以 port 901 连到 Samba Server了。假设 Samba 的 ip 是 192.168.0.1,则输入 http://192.168.0.1:901,被要求输入账号密码时,请输入 root 及其密码。接着出现图 17-2 的画面:

图 17-2

我们选GLOBALS来看全域设定:

图 17-3

这里的每一个选项,我们都可以参考 /usr/local/etc/samba.conf.defaults 来设定,设定完后记得要 " Commit Changes" 来使设定生效。

如果要开放一个新的目录,我们可以选 SHARES 来设定分享的资料夹:

图 17-4

我们可以在 Create Share 字段中建立要分享的资料来名称,再按 "Create Share" 来设定。或是选择 "Choose Share"、"Delete Share" 来选择或删除已分享的目录。

其它的各项功能选项说明如下:

以设定新的使用者为例,如果我们要建立一个新的使用者 friend:

图 17-5

使用者 friend 必须己存在于 /etc/passwd 中,否则要自行以 vipw 建立:

friend:*:60000:65534::0:0:Samba user:/home/upload:/sbin/nologin

建立之后就可以在上图中 User Name 中输入 friend 并密码。这个功能取代了使用 smbpasswd -a 来建立账号的功能。

如果有任何问题,或是想知道更多关于 Samba 的设定,可以到 Samba 网站(http://www.samba.org/)。

17.4 Windows 设定

MS windows 系统的设定方面,鼠标右键点选桌面 [网络上的芳邻] -> [内容]:

图 17-6

必须要有 Client for Microsoft Networks 及 File and printer sharing for Microsofe Networks。如果要设定使用者名称,在主网络登入请选 Client for Microsoft Networks。

工作群组及计算机名称的设定如下:

图 17-7

如果你设定某个目录必须输入使用者名称,但在浏览该目录时却怎么输入密码都没有用,可能是你在进入 windows 时所使用的名称不正确:

图 17-8

这时候就必须先注销原本的使用者,再以该目录要求的使用者名称登入。

17.5 存取 MS Windows 的网芳资料

如果您要使用 FreeBSD 来存取 MS Windows 的网芳数据,FreeBSD 中内建有 mount_smbfs 这个工具,可以让我们将所要存取的主机及其目录挂在档案系统中。挂入后,存取的方式就好像档案位于硬盘中一样,十分方便,而且对于中文的存取也没有问题。mount_smbfs 是在 4.5-RELEASE 之后才内建的,如果您的系统在 4.5-RELEASE 之前,您必须要自行从 ports 中安装 /usr/ports/net/smbfs

在使用 mount_smbfs 时,如果您的 kernel 并未将 SMB protocol 编译进来也没关系,系统在使用前会自动加载 smbfs.ko 这个模块。如果您想将该模块内建在核心中,我们可以在核心设定中加入下列几个选项,并重新编译核心:

# SMB/CIFS requester
# NETSMB enables support for SMB protocol, it requires
# LIBMCHAIN and LIBICONV options.
# NETSMBCRYPTO enables support for encrypted passwords.
options         NETSMB            #SMB/CIFS requester
options         NETSMBCRYPTO    #encrypted password support for SMB
# mchain library. It can be either loaded as KLD or compiled into kernel
options         LIBMCHAIN               #mbuf management library
# Kernel side iconv library
options         LIBICONV
options         SMBFS                   #SMB/CIFS filesystem

编译完核心并重新启动后,便可以使用 mount_smbfs 了。

假设我们要存取的主机数据如下:

我们可以使用下列指令来挂入:

# mount_smbfs -I 192.168.0.2 -N '//内务总管/software' /mnt

这里的参数 I 表示指定 IP 地址,参数 N 表示不须密码验证。如果您所要挂入的分享数据夹需要密码认证,则不要加参数 N。我们在挂入别台计算机的数据夹时,如果没有指定使用者名称,内定会以目前所使用的账号。如果我们要使用别的使用者名称,可以使用下列方式:

# mount_smbfs -I 192.168.0.2 '//username@内务总管/software' /mnt

将分享的资料夹挂入后,我们就可以使用 FreeBSD 档案处理的指令,诸如 cp、mv等来抓取我们所要的档案,就像是从本机硬盘中使用档案一样。