Samba是由Andrew Tridgell在1991年(和Linux诞生的时间接近)制作的,当时他使用的是DEC的Pathworks网络,但是他发现无法同时使用Sun的NFS协议(正如我们前面介绍的,NFS是一个非常有用的网络协议),于是,连Socket(套接字)都不熟悉的他开始尝试自己在PC机上实现NFS,经过不断的摸索,他终于在自己的计算机上实现了NFS,采用的网络协议是NetBIOS(因为NetBIOS是公开的,可以合法地得到)。到了1992年1月,他开发出了0.1版,称为Server 0.1,随后又开发了一段时间,由于得到了X终端,他放弃了进一步的开发。直到1992年底,从一封电子邮件中,Andrew Tridgell获知了Linux,一个爱好者将Server 1.0转换到了Linux上,很快,人们发现这个程序可以直接使用,应用户的要求,Adrew Tridgell开始在Linux上开发,同时他发现smb-server已经被别人注册了,所以就只好起名为Samba,这就是Samba这个名称的由来。读者如果感兴趣的话可以访问http://www.ssc.com/lj/issue7/samba.html了解这段历史。
1. Samba服务能够做什么
在网络上共享目录,就好像一台文件服务器一样。
在网络上共享打印机。
决定每一个目录由谁来使用,可以让一个人、某些人、组和所有人访问。
决定打印机由谁来使用,可以让一个人、某些人、组和所有人使用。
可以看出,安装和配置好了Samba服务器后,Linux就可以Windows网络中的文件和打印服务器了。
2. Samba的安装
我们假设用户在安装Red Hat Linux的时候,已经选择了安装Samba(如果安装的时候你选择了everything,那么你的计算机上已经有了Samba),如果没有安装,可以从光盘的RedHat/RPMS目录下安装,也可以到ftp://metalab.unc.edu/pub/Linux/system/network/samba/去寻找最新版本,安装的时候,请参考samba-HOWTO和软件提供的帮助文件。
3. Samba软件包的内容
Samba是SMB客户程序/服务器软件包,它主要包含以下程序:
SMB服务器smbd:为SMB客户机如Windows 9x/NT等提供Windows NT和Lan Manager风格的文件和打印服务。
Netbios(RFC1001/RFC1002)名字服务器nmbd:可以提供浏览支持。用户甚至可以用Samba作为局域网的主浏览服务器。
SMB客户程序smbclient:类似ftp程序,用以从UNIX、Netware和其他操作系统上访问SMB服务器上的资源(如文件、打印机)
SMB客户服务程序的tar扩展smbtar:用以方便地拷贝SMB服务器上的文件。
在Linux上,Samba还提供了挂卸SMB文件系统的工具程序smbmount(smbmnt)和smbumount。
samba的核心是smbd和nmbd,如果你用ps –ef可以看到这两个进程,那么你的机器已经在运行samba了。Samba服务的状态查询、启动和关闭:
# /usr/bin/smbstatus
# /etc/rc.d/init.d/smb stop
# /etc/rc.d/init.d/smb start
4. 定制Samba
这部分内容介绍如何配置Samba,主要就是如何调整/etc/smb.conf文件,所以请现在备份一下你的smb.conf文件。原始的smb.conf文件如下,我们在后面的配置过程中,会把相关的部分拿出来单独介绍,为了方便,我们把原始文件的注释部分用中文代替。
smb.conf文件的作用和语法类似于Windows 3.x里面的ini文件,该文件现在一般位于/etc目录下。
smb.conf文件的语法格式包含了许多区段(section),每一个区段都有一个名字,用方括号括起来,其中比较重要的区段是[global]、[homes]和[printers],[global]区段定义了全局参数,[homes]区段定义了用户的主目录文件服务,[printers]区段定义了打印机共享服务。
每一个区段里面都定义了许多参数,格式为“参数名 = 参数值”,等号两边的空格被忽略,参数值两边的空格也被忽略,但是参数值里面的空格有意义。如果一行太长,用“”进行换行。
# Samba的配置文件,用户应该在修改前仔细阅读smb.conf(5)的手册页。
# Samba有许多选项,大多数没有列在本文件中(手册页约130页)
#
# 所有以分号;和井号#开头的行都表示注释,这些行都被忽略,本文约定,
# 文件中用井号表示评论,分号表示可以激活的选项
#
# 当你修改本文件后,应该运行testparm命令以检查语法错误
#
#=======================设置全局变量的区段====================================
[global]
# workgroup = NT的域名或者工作组名
workgroup = MYGROUP
# server string 等价于NT的描述域(description field)
server string = Samba Server
# 下面的选项对于安全十分重要,它限制连接到当前服务器的本地网络的IP地址。
# 下面的例子中,只允许两个C类网络地址和‘loopback’界面访问SMB服务器。
# 更多信息,查看smb.conf的手册页。如果该选项要激活,把分号去掉。
; hosts allow = 192.168.1. 192.168.2. 127.
# 自动加载打印机,而不是每次单独设置
printcap name = /etc/printcap
load printers = yes
# 除非你的打印系统的类型不标准,否则不用设置下面的参数,当前支持的打印
# 系统有:bsd, sysv, plp, lprng, aix, hpux, qnx
; printing = bsd
# 如果希望建立客户账号,激活此选项,同时把此账号加入/etc/passwd文件中
# 否则使用用户""nobody""作为客户账号
; guest account = pcguest
# 对从不同机器建立的连接建立不同的日志文件
log file = /var/log/samba/log.%m
# 限制日志文件的最大尺寸(单位是KB)
max log size = 50
# 安全模式,大多数用户希望用户级的安全,
# 详细信息参考security_level.txt文件。
security = user
# 当security = server时使用口令服务器选项
; password server =
# 输入口令应该和真实口令的前面Password Level个字符相符合
# 输入用户名应该和真实用户名的前面username level个字符相符合
; password level = 8
; username level = 8
# 用户可能需要使用口令加密,在使用下面的选项之前,请仔细
# 阅读ENCRYPTION.txt,Win95.txt和WinNT.txt文件。
# 用户密码文件可以存放在/etc/passwd文件中
; encrypt passwords = yes
; smb passwd file = /etc/smbpasswd
# 如果要允许在Windwos中的密码改动更新Linux系统的密码,就需要下面的选项.
# NOTE: Use these with ''encrypt passwords'' and ''smb passwd file'' above.
# NOTE2: You do NOT need these to allow workstations to change only
# the encrypted SMB passwords. They allow the Unix password
# to be kept in sync with the SMB password.
; unix password sync = Yes
; passwd program = /usr/bin/passwd %u
; passwd chat = *New*UNIX*password* %n *ReType*new*UNIX*password* %n *passwd:*all*authentication*tokens*updated*successfully*
# Unix用户可以映射成不同SMB用户名
; username map = /etc/smbusers
# 对每个不同的客户机使用不同的配置文件,%m代表客户机的Netbios名字
; include = /etc/smb.conf.%m
# 下面的选项可以提高服务器的性能,特别是使用smbmount挂卸SMB文件系统时。
# 参考speed.txt文件。
socket options = TCP_NODELAY
# 如果SMB服务器使用了多个网卡,必须在下面列出并进行配置
; interfaces = 192.168.12.2/24 192.168.13.2/24
# Configure remote browse list synchronisation here
# request announcement to, or browse list sync from:
# a specific host or from / to a whole subnet (see below)
; remote browse sync = 192.168.3.25 192.168.5.255
# Cause this host to announce itself to local subnets here
; remote announce = 192.168.1.255 192.168.2.44
# 浏览器控制选项:如果你不想让Samba服务器成为网络中的主浏览器,
# 那么local master设置为no,否则设置为yes(此时将参加主浏览器的竞争)
; local master = no
# 竞争主浏览器时对自身的评价
; os level = 33
# Domain Master specifies Samba to be the Domain Master Browser. This
# allows Samba to collate browse lists between subnets. Don''t use this
# if you already have a Windows NT domain controller doing this job
; domain master = yes
# Preferred Master causes Samba to force a local browser election on startup
# and gives it a slightly higher chance of winning the election
; preferred master = yes
# Use only if you have an NT server on your network that has been
# configured at install time to be a primary domain controller.
; domain controller =
# Enable this if you want Samba to be a domain logon server for
# Windows95 workstations.
; domain logons = yes
# if you enable domain logons then you may want a per-machine or
# per user logon script
# run a specific logon batch file per workstation (machine)
; logon script = %m.bat
# run a specific logon batch file per username
; logon script = %U.bat
# Where to store roving profiles (only for Win95 and WinNT)
# %L substitutes for this servers netbios name, %U is username
# You must uncomment the [Profiles] share below
; logon path = %LProfiles%U
# All NetBIOS names must be resolved to IP Addresses
# ''Name Resolve Order'' allows the named resolution mechanism to be specified
# the default order is ""host lmhosts wins bcast"". ""host"" means use the unix
# system gethostbyname() function call that will use either /etc/hosts OR
# DNS or NIS depending on the settings of /etc/host.config, /etc/nsswitch.conf
# and the /etc/resolv.conf file. ""host"" therefore is system configuration
# dependant. This parameter is most often of use to prevent DNS lookups
# in order to resolve NetBIOS names to IP Addresses. Use with care!
# The example below excludes use of name resolution for machines that are NOT
# on the local network segment
# - OR - are not deliberately to be known via lmhosts or via WINS.
; name resolve order = wins lmhosts bcast
# Windows的Internet命名服务支持区段:
# WINS支持—要求Samba的nmbd进程激活WINS服务
; wins support = yes
# WINS服务器—要求Samba的nmbd进程成为一个WINS客户
# 注意:Samba可以成为一个WINS服务器或者客户,但是不能同时选择两个身份
; wins server = w.x.y.z
# WINS Proxy - Tells Samba to answer name resolution queries on
# behalf of a non WINS capable client, for this to work there must be
# at least one WINS Server on the network. The default is NO.
; wins proxy = yes
# DNS Proxy - tells Samba whether or not to try to resolve NetBIOS names
# via DNS nslookups. The built-in default for versions 1.9.17 is yes,
# this has been changed in version 1.9.18 to no.
dns proxy = no
# Case Preservation can be handy - system default is _no_
# NOTE: These can be set on a per share basis
; preserve case = no
; short preserve case = no
# Default case is normally upper case for all DOS files
; default case = lower
# Be very careful with case sensitivity - it can break things!
; case sensitive = no
#============================== 共享服务的定义================================
[homes]
# 说明文字,当一个客户机列出服务器的共享资源时,给出该服务器的描述
comment = Home Directories
# 当一个客户程序以guest身份列出服务器的共享服务时,homes服务将不出现在列表中,
# 但是为本机的真实用户创建的主目录服务继承[global]区段的设订(browseable=yes)
browseable = no
writable = yes
# Un-comment the following and create the netlogon directory for Domain Logons
; [netlogon]
; comment = Network Logon Service
; path = /home/netlogon
; guest ok = yes
; writable = no
; share modes = no
# Un-comment the following to provide a specific roving profile share
# the default is to use the user''s home directory
;[Profiles]
; path = /home/profiles
; browseable = no
; guest ok = yes
# 定义打印机共享,使用BSD风格的打印系统不必单独定义每一个打印机
[printers]
comment = All Printers
# path指定的目录必须事先创建,否则不能使用
path = /var/spool/samba
browseable = no
# 设定public = yes允许用户(guest account)使用打印机
guest ok = no
# printable服务总是允许往服务目录写文件,但是只能通过打印缓存操作实现
writable = no
printable = yes
# 设置网络用户共享文件的临时区域,每个人可以在这里存放文件供别人使用
;[tmp]
; comment = Temporary file space
; path = /tmp
; read only = no
; public = yes
# 一个共享的目录,普通的访问者只读,属于staff组的用户可以读写
;[public]
; comment = Public Stuff
; path = /home/samba
; public = yes
; writable = yes
; printable = no
; write list = @staff
# Other examples.
#
# 一个私有的打印机,只供fred使用,打印缓存存放在fred的主目录里# home directory. # 注意fred必须对打印缓存的目录有写权
;[fredsprn]
; comment = Fred''s Printer
; valid users = fred
; path = /homes/fred
; printer = freds_printer
; public = no
; writable = no
; printable = yes
# 私有的目录,只供用户fred使用,fred需要对该目录有写权
;[fredsdir]
; comment = Fred''s Service
; path = /usr/somewhere/private
; valid users = fred
; public = no
; writable = yes
; printable = no
# 下面的配置,使得每个不同的计算机都有不同的连接
# 在path参数值后面加上%m,代表机器名,也就是说,主机lidf会连接到
# SMB服务器的/usr/pc/lidf目录上
;[pchome]
; comment = PC Directories
; path = /usr/pc/%m
; public = no
; writable = yes
# 一个共享目录,对于所有用户都可读可写。注意目录中创建的文件属于缺省的用户,
# 所以所有用户都可以在该目录中修改、删除其他用户的文件
;[public]
; path = /usr/somewhere/else/public
; public = yes
; only guest = yes
; writable = yes
; printable = no
# 下面的例子解释了如何共享一个目录,从而两个用户可以在里面放置文件。
# 在下面的配置中,目录应该是对两个用户可写的,并且有setuid,
# 当然,也可以设置更多的用户共享这一个目录。
;[myshare]
; comment = Mary''s and Fred''s stuff
; path = /usr/somewhere/shared
; valid users = mary fred
; public = no
; writable = yes
; printable = no
; create mask = 0765
4.1 关于lmhosts文件和WINS
在Windows网络中,负责计算机的netbios name到IP地址转换的服务由WINS服务器实现,这种转换的静态地址表叫做lmhosts,Windows NT将其存入.mbd格式的数据库中,在Linux中,要担任WINS服务器,就只能靠在/etc目录下的lmhosts文件来实现静态地址转换。lmhosts文件的格式和hosts文件类似,只是这里输入的是计算机的netbios名字,而不是TCP/IP网络中的主机名。要让Linux主机担任WINS服务器,激活以下参数:
wins support = yes
或者,让Linux主机担任wins客户机,激活下面的参数:
wins server = w.x.y.z
强行给Linux主机指定一个netbios名字:
netbios name = linux206
4.2 对连接的主机的限制
要允许IP为192.168.0.x的主机使用Samba服务,激活并设置以下参数:
hosts allow = 192.168.0. 127.
4.3 对连接的用户的限制
要允许用户syy使用Samba服务,激活并修改以下参数:
guest account = syy
4.4 为了提供最大限度的访问,修改安全模式如下:
security = share
4.5 主浏览器(Main Browser)
在Windows的“网络邻居”中,主浏览器负责维护当前网络中的主机的列表,但是往往由于刷新过慢,使得我们重新启动的smb服务看不到效果,以为自己设置的仍然不对,这时我们可以调整remote browse sync和remote announce两个参数,remote browse sync将收集网络中其他机器的信息,remote announce参数将自己声明给当前的子网。例如:
remote browse sync = 192.168.0.1 192.168.0.26
remote announce = 192.168.0.1 192.168.0.9
或者,干脆调整local master = yes参加网络的主浏览器的竞选,调整os level = 65以确保自己能够竞争成功。
如果还看不到SMB服务器,就选择开始-运行,输入SMB服务器的netbios名字,例如:linux206,这时候一般就会打开SMB服务器了。
4.6 关于密码
从Windows 95开始,用户登录Windows网络采用了密文(在这之前采用明文,即所谓的clear text),所以从windows 95访问Linux上的SMB服务,可能会涉及到密码的问题。
一种变通的解决方案是,调整Windows 9x的注册表,我们选择开始,运行regedit,在HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/VNETSUP/中,创建一个DWORD,起名为“EnablePlainTextPassword”,设置其值等于1。重新启动计算机,以后的登录就变成明文的方式了。
另一种解决方案是,让SMB服务器支持密文登录,修改参数如下:
encrypt passwords = yes
smb passwd file = /etc/smbpasswd
此时,需要以root的身份运行smbpasswd命令,为已经在/etc/passwd中存在的用户设置smb的password,如:
[root@linux206 jw]# smbpasswd -a jw
New SMB password:
Retype new SMB password:
startsmbfilepwent: unable to open file /etc/smbpasswd
Added user jw.
Password changed for user jw.
[root@linux206 jw]# more /etc/smbpasswd
# Samba SMB password file
jw:502:82DD2DCB1F75A511F9393D97E7A1873C:4C5A33C075FC8AB4102A8F8381DFCBA8:[U
]:LCT-38BB2E4A:
此后,用户jw就可以访问SMB服务器的资源了。
4.7 关于smb的重启
我们在前面介绍过启动和停止Samba服务的命令,当我们修改过smb.conf 文件后,一是注意用testparm命令来进行语法检查,二是不需要重新启动系统,只要重新启动smb服务就可以了。
关于Samba的设置有很多技术细节,请仔细查看smb.conf的手册页,和阅读/usr/doc/samba*/目录下面的说明文件,另外,在/usr/doc/samba*/examples/目录下,还有很多现成的例子供参考。
5. smbclient、smbmount(smbmnt)和smbumount
假设SMB服务器的Netbios名字是milkyway_core,那么我们可以使用smbclient命令察看服务器的共享服务:
# smbclient –L milkyway_core
然后SMB服务器会询问当前用户的口令,回答正确的话,就建立连接。联接不成功,则作为guest处理。如果联接成功,将进入一个类似ftp的界面,可以用?来察看可以使用的命令。关于smbclient的详细用法,请察看smbclient的手册页和Samba软件包中的说明。
我们还可以使用smbmount(smbmnt)和smbumount命令,像NFS一样,mount服务器的共享目录,为了让普通用户可以使用这两个命令,请将命令属性改成setuid,如:
# chmod 4755 /usr/local/samba/bin/smbmnt
# chmod 4755 /usr/local/samba/bin/smbumount
例如要安装Windows 98主机lidf上的download目录,命令如下:
% smbmount ‘lidfdownload’ –c ‘mount /home/jw/inport –f 3755’
6. Linux和Windows 9x/NT上的打印机共享
Samba使Linux上的打印机可以称为共享资源,同样也让Linux可以使用Windows 9x/NT等SMB服务器的共享打印机。
6.1 在Linux上使用Windows共享的打印机
安装了Samba软件包后,我们就得到了一个smbprint脚本,它可以把一个打印请求发送到网络打印机上。如果smbprint脚本不在samba目录的bin目录下,请拷贝到bin目录下,并将属性调整为可执行。
如果我们使用Red Hat提供的printtool,那么下面的设置工作可以不做,直接在图形界面中进行设置即可。手工设置的话,首先,我们在/etc/printcap文件中,为网络打印机建立一个新的队列,例如:
smb:
:sd=/var/spool/lpd/smb:
:mx#0:
:sh:
:lp=/dev/null:
:af=/var/spool/lpd/smb/acct:
:if=/var/spool/lpd/smb/filter:
其中,lp=/dev/null,是因为网络打印机不和本地的任何文件有联系;af参数设置记账,主要是为了进行网络打印机的共享。
网络打印机的过滤器只要简单地拷贝以前的过滤器,然后稍微修改一下(见打印机部分)。关于网络打印机的名字、口令,存储在af所定义的目录下,在此处就是/var/spool/lpd/smb/acct,假如没有.config文件的话,我们可以手工创建,如:
server=Milkyway_core
service=HP6L
password=”hello”
然后重新启动打印服务并打印测试文件:
# lpc restart all
# lpr –P smb test_file
注意,第一次使用smbprint时要确保其缺省的日志文件/tmp/smb-print.log不存在,否则会失败并不断尝试。
6.2 在Windows上使用Linux共享的打印机
首先,在Linux上将本地打印机设置为共享资源。
如果用户安装打印机时使用的是Red Hat提供的printtool,那么由于printtool提供的打印过滤器能够自动区分打印文件的格式,所以Windows用户可以像安装Windows网络打印机一样安装Linux共享的网络打印机。
如果用户配置打印机的时候,是自己手工配置的,并且打印机过滤器不能自动区分文件格式(比如使用Ghostscript)那么用户需要安装PostScript的打印机驱动,比如你的打印机是HP LaserJet 6L,那么需要安装HP LaserJet PostScript(随便什么型号)的驱动,并且将打印机属性中的PostScript输出格式调整成“自动存档”。
7. 如果要与Netware服务器通讯(共享目录、打印机),需要安装IPX软件包(如光盘上提供的ncpfs-2.2.0.12-5.i386.rpm)。然后可以实现一下功能:
ncpmount:安装Netware服务器的卷(volume)
ncpumount:卸载Netware服务器的卷(volume)
ncopy:向Netware服务器拷贝文件
nprint:向Netware打印服务器提交打印请求
其他功能请查看ncpfs的帮助文件(/usr/doc/ncpfs*/),不过遗憾的是,该软件包的作者是在Netware 3.11环境上实现的,对Netware 4.x/5.x的支持可能有问题。