第十七章 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> - BDESKTOP <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等来抓取我们所要的档案,就像是从本机硬盘中使用档案一样。