第二十章 SAMBA 网络芳邻

使用 MS Windows 的人大概都知道我们可以经由「网络上的芳邻」看到网络中的计算机,并经由共享数据夹来分享档案、打印机。而在 FreeBSD 中,我们也可以安装一些软件来让 Windows、FreeBSD 的使用者经由网络上的芳邻共享 FreeBSD 机器中的档案。使用 FreeBSD 来做为档案服务器,可以让家中、公司的计算机轻易的交换信息,可以说是非常方便。

本章将介绍如何使用 FreeBSD 架设网络芳邻,并使用 FreeBSD 去存取 Windows 网络芳邻的数据。读完本章后,您将了解下列主题:

20.1 网络芳邻简介

20.1.1 SMB 协定简介

MS Windows 可以说是目前桌上型计算机中市占率最高的操作系统,许多人使用 Windows 来进行日常工作。而在 Windows 平台上,使用者可以经由「网络上的芳邻」来看到不同计算机,并经由设定「共享数据夹」来分享档案及打印机。Windows 的网络芳邻其实是使用 SMB/CIFS 通讯协议。

SMB (Server Message Block) 通讯协议最早是在 1980 年代由 IBM 所发展出来,这个通讯协议可以让不同的计算机共享档案、打印机、及其它装置。SMB 最早是运作在 NetBIOS 的网络协上,一开始 IBM 设计了 NetBIOS 只是为了让网络中少数的计算机可以彼此互相沟通。所以 NetBIOS 的功能比较阳春,在使用上有一些限制。例如,只能使用在局域网络中、跨不过路由器。后来又出现了 NetBEUI (NetBIOS Extend User Interface),也是 IBM 针对 NetBIOS 的改良版。后来又有 NetBIOS over TCP/IP,使得 SMB 协议也可以跑在 TCP/IP 上,并可以经由因特网存取。在使用 NetBIOS 在存取远程计算机时,我们可以使用计算机名称如「\\alex-pc」来存取,而 TCP/IP 只能使用「\\192.168.0.1」这种方式来存取。所以 NetBIOS 也不是一无是处,它提供了比较简单而易懂的方式。

Microsoft 在 1996 年为了市场考量,将 SMB 改名为 CIFS (Common Internet File System),名称看起来比较容易了解,顾名思义就是可以在因特网上使用的档案系统。所以我们其实不应该称呼网络上的芳邻为「网络芳邻」,而是 SMB/CIFS 通讯协议,就好像我们称呼 HTTP、FTP 一样。在 Windows 的世界里,人们可以使用 SMB/CIFS 来共享档案。而在 UNIX 的世界里使用的是 NFS (Network File System);Mac 的世界中则是使用 AppleTalk。我们可以看到不同的操作系统环境中,都有自己的一套方法,不过我们还是可以经 由安装软件来达成不同平台共享档案的功能。

20.1.2 Samba 简介

在 1991 年,澳洲的一位个大学生 Andrew Tridgell 为了要让 DOS 的机器和 UNIX 的机器可以共享档案,就在 UNIX 系统中写了一套 SMB 协议的软件。经过了一段时间的发展,他想要为这套软件取一个名字,但又不能直接使用 SMB 这个名字。所以他就翻翻字典,最后找到一个和 SMB 很像的字 Samba。最后 Samba 就开始有长足的发展,加入了许多有志之士。而今,Samba 已经成为 UNIX 世界中 SMB/CIFS 协议的代名词了。

但为什么我们要在 UNIX 中使用 Samba 而不直接使用 Windows 的机器来分享档案呢?以笔者的使用经验,由于我的 FreeBSD 服务器是 24 小时开机,在上面安装了 Samba 之后,网络上的所有计算机都可以使用这台服务器共享档案,而不必另外再开一台 Windows 机器。而且,我在编辑网页、写程序时,会使用 Samba 将我的网页数据、程序直接分享出来,再由 Windows 上的文书编辑软件来进行编辑。存盘后,我不必再使用 FTP 上传档案,而是可以直接使用浏览器看到编辑的结果,很棒吧。

Samba 的功能可不只有档案分享,它还可以让我们使用 UNIX 加入 Windows 的 Domain、ADS,以使用 Windows 的 Domain 使用者权限控管。更多的功能,请参考 Samba 网站的数据。

20.2 安装设定 Samba

Samba 目前有二个主要的版本:2.2.12 及 3.0.x。2.2.12 已经发展很久了,目前已进入停滞状态。和 3.0 比较起来,速度稍快、功能较简单。最大的不同在于 Samba 2.2.12 只支援 code page,而 Samab 3.0 支援 Unicode。Unicode 的支持可以让我们同时在一个目录中存放中文、日文、简体中文等多国语的档名。所以,笔者建议您安装 Samab 3.0。

20.2.1 安装 Samba

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

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

接着,将出现下列画面,让您做一些偏好设定:

图 20-1

我们维持原本的设定即可,接下来就可以选 OK 继续编译了。

20.2.2 基本的设定档说明

Samba 的设定文件位置为 /usr/local/etc/smb.conf。在安装完后,设定文件的模板会放在 /usr/local/etc/smb.conf.default,您可以直接复制它来加以修改。

 Samba 的设定档中,一个以中括号括起来的部份就是一个区段,如:[区段名称] 。除了 [global] 区段外,每一个区段都是一个分享资源的设定。在 [global] 区段中,决定了 Samba 服务器的主要设定,而其它区段则是不同分享资源的权限设定。[分享资源] 区段可以是打印机或是共享数据夹,我们可以针对不同的目录设定不同的权限。除了设定的数据外,在 smb.conf 档案中行首为 ";" 或 "#" 都是批注。

以下为 smb.conf 的主要的设定说明:

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

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

# 要使用哪一种安全模式。如果设定为 share,就是任何人都可以存取,无需使用账号密码;
# 而设为 user 则是要输入使用者名称及密码。如果我们设为 user,必须要再设定使用者
# 使用者及密码。我们会在下一小节中做更详细的说明。
   security = user

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

# 设定可以使用 Samba 的网络接口,可以是 IP/netmask 或是网络卡名称。
   interfaces = fxp1

# 设定新建档案时的权限为何。Samba 的权限除了看数据夹的权限设定外,还会看 UNIX 的
# 权限。我们将新建档案的权限设为 0666,新建目录设为 0777,以让不同使用者所建立的
# 可以让有权存取该共享数据夹的使用者存取。
   create mask = 0666
   directory mask = 0777

# 在下载档案时,我们使用 FreeBSD 的系统呼叫 sendfile() 以提高下载速度。使用
# sendfile() 可以提高效能近一倍喔!
   use sendfile = yes

#========================== Share Definitions ==============
# 这个区段是用来设定我们要分享的数据来。在这个区断中,有几个设定的范例可以让我们参考
# 。以下的范例为设定分享的目录是 /home/mp3,设定该目录的分享名称为 "music",只有
# wheel 群组的使用者才可以写入。
#
[music]
   path = /home/mp3
   write list = @wheel

# 另一个范例,假设我们要设定一个上传区,分享路径为 /home/upload,具有写入权限的帐
# 号是 alex 及 wheel 群组,而 samba 群组的使用者只有只读的权限。当 security
# 设为 user 时,我们必需先在系统中建立该真实使用者,再使用 smbpasswd 来建立
# Samba 的密码。必须要注意的是,当您设定某一个使用者对某个目录具有写入权限时,该使
# 用者在系统中对于该目录的 UNIX 权限也必须要有写入权限才可以喔。
[upload]
    path = /home/upload
    write list = alex,@wheel
    valid users = @samba

上述设定档中,在全域设定方面,您大概只需要修改「interfaces」部份即可。接下来的设定重点在于各个共享数据夹的设定。共享数据夹可以让我们分享系统中的某个目录,分享的名称以中括号括起来。例如,我们想要分享系统中的 /home/mp3,而使用者连进来后,看到的数据夹名称为「music」,则我们必须要设定一个区段名为 [music]。在共享资料夹权限设定方面,我们可以使用下列参数:

当我们联机到一个 Samba 服务器时,如果「security」模式设为 user,Samba 会先讯问使用者名称及密码。接下来,要进入一个共享数据夹时,会经过下列检查:

基于上述规则,建议您先在「invalid users」中加入不可以使用 Samba 资源的群组,再设定可以读写的使用者即可。

您必须特别注意的是,由于 Samba 3.0 支持 Unicode (UTF-8),如果您要将共享数据夹名称设定为中文,请使用支持 UTF-8 的文书编辑器来编辑 smb.conf,并在存盘时将档案存成 UTF-8 的纯文字格式。Windows 支持 UTF-8 的文书编辑器如 Word、UltraEdit、EmEditor,在存盘时,必须使用 UNIX 的换行格式。以 Word 为例,在存盘时,我们将档案存成纯文字文件 (txt),接下来会出现下列选单:

图 20-2

接下来,您可以就可以将该档案放到 FreeBSD 中,并将扩展名 .txt 移除,更名为 smb.conf。还有一点,由于 Windows 的文书编辑软件会在档案最开头加入三个 Unicode 的辨识字符,当您以 ee 打开该档时,可能看到下列这样的内容:

嚜璟global]
workgroup = Workgroup
server string = FreeBSD
interfaces = lnc0
security = user
encrypt passwords = Yes
create mask = 0777

我们可以看到档案第一行的开头有乱码,这时候,请使用 ee 删除开始的三个字符,让第一行变成 [global] 即可。

小提示

支援 Unicode 的好处是您可以同时使用中文、日文、韩文等多国语。但在共享数据夹名称中使用中文时,设定会比较麻烦一点。不过您一定要记得,当共享数据夹要设为中文时,smb.conf 一定要存成 UTF-8 格式,否则数据夹名称会看不到或是变乱码喔。

对于分享的数据夹除了要在 Samba 设定你想要的权限外,对于该目录在 UNIX 系统上的读写权限也要配合。如果你在 Samba 中的设定都正确,却发现无法对该数据来写入,很可能是在系统中的权限没有正确设定,必须以 chmod 来加以修改。也就是说,如果您设定要分享 /home/mp3,而使用者 alex 登入后无法写入,可能是 Samba 的权限设定不对,或是该使用者在系统中对于该数据夹本来就没有写入权限。这时候,您必须使用 chmod/home/mp3 的权限设为 777,这样该使用者才可以写入该目录。关于更详细的分享目录权限,请参考下一小节的说明。

修改完 smb.conf 之后,我们可以使用指令 testparm 来查看我们的设定有没有语法上的错误。

设定完 smb.conf 后,在启动 Samba 之前,我们必须先增加可以使用 Samba 的使用者密码。假设我们要新增使用者 alex,请先确定使用者 alex 是 FreeBSD 中的系统账号,接下来才可以请使用下列指令来设定它的 Samba 密码:

# smbpasswd -a alex
New SMB password:
Retype new SMB password:

我们在 smbpasswd 中使用了参数 -a,表示新增使用者。如果您只是要修改使用者密码,则不需要使用参数 -a。一般使用者也可以使用 smbpasswd 来修改自己的密码。不过一般使用者在修改密码时,密码长度一定要大于五个字符喔。其它关于删除使用者、停用使用者账号的设定,请参考后续小节的说明。

Samba 会将使用者账号密码存放在 /usr/local/private/smbpasswd 中,您可以使用文书编辑器打开该档案,以查看目前有哪些使用者。

小提示

可以使用 Samba 资源的使用者一定要是系统中的使用者,而且必须先使用 smbpasswd 设定该使用者的密码喔。

20.2.3 启动 Samba

完成了设定之后,我们可以启动 Samba 了。请先编辑 /etc/rc.conf,并加入下列设定:

nmbd_enable="YES"
smbd_enable="YES"

我们在 /etc/rc.conf 设定启用 nmbd 及 smbd, smbd 这支程序是用来做分享数据的 daemon,而 nmbd 则是用来做名称服务的 daemon。如果没有跑 nmbd,您只能使用 IP 连到 Samba。例如,\\192.168.0.1;而有 nmbd 后,您可以使用主机名称 (hostname) 连到 Samba,例如,\\freebsd (假设您的主机名称是 freebsd.twbsd.org)。

接下来,请先将 Samba 的启动程序更名:

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

最后,我们就可以使用下列指令启动 Samba 了:

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

现在您就可以从 Windows 端联机到 Samba 了,您可以在档案总管的网址列输入 \\ip 或 \\hostname 来使用联机资源。

20.3 smb.conf 设定说明

Samba 的设定档中有很多细项可以让我们进行微调,建议您可以浏览一遍,以了解有什么是您需要的设定。以下我们就针对比较常用的项目分别说明。

20.3.1 global 区段的基本设定

fstype

我们可以使用 Windows 的联机网络磁盘驱动器功能,将一个共享数据夹变成系统中的网络硬盘。例如,将共享数据夹变成 Z: 磁盘驱动器。如果您点选该网络磁盘驱动器,并查看内容,您会看到它的档案系统格式为 NTFS,如下图所示:

图 20-3

您可以经由设定 fstype 以改变设定。例如,下列设定是将档案系统变成 UFS2:

fstype = UFS2

netbios name

netbios name 就像是 Windows 中的计算机名称一样,如果您检示工作群组中的计算机,您可以看到预设的是您的 hostname。您可以修改 netbios name 为其它名称,如 snoopy,这样一来您就可以使用 \\snoopy 来连到该计算机。

pid directory

设定用来放 smbd 及 nmbd process id 的档案路径。预设是 /var/run

server string

在我们查看网络上的芳邻时,除了可以看到计算机名称外,在计算机名称后还会加入一串计算机描述。预设的描述是 Samba + 版本名称。您可以任意设定这个字符串。在设定时,如果您使用 %v,则 %v 会被取代成为 Samba 的版本名称。而 %h 则会被取代成为主机名称。

workgroup

设定工作群组。

20.3.2 global 区段的安全性设定

admin users

设定管理者账号。预设的管理者账号为 root。在管理者账号中的使用者,Samba 不会去检查该使用者在 UNIX 系统中的权限,而会一律以 root 的身份执行删除档案、建立新档案等动作。预设并没有设定管理者账号,也就是没有其它使用者被设定为具有 root 的权限。如果您要设定使用者 alex 具有管理者账号的权限,可以加入下列这一行:

admin users = alex

available

available 可以让我们设定是否要停用 Samba 服务。如果 available 设为 no,则会禁止使用者登入,而且所有登入的动作都会被记录下来。

create mask

设定新建档案时的权限为何。Samba 的权限除了看数据夹的权限设定外,还会看 UNIX 的权限。例如,如果我们将 /home/music 设定让使用者 alex 及 john 都有写入的权限,当使用者 alex 建立了一个档案后,而 john 要去删除该档案时,因为该档案的拥有者不是 john,如果档案的权限是 644,则 john 会无法删除档案。我们可以将新建档案的权限设为 0666,这样一来,john 也可以删除使用者 alex 所建立的档案。这样设计的好处是我们可以让所有权限的控制都交由 Samba 的数据夹权限控制,而非 UNIX 权限。

directory mask

这是用来设定新建目录时权限为何。它的作用和 create mask 差不多,只是会用在目录的权限上。

encrypt passwords

设定是否要使用加密过的密码。Windows 98 及 WinNT SP3 以上会将密码加密,我们必须将它设为 yes。

follow symlinks

设定是否要允许使用者取得、进入 symbolic link 的真的目录及档案。预设是 yes,在设为 yes 的情况下,如果您分享了 /home/music,但在该目录中有一个 symbolic link 指向 /usr/local,则使用者也可以进入到 /usr/local 目录中。这样的设定比较危险。例如,如果使用者可以进入系统中对 /home/music 做 symbolic link,则他可以建一个连结到 /etc/master.passwd,这样使用者就可以从共享数据夹中去存取 master.passwd 这个档了。

guest account

设定 guest 账号,预设是 nobody。当我们在共享数据夹权限中设定了 guest ok 为 yes 时,使用者可以使用这个账号去存取该数据夹,而不需任何密码。这个使用者一定要是系统中的使用者。

map to guest

是否要将登入错误的使用者对映到 guest 使用者而登入,预设是 Never。这个设定只有在 security 不是 share 时才有用。在设定时可以有下列三种模式:

使用自动对映到 guest 使用者的好处是,一般使用者不需要记得自己的密码就可以登入。但缺点是如果使用者登入失败,其身份会自动变成 guest,他有可能会无法使用原本自己账号该有的权限去存取档案。

null passwords

是否允许使用空白密码。预设是 no。

security

这个项目可以说是 Samba 设定文件中最重要的项目,它控制了使用者的登入行为及使用者认证的方法。我们可以将 security 设定为 share、user、server、或 domain,分别说明如下:

关于 security 的设定相当复杂,建议您使用 user 的模式。如果您有需要使用其它模式,请参考 Samba 网站上关于 smb.conf 的说明。

20.3.3 global 区段的效能调校设定

max open files

设定同时最多可以开启多少档案,预设是 10000。我们通常不需要修改它。

socket options

这个项目控制了开启网络连结 (socket) 时,要设定的选项。预设只有 TCP_NODELAY。如果您有需要调校,请 man setsocopt。

use sendfile

设定下载档案时是否要使用 sendfile()。当设为 yes 时,在下载档案时,会使用 sendfile() 这个系统呼叫,而非传统的读写动作。传统的读写动作必须由 kernel 读取数据,送数据到 Samba,再由 Samba 将资料写到 Kernel,接着才由 Kernel 送到网络上。而使用 sendfile 时,会变成由 kernel 读出档案数据后,直接送到网络上。如此一来,可以大大的提高效率。

20.3.4 global 区段的记录文件及除错设定

log file

设定要将 Samba 记录文件存成什么文件名。我们可以设定针对不同的使用者、不同的来源存成不同的记录文件。例如,我们可以设定 log file 为 /var/log/samba/log.%m,表示将记录文件依不同的来源主机存放,%m 会被取代成为主机名称。您还可以使用 %d 表示 process id,%l 表示客户端的 IP,还有更多代号请 man smb.conf

log level

设定记录的等级,等级可以设等级的数字可以是 0 到 10。设定为 0 时的记录最少,设定为 10 的记录内容最详细。这个设定值会影响到系统效能,如果等级设得越高,则要记录的东西越多,自然速度会越慢。

max log size

设定记录文件最大的大小,预设是 5000。如果设为 0 表示不限制。在记录文件超出设定值时,Samba 会将该档案更名为 .old 文件,并建立新的记录文件。

20.3.5 global 区段的网络资源设定

deadtime

设定当客户端联机多久没有动作则自动断线并离开子程序。当有客户端联机时,smbd daemon 会产生一支新的子程序来处理客户联机,但是如果客户端一直没有动作,这个子程序的存在只是占用了内存。我们可以设定一段时间没有动作则自动断线,以节省资源。而一般的客户端在断线后,如果有需要在使用资源,会自动联机,使用者不会有任何感觉。预设并没有设定自动断线。

domain master

在 SMB 协议中,同一个 workgroup 的所有计算机中,通常开机最久的计算机会被当做 master browser。当工作群组中的计算机要查询群组中的主机名称时,会到该计算机上查询。如果我们将 domain master 设为 yes,则 nmbd 会告诉工作群组中的计算机这台 Samba 服务器是 master browser,而 Samba 就会将工作群组中的计算机清单存下来,以供客户端查询。建议您将这个项目设为 no,以免占用系统资源。

hosts allow

设定可以使用 Samba 服务的客户端来源。预设并没有设定 host allow,也就是允许任何人联机。以下是几个设定的范例:

hosts deny

这个项目和 host allow 类似,只是它是用来设定不可以使用 Samba 服务的来源。

interfaces

设定 Samba 只提供服务给此接口的网络卡。如果您有二张网络卡,一张对内,一张对外,则可以设定只允许内部使用 Samba。这个设定可以是网络卡代号、IP/Mask、IP。如果您设定为 fxp*,则表示 fxp0、fxp1 都可以使用。

bind interfaces only

如果没有将 bind interfaces only 设为 yes,则 Samba 只会限制 smbd 只提供档案服务给上列 interface 的网卡。而还是允许其它网卡使用 nmbd 服务进行广播。

max connections

设定最多同时联机的数目,预设是 0 表示没有限制。

wins support

设定是否支持 wins 服务器。由于 SMB 名称查询是使用广播的方式。当有不同的子网域时,需要有 wins 服务器才可以查询到不同子网域的数据。所以如果您有不同子网域时,您可以设定使用 wins 服务器,否则不需设定。

wins server

设定 wins 服务器的 IP。

20.3.6 分享权限设定

本小节将说明分享资料夹时,我们可以对资料夹设定什么权限。每一个数据夹都是一个独立的区段,我们可以分别对不同的数据夹设定不同的权限。例如,是否要允许使用者 A 存取、读写权限为何等等。

browseable

这个项目设定当使用者连到本服务器时,在列出所有共享数据夹时,是否要列出这个资料夹。如果设为否,则使用者联机到本机时,不会列出此目录。但是使用者还是可以使用 \\xxx\share 来直接进入该数据夹。

这项设定的好处是,您可以隐藏不想让使用者看到的共享数据夹,只有知道路径的人才可以存取它。

comment

设定数据夹批注。在使用者从网络芳邻中浏览数据夹时,这个批注会出现在数据夹名称后面。

guest ok

是否允许 guest 账户使用本共享数据夹。

hide dot files

是否要将档名为 . 开头的档案当成隐藏档,预设是 yes。

invalid users

设定不可以使用本共享数据夹的使用者。这个项目可以是一堆用逗号分开的使用者、群组清单。如果是群组名称,则必须在名称之前加上 @。

path

设定此共享数据夹在系统中的绝对路径。

valid users

设定可以使用本共享数据夹的使用者。这个项目可以是一堆用逗号分开的使用者、群组清单。如果是群组名称,则必须在名称之前加上 @。如果使用者同时出现在 invalid users 及 valid users,则不可以存取本数据夹。

write list

设定可以对本共享资料夹进入写入动作的使用者。这个项目可以是一堆用逗号分开的使用者、群组清单。如果是群组名称,则必须在名称之前加上 @。

20.4 使用网页设定 Samba

除了使用文字编辑软件来修改 smb.conf 并用命令列工具设定使用者数据外,我们可以使用 Samba 内建的网页接口工具来进行设定。我们在编辑 smb.conf 时,如果要使用中文数据夹名称时,由于数据夹名称是 Unicode,我们必须使用 Word 来编辑。但如果我们使用 Samba 的网页接口工具,预设就是 UTF-8 了,在设定上会容易许多。

首先编辑 /etc/inetd.conf,将最下方 swat 的批注拿掉:

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

最后重新启动 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 及 root 在系统中的密码。请注意 root 一定要有密码,否则无法登入。接着出现下列画面:

图 20-4

在 swat 的首面中,有很多说明文件的连结供您参考。

接下来,我们选GLOBALS来看全域设定:

图 20-5

这里的每一个选项,我们都可以参考上一小节中的说明来设定,设定完后记得要 「Commit Changes」来使设定生效。

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

图 20-6

我们可以在 Create Share 字段中建立要分享的资料来名称,再按「Create Share」来新建一个共享资料夹。或是选择「Choose Share」、 「Delete Share」来选择或删除已分享的目录。在设定完数据夹后,您必须重新启动 smbd 才会生效喔。

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

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

图 20-7

使用者 friend 必须是系统中的使用者,否则您必须使用 adduser vipw 建立使用者。建立之后就可以在上图中 User Name 中输入 friend 并密码。这个功能取代了使用 smbpasswd -a 来建立账号的功能。

20.5 Samba 命令列工具介绍

在命令列中有一些工具可以让我们设定使用者数据、浏览目前使用情形等,我这个小节我们先介绍一些基本的命令指令。

20.5.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 以获得更多信息。

20.5.2 smbstatus 服务器状态检视

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

Samba version 3.0.20
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

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

20.5.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>

20.6 Windows 设定

MS windows 系统的设定方面,如果您使用的是 Windows 98/ME,请先确认您有支持「Client for Microsoft Networks」及「File and printer sharing for Microsofe Networks」。而且 Windows 98 的使用者登入系统名称和您要登入 Samba 的使用者名称必须相同才行。如果是 Windows 2000/XP 则没有这个问题。

我们在使用登入 Samba 时,可以从档案总管或浏览器直接输入 \\192.168.0.1 (服务器 IP) 或是 \\hostname (您所设定的 netbios name,预设是 hostname)。或者,您可以将某一个共享数据夹设为系统中的网络磁盘驱动器。

我们只要对着某一个数据夹按鼠标右键,选择「联机网络磁盘驱动器」即可:

图 20-8

接下来选择要使用的磁盘驱动器代号:

图 20-9

最后就会出现一个新的网络磁盘驱动器了:

图 20-10

由于我们安装的是 Samba 3.0,所以在共享资料夹内可以同时存在中文、日文、韩文的档案。

20.7 存取 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 这个模块。假设我们要存取的主机数据如下:

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

# mount_smbfs -I 192.168.0.2 -N '//192.168.0.1/software' /mnt

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

# mount_smbfs -I 192.168.0.2 '//username@192.168.0.1/software' /mnt

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