LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: probing

╭∩╮(︶︿︶)╭∩╮FreeBSD使用大全FreeBSD╭∩╮(︶︿︶)╭∩╮

[复制链接]
 楼主| 发表于 2003-2-11 23:05:23 | 显示全部楼层

FreeBSD连载(59):编译安装新内核

编译安装新内核

  在/usr/src/sys/i386/conf目录下,可以看到一系列内核配置文件的样例。

bash-2.02$ ls /sys/i386/conf
GENERIC   Makefile.i386   files.i386     majors.i386
LINT      PICOBSD-N.2000  ipfilter       options.i386
LKM       devices.i386    kernel.script

  目录中最重要的文件有GENERIC和LINT,名为GENERIC的文件就是通用内核kernel.GENERIC的配置文件,而LINT文件中包括FreeBSD支持的几乎所有配置参数,并逐一加以解释。另一些文件则是其他硬件配置下,用于特定目的的配置文件的例子。因此GENERIC和LINT文件是在设置内核时的必备参考。有了这些文件作参考之后,就可以生成针对某个计算机具体设置的配置文件就更为简单了,并执行编译内核的任务。

    * 修改内核的一般原则

  要定制内核,就必须要生成配置文件。一般都是通过更改已有配置文件的方法来生成特定的配置文件,以简化设置工作。但直接修改已有的配置文件的方式,如修改GENERIC文件,并不可取,而应该先复制生成一个新的配置文件,这样就可以使用多个配置文件,维护多个不同配置的内核。这些内核可以是为一台计算机准备的,也可以是为多台计算机准备的。新配置文件可以很方便的从对已有配置文件,如GENERIC,进行复制得到。例如:

# cd /usr/src/sys/i386/conf
# cp GENERIC mykernel

  然后再修改mykernel这个配置文件,第一步需要完成的任务是先删除不必要的硬件支持选项,这是因为通用内核支持的硬件设备通常要多于计算机系统中实际存在的硬件设备,不必要的硬件驱动代码会占用不必要的内核内存空间。除了根据管理员对计算机硬件配置的了解来进行删除不必要的硬件驱动选项之外,比较简便的方法是根据FreeBSD的通用内核在启动时报告的信息来判断哪个设备已经探测到,哪个设备没被探测到。使用系统命令dmesg可以查看系统启动时的信息,因此没被探测到的设备可以使用命令来得到:

# dmesg | grep “not found”

  这个命令输出的结果,或者是计算机中并不存在的设备,或者是驱动程序的参数没有配置正确,没有正确检测到硬件设备的情况。如果确认没有这个硬件设备,就可以在配置文件中将其删除。

  有些硬件设置的缺省参数与系统中的硬件设置并不一致,可以通过更改配置文件中的配置参数来改变设置,以达到正确检测硬件的目的。

  有些设备在GENERIC配置文件中并没有提供支持,例如声卡设备,以及多处理器支持能力。如果要想支持这些设置,就要将相应的设置参数增添到配置文件中,可以要参考文件LINT中的相应设置来完成增添硬件的过程。

  为了得到一个合适的内核,或许需要不止一次的更改设置。当对计算机的某些硬件设置不是很清楚,为了节约编译内核次数,可以先通过 UserConfig更改确定正确的硬件设置,再重新编译内核的这种循序渐进方式,逐步获得硬件的正确配置。

  重新定制内核不但是为了获得硬件配置的正确性,还可以通过更改内核设置支持一些FreeBSD支持的特定功能、优化现有能力,以发挥系统的最大能力,从而达到将硬件具备的最大能力,充分发挥FreeBSD具备的强大处理能力。

    * 编译和安装内核

  在生成自己的内核配置文件mykernel之后,就可以进入下一步编译安装过程了。在配置文件所在的目录中,输入:

# /usr/sbin/config mykernel
Removing old directory ../../compile/mykernel:  Done.
Kernel build directory is ../../compile/mykernel

  这个命令将产生一个/usr/src/sys/complie/mykernel的目录,其中目录名对应于内核的名字,这样就使得系统中可以同时维护多个不同的内核,不同的内核相互独立而互不干扰。这个目录中就包括了编译内核所需的源文件。

  如果这个过程出现错误,就说明配置文件中存在语法错误,config程序将会提示出错的行,以便使用者进行修改。但是config不会发现配置文件中存在的逻辑错误,这些逻辑错误只能在编译内核时才能发现。

  下一步就是进入生成的目录中进行编译和安装。

# cd ../../compile/mykernel
# make depend
# make

  编译过程需要一些时间以进行编译,这时候就可以作些其他任务等待编译结束。但如果配置文件存在逻辑错误,在编译时会形成错误。因为内核配置选项不是相互无关的,而是存在相关依赖关系,有些设置项会依赖于另外的设置项。当发生这些逻辑错误的时候,当所有需要的源文件都存在时,就说明配置文件中缺少一些基本参数定义的代码,需要重新加入。例如所有的EISA设备依赖于controller eisa0定义的EISA控制器,那么删除controller eisa0设置项就会造成编译EISA设备时,缺少controller eisa0对应的源程序中定义的函数和变量,就会造成编译失败。确定没有EISA设备的时候,就要删除所有的 EISA相关选项,以避免逻辑错误。

  内核编译成功之后,就可以进行安装了:

# make install

  这将原有内核更改为/kernel.old,然后将编译后产生的新内核移到根目录下,命名为/kernel。此后可以重起系统,检查新内核是否正确。

# reboot

  如果新内核的配置不正确,造成某些硬件不能正确检测造成不能正常启动。此时就需要重新用老内核进入系统,以重新进行编译纠正错误。选择不同内核必须通过Boot Loader的交互界面进行,需要在启动时进入Boot Loader,然后可以输入load kernel.old命令,使用老内核启动系统,或者使用kernel.GENERIC 通用内核启动系统。

  为了避免第二次编译内核时,将错误的内核保存为kernel.old,覆盖原有的正确设置,也可以先将正确的内核拷贝为根文件系统中的另一个文件,进行备份保存,只有放置在根分区上的内核才能正常启动系统,因此备份到其他文件系统中内核意义不大。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:06:38 | 显示全部楼层

FreeBSD连载(60):缺省内核配置选项

缺省内核配置选项

  通用内核的设置文件中包含了很多比较重要的设置选项,这里的设置选项也是最常用的配置选项,为了编译出适合自己计算机的设置,就需要了解这个文件中的设置选项。

#
# GENERIC -- Generic machine with WD/AHx/NCR/BTx family disks
#
# For more information read the handbook part System Administration ->
# Configuring the FreeBSD Kernel -> The Configuration File.
# The handbook is available in /usr/share/doc/handbook or online as
# latest version from the FreeBSD World Wide Web server
# <URL:http://www.FreeBSD.ORG/>
#
# An exhaustive list of options and more detailed explanations of the
# device lines is present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
#        $Id: GENERIC,v 1.143.2.2 1999/02/15 02:50:07 des Exp $

machine                "i386"
cpu                "I386_CPU"
cpu                "I486_CPU"
cpu                "I586_CPU"
cpu                "I686_CPU"
ident                GENERIC
maxusers        32

  machine行定义了系统所使用的计算机体系结构,对于运行在个人计算机平台上的FreeBSD,此参数值只能是i386,运行在其他平台上的BSD系统将使用其他相应设置。注意由于这个配置参数中混用了字母和数字,因此需要用引号将其括起来。这种情况在配置文件中经常会碰到,如果不使用双引号括起来,配置程序就不能区分它是用于标识字符串还是用于数值设置,造成语法错误。

  可以多个cpu参数描述了处理器类型,可以使用 ”I386_CPU” 、 “I486_CPU” 、 “I586_CPU” 、 “I686_CPU” 四种类型。 “I386_CPU” 是最低配置,缺省的GENERIC配置文件中将这些类型全部列出,这使得这个通用内核在任何个人计算机系统下都能正常运行,但最好根据处理器类型进行针对配置。由于处理器是向下兼容的,但不能向上兼容,因此如果配置的参数高于计算机实际处理器类型,内核就不能正常启动和工作。

  对于586以上的处理器,各个兼容厂商的标记方法各不相同,因此必须小心选择正确的处理器类型,以避免选择错误。可以使用系统启动时的检测信息来判断处理器的类型:

# dmesg | grep ^CPU

  ident用于标识内核,每个内核都应该具有自己的标识,GENERIC内核的标识为GENERIC,而自己定制的内核可以在这一行中定义自己的标识。由于系统中可能存在有多个内核,因此使用这个标识来帮助区分不同的内核。这个标识在系统启动时将显示在启动屏幕上。

  maxusers这个值并不直接限制FreeBSD的用户数目,而是定义了内核中的一些非常重要的系统表格大小,这些表格会随系统中进程的增加和资源的被占用会逐渐被填满,而系统中的用户和进程数量有一定的关系,因此这个值大概等于系统同时允许的用户数目。但是当用户使用X Winodw或其他产生了大量进程和应用程序时,即使只有很少的用户,系统表格也很容易被填满。因此这个值不能设置的太小。尤其是要将FreeBSD 用作服务器的时候,服务器会启动大量的进程,往往要增大这个值以提升系统对高负载的支持能力。

  系统的进程表的大小为:20+16*maxusers,去除系统启动时自动启动的一些守护进程数目,因此可以大致估计出系统中空余的进程表项。进而估计出系统中还可以容纳的进程数目,因此就可以根据需求改变这个值的设置。

options                MATH_EMULATE                #Support for x87 emulation
options                INET                        #InterNETworking
options                FFS                        #Berkeley Fast Filesystem
options                FFS_ROOT                #FFS usable as root device [keep this!]
options                MFS                        #Memory Filesystem
options                MFS_ROOT                #MFS usable as root device, "MFS" req'ed
options                NFS                        #Network Filesystem
options                NFS_ROOT                #NFS usable as root device, "NFS" req'ed
options                MSDOSFS                        #MSDOS Filesystem
options                "CD9660"                #ISO 9660 Filesystem
options                "CD9660_ROOT"                #CD-ROM usable as root. "CD9660" req'ed
options                PROCFS                        #Process filesystem
options                "COMPAT_43"                #Compatible with BSD 4.3 [KEEP THIS!]
options                SCSI_DELAY=15000        #Be pessimistic about Joe SCSI device
options                UCONSOLE                #Allow users to grab the console
options                FAILSAFE                #Be conservative
options                USERCONFIG                #boot -c editor
options                VISUAL_USERCONFIG        #visual boot -c editor

config                kernel        root on wd0

  MATH_EMULATE选项是一个x87浮点运算模拟器,当计算机中没有x87协处理器时才需要使用。当前586级以上处理器的处理器内部均已集成了浮点运算器件,因此除非使用386芯片或部分低档486芯片,内核配置并不需要这种模拟功能。此外,另一个具有相同功能的选项为GPL_MATH_EMULATE,这个选项性能更好,只是它使用GNU的数学函数代码,而GNU公用许可比BSD许可要求更严格。因为这个版权的原因,缺省使用 MATH_EMULATE,这保证FreeBSD可以只以二进制形式向外发布,而不违反GNU许可。由于两个选项功能相同,只能任选一种,不能同时使用这两个选项。

  INET选项定义了基本的TCP/IP支持,由于FreeBSD是网络操作系统,因此这是最基本的选项。

  FFS为BSD快速文件系统,即UFS文件系统,这是FreeBSD使用的基本文件系统。FFS_ROOT用于在UFS系统上启动系统, 允许将UFS文件系统用作根文件系统。由于UFS是FreeBSD使用的最基本的文件系统,因此应该设置FFS_ROOT,以使系统能够从磁盘上正常启动。

  NFS为Sun公司开发的网络文件系统,它是Unix之间共享文件系统一种事实标准。NFS文件系统也可以用作根文件系统,这通过NFS_ROOT选项进行定义,使得可以配置FreeBSD无盘工作站,无盘的FreeBSD系统可以用于专用X终端等特殊场合。

  "CD9660"为ISO 9660 格式的CD-Rom文件系统,使用它访问CD-Rom上的文件系统。"CD9660_ROOT"使得可以用光盘作根文件系统。

  MFS为内存映射文件系统,可以将内存映射为文件系统,改善文件系统的性能,当然这只适合有大量物理内存和交换空间的系统。也可以使用mfs类型来将交换分区安装到某个目录上,保存一些临时文件。例如,系统的交换分区为wd0s3b,那么可以使用 “mount -t mfs /dev/wd0s3b /tmp” ,将交换分区安装到/tmp目录上。由于tmp是临时目录, 被程序用来交换数据,使用mfs文件系统能提高访问速度,这是拥有大量内存的计算机使用 mfs较常用的方式。MFS_ROOT用于将内存映射文件系统用作根文件系统,FreeBSD的安 装软盘就是使用的这种根文件系统,此外,使用MFS_ROOT也用于将FreeBSD系统用作专用防火 墙的嵌入式操作系统。

  当安装了系统源代码之后,可以很容易生成能运行在一张软盘上的FreeBSD系统,叫做 PicoBSD,它主要被用做路由器、防火墙等专用服务器等。

  MSDOSFS选项定义了msdos的fat文件系统,这不是必要的文件系统选项,使用它来访问本地硬盘上的msdos文件系统。如果要访问软盘上的msdos文件系统,使用mtools软件更为方便。

  PROCFS是一个伪文件系统,它被安装到/proc目录,用于访问与相应的进程相关的信息,一些系统程序如ps,使用它来获得进程的信息。

  此外,"EXT2FS"选项为Linux所使用Ext2fs类型的文件系统,如果用户的计算机上还运行着Linux,并希望使用FreeBSD访问本地硬盘上的Linux文件系统,就需要这个选项。

  FreeBSD 2.x以后版本是从4.4BSD发展来的,但FreeBSD 1.x是来自于4.3BSD的。4.3BSD是一个非常重要的BSD版本,很多应用程序也是依照4.3BSD开发的。因此需要使用这个"COMPAT_43" 选项保持和基于4.3BSD(包括FreeBSD 1.x)应用程序的兼容性。

  SCSI设备在设置时需要一定的延迟时间,以便使SCSI控制卡能正确的和SCSI设备通信。因此需要定义SCSI_DELAY=15000选项,与其他选项不同,这个选项为数值设置,使用了赋值符号和数字。这个值的单位为毫秒

  UCONSOLE选项使用户能接管console,通常在使用X Window时比较有用,这样就能在 X Window下接管console输出的与系统相关的信息。FAILSAFE选项使得配置程序对待内核更为谨慎和保守,从而增加了系统的安全性。

  USERCONFIG和VISUAL_USERCONFIG这两个选项使用户可以在启动时进入内核参数设置程序UserConfig,配置硬件参数。USERCONFIG参数只提供基本命令行配置功能,而 VISUAL_USERCONFIG进一步提供全屏的编辑功能。

  config行指定内核文件名及其位置,它指定内核名为kernel,并且内核所在的根文件系统位于wd0硬盘上,根文件系统即为wd0a。FreeBSD习惯上使用kernel作为内核的文件名,不应改变。而它的位置wd0可能会根据硬件设置的不同而不同,例如:如果将FreeBSD安装到了SCSI硬盘上,则内核和根文件系统的位置就为da0中的分区。

# To make an SMP kernel, the next two are needed
options         SMP                                # Symmetric MultiProcessor Kernel
options         APIC_IO                        # Symmetric (APIC) I/O
# Optionally these may need tweaked, (defaults shown):
#options        NCPU=2                        # number of CPUs
#options        NBUS=4                        # number of busses
#options        NAPIC=1                        # number of IO APICs
#options        NINTR=24                        # number of INTs

  如果用户的计算机有多个处理器,就需要取消注释,使用这几个选项以进行支持。一般 SMP和APIC_IO是最基本的两个设置选项,SMP选项是用于支持对称多处理器SMP结构的基本代码,APIC_IO支持APIC IO方式对称I/O。使用这两个选项之后,系统就能自动检测出所使用的处理器个数以及其他系统资源。当然也可以手工指定这些资源设置,这用于不能正确侦测处理器数目时使用。缺省内核不支持多处理器,因此对于多处理器系统必须重新生成内核。

  由于只有586以上的芯片才支持SMP,因此这需要在cpu行的设置中删除386和486行的设置,明确指定处理器的类型。否则就会发生逻辑冲突。

controller        isa0
controller        eisa0
controller        pci0

  这三行定义了三种控制器的基本支持代码:ISA、EISA和PCI总线控制器。

  ISA总线类型是个人计算机的标准配置,很多驱动程序代码都基于ISA控制器的代码,因此系统必须对ISA总线进行支持。EISA总线类型是ISA的扩展,使用在一些较老型号的服务器中,今天已经逐渐被PCI总线代替,它是可选的。PCI选项支持PCI总线设备的通用代码,当前PCI总线主板是个人计算机的主流,这个选项也是必须的。

  如果用户的计算机不存在EISA总线,可以删除对EISA选项的支持。但是,由于后面设置的一些设备是EISA总线类型的设备,依赖这个选项的支持,必须同时也必须删除所有的EISA总线类型的设备,否则就存在逻辑错误。配置程序并不会自动删除那些并不存在的设备选项,这样就导致直到编译时才会发现EISA总线设备的驱动程序发生编译错误,编译不能正常完成。

controller        fdc0        at isa? port "IO_FD1" bio irq 6 drq 2
disk                fd0        at fdc0 drive 0
disk                fd1        at fdc0 drive 1

  控制器fdc0是支持标准软盘控制器的基本代码,一般个人计算机能支持两个软盘驱动器, fd0和fd1设备。 通过drive参数的值可以指定这两个软盘的顺序。fdc0使用的资源是个人计算机缺省设置,因此不存在系统探测问题。此外,虽然让内核自动探测软盘的数量没什么坏处,但删除不必要的选项可以略微加快系统启动的速度

options                "CMD640"        # work around CMD640 chip deficiency
controller        wdc0        at isa? port "IO_WD1" bio irq 14
#controller        wdc0        at isa? port "IO_WD1" bio irq 14 flags 0x00ff8004
disk                wd0        at wdc0 drive 0
disk                wd1        at wdc0 drive 1

controller        wdc1        at isa? port "IO_WD2" bio irq 15
disk                wd2        at wdc1 drive 0
disk                wd3        at wdc1 drive 1

options                ATAPI                #Enable ATAPI support for IDE bus
options                ATAPI_STATIC        #Don't do it as an LKM
device                acd0                #IDE CD-ROM
device                wfd0                #IDE Floppy (e.g. LS-120)

  前面的这些选项是用于支持IDE驱动器及硬盘的配置,事实上这些设置不但支持IDE驱动器,还支持一些较老的ST506或ESDI界面的硬盘设备,虽然那些硬盘设备已经淘汰,没有人再使用它们了。

  "CMD640"用于修正使用CMD640控制芯片的系统主板的问题,wdc0是第一个IDE接口控制器,wdc1为第二个IDE控制器,一个个人计算机系统中只能存在两个标准IDE控制器,并且一个IDE驱动器能带两个硬盘设备,因此wdc0上能连接两个硬盘wd0和wd1,wdc1能连接wd2和wd3。其中wd0和wd2为主硬盘,wd1和wd3为从硬盘。当然可以通过指定磁盘的参数at和drive参数的设置,改变硬盘号的顺序。

  由于IDE经过了一个长期的发展,控制器是由不同的制造厂商制造的,因此在一些细微的方面也存在有差异,主要是新的控制器能够支持更强的传输模式,当然它也支持原有的兼容模式。为这些细小的差异没有必要重写驱动程序,只需要更改配置行中的参数设置,就能支持某些IDE控制器的高级功能。

  每个控制器都有长32位的flags标志位,用于定义IDE硬盘的I/O类型,其中前16位定义 drive 1的标志,后16位定义drive 0的标志。例如wdc0的标志为0x00ff8004,表示定义了wd0的标志为0x8004,使用32位I/O每次传送4个扇区,而wd1设置为0x00ff,不探测32位传输而使用兼容模式。这个标志也可以分割为两个16位的部分,也在每个磁盘设备的标志中定义。

  IDE控制器中还支持光盘驱动器,首先需要ATAPI提供IDE界面使用的ATAPI类型光驱基本代码, ATAPI_STATIC这一选项使ATAPI代码直接编译到内核文件中,而不编译为可加载模块。而acd0就为IDE光驱的驱动程序。由于光驱就是连接在IDE控制器上,因此IDE接口的光驱还需要相应IDE驱动器的支持,例如光驱接在第二个IDE控制器上,则必须增加wdc1控制器选项。如果光驱上的主/从(master/slave)跳线不正确,就不能正确侦知IDE光驱,很多IDE光驱出厂设置位从设备,在该IDE总线上没有其他设备的情况下,应该将光驱跳为主设备。

  2.2和3.0release版本使用wcd0作光驱的驱动程序,而acd0是3.1-stable使用的新CD-ROM驱动,因此从2.2.x或3.0-release升级到3.1-stable时,要更改设置文件中的原wcd0项为acd0项。以后随着系统的发展,老wcd0的代码会完全删除,新代码的驱动名字会恢复为wcd0。

  wfd0为IDE接口的软盘驱动器,某些zip驱动器需要这个驱动器的支持。

# A single entry for any of these controllers (ncr, ahb, ahc) is
# sufficient for any number of installed devices.
controller        ncr0
controller        ahb0
controller        ahc0
controller        isp0

# This controller offers a number of configuration options, too many to
# document here  - see the LINT file in this directory and look up the
# dpt0 entry there for much fuller documentation on this.
controller      dpt0

controller        adv0        at isa? port ? cam irq ?
controller        adw0
controller        bt0        at isa? port ? cam irq ?
controller        aha0        at isa? port ? cam irq ?
#controller        aic0        at isa? port 0x340 bio irq 11

controller        scbus0
#controller  scbus1 at ahc1 bus 0

device                da0
#disk  da0 at scbus0 target 0 unit 0

device                sa0
device                pass0
device                cd0        #Only need one of these, the code dynamically grows

  对于网络服务器来讲,SCSI控制器是理想的选择,因为SCSI设备不需要占用计算机处理器的处理能力,因此适合经常发生并发存取的服务器系统。FreeBSD 3.0之后的SCSI驱动代码已经完全重写,新的代码更高效,并支持更多新设备。

  对于不同的SCSI设备,需要不同的SCSI控制器驱动程序,例如aha0为支持使用Adaptec 154x 芯片SCSI控制器的驱动程序,内核配置文件LINT和安装介质中的HARDWARE.TXT中也列出了FreeBSD支持的 SCSI控制器对应的各个选项。需要根据自己计算机上的SCSI卡的具体型号进行选择。确定了具体的驱动之后,可以删除和添加相应的控制行,但需要注意最好不要改变配置文件中控制器的前后顺序,因为配置顺序决定系统检测硬件的顺序,那么配置顺序不正确有可能造成错误的检测结果。

  scbus0控制器提供基本的SCSI总线驱动代码,当不使用参数的时候,这个控制器将自动和检测到的某个SCSI控制器联系起来。在已经了解系统拥有的控制器的条件下,可以使用at参数手工指定某个序号的SCSI总线位于哪个SCSI控制器上,一般一个SCSI控制器可以有几个SCSI总线通道。上例中注释中的 scbus1总线控制器被指定为ahc1控制卡上的第一个总线,注意自动分配SCSI总线序号的方式与手工指定 SCSI总线的方式不应该混用,以避免出现冲突错误。

  da0就用于标识SCSI硬盘设备,不同的SCSI磁盘的SCSI总线scbus0,总线上的target号和逻辑单元号unit这三个参数是不同的,可以用来标识不同的SCSI硬盘。如果忽略这三个配置参数,FreeBSD按检测的顺序分配硬盘的序号。但是也可以手工指定这三个参数,确定硬盘序号。同样,手工指定和自动分配序号不能混用。

  指定总线序号并指定硬盘序号的益处是硬盘序号的顺序将与内核自动检测的顺序无关。由于每个系统中会同时存在多个SCSI总线,每个总线上可以有安装有多个SCSI设备和逻辑单元,因此在增加、移去某个磁盘时,会使其他磁盘自动分配的序号发生改变,从而使FreeBSD安装文件系统出现问题,严重的会影响正常启动。解决办法就是应该手工指定SCSI硬盘与总线、控制器的关系。

  sa0为SCSI磁带驱动器,cd0为SCSI光驱,pass0为新SCSI驱动程序CAM中的通道驱动程序。

device                wt0        at isa? port 0x300 bio irq 5 drq 1
device                mcd0        at isa? port 0x300 bio irq 10

controller        matcd0        at isa? port 0x230 bio

device                scd0        at isa? port 0x230 bio

  上面这些驱动是一些老式的ATAPI界面的光驱,这些光驱控制器一般都和声卡作在一起,当前已经很少使用这些光驱了。

# atkbdc0 controlls both the keyboard and the PS/2 mouse
controller        atkbdc0        at isa? port IO_KBD tty
device                atkbd0        at isa? tty irq 1
device                psm0        at isa? tty irq 12

device                vga0        at isa? port ? conflicts

# splash screen/screen saver
pseudo-device        splash

# syscons is the default console driver, resembling an SCO console
device                sc0        at isa? tty
# Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver
#device                vt0        at isa? tty
#options                XSERVER                        # support for X server
#options                FAT_CURSOR                # start with block cursor
# If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
#options                PCVT_SCANSET=2                # IBM keyboards are non-std

device                npx0        at isa? port IO_NPX irq 13

  atkbdc0为键盘控制器,atkbd0为相应的键盘设备,psm0为ps/2 类型的鼠标设备。vga0为显示驱动程序,标准的控制台程序需要它的支持。vga0的 conflicts标志指出这个驱动程序会和其他设备共享某些资源,告诉内核不要因为这个硬件发生资源冲突而认为是这个设置不正确。FreeBSD为多用户系统,一般情况下各个设备不应该相互共享资源,以避免访问冲突。除非设备不能被使用者直接访问的情况下,硬件才能共享系统资源。

  如果要取得更好的显示效果,可以使用VESA选项(options VESA),来支持800x600的控制台显示模式(能支持132x60的字符模式)。只是VESA选项不能和多处理器选项SMP共存,它也要求系统内核提供对虚拟86模式的支持,以便VESA显示子系统就能控制显示卡,所以同时需要 “options VM86” 选项。

  splash伪设备用于支持splash屏幕图象和屏幕保护功能,这能使得系统启动时展示一个图象启动标志,并能提供控制台下的屏幕保护功能。

  全称为syscon的sc0驱动程序定义了缺省的控制台设备,支持彩色和虚拟控制台模式。vt0是可以用来替换sc0驱动另一个控制台驱动程序,只有在使用有些特殊的与sc0 不兼容的硬件的时候,才需要使用这个pcvt控制台驱动程序。如果使用vt0驱动,那么或者会需要设置XSERVER、FAT_CURSOR等选项以提供更完善的支持。

  npx0为浮点协处理器的接口,这是用于支持浮点协处理器必需的选项。没有浮点协处理器的计算机必须配置数学防真MATH_EMULATE或者GPL_MATH_EMULATE以支持浮点运算。如果同时使用了这两类选项,则按照系统检测结果,当npx0被检测到时npx0就发挥作用。

#
# Laptop support (see LINT for more options)
#
device                apm0    at isa?        disable        flags 0x31 # Advanced Power Management

# PCCARD (PCMCIA) support
#controller        card0
#device                pcic0        at card?
#device                pcic1        at card?

  上面这些选项用来支持便携计算机,apm0用于支持高级电源管理功能,card0 控制器对PCMCIA接口的设备进行支持,需要指定相应的设备如pcic0等。

  标准的FreeBSD内核代码支持的便携计算机设备并不丰富,因此FreeBSD中有一个PAO的开发计划,专门为用于支持便携计算机。

device                sio0        at isa? port "IO_COM1" flags 0x10 tty irq 4
device                sio1        at isa? port "IO_COM2" tty irq 3
device                sio2        at isa? disable port "IO_COM3" tty irq 5
device                sio3        at isa? disable port "IO_COM4" tty irq 9

# Parallel port
device                ppc0        at isa? port? net irq 7
controller        ppbus0
device                nlpt0        at ppbus?
device                plip0        at ppbus?
device                ppi0        at ppbus?
#controller        vpo0        at ppbus?

  sio0、sio1、sio2和sio3为四个标准串口设备,其中sio0还可以用做终端控制台,这样专用服务器就可以不使用显示器、键盘而使用一个普通字符终端来完成控制任务,这样多个FreeBSD系统能放在专用机架上,用做专用服务器。sio0的flags规定了这个串口用做控制台的优先级,通常使用0x10就足够了,使用0x20或0x40会妨碍对这个串口进行其他正常操作。

  3.0之前的FreeBSD系统使用COMCONSOLE设置选项来达到同样的目的,这个选项在新系统中不再有效,使用sio0的flags就能达到同样的目的。

  要使用串口作控制台,还需要在/etc/ttys中定义相应的配置行,使得系统在sio0对应的ttyd0 设备上执行相应的getty命令。Packages Collection中的comconsole-0.1.tgz软件包能帮助进行这些设置。

  设备ppc0、控制器ppbus0用于支持并口设备,nlpt0为并口打印机设备,plip0为并口网络界面,ppi0用于一般目的的输入输出。vpo0为某些并口SCSI设备的控制器,因此除了并口驱动之外,也需要SCSI总线控制器scbus0和SCSI硬盘da0的支持。这些并口设备是3.1版本之后更新的并口驱动,原有的驱动为lpt0,只能支持最标准的并口模式,不能并口的新模式。

# Order is important here due to intrusive probes, do *not* alphabetize
# this list of network interfaces until the probes have been fixed.
# Right now it appears that the ie0 must be probed before ep0. See
# revision 1.20 of this file.
device ax0
device de0
device fxp0
device mx0
device pn0
device rl0
device tl0
device tx0
device vr0
device vx0
device wb0
device xl0

device ed0 at isa? port 0x280 net irq 10 iomem 0xd8000
device ie0 at isa? port 0x300 net irq 10 iomem 0xd0000
device ep0 at isa? port 0x300 net irq 10
device ex0 at isa? port? net irq?
device fe0 at isa? port 0x300 net irq ?
device le0 at isa? port 0x300 net irq 5 iomem 0xd0000
device lnc0 at isa? port 0x280 net irq 10 drq 0
device ze0 at isa? port 0x300 net irq 10 iomem 0xd8000
device zp0 at isa? port 0x300 net irq 10 iomem 0xd8000
device cs0 at isa? port 0x300 net irq ?

  由于FreeBSD是网络操作系统,因此通常计算机常常通过以太网卡或广域网卡与网络相连接。对于每个网卡设备,必须在内核配置中进行相应的配置。上述选项就用于设置不同的网络设备的驱动程序。FreeBSD缺省内核包括了对很多网卡设备的支持,这些设备的驱动程序都被编译入系统内核中,占据了大量不必要的空间。因此在定制系统内核时,最好删去计算机上不存在的网卡类型的驱动,这样也可以加快系统的硬件探测过程。如果在缺省内核中,网卡已经能正常运行,就可以使用dmesg找出正确的网卡类型。当不能确定网卡类型的时候,更改内核配置文件一定要注意顺序,因为检测顺序非常重要,由于不同的网卡驱动相互有影响,正确的检测顺序可以避免出现探测错误。

  较老的ISA网卡还需要配置参数和硬件设置相一致,就要调整网卡使用的端口地址,irq 和iomem等参数与网卡使用的真实资源相一致。这是由于生产兼容网卡的厂商太多,因此各种兼容网卡的缺省设置却并不相同,而较老的驱动程序不能自动探测设备使用的资源。新的PCI网卡就不存在这个问题,驱动程序支持PNP,可以自动探测硬件资源。

pseudo-device        loop
pseudo-device        ether
pseudo-device        sl        1
pseudo-device        ppp        1
pseudo-device        tun        1
pseudo-device        pty        16
pseudo-device        gzip                # Exec gzipped a.out's

  伪设备并不与具体的物理设备有关,但外在表现为一种设备。通常伪设备用于支持系统中与某类操作相关的基本代码。

  loop定义TCP/IP使用的loopback网络设备,这将使计算机能够通过TCP/IP堆栈内部,以127.0.0.1(通常名字定义为localhost)的IP地址访问自身。由于FreeBSD为网络操作系统,这个选项是必须的。不管计算机上有没有网络设备,FreeBSD都提供了这个loopback的伪网络设备,以提供最基本的网络功能。网络功能是FreeBSD系统的基本功能,FreeBSD上的很多程序需要网络支持才能正常运行。很多程序能使用这种网络支持,进行本机内部进程间的连接。

  ether伪设备定义了支持Ethernet协议的基本代码,Ethernet是最流行的局域网标准,如果计算机通过Ethernet网卡互相连接,就需要这个选项的支持。

  sl为支持SLIP协议的伪设备,其后的数值参数为支持的sl伪设备的数目。SLIP协议已经逐渐被PPP协议取代。因此一般可以删除这个选项。

  ppp是在内核中实现PPP协议的驱动程序,之后的数字指定了可同时使用的PPP会话的数量。用户使用这个伪设备便能使用pppd,使用PPP协议通过modem与另一台计算机相连接。

  tun为tunnel伪设备,用于建立直接的通道。它也被常用来支持PPP协议,不同在于它在内部没有实现PPP协议,而支持PPP协议的代码是在应用软件ppp中实现的。这是用户模式的PPP 支持,与伪设备ppp相比,它较容易配置和使用。

  pty是伪终端设备,在远程登录等需要以终端方式进行连接,但又并非真实终端的应用程序中必须使用这种设备,如telnet或xterm等程序。这里定义的限制是内核允许同时创建的伪终端数,缺省设置对于个人使用还能基本满足,但如果将系统用于提供远程登录服务,例如用做BBS服务器,16个伪设备就远远不够。此外,X Window用户也会占用大量的pty设备。

  伪设备gzip是FreeBSD的另一种特性,它使FreeBSD能够运行用gzip压缩过的a.out格式执行文件,因此能节约磁盘空间。但是这种特性只支持传统的a.out格式执行文件,而FreeBSD自3.0以后,虽然仍然支持a.out格式,但标准执行程序的格式转为ELF格式。因此这个特性带来的好处就大大降低了。为了利用这个特性,可以将应用程序编译为a.out格式(使用-aout编译连接选项)。

# KTRACE enables the system-call tracing facility ktrace(2).
# This adds 4 KB bloat to your kernel, and slightly increases
# the costs of each syscall.
options                KTRACE                #kernel tracing

# This provides support for System V shared memory and message queues.
#
options                SYSVSHM
options                SYSVMSG

  配置KTRACE选项使内核允许系统调用跟踪程序ktrace能正常运行。

  SYSVSHM、SYSVMSG这个选项提供FreeBSD与System V的兼容性,其中第一个选项SYSVSHM 提供了进程间共享内存的机制,X Window系统就需要这种共享内存机制,以提高管理图形的性能。 SYSVMSG用于支持System V的消息队列,只在特定的程序中用到,如Windows 9x的模拟器wine。

#  The `bpfilter' pseudo-device enables the Berkeley Packet Filter.  Be
#  aware of the legal and administrative consequences of enabling this
#  option.  The number of devices determines the maximum number of
#  simultaneous BPF clients programs runnable.
#pseudo-device        bpfilter 4        #Berkeley packet filter

  bpfilter即Berkeley Packet Filter,通常计算机只接收与本机有关的数据包或广播包。在网上传播的数据包,如果与本机无关,计算机将不予理会,这样的好处是减轻了处理器负担。如果要让计算机能够捕获经过网卡的所有数据包,就要让网卡工作在混杂模式,此时就需要使用这个伪设备。后面的数字指定能同时使用这个功能的程序的数目。

  使用这个选项的目的是使计算机能捕获数据包并进行分析,监测网络、寻找故障,一些特殊功能如DHCP的客户程序,也需要这个伪设备的支持。但这种功能如果被不正当使用,将对整个局域网的安全造成威胁,尤其是使用共享式以太网连接方式的网络,网络上传播的信息将被这台计算机所窃听。需要注意的是,不是所有的网卡都支持混杂模式,只有支持混杂模式的网卡才能使用这个功能。

# USB support
#controller    uhci0
#controller    ohci0
#controller    usb0
#
# for the moment we have to specify the priorities of the device
# drivers explicitly by the ordering in the list below. This will
# be changed in the future.
#
#device        ums0
#device        ukbd0
#device        ulpt0
#device        uhub0
#device        ucom0
#device        umodem0
#device        hid0
#device        ugen0

#
#options       USB_DEBUG
#options       USBVERBOSE

  这些设置选项是用来支持USB控制器和USB设备,当前USB设备还不是很流行,但它是未来发展的一个趋势。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:07:31 | 显示全部楼层

FreeBSD连载(61):其他内核设置选项

其他内核设置选项

  了解了最基本的GENERIC设置文件的内容,使用者就能根据实际情况,将不必要的设置删除,配置一个适合自己硬件的内核。然而GENERIC内核并不能包括更丰富的设置,包括很多支持的硬件种类,或者特定的内核特性等。

  除了上面提到的这些较常用到的选项之外,FreeBSD中还支持一些不常使用的设备和选项,例如一些老式的连接到声卡上的光驱、游戏杆等,FreeBSD甚至也支持IP over ATM协议和ATM网卡,千兆以太网卡等最新的网络设备和协议。

  所有的选项均可以在LINT文件中找到对应配置的例子,就需要根据具体硬件将配置增加到用户自己的配置文件中。

  无论增加哪种硬件设备之后,都要检查系统中是否有相应的设备文件存在。通用内核中不存在的设备,缺省也没有生成对应的设备文件。因此需要进入/dev目录中,使用/dev/MAKEDEV命令来产生相应的设备文件。

    * 调整内核性能

  当运行一台高性能服务器的时候,缺省设置并不能充分发挥内核的所有能力。为了调整系统性能,便需要考虑更多的设置选项。

maxusers                256
options         "MAXMEM=(256*1024)"
options         "MAXDSIZ=(256*1024*1024)"
options         "DFLDSIZ=(256*1024*1024)"
options         NMBCLUSTERS=4096        
options         CHILD_MAX=512           
options         OPEN_MAX=512         
options                SMP
options                APIC_IO
options                SOFTUPDATES

  由于服务器系统运行在高负载下,需要产生数量巨大的进程数目,并打开相当多的文件。为了提供更好的支持就需要增加系统中表格的大小,这应该增加maxusers设置参数。

  系统启动时首先通过BIOS来检测系统中的内存,但是一般的BIOS最多只能报告64M内存,因此FreeB SD需要自己检测系统中的内存数量。然而系统内存检测并不一定检测到系统中的所有内存,因此需要在内核设置中指定内存大小,MAXMEM选项就用来指定系统物理内存的容量。上例中将系统内存设置为256MB。

  此外,缺省情况下FreeBSD限制每个应用程序使用128MB的内存,这对于一般的应用程序是满足的。但是对于特定的应用程序的服务器,如大容量的新闻组服务器,将占用大量内存,因此就需要增加相应的参数。内核选项MAXD SIZ为最大限制,DFLDSIZ为这个限制的缺省值,那么将应用程序的内存使用限制设为256MB的配置项为上例所示。

  为了增加FreeBSD的网络性能,可以增加NMBCLUSTERS的值,这个设置决定网络界面接收数据时的缓冲mbuf的大小,增加这个值就能使系统能同时响应更多的并发请求,这对于Web等高负载服务器特别重要。CHIL D_MAX定义一个进程能打开的最多子进程数数目,而OPEN_MAX定义一个进程能同时打开的文件描述字的数目,这三个参数为继承自4.4BSD中的设置参数,在FreeBSD下一般不需要调整,因此并没有写在LINT配置文件中,一般情况下,NMBCLUSTERS的缺省值对于高负载服务器略小一些,而CHILD_MAC和OPEN_MAX的缺省值能满足一般的高负载服务器的要求。

  通常这些数值参数需要根据实际情况进行调整,而不应该一味的增大。使用vmstat,netstat,top 等系统工具可以观察系统在实际情况下的运行状态,以决定需要进行哪些调整。

  SOFTUPDATES选项能增加UFS类型的文件系统存取速度,对于大部分种类的网络服务器,系统瓶颈在于磁盘访问速度,而使用这个选项可以改善文件系统的存取性能。这个选项之所以没有被作为缺省设置,主要是因为版权原因。然而为了编译带有SOFTUPDATES选项的内核,还必须手工建立一些符号连接,因为SOFTUPDATES使用的源代码并不直接位于正确的编译路径下,而是位于一个非标准路径下,FreeBSD使用这种方法提醒FreeBSD用户,表示这个部分的版权与BSD版权许可不同,需要单独处理。

# cd /usr/src/sys/ufs/ffs
# ln -s /usr/src/contrib/sys/softupdates/*.[ch] .

  当建立了上述连接之后,带有SOFTUPDATES选项的内核才能被正确编译,然而即使内核支持这个选项,还需要在文件系统中设置softupdate选项,相应文件系统才能真正使用这个功能,这需要对相应的文件系统使用tunefs命令:

# tunefs -n enable /dev/rda0s1d

  这个命令只需执行一次就行了,为了避免出现问题,请在系统的单用户模式下执行这个命令。同样可以使用tune fs -n disable可以屏蔽这个功能。

  此外,对于多处理器的服务器系统,还可以使用SMP选项和APIC_IO选项以支持多处理器。

  可以在编译内核时打开更多的优化选项,缺省情况的只能提供十分基本的优化,而且是使用标准版本的gcc 2. 7.2.1来编译系统的。可以安装egcc,并指定更高的优化选项,如-O6和-mPentium,来获得更高级别的优化和利用Pentium芯片专用指令。由于egcc仅仅支持ELF格式的执行文件,因此不能用于3.0之前(包括3 .0-REKLEASE)使用a.out格式内核的系统。

  当使用egcc编译内核时,需要更改执行config后产生的内核目录下的Makefile,需要重新定义C C选项为/usr/local/bin/egcc,并更改优化选项-O为-O -mpentium,但是由于egcc 不支持gcc的编译选项-fformat_externsion,因此还需要更改Makefile引用的/usr/s rc/share/mk/bsd.kern.mk文件,删除这个文件中这个编译选项的定义。

  虽然理论上编译器优化不影响编译结果,但是编译器本身也会存在问题,使得在某些情况下发生错误。尤其对于系统内核,它决定系统的稳定性。因而在编译时采用过高的优化时就要特别小心,极其偶然的情况下会过高优化的内核会造成系统崩溃。因此在正式使用一个优化内核之前,应该保留一个原有的、使用普通优化选项的内核。新内核经过一定时间实际运行的考验,确认没有问题之后才能放心用于正式使用。

    * 声卡设备

  通常对于SoundBlaster兼容的声卡,可以使用的以下配置选项:

controller     pnp0
controller     snd0
device sb0 at isa? port 0x220 irq 7 conflicts drq 1 vector sbintr
options  SBC_IRQ=5
device   sbxvi0  at isa? drq 5
device   sbmidi0  at isa? port 0x330
device   opl0     at isa? port 0x38a

  其中pnp0控制器是帮助设置ISA接口的PNP声卡的资源,这主要用于使用BIOS为ISA PNP设备分配资源的情况下。但如果不是ISA PNP的声卡,就不需要这个设置,而且如果ISA PNP声卡能设置为非PNP类型,最好将其设置为非PNP类型,ISA总线下的PNP声卡比较难以设置。

  如果系统中安装有DOS的话,可以启动到DOS下,使用该卡的设置程序或一些系统硬件分析软件寻找BIOS分配给ISA PNP卡的资源。

  snd0提供最基本的声卡支持代码,sb0为SoundBlaster兼容声卡驱动程序,要根据声卡的配置参数更改sb0驱动程序的IRQ、DMA以及port数值。改变IRQ值的时候,不仅应该在sb0的配置行中改变,还应该使用SBC_IRQ配置选项。

  sbvxi0也是SoundBlaster 16所需的代码,大部分声称与SoundBlaster兼容的声卡并不能做到完全兼容SoundBlaster 16,最多兼容SoundBlaster或SoundBlaster Pro,因此就不能支持这个设备,只有真正的SoundBlaster 16才能使它发挥作用。sbmidi0为So undBlaster声卡的MIDI接口的驱动程序,很多兼容声卡也不支持这个设备。opl0为SoundBlast er兼容声卡使用的Yamaha OPL-2和OPL-3芯片使用的驱动。

  使用上面的配置选项,设置正确的资源参数,就可以支持soundblaster兼容声卡。但是不同声卡对So undblaster的兼容性不同,因此系统检测时就不能检测到所有的设备,如midi设备或sbvxio0设备,但一般都可以检测到sb0设备,这就能提供基本的声卡设备支持。

  声卡设备还需要相应设备文件snd0的支持:

# cd /dev
# ./MAKEDEV snd0

  当使用这些选项重新编译好内核,并启动之后,就可以查看声卡系统是否工作正常。首先应使用 dmesg命令查看系统是否侦测出了声卡设备,如果没有侦测出,就可能是硬件参数配置的问题,需要使用 UserConfig更改配置。

# dmesg | grep snb0
snd0: <SoundBlaster 16 4.16>
snd0: <SoundBlaster 16 4.16>
snd0: <SoundBlaster MPU-401>
snd0: <Yamaha OPL3 FM>

  通过直接读取设备文件sndstat可以查看出当前声卡的状态,根据系统检测出的设备不同,sndstat 报告的系统中安装的驱动也不同,至少应该报告一个soundBlaster设备:

# cat /dev/sndstat
VoxWare Sound Driver:3.5-alpha15-970902
(Wed Aug  6 22:58:35 PDT 1997 Amancio Hasty@rah.star-gate.com)
Config options:

Installed drivers:
Type 1: OPL-2/OPL-3 FM
Type 2: SoundBlaster
Type 6: SoundBlaster16
Type 7: SB16 MIDI

Card config:
SoundBlaster at 0x220 irq 5 drq 1
SoundBlaster16 at 0xffffffff irq 1 drq 5
SB16 MIDI at 0x330 irq 1
OPL-2/OPL-3 FM at 0x388 irq 1

Audio devices:
0: SoundBlaster 16 4.16

Synth devices:
0: Yamaha OPL-3

Midi devices:
0: SoundBlaster 16 Midi

Timers:
0: System clock

Mixers:
0: SoundBlaster

  设备文件audio用于声音的输入、输出,如果声卡没有IRQ/DRQ冲突,就能正常使用这个设备,从而可以通过这个设备进行录音和播放声音文件,可以通过标准的操作命令来操作这个设备文件。

# dd if=/dev/audio of=out.au bs=1024 count=10
# cat out.au > /dev/audio

  此后就可以安装相关的声音应用软件了,这些软件通常位于ports的软件包目录下,例如播放mp3格式的音乐文件的软件mpg123:

# cd /usr/ports/audio/mpg123
# make install
# mpg123 test.mp3

    * 其他的声卡驱动程序

  除了SoundBlaster声卡之外,FreeBSD还可以支持SoundBlaster AWE 32/ 64、Gravis Ultrasound、Microsoft Sound System、Roland MPU 401、ProAudioSpectrum等声卡。支持这些声卡的驱动也在LINT文件中给出了范例,但这些驱动程序不是单独使用的,需要与上面提到的基本设备sb0相互合作。

  如果计算机上没有声卡,也可以使用个人计算机的喇叭模拟声卡。这样的音响效果并不令人满意,而且也会消耗大量处理器时间,因此应该尽量使用,模拟声卡的设备驱动为pca0。

  有些情况下某些soundblaster声卡使用以上的sd0声卡设备选项并不能正常工作,会遇到IRQ/D RQ的冲突问题。此外还可以使用另一个驱动程序pcm0,这个驱动程序能支持一些sb0不支持的SoundBlast er兼容声卡。当然pcm0的功能相对弱一些,不能支持midi功能。设备sb0能和其他几个设备同时发挥作用,而p cm0设备不能和前面提到的其他设备相互协作,使用pcm0的配置文件应该为:

controller     pnp0
controller     snd0
device pcm0 at isa? port 0x220 irq 7 drq 1 vector pcmintr

  有时由于pnp设置资源的问题,使得pcm驱动将声卡识别为第二个设备pcm1,而报告pcm0与pcm1存在冲突,此时可以简单的建立设备snd1,而忽略pcm0的冲突信息,此后就一直使用snd1作为声卡设备。

    * 设置ISA PNP声卡

  为了给PNP声卡设置正确的资源值,可以在UserConfig中的命令行方式下搜寻PNP设备、配置PNP 设备的硬件参数。如同在前面提到的,对PNP设备需要在UserConfig的命令行方式下使用pnp命令进行设置。为了保留这个设置,每次启动时都自动进行设置,就需要将设置写入根文件系统中的一个设置文件中,例如/kernel.config,例如对于Soundblaster Vibrx16,执行的pnp命令及写入kernel.config的内容包括:

pnp 1 0 os enable irq0 5 drq0 0 drq1 1 port0 0x220 port1 0x300 port2 0x388
pnp 1 1 os enable port0 0x201
quit

  由于pnp命令就为pnp设备分配了资源,那么内核配置文件中的pcm0使用的参数设置就要与它相一致。

  当设置完kernel.config中,还需要设置Boot Loader的资源文件/boot/boot.rc文件,使其能在启动时自动执行设置命令。

load /kernel


load -t userconfig_script /kernel.config
autoboot

  由于个人计算机上的声卡种类相当多,而FreeBSD支持的声卡类型相对较少,如果用户计算机使用的声卡与FreeBSD支持的类型都不兼容,也可以考虑使用FreeBSD下的商业声卡驱动,商业驱动程序能够支持更多类型的硬件。Opensound是FreeBSD下的一种商业声卡支持驱动,其主页是http://www.4front.com。

    * 磁盘设置

  FreeBSD提供了对磁盘上的文件系统和交换空间的管理能力,可以供使用者进行设置。 FreeBSD的使用者可以设置对用户的磁盘空间设置,建立伪磁盘设备等,以更好的方式管理磁盘和文件。

    * 磁盘空间限制

  FreeBSD提供了强大的系统管理功能,除了可以在/etc/login.conf中使用登录类别对用户占用的处理器资源进行限制之外,还可以对用户占用的磁盘资源进行限制。用户磁盘空间的限制是通过quota来完成的。这样就可以控制用户对硬盘资源的使用,防止硬盘空间被无意或恶意用光而造成系统故障。这对于提供公共访问的计算机比较重要。quota需要内核支持,在编译内核时必须加入选项:

options  QUOTA

  接下来是决定对哪个文件系统使用quota来限制用户磁盘资源,要更改/etc/fstab中该文件系统对应的行,从而更改分区安装时使用的参数,例如要对wd0s1e进行限制,则更改fstab中的对应行为:

/dev/wd0s1e         /usr                ufs  rw,userquota,groupquota                1         1

  然后更改/etc/rc.conf中的有关quota的设置check_quotas的值为”YES”,使用新内核重新启动计算机之后,就可以使用下列命令打开用户磁盘设置。

# quotacheck  -av
# repquota  -a

  这些命令在第一次启动支持quota的系统时使用,用来检查磁盘上的quota状态。如果一切正常,就可以使用edquota来更改每个用户的磁盘限制了。

# edquota  -u user1
# edquota  -p user1  user2  user3

  第一个命令就为更改user1的磁盘空间限制,第二行将user1的quota限制复制给user2和user3。

  日常维护要使用quota命令,例如来检查user1的quota设置可以使用下面的命令。

# quota -v user1

  为了避免出现问题,需要每天执行一次quotacheck命令,来检查全部设定是否正常,因此这个命令可以放入/etc/daily或crontab中,定期执行。

# quotacheck -a

    * 伪磁盘设备

  交换设备的数量是受内核设置的限制,内核中的NSWAPDEV的值就确定了最多可使用的交换设备的数量,而NO_SWAPPING选项可以用来屏蔽任何交换设备。

options  NSWAPDEV=20
#options        NO_SWAPPING
pseudo-device        vn        4
pseudo-device        ccd        4

  当增加了交换设备的数量之后,就能增加交换空间,更好的发挥FreeBSD的虚拟内存机制。

  FreeBSD支持的vn伪磁盘设备可用于设置交换文件。缺省内核支持的vn伪设备数量为一个,因此仅可以设置一个交换文件。一般仅需要更改/etc/rc.conf文件中的swapfile选项为交换文件的名字,系统自动使用vnconfig命令来将文件和虚拟设备联系在一起。

  为了增加对多个交换文件或多个镜像文件的支持,可以增加内核中伪设备vn的数量,然后还需要创建相应数量的v n设备。此后就可以使用这多个伪磁盘设备,并使用vnconfig命令管理多个磁盘镜像文件或交换文件。

  除了伪磁盘设备vn之外,FreeBSD系统还提供一个将多个磁盘文件系统映射为一个磁盘的伪设备ccd,这样原有的小磁盘分区就能联合起来,形成一个大的文件系统。ccd要求内核中支持ccd这个伪设备,当内核中支持了cc d伪设备之后,就可以通过设备文件/dev/ccd0c等来使用这个伪磁盘了(缺省/dev下只有ccd0的设备文件,可以根据需要建立其他的设备文件)。

  将多个磁盘分区与单一的ccd设备联系起来,还需要使用ccdconfig进行配置,最基本的ccdconf ig使用例子为:

# ccdcofnig -c ccd1 0 0 /dev/da0s2g /dev/da1s2e

  这个例子使用-c参数对ccd1设备进行配置,指出ccd1由/dev/da0s2g和/dev/da1s2e两个分区联合组成。如果这两个磁盘分区都是100M大小,那么新的设备/dev/ccd1c就有200M大小。然后就可以在ccd1设备上建立文件系统,并使用这个设备了。

# newfs /dev/ccd1c


# mount /dev/ccd1c /mnt

  这是一个对ccd进行配置并使用的最简单的例子,这里没有对ccdconfig命令中紧跟ccd设备的两个数字参数的意义进行解释。而通过选择这两个参数的不同数值,能将多个磁盘文件系统采用不同的RAID方式映射为单个设备。

  RAID为冗余磁盘阵列的简称,它意味着物理上使用多个磁盘,而逻辑上却只有一个磁盘设备。RAID之所以流行,是因为它使用了分段(strip)和冗余的概念,就是说通过RAID映射的逻辑磁盘上的数据是以分段的方式保存的,例如一个文件的第一段数据保存在第一个物理磁盘上,第二段数据保存在第二个物理磁盘上,依次类推。这样在存取这一个文件上的连续数据时,多个磁盘可以同时进行存取操作,因此增加了磁盘访问速度。而冗余则是物理磁盘的空间大于逻辑磁盘的大小,通过物理磁盘上多余的磁盘空间,保存冗余信息,这样一旦多个磁盘中的某一些出现问题,数据能通过冗余数据得到恢复,而不会丢失。

  按照不同的冗余组织方式,RAID被分为不同的级别。最简单的RAID称为RAID 0,这个级别中没有冗余,多个磁盘只是以分段的方式组织起来,由于使用分段的方式存取,可以同时访问这两个磁盘,因此存取单个文件的速度会有所改善。更高一级的RAID级别为RAID 1,它同时使用两个磁盘,每个磁盘都是另一个磁盘的镜像,这样一旦一个磁盘出现问题,还可以在另一个磁盘找到数据,保证了数据完整性,但这样设置,有一半的磁盘空间都用做了冗余,浪费了磁盘空间。此外还有RAID 3级别,至少要使用3个物理磁盘,前两个磁盘中分段存储数据,第三个磁盘的冗余空间中并不是直接保存原有的数据,而是保存根据前两个磁盘中对应分段中的数据进行计算得到一个校验和。在前面某一个磁盘被破坏后能通过冗余磁盘中保存的校验和来恢复原有数据。由于RAID 3中校验和是单独保存在一个物理磁盘上的,不能充分发挥分段存取的优势,因此RAID 5中将校验和与其他数据一起分段、分布保存在各个磁盘上,提供了更好冗余效果。因此当前常用的RAID级别为RAID 0, RAID 1和RAID 5,可根据不同的需要进行选择使用。

  当在ccdconfig中使用两个0作为参数来设置ccd伪设备时,ccd是以最普通的直接连接方式来连接多个磁盘的,当数据写满第一个磁盘后,才接着写入第二个磁盘,这里没有使用任何分段存储策略,因此这是一种不完善的RA ID 0方式。然而也可以设置ccd以使用分段存储策略,以大来存取速度的优势,这就需要设置分段存储中的段的大小,即设置交错因子的大小,因此就需要改变第一个数字参数,例如:

# umount /mnt
# ccdconfig -u ccd1
# ccdconfig -c ccd1 32 0 /dev/da0s2e /dev/da1s2g

  上面第一条命令是卸载已安装的ccd文件系统,第二条命令是将原有的ccd1设备释放出来,使用这两条命令是因为前面操作中已经将ccd1设置过并安装到文件系统中了。第三条命令为重新设置ccd1的命令,其参数中紧随ccd 1设备的参数设置为32,这个参数代表交错因子为32个磁盘块,即数据每隔32个磁盘块大小,进行分段保存到不同的磁盘上,显然前面的参数设置为0表示不进行分段存储。

  由于ccd使用的磁盘设备为预分配的磁盘分区空间,那么这些分区的大小很可能不一致。当一个磁盘设备用光,而另一个较大的设备还有空余的时候,分段策略就不再有效了。此时ccd可以有两种选择,一个是尽量利用磁盘空间,必要时不再进行分段存储,顺序存储数据;另一种选择是不使用这些不能进行分段存储的空间,以保证分段存储带来的优势。当cc d命令的第二个数字参数设置为0时,将尽量利用磁盘空间,因此就ccd伪设备就混合使用分段存储和顺序存储。但也可以将其设置为2,这样ccd只使用分段存储策略,忽略分区不一致的空间。推荐在建立磁盘文件系统时为ccd划分大致相等的空间,这样就可以充分利用分段带来的好处,并且不浪费磁盘空间。

  当使用分段存储之后,理论上在两个磁盘上同时分段存储,存取速度可以加快。这种速度的提高是针对单次数据存取而言的,例如在读取一个大文件时,ccd可以同时从两个磁盘读取。可以看出ccd所作只是改变数据存取的位置,通过将可能会同时访问的数据放置到可以同时访问的多个磁盘上,来提高存取速度。然而而由于ccd是使用软件方式实现的分段,软件方式不能提高磁盘I/O的硬件限制,而高负荷的服务器,同时会有多个进程对多个磁盘进行I/O操作,ccd的作用就不太明显了。此时使用硬件RAID的方式更为有效。

  FreeBSD支持DPT的硬件RAID卡,很多服务器附带的RAID卡均是OEM这家厂商的产品,虽然它们使用其他厂商的商标,但实质还是同一个厂家的产品。因此在使用RAID卡时,需要检查其手册或卡上的芯片标识,判断其是否为OEM产品,以获得RAID卡的真实型号。

  此外,还有一些SCSI-to-SCSI的RAID卡,因此只要该卡使用SCSI控制芯片为FreeBSD所支持,该卡就能在FreeBSD下使用。

  虽然ccd设备能够提高存取速度,但对于建立交换磁盘空间意义不大,一般也并没有必要将交换空间建立在ccd 设备上。这是因为FreeBSD对交换设备本身也采用了交错存取的策略,如果在多个磁盘上设定了多个交换空间,系统会自动使用交错方式使用交换空间,而不必依赖ccd设备的帮助。

  对于IDE磁盘,尤其对于连接在同一条IDE线上的IDE磁盘,使用分段策略是无益的。因为同一条IDE总线上不能进行并发存取数据,分段存储反而影响速度。即使是连接在两个IDE总线上的两个IDE磁盘,由于IDE磁盘的存取十分占用CPU的处理时间,因此分段存储带来的益处也极为有限,只有SCSI磁盘才能充分发挥分段存储的带来的好处。

  ccd也支持RAID 1,这种方式又称为磁盘镜像方式,主要用于保护磁盘数据不会因为偶然损坏而丢失数据,但同时多使用一倍的磁盘空间。此时需要将ccdconfig中的第二个数字参数设置为4,它将强制使用相同大小的各个物理磁盘的空间并使用RAID 1方式。当前的ccd还不支持RAID 5。

# ccdconfig -c ccd1 32 4 /dev/da0s2e /dev/da1s2g

  虽然ccd能够支持RAID 1,但通常并不使用它来进行RAID 1。主要原因是ccd并没有提供相应的软件工具,使得能够在系统出现问题时,能从镜像磁盘中恢复出数据。由于ccd设备和物理磁盘的存储格式存在差异,并不能直接安装上ccd镜像磁盘其中的一个,要恢复存储的数据就需要其他工具的帮助。由于ccd本身并没有提供这种工具,就只能依靠从原始磁盘上读取数据的方式恢复,就使得恢复数据比较困难,所以很少有使用者真正利用ccd来进行磁盘镜像。

  如果需要使用RAID 1以增强系统的可靠性,可以考虑使用vinum,这个软件使用一个内核可加载模块,能提供RAID 0、RAID 1和RAID 5,但由于版权的原因(产生校验和的算法被其专利保护),其中的RAID 5代码没有被直接放入FreeBSD系统中,随同FreeBSD一起提供的vinum只提供RAID 0和RAID 1能力。由于ccd用于RAID 0更容易,而vinum提供了相当完善的RAID 1功能,因此习惯上使用ccd来提供RAID 0,而使用vinum提供RAID 1。具备RAID 5能力的vinum版本可以从Cybernet 公司获得(http://www.cybernet.com),或者与vinum的开发者联系获得测试版。vinum 是一个相当复杂的软件,这里就不再讨论其设置和使用方法了。

  当设置好ccd之后,就可以将其配置放入配置文件中。使用ccdconfig -g命令可以将当前的配置显示出来,把这些设置放入/etc/ccd.conf中之后,使用ccdconfig -C将直接读取这个设置文件,来设置ccd的各个设备,启动时也将自动执行这个设置任务。

# ccdconfig -g > /etc/ccd.conf

  由于ccdconfig及vinum会直接和内核中的伪设备交谈,因此使用它们具备一定的危险性,对它们进行设置时就有造成系统当机的可能性。因此进行设置不要运行其他进程,最好进入单用户状态进行操作,在设置完毕之后,系统就会正常运行了。如果在设置时连续出现当机问题,可以尝试改变设置时使用的ccd设备及其顺序,例如本来使用ccd0 的改变为使用ccd1,再进行重新配置,以避开ccd驱动中可能存在的问题。

    * 非标准配置

  标准系统内核配置均列在配置文件LINT中,这对于绝大多数情况是足够的。然而很多新特性并没有包括在这些标准内核配置中,如果要使用这些独立特性,就需要单独安装这些非标准配置。

  在FreeBSD的开发模式中,可以有任意多个项目组,这些项目组开发的结果要合并到正式的FreeBSD源码中的时候,就必须被FreeBSD core team认可。与Linux的开发方式相比,这种方式较为保守。因此虽然FreeBSD中能够支持很多种特性,但很多都没有包括在FreeBSD的正式版本中。因此使用者要了解Free BSD具备的其他新特性,就必须检查标准配置之外的各种配置。今天的非标准配置,可能就是明天的标准配置。

  在FreeBSD的主页中,介绍了基于FreeBSD的各种商业和自由的开发计划,例如System V系统防真功能、实现IPv6和IPSec的KAME计划等。

  除了正在开发的功能之外,新特性不能被合并到标准配置中的另一个原因是版权原因,很多软件有较严格的版权声明,不能直接放到FreeBSD系统中。另一个原因是FreeBSD的核心小组认为这个特性没有太大的需求,不需要被支持。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:08:21 | 显示全部楼层

FreeBSD连载(62):升级系统

升级系统

  通过CD-Rom或Internet能够很方便的获得FreeBSD的新版本,由于每一次版本升级都修正了原有版本中存在的问题,并增加了一些新特性。因此保持系统与最新版本相一致是十分有益的事情。

  升级内核的最直接想法是直接编译新内核,可以将新版本的内核展开到系统中的目录中,然后按照前面的步骤编译安装新内核。这个方法在同一版本分支中作子版本的升级十分方便,例如从FreeBSD 2.2.7release升级到 2.2.8release。如果要从2.2.x版本升级到3.x版本,由于升级了主版本号,基本系统有了较大改动,因此不仅要升级内核,还需要升级系统中的应用程序。此时一般应使用sysinstall中的Upgrade选项进行升级。

    * 使用源码升级系统

  除了使用sysinstall直接升级之外,另一种升级方法是从系统的源代码中升级系统。这要安装要升级版本的全部源码,从而能重新编译整个系统,包括系统内核和各个应用程序。可以通过下面的办法手工安装系统源码。

# cd /cdrom/src
# ./install.sh

  重新编译整个系统是一个漫长的时间,根据使用的系统硬件不同,将需要几个小时的时间或更长时间来完成这个任务。这个编译命令被称为 “make world” ,表示重新编译构建整个FreeBSD系统。

# cd /usr/src
# make world

  如果是从2.2版本或3.0-release升级到3.1-stable,那么直接这样make world会遇到问题。主要原因是3.0-stable之后,系统的执行文件格式从原有的a.out转向了ELF(3.0-release的执行文件虽然是 ELF格式的,但其内核还保持a.out格式)。make world就提示用户使用make upgrade进行升级,因此使用者就应该按照make world的提示进行操作:

# make upgrade

  其他的make目标有:

  buildworld:编译所有的源代码;

  installworld:安装buildworld编译产生的结果;

  world:执行buildworld和installworld,重新编译安装整个系统;

  aout-to-elf-build:编译从aout到elf升级系统所需的源代码;

  aout-to-elf-install:在aout-to-elf-build的基础上升级系统;

  aout-to-elf:依赖于aout-to-elf-build和aout-to-elf-install,进行a.out系统到elf系统的升级转换;

  update:进行系统升级,对于3.1-stable来讲即包括aout-to-elf;

  reinstall:在以前已经编译好的基础上,不重新编译而再次安装编译产生的结果;

  当使用源代码的方式重新编译系统时,由于需要使用编译工具和这些工具的缺省设置,这些工具就需要预先更新。编译工具一般不需要升级,但编译工具的设置常常需要更新。当更新所有的源代码时,就不存在这个问题,但如果只是更新部分源代码,就会出现这个问题。如果不打算更新所有的源代码,可以通过预安装的一个很小的系统升级软件包来解决编译工具设置更新问题。例如需要更新Ports Collectin,但不打算更新全部源代码(从3.1-release升级到 3.1-stable),就需要安装31Upgrade.tgz。

    * 使用CVSup维护系统源码

  FreeBSD的源代码可以从安装介质上或从网络上下载得到。然而FreeBSD的开发是非常活跃的,系统更新速度相当迅速,只有通过网络更新,才能保持源代码和其他FreeBSD使用者和开发者一致。但如果每次系统更新都从网络下载全部源代码,不仅浪费了网络带宽,而且也没有必要,因为系统中的绝大部分代码并不会更新,每次系统升级更新的只是其中很小的一部分。FreeBSD的全部源代码相当大,尤其对于慢速Internet连接的使用者,下载一次并不是一件简单的任务。所以需要一种方法,使用户每次都只需要下载源代码的更改部分。

  软件开发中的版本维护工具是一种维护同一个软件的不同版本的方法,程序员可以通过这个工具同时维护不同的软件版本。但虽然版本维护工具同时维护多个版本,但并不是将这些版本都独立保存一份,而只是保存一个基本版本及其他版本与它的差异。因此,基于这种版本维护工具的方式,FreeBSD就提供了更新部分源代码的方法,使得用户每次只需要下载更改过数据,这样使用者就能通过Internet与FreeBSD源代码树保持一致,保持最新版本的源代码,并节约了网络带宽。

  为了维护FreeBSD的源代码树,需要一个版本控制软件包CVSup和用于维护源代码的300M硬盘空间。

  FreeBSD的所有源代码本来就是通过CVS(Concurrent Versions System)版本维护系统进行维护的,所有的使用者都能读取同样的源代码,但只有FreeBSD的开发者能够更改这些源代码,这样就保持了FreeBSD源代码的一致性。

  为了使用CVSup,首先要安装这个应用软件。这个软件被收录在Packages Collection中,因此安装非常容易。可以使用pkg_add来完成这个任务:

# pkg_add cvsup-bin-16.0.tar.gz

  安装好CVSup软件之后,下一步就是配置一个配置文件,告诉cvsup从哪个服务器上同步源代码树,以及同步哪些源代码。在安装CVSup的时候,还将安装cvsup的配置文件例子到/usr/share/examples/cvsup 目录下。

$ ls /usr/share/examples/cvsup
README           ports-supfile           secure-supfile
cvs-supfile      secure-cvs-supfile      stable-supfile
gnats-supfile    secure-stable-supfile   standard-supfile

  这个目录下的每个文件都用于一个特定目的,用来同步某个源代码树。其中standard-supfile用于同步FreeBSD -current分支的源代码树,stable-supfile用于同步FreeBSD -stable分支的源代码树, ports-supfile用于同步Ports Collection的源代码,等等。通常这些例子文件中需要修改的只是需要连接的cvsup服务器的名字,例如一个用于同步3.1-stable的配置文件supfile如下,这个文件是根据stable-supfile 生成的,仅仅修改了host的设置,以指向正确的主机。

*tag=RELENG_3_1
*default host=cvsup.FreeBSD.org
*default prefix=/usr
*default base=/usr/src/cvsup
*default release=cvs delete use-rel-suffix compress
src-all

  配置文件中使用tag的值用来标识要同步的不同源代码树。FreeBSD有多个版本,可以根据使用者的选择来获得不同的版本的源代码。最常用的源代码是 -current分支的源代码和-stable分支的源代码,通常对于- current分支的源代码,需要设定 “tag=.” ,而stable分支就要指定版本号,这里为RELENG_ 3_1(或者使用RELENG_3表示3.x分支中的最新版本)。

  host的值用于指明用于同步源代码的服务器的名字,出于速度的考虑,最好使用离用户最近的CVSup服务器。

  base指明用于放置cvsup的状态文件的目录,prefix指明用于放最终的源代码文件的目录。由于最终的源代码和cvsup均要占用大量的磁盘空间,因此需要注意为其留下足够的空间。

  release指明源代码树是使用cvs进行版本维护的,后面为从服务器上传输源代码及处理本地文件时使用的参数。

  src-all用于同步所有的源代码,为了节约磁盘空间和同步时间,可以只同步部分源代码。配置文件中给出了同步部分源代码的配置情况,但被注释了。需要使用#符号将src-all注释掉,指明其他要同步的源代码,如port s-all。

  如果这个配置文件名为stable-supfile,那么就能使用下列命令启动cvsup:

# cvsup -L2 stable-supfile

  参数-L2标识使用第2级记录方式在屏幕上打印出cvsup同步源代码的同步过程,如果系统位于防火墙内,会需要-P m参数以使用被动方式越过防火墙。

# cvsup -P m stable-supfile

  cvsup可以在X Window下运行,此时它使用图形界面。

  通常对于不太经常更新系统的管理员来讲,手工启动cvsup来更新系统源代码就够用了,如果要经常更新源代码,就需要将cvsup命令放入crontab中执行。

  除了cvsup,FreeBSD也可以通过Email来提供源代码同步,这种方式称为CTM,与cvsup不同在于,cvsup 必须由本地系统启动以从远端下载,CTM是由远端服务器发送回来的。CTM对于网络连接比较慢,或只能通过Email 访问Internet的系统最方便,对于与Internet直接相连的系统,一般不需要使用CTM。

  由于使用了cvsup,所有的FreeBSD用户和开发者都能访问同一个源代码树,这样就维护了系统的一致性,就使得只存在一个单一的FreeBSD系统,不致造成不同的版本混乱。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:10:21 | 显示全部楼层

FreeBSD连载(63):集成Unix和Windows的方式

第7章 与Windows系统集成

  在局域网中,由于Windows是为最流行的桌面操作系统,它使用的网络协议也占据重要地位。而 FreeBSD性能非常优秀,除了被用做Internet/Intranet服务器之外,使用者也希望它能用做文件/打印等传统的局域网服务器,为局域网内(或高速连接的网络之间)的客户计算机提供文件和打印服务。因而将FreeBSD和Windows 系统这两种不同的操作系统在同一个网络上相互,就成为一件很有意义的事情。

  将FreeBSD和Windows系统进行集成有几种不同的方式,一种为设置Windows系统,使其遵从 Unix中的标准方式访问FreeBSD服务器,或者在Windows NT服务器安装网关软件,使其成为在 FreeBSD相应服务和Windows相应服务之间进行转换的网关。此外也能配置FreeBSD支持MS Windows下的标准协议,与Windows系统相互通信。

    *
      集成Unix和Windows的方式

  TCP/IP协议族中提供了多种标准的程序,能让支持TCP/IP的计算机进行互连。Windows系列的计算机同样也支持TCP/IP协议及其中一些常用的应用程序,例如远程登录程序telnet,文件传输程序ftp等,使用这些应用程序能实现异种系统互连的基本方式。如果要使用这些最基本程序功能之外的功能,例如文件和打印资源的共享,就必须使用其他软件来达到目的了。

  为了让Windows计算机以最常见的文件共享等方式使用Unix上的资源,Unix计算机必须提供相应的文件共享服务。Unix之间共享文件系统的协议为NFS,然而由于个人计算机上没有严格意义上的用户和权限的概念,因此 Unix不能信任个人计算机上的使用者,而需要对用户进行验证,这就需要pcnfsd提供的认证和共享能力。Dos/Windows 系统可以安装pcnfsd的客户程序,来访问Unix系统上的资源。

  在FreeBSD上安装pcnfsd非常容易,可以使用sysinstall安装程序中的Networkin g菜单中的选项来安装pcnfsd,也可以直接通过Packages Collection来安装它。pcnfsd软件将在/usr/local/libexec下安装一个rpc.pcnfsd程序,如果Unix被配置为nfs服务器,那么rpc.pcnfsd就能为pcnfs客户机提供认证及共享服务,客户能通过它使用Unix系统上的文件和打印资源。

  Sun和其他开发者提供了几种pcnfs的客户程序,然而由于pcnfs在个人计算机领域并没有得到大家的认可,使用它的网络很少。因而pcnfs也就没有得到进一步发展,当前已经成为了一种过时的技术,因此不推荐使用pcnfs 来集成Windows和Unix。

  Windows系统也能够通过Windows NT作应用网关,使用Unix上的资源,这方面的一个例子是Windows NT 系统中支持的TCP/IP网络打印服务,由于这个服务可以支持LPD协议,因此Windows NT 也能作为一个打印机网关,将其他Windows客户的打印请求转换为lpd请求,发送给Unix计算机,或者从Unix 上打印到Windows NT计算机上。然而,应用网关是一种单独的软件,必须具备一种应用网关软件才能集成一种网络服务,因此除了打印服务之外,并不存在其他种类的应用网关系统。

  通过配置Windows计算机与Unix进行集成的方法,对Windows客户并不是最方便的方式。原因之一是由于Windows计算机之间的互连更为常见,所以Windows方式在个人计算机用户中占据主流,而另一个更为重要的原因是用户的问题,要让多数不熟悉Unix系统的Windows使用者以Unix的方式访问Unix系统资源,困难就相当大。而与此相比,Unix系统管理员一般都具备Unix和Windows的丰富经验,并了解各种网络协议,这样就能在Unix计算机上安装支持Windows网络系统的软件,而众多Windows系统用户不需其他额外配置就能使用Unix系统的资源了。显然这种方式能够利用Windows系统现有软件的友好界面,又能利用Unix系统的强大功能,并且不需要Windows用户进行额外的设置,因此就成为了集成Windows和Unix的最流行的方式。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:11:47 | 显示全部楼层

FreeBSD连载(64):NetBIOS名字解析

NetBIOS与SMB/CIFS协议

  在个人计算机和局域网发展的早期,为了在个人计算机上实现网络能力,Microsoft和IBM合作开发了一套协议NetBIOS,这是一套用于网络通讯的调用接口,开发者IBM认为这套协议将如同它们设计的计算机BIOS一样成为最基本的网络访问接口,因此使用了NetBIOS这个名字。而Microsoft就使用NetBIOS接口开发网络服务器及相应的客户软件。

  然后IBM在Token Ring和Ethernet上直接实现了NetBIOS驱动,实现了位于NetBIOS 和物理网络层之间的各种具体接口,这些程序遵循的标准被称为NetBEUI。NetBEUI直接控制Token Ring和Ethernet驱动程序,因此它只能运行在局域网上。但是NetBIOS本身并没有对下层使用的协议进行限制,因此它除了可以在NetBEUI支持下运行之外,也可以在其他协议支持下运行。其他的网络开发者在另外的一些协议的基础上也实现了NetBIOS接口,例如TCP/IP,IPX以及Decnet等。其中NetBIOS over IP由于使用TCP/IP协议,因而在低层与Unix计算机相容,成为Unix和个人计算机系统通信的基础。

  Windows系列计算机并不一定使用IP作它的网络传输协议,它也能使用IPX或NetBEUI作传输协议,但是FreeBSD不支持IPX或NetBEUI上的NetBIOS,必须为Windows客户配置IP协议,才能与FreeBSD相互共享资源。

    *
      NetBIOS名字解析

  由于NetBIOS事实上是一种与TCP/IP独立发展的标准,虽然它可以使用TCP/IP作为传输协议,但是由于概念上的不同,它并没有利用TCP/IP提供的全部能力,而是使用自己的方式来完成类似的工作。其中最大的区别就在于名字解析方式上,NetBIOS具备自己独立的名字解析概念和能力,因此它使用的名字解析方式就与TCP/IP 中标准解析方式 ── DNS不同。在必须经过NetBIOS名字解析获得了一台命名相应的IP地址之后,NetBIOS 会话就可以建立在普通TCP连接的基础上了。因此在NetBIOS中,名字解析是NetBIOS会话与普通TCP 连接最大的不同之处。

  NetBIOS名字解析与DNS名字解析的最大不同在于NetBIOS是动态的,计算机需要首先注册自己的名字,然后才能解析到该名字。动态解析虽然带来的很大的方便性,但却复杂和低效的多,因此只能用于小范围的局域网上。

  每个NetBIOS的名字可以多达16个字符,第16个字符用来标识输入名字时使用的程序类型。当NetBIOS 的计算机进行通信时,它必须基于NetBIOS名字,而不能基于IP地址。一个NetBIOS服务程序必须首先注册自己的NetBIOS名字,而一个应用程序则需要查询所需要的NetBIOS名字。例如每台Windows计算机在启动之后初始化网络时就使用所配置的计算机名字来初始化其使用的NetBIOS名字。

    * NetBIOS名字解析方式

  从NetBIOS名字查找相应的节点地址(TCP/IP协议中为IP地址)有几种不同的查找方式。

  
# 本地广播: 在本地网络上发送广播,通过广播某设备的NetBIOS名字,查找其对应的IP地址。广播方式也能用于注册自己的NetBIOS名字,例如一台计算机可以通过广播本机的名字,向其他计算机宣告自己使用了这个NetBIOS名字。

  
# 缓冲: 每个支持NetBIOS的计算机中,维护一个NetBIOS名字和相应IP地址的列表,这些对应的名字都有一定的生存期,以便能及时更新。

  
# NetBIOS名字服务器:使用一个名字服务器来提供名字与IP之间的解析任务,这个NetBIOS 名字服务器被称为NBNS(NetBIOS Name Server),Miscrosoft实现的NBNS名字服务器为WINS(Windows Internet Name Service)。NetBIOS计算机首先要向NBN S登记自己的NetBIOS名字,完成名字的注册过程。

  
# 预定义文件lmhosts:Microsoft Windows能通过查找存放在本地文件lmhos ts中的数据,来识别网络上NetBIOS名字和IP的关系,这个方式不是NetBIOS名字识别的标准,但它是Microsoft 的实现方式,因此是一种事实标准。

  
# 通过DNS和hosts文件解析:DNS服务器和本地hosts文件中存放的数据是用于标准TCP/IP 协议中名字和IP之间转换使用的方式,但使用其他方式查找不出对应的节点地址时,Microsft Window s中通常也能通过标准的TCP/IP名字解析方式,进行名字和IP的转换。同样这也不是NetBIOS的标准,而是Micorsoft 的扩展。

  从这五种NetBIOS识别方式,以及其中的不同的名字注册方式出发,进行不同的组合方式,就构成不同的名字识别策略。在NetBIOS标准中,将使用不同名字识别策略的模式称为不同的NetBIOS节点类型。

  B-node:通过广播方式来进行注册和进行识别NetBIOS名字。对于IP协议上的Net BIOS,就需要基于UDP进行广播,在小网络上这种方式工作得很好,但当网络增大时,就会被使用路由器将大网络分割为几个小网。在一般情况下路由器不转发广播数据,广播包仅发送到本地网络。虽然可以配置路由器进行b-node广播转发,但是这将使UDP广播产生大量的无用网络数据,且名字注册和解析的难度也增加了。因此对于较大的网络,这种方式不可取。

  P-node(peer-to-peer):对等方式能为识别名字提供非常有效的方法,它使用 NetBIOS名字服务器进行名字的注册登记和名字识别。因此对于每个NetBIOS计算机,必须指定同样的NBNS 服务器的IP地址。这样在NBNS服务器停机或更改了设置(如IP地址等情况)的情况下,名字解析不能完成,就不能进行NetBIOS通信。当然NetBIOS计算机可以配置为使用多个NBNS服务器,以便在其中一个出现问题时使用备份的服务器。

  M-node(Mixed):为了正确解析NetBIOS名字,最好综合使用广播和名字服务器的方式,这样的名字识别是一个复合的过程。M-node首先通过B-node广播方式进行名字识别过程,当广播方式失败之后,再使用P-node方式进行查询。

  H-Node(Hybrid):H-node模式也是一种复合模式,它与M-node不同的地方是查找的顺序不同。H-node先查找NBNS名字服务器,然后再使用广播方式进行查询。

  Windows中实际使用的名字识别方式是对标准H-node方式的扩展,Windows系列的计算机将首先检查缓存中的内容,然后再查看WINS服务器,之后进行广播,然后将查找lmhosts文件,以及通过hosts和DNS 进行查找。实际进行NetBIOS识别是一个复杂的过程,主要就是由于NetBIOS是一个动态的名字解析方式,每一台计算机都必须注册自身。

    * NetBIOS名字识别的过程

  与DNS不同,NetBIOS名字使用动态方式进行管理。DNS数据是静态的,增加和删除DNS名字需要管理员手工更改配置文件。但NetBIOS要求计算机在网络上自动注册其名字,计算机停机之后占用的名字会被释放,这个过程不需要管理员干预。因为它需要额外的网络数据以完成名字登记等过程,使得它不适合象Internet这样的大型网络。NetBIOS名字识别需要三个步骤:

  名字注册:在NetBIOS启动时,计算机向整个网络声明占用了一个NetBIOS名字,如果已经有其他计算机占用了这个名字,这个计算机就会收到错误信息。注册是通过向网络广播声明信息或向NetBIOS名字服务器登记的方式来实现的。

  名字解析:通过广播或查询NetBIOS名字服务器来解析一个NetBIOS名字。此外还可以通过lmhosts 文件和DNS辅助解析名字。

  名字删除:在系统关机或提供的工作站服务结束时,会删除其占用的NetBIOS名。

  通过NetBIOS名字和共享的目录名,就能够定位Windows计算机上的资源。Microsoft使用U NC的形式来确定一个网络资源的位置,一个UNC以双反斜线开始,接下来是提供资源计算机的NetBIOS名字,然后是该台计算机上提供资源的共享名,接下来就是下面的目录和文件名。如:\\ntserver\share\files ,因此使用一个资源的命令为:

C:\> net use f: \\ntserver\share
C:\> f:
F:\>

  上面的net use命令将ntserver上的share资源映射为F:盘。

    * 名字服务器的工作原理

  由于b-node广播会在网络上产生大量的信息流,尤其是在网络是由多个子网构成的时候,而使用路由器本来就是要隔离广播信息,可是为了进行名字解析,就不得不转发b-node广播信息包,这就达不到缩减无用网络流量的目的。

  使用名字服务器进行解析就能避免这个问题,客户通过对名字服务器进行查询而非广播,信息流就不必传播到各个子网上,就能减少广播数据,减轻网络的负担节省带宽,并且能有效的提高名字解析的速度及准确性。

  实际存在的Windows网络甚至很少利用名字服务器进行名字解析,这就使得这些网络名字解析存在很大问题,常常会出现不同计算机的网络邻居列表不同,根本原因就是广播方式是没有保证的,必须转向名字服务器方式才能解决名字解析问题。

  普通NetBIOS计算机和NBNS服务器进行通信有四个不同的通信过程:

  名字注册:每台NetBIOS计算机启动时,都在名字服务器上注册。这样就保持了数据库的自动更新,并具备动态更新的特性。名字服务器将返回确认信息,以及这个名字的生存期TTL。如果客户要求的名字已经被占用了,服务器就查询占用这个名字的客户是否还在网络上,以判断这个名字是否可以再次被使用。这种情况主要发生在Windows计算机死机后重新登记的过程中,因为此时在计算机死机之前,它在名字服务器中登记的名字还存在,如果名字服务器简单的拒绝提供名字,那么这个计算机就无法再次获得自己的名字。只有在真正发生冲突的情况下,客户的名字注册才会失败。

  名字更新:由于每个名字都存在一个生存期TTL,那么当经历了这个TTL一半的时间,客户会向服务器进行更新请求,刷新服务器上的TTL设置。

  名字释放:客户停机时会与服务器通信释放其占用的NetBIOS名字,其名字TTL超时也会使得服务器释放这个名字。

  名字识别:客户可以向NBNS服务器发送查询名字的请求,进行名字解析。

  有些情况下,客户没有设置支持名字服务器,或者使用的客户软件还不支持名字服务器进行解析,可以通过设置一个 WINS代理,由它来在广播数据和查询名字服务器之间进行转换,它可以帮助客户注册并回应客户的广播查询。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:13:57 | 显示全部楼层

FreeBSD连载(65):SMB/CIFS协议

SMB/CIFS协议

  在NetBIOS出现之后,Microsoft就使用NetBIOS实现了一个网络文件/打印服务系统,这个系统基于NetBIOS设定了一套文件共享协议,Microsoft称之为SMB(Server Message Block)协议。这个协议被Microsoft用于它们Lan Manager和Windows NT服务器系统中,而Windows系统均包括这个协议的客户软件,因而这个协议在局域网系统中影响很大。

  随着Internet的流行,Microsoft希望将这个协议扩展到Internet上去,成为Inter net上计算机之间相互共享数据的一种标准。因此它将原有的几乎没有多少技术文档的SMB协议进行整理,重新命名为 CIFS(Common Internet File System),并打算将它与NetBIOS相脱离,试图使它成为Internet上的一个标准协议。

  因此,为了让Windows和Unix计算机相集成,最好的办法即是在Unix中安装支持SMB/CIFS协议的软件,这样Windows客户就不需要更改设置,就能如同使用Windows NT服务器一样,使用Unix计算机上的资源了。

  与其他标准的TCP/IP协议不同,SMB协议是一种复杂的协议,因为随着Windows计算机的开发,越来越多的功能被加入到协议中去了,很难区分哪些概念和功能应该属于Windows操作系统本身,哪些概念应该属于SMB 协议。其他网络协议由于是先有协议,实现相关的软件,因此结构上就清晰简洁一些,而SMB协议一直是与Microsoft 的操作系统混在一起进行开发的,因此协议中就包含了大量的Windows系统中的概念。

    * 浏览

  在SMB协议中,计算机为了访问网络资源,就需要了解网络上存在的资源列表(例如在Windows下使用网络邻居查看可以访问的计算机),这个机制就被称为浏览(Browsing)。虽然SMB协议中经常使用广播的方式,但如果每次都使用广播的方式了解当前的网络资源(包括提供服务的计算机和各个计算机上的服务资源),就需要消耗大量的网络资源和浪费较长的查找时间,因此最好在网络中维护一个网络资源的列表,以方便查找网络资源。只有必要的时候,才重新查找资源,例如使用Windows下的查找计算机功能。

  但没有必要每个计算机都维护整个资源列表,维护网络中当前资源列表的任务由网络上的几个特殊计算机完成的,这些计算机被称为Browser,这些Browser通过记录广播数据或查询名字服务器来记录网络上的各种资源。

  Browser并不是事先指定的计算机,而是在普通计算机之间通过自动进行的推举产生的。不同的计算机可以按照其提供服务的能力,设置在推举时具备的不同权重。为了保证一个Browser停机时网络浏览仍然正常,网络中常常存在多个Browser,一个为主Browser(Master Browser),其他的为备份Browser。

    * 工作组和域

  工作组和域这两个概念在进行浏览时具备同样的用处,都是用于区分并维护同一组浏览数据的多个计算机。事实上他们的不同在于认证方式上,工作组中每台计算机都基本上是独立的,独立对客户访问进行认证,而域中将存在一个(或几个)域控制器,保存对整个域中都有效的认证信息,包括用户的认证信息以及域内成员计算机的认证信息。浏览数据的时候,并不需要认证信息,Microsoft将工作组扩展为域,只是为了形成一种分级的目录结构,将原有的浏览和目录服务相结合,以扩大Mircrosoft网络服务范围的一种策略。

  工作组和域都可以跨越多个子网,因此网络中就存在两种Browser,一种为Domain Master Browser ,用于维护整个工作组或域内的浏览数据,另一种为Local Master Browser,用于维护本子网内的浏览数据,它和Domain Master Browser通信以获得所有的可浏览数据。划分这两种Browser 主要是由于浏览数据依赖于本地网广播来获得资源列表,不同子网之间只能通过浏览器之间的交流能力,才能互相交换资源列表。

  但是,为了浏览多个子网的资源,必须使用NBNS名字服务器的解析方式,没有NBNS的帮助,计算机将不能获得子网外计算机的NetBIOS名字。Local Master Browser也需要查询NetBIOS名字服务器以获得Domain Master Browser的名字,以相互交换网络资源信息。

  由于域控制器在域内的特殊性,因此域控制器倾向于被用做Browser,主域控制器应该被用作Domain Master Browser,他们在推举时设置的权重较大。

    * 认证方式

  在Windows 9x系统中,习惯上使用共享级认证的方式互相共享资源,主要原因是在这些Windows系统上不能提供真正的多用户能力。一个共享级认证的资源只有一个口令与其相联系,而没有用户数据。这个想法是适合于一小组人员相互共享很少的文件资源的情况下,一旦需要共享的资源变多,需要进行的限制复杂化,那么针对每个共享资源都设置一个口令的做法就不再合适了。

  因此对于大型网络来讲,更适合的方式是用户级的认证方式,区分并认证每个访问的用户,并通过对不同用户分配权限的方式共享资源。对于工作组方式的计算机,认证用户是通过本机完成的,而域中的计算机能通过域控制器进行认证。当 Windows计算机通过域控制器的认证时,它可以根据设置执行域控制器上的相应用户的登录脚本并桌面环境描述文件。

    * 共享资源

  每个SMB服务器能对外提供文件或打印服务,每个共享资源需要被给予一个共享名,这个名字将显示在这个服务器的资源列表中。然而,如果一个资源的名字的最后一个字母为$,则这个名字就为隐藏名字,不能直接表现在浏览列表中,而只能通过直接访问这个名字来进行访问。

  在SMB协议中,为了获得服务器提供的资源列表,必须使用一个隐藏的资源名字IPC$来访问服务器,否则客户无法获得系统资源的列表。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:16:04 | 显示全部楼层

FreeBSD连载(66):安装samba

配置和使用Samba

  FreeBSD下实现SMB/CIFS协议的软件为samba ── 一个可以运行在很多种Unix系统中的著名自由软件,它使得Unix对外如同一个Lan Manager服务器,向Windows客户提供文件和打印服务。 Samba的当前版本为2.0,在FreeBSD下可以通过Packages Collection或Ports Collection进行安装。

  samba的主页为http://samba.org,包括有大量samba的资源。

  虽然SMB协议主要用于Microsoft网络,但samba的出现与其无关。它是作者Andrew Tridgell 试图在一台Sun工作站上完成DEC Pathworks功能的尝试,以完成他的其他研究工作。Pathworks 是另一个基于SMB的服务器。那时Andrew Tridgell对SMB和NetBIOS一无所知,但通过分析DOS客户端和Pathworks的行为,他完成了Samba的最初版本。此后随着越来越多的人加入Samba的开发,Microsft也公开了SMB的文档,Samba也越来越完善。使用Samba的使用者一般都会使用过Windows NT等其他SMB服务器,根据他们的经验,Samba服务器的性能要超过其他的各种SMB服务器,包括Windows NT。

  samba软件的主要组成部分有:

  smbd:这就是samba的SMB服务器,它使用SMB协议与客户连接,完成事实上的用户认证、权限管理和文件共享任务;

  nmbd:提供NetBIOS名字服务的守护进程,可以帮助客户定位服务器和域,如同Windows NT上的WINS服务器;

  smb.conf:是samba的配置文件,在FreeBSD中它被放在/usr/local/etc目录中。

  swat:是一个Samba专用的WWW服务器,用于通过客户浏览器配置samba,提供了对Samba的图形配置界面;

  smbclient:是一个简单的SMB客户程序,用于访问其他SMB计算机共享的文件或打印资源,例如Windows95 或NT计算机,它的操作和ftp类似。

  smbprint:一个shell脚本,它使用smbclient向Windows计算机上共享出的打印机上发送要打印的文档。

  nmblookup:用于查询NetBIOS名字的命令行工具。

    *
      安装samba

当使用Packages Collection安装了Samba之后,将自动安装一个启动脚本samba.sh.sample到/usr/local/etc/rc.d目录中,可以将其更名为samba.sh,用于计算机启动时自动启动samba服务器smbd和nmbd。但要启动samba,还需要更改/usr/local/etc/目录下的配置文件smb.conf,安装程序将自动安装一个样例文件smb.conf.default,可以将其复制为smb.conf文件,然后再进行修改。

# pkg_add samab-2.0.2.tgz
# cd /usr/local/etc
# cp smb.conf.default smb.conf
# cd rc.d
# cp samba.sh.sample samba.sh
# sh samba.sh
Samba

  为了正常使用samba,必须对smb.conf进行配置,可以直接编辑配置文件,或者使用图形设置界面进行设置。由于samba是一个非常流行的SMB服务器,因此存在多种图形界面的配置程序,samba2.0本身提供的 swat就是其中的一种,它作为一个Web服务器,可以通过WWW浏览器来配置smb.conf。但是即使能通过图形界面进行设置,但手工编辑smb.conf仍然是最基本的设置方式。

  如同上面的执行命令中所显示的,缺省的smb.conf就正常启动samba服务器,只是缺省配置并不一定适合用户的具体设置情况。例如域(或工作组)名字缺省为MYGROUP,而实际网络中则不一定使用这个名字。下面的命令使用Samba提供的smbclient客户程序,查看缺省smb.conf启动的samba服务器的设置。

# smbclient -L localhost -U%
Added interface ip=202.102.245.60 bcast=202.102.245.255 nmask=255.255.255.0
Domain=[MYGROUP] OS=[Unix] Server=[Samba 2.0.2]

        Sharename      Type      Comment
        ---------      ----      -------
        IPC$           IPC       IPC Service (Samba Server)
        ascii          Printer   lj5gray-a4-ascii-mono
        lp2            Printer   lj5gray-a4-auto-mono
        lj5gray-a4-ra  Printer   lj5gray auto raw
        wb             Disk      Home Directories

        Server               Comment
        ---------            -------
        fbsdsrv              Samba Server

        Workgroup            Master
        ---------            -------
        MYGROUP

  从这个输出结果可以看出,缺省使用的工作组为MYGROUP,提供共享的资源有IPC$,用户个人目录wb,以及系统中存在的多个打印机资源。samba使用计算机的hostname生成它NetBIOS名字fbsdsrv。

  最一般的情况下,只需要将工作组名字改动为与具体网络使用的名字相一致,就能使得使用Windows计算机的客户正常访问samba服务器了,用户在登录Windows的时候,使用自己在samba所在的Unix服务器上的用户名和口令登录,那么就可以访问samba服务器上自己的个人目录及打印机资源了。

  FreeBSD将Samba的文档安装到/usr/local/share/doc/samba目录下,一些设置文件的例子被安装到/usr/local/share/examples/samba目录下,这些文档和例子对于理解SMB协议,正确设置Samba都是非常重要的参考资料。

    * 启动samba方式

启动samba的基本方法是使用Package中提供的shell程序 ── 安装在/usr/local/etc/rc.d目录下的samba.sh。这个程序将会以守护进程的方式启动smbd和nmbd两个守护进程(启动时使用-D参数)。这样在计算机启动时就能自动启动samba服务器。

除了直接启动之外,还可以使用超级服务器inetd来启动samba,这时inetd.conf中应该包括以下行:

netbios-ssn    stream    tcp  nowait          root /usr/local/sbin/smbd     smbd


netbios-ns dgram udp wait root /usr/local/sbin/nmbd nmbd

  其中netbios-ssn和netbios-ns是在/etc/services中定义的两个用于NetBIOS 的端口,一个用于NetBIOS会话管理,一个用于NetBIOS名字解析。当这两个端口就被inetd占据之后,使用上面启动脚本或直接启动smbd和nmbd就无法成功。但由于inetd效率较低,启动服务器较慢,这种配置只适合偶尔共享自己的文件的计算机,不适合会被频繁访问的文件/打印服务器。

  当使用samba.sh启动samba之后(或者使用inetd来启动samba),就可以从Windows 客户机的网络邻居中发现这个FreeBSD服务器。或者使用net use命令直接访问服务器。

  由于一般在Windows中没有配置WINS服务器,那么就可能会出现名字解析的问题。为了帮助进行名字解析,可以在Windows的lmhosts文件中增加samba服务器的NetBIOS名字和IP配置,帮助Windows 解析名字。或者使用samba作为NBNS服务器。

  samba在/var/log下留下了大量的访问日志文件,日志文件的名字在smb.conf中定义。通常日志文件以log开头,以用户名或计算机的NetBIOS为后缀,例如一台计算机NetBIOS名字为cca,那么它访问这台服务器的日志文件就为log.cca。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:19:21 | 显示全部楼层

FreeBSD连载(67):配置samba

配置samba

  虽然缺省情况已经适合大部分用户访问自己在服务器上的个人目录的要求,但是为了充分发挥samba提供的功能,与这些复杂多样的Windows网络相适应,就必须更改smb.conf的设置。以提供更多的共享设置、服务器设置,以及用于支持包括比较简单的共享方式和复杂的域认证方式在内的认证方式。

  smb.conf中的语法非常简单,整个配置文件分为多个不同的部分,每个部分具有一个标题。使用方括号将标题引起来,标题下包括一些相关设置,每一行都用于一个相关设置。设置文件中的每个部分或者定义了一个共享资源的名字,或者设置了一组参数。以下以缺省smb.conf为例,介绍smb.conf中的相关设置。

    * [global]设置

# This is the main Samba configuration file. You should read the
# smb.conf(5) manual page in order to understand the options listed
# here. Samba has a huge number of configurable options (perhaps too
# many!) most of which are not shown in this example
#
# Any line which starts with a ; (semi-colon) or a # (hash)
# is a comment and is ignored. In this example we will use a #
# for commentry and a ; for parts of the config file that you
# may wish to enable
#
# NOTE: Whenever you modify this file you should run the command "testparm"
# to check that you have not many any basic syntactic errors.
#
#======================= Global Settings =====================================
[global]

  [global]部分定义了服务器本身使用的配置参数,以及其他共享资源部分使用的缺省配置参数,因此相当重要。

# workgroup = NT-Domain-Name or Workgroup-Name, eg: REDHAT4
   workgroup = MYGROUP

  工作组设置本地网络使用工作组名字(或者是NT域名字),这对于将正确进行浏览数据中非常重要。否则,Windows客户就不能从其网络邻居中发现这个Samba服务器。

# server string is the equivalent of the NT Description field
   server string = Samba Server

  server string是对于本地服务器的简单描述,这些信息将作为这台服务器的属性,返回给Browser,显示在Windows客户中作为对这个服务器的描述。

# This option is important for security. It allows you to restrict
# connections to machines which are on your local network. The
# following example restricts access to two C class networks and
# the "loopback" interface. For more examples of the syntax see
# the smb.conf man page
;   hosts allow = 192.168.1. 192.168.2. 127.

  hosts allow参数用于限制可以访问这台samba服务器的客户机的IP地址范围,通过指定一系列网络地址,使得只有这些网络中的计算机才能访问这台服务器提供的资源,以提供安全限制。缺省情况下,这行配置被注释了,使得所有的客户都可以访问这台计算机,这样就存在一定的安全问题。

# If you want to automatically load your printer list rather
# than setting them up individually then you'll need this
   load printers = yes

# you may wish to override the location of the printcap file
;   printcap name = /etc/printcap

# on SystemV system setting printcap name to lpstat should allow
# you to automatically obtain a printer list from the SystemV spool
# system
;   printcap name = lpstat

# It should not be necessary to specify the print system type unless
# it is non-standard. Currently supported print systems include:
# bsd, sysv, plp, lprng, aix, hpux, qnx
;   printing = bsd

  这些设置是用于设置samba服务器的打印机资源,load printer=yes就允许samba服务器对外共享服务器的打印机。由于不同的Unix系统中会使用不同的打印系统和不同的打印设置文件,因此需要设置正确的 printcap和printing类型,对于使用BSD打印系统的FreeBSD来讲,打印系统为BSD,使用的设置文件为 printcap,这些是缺省设置,不需要改动。对于使用Unix System V打印系统的Samba,则需要重新进行设置。

# Uncomment this if you want a guest account, you must add this to /etc/passwd
# otherwise the user "nobody" is used
;  guest account = pcguest

  由于Mircrosoft客户没有用户的概念,因此有时会用没有用户和口令的请求访问服务器,就需要将这个没有用户的请求映射为系统中的某个用户,Samba服务器才能安全的访问系统。guest account 就定义这样的请求在Unix下对应的用户权限。为了安全的原因,不能让这个帐户在系统中有可写的权限,通常可以增加一个专用帐户,如pcguest。如果这个设置被注释的情况下,系统缺省使用nobody执行 Windows客户的请求。一些使用者建议不要使用nobody用户,因为系统中的很多程序缺省都使用它,因此就会有安全问题。

# this tells Samba to use a separate log file for each machine
# that connects
   log file = /var/log/log.%m

# Put a capping on the size of the log files (in Kb).
   max log size = 50

  这里定义samba的日志文件为/var/log目录下的以log为前缀的文件,%m用于代表从访问的NetBIOS 计算机名,如果使用的用户级认证,还可以使用%U表示不同的登录用户。例如从一台名字为win95c的计算机访问samba服务器的日志,将记录在/var/log/log.win95c文件中。max log size定义每个日志文件的存储限制。

# Security mode. Most people will want user level security. See
# security_level.txt for details.
   security = user
# Use password server option only with security = server
;   password server = <NT-Server-Name>

# You may wish to use password encryption. Please read
# ENCRYPTION.txt, Win95.txt and WinNT.txt in the Samba documentation.
# Do not enable this option unless you have read those documents
;  encrypt passwords = yes

  在SMB协议中,有多个不同的认证方式,包括简单的共享级认证和用户级认证。Unix为多用户操作系统,缺省就使用用户级认证方式。当使用用户级认证的时候,Samba服务器使用Unix操作系统的用户和口令(来自/etc/passwd )对用户进行认证,这是一种独立的认证方式。而有时候希望所有的服务器使用同一个认证数据库进行统一认证,因此就导致出现了基于域的统一认证模式。在一个域中,用户只需要通过域控制器进行认证即可,域中其他SMB服务器就将认可域控制器的认证。

  为了使Samba服务器支持域认证方式,可以有两种不同的设置方式,一种为真正的域认证,另一种为服务器认证方式,将Samba服务器配置为通过服务器验证用户,这需要指定security=server,以及指定password server的名字为NT的域控制器。认证服务器的方式不能事先域认证方式提供的一些特征,但它的适用范围并不仅限于域,使用工作组的网络也能通过统一的认证服务器来使用统一认证模式。设置域认证方式在后面进行详细解释。

  在Windows NT 4及Windows 98之后,客户和服务器之间进行认证时,口令不再以明文的方式在网络中传输了。为了支持加密口令传输,需要设置encrypt passwords选项。同样,这也需要其他复杂的设置。

# Using the following line enables you to customise your configuration
# on a per machine basis. The %m gets replaced with the netbios name
# of the machine that is connecting
;   include = /usr/local/etc/smb.conf.%m

  系统管理员可以为每个特定的计算机定制一个特定的配置文件,那里的设置将覆盖smb.conf中的缺省设置。这样就可以针对不同的计算机提供不同的配置。

# Most people will find that this option gives better performance.
# See speed.txt and the manual pages for details
   socket options = TCP_NODELAY

  socket参数用于配置对TCP的处理方式,以适合Microsoft客户的特征。Microsoft习惯为每个很短的会话都建立单独的连接,而不是使用一个连接进行多次传输,这样在传输中就需要进行多次连接会话设定过程,对性能有一定影响。为了改善性能,需要设置TCP_NODELAY或IPTOS_LOWDELAY选项。

# Configure Samba to use multiple interfaces
# If you have multiple network interfaces then you must list them
# here. See the man page for details.
;   interfaces = 192.168.12.2/24 192.168.13.2/24

  如果计算机上有多个网络界面,那么就需要让samba向多个界面广播b-node广播包,以及为这些界面提供资源服务,否则samba就会只向某一个界面提供网络服务。当然也可以设置这个参数,使得samba 只服务于某个指定的网络,而不是服务器连接所有的网络。

# Browser Control Options:
# set local master to no if you don't want Samba to become a master
# browser on your network. Otherwise the normal election rules apply
;   local master = no

# OS Level determines the precedence of this server in master browser
# elections. The default value should be reasonable
;   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 = <NT-Domain-Controller-SMBName>

  这些设置选项主要用于SMB网络中进行浏览时,设置samba服务器的行为。缺省情况不让samba服务器参加broswser的推举过程,为了使得samba服务器能成为browser,就需要设定local master =yes。然后samba服务就可以根据os level设置的权重进行推举,缺省的os level为0,这个权重不会赢得推举。但可以取消注释,将os level设置为33,这将在与所有Windows计算机(包括Windows NT)的推举竞赛中获得胜利,因为NT server的权重为32。设置比33更高的权重,只是在不同的samba 服务器之间进行选择时才有意义。

  由于Unix及Samba服务器在同样硬件配置下具有更高的网络性能,因此一般情况下,使用Samba服务器作Browser更佳。当然可能在Samba服务器启动之前,网络中都已经存在了Browser了,一般情况下不必重新进行推举过程,让网络中的现有Browser继续发挥作用。如果希望Samba服务器总是成为Browser,可以设置当Samba服务器启动时,迫使网络中重新进行推举过程,这需要设定perfered master参数。

  通常Samba能够胜任master Browser的角色,然而在多个子网的情况时,网络上就会存在Local master Browser和Domain master Browser。以上的设置只能使Samba成为 Local master Browser,缺省Samba并不参加Domain master Brower的推举。设置Samba服务器成为Domain master Browser就必须使用domain master参数进行设置,这对于使用工作组方式进行跨子网浏览意义重大。

  但是如果网络使用的是NT的域方式,就要使用NT的域控制器作为Domain master Browser ,不要设置与NT域控制器同一个子网中的Samba服务器的domain brower与browser功能,以免它和域控制器竞争。不让Samba服务器和NT域控制器竞争的原因是由于Windows NT中域控制器还涉及域认证(不是认证域用户,而是认证域上的合法成员计算机),SMB协议中各种复杂功能交错混合,浏览和认证两种不同的功能竟也混合在一起。由于域控制器完成的域认证任务,Samba服务器不能够完成,因此为了避免与NT域控制器相互冲突,最好使用域控制器作Domain master Browser。

  让Samba服务器了解当前域中存在的域控制器的方法是指定在设置文件中指定域基本控制器PDC(primary Domain Controller)的NetBIOS名字,这需要使用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 = \\%L\Profiles\%U

  当用户通过一台Windows 9x客户机使用用户级认证访问网络时,他可以选择登录进网络中的域。这意味着他不但要在SMB服务器中进行验证,而且会执行服务器中相应目录中的登录脚本,以自动执行一些相关设置。通常这种登录功能是由Windows NT服务器来执行的,然而Samba服务器也能完成这个任务,但必须设定domain logons 参数。此后就可以对不同的客户计算机或不同用户指定相应的登录脚本。这个功能还必须要求在本配置文件后面设置 netlogon共享选项,以便客户机能访问相应的登录脚本。

  除了登录脚本之外,Windows NT中为了支持移动用户在不同地点进行漫游,也提供了针对每个用户的描述其使用环境的Profile文件,Samba服务器也可以通过logon path来支持对windows客户机这种漫游能力的支持。这样当Windows客户机使用漫游功能的时候,客户机会自动将用户的配置文件保存到服务器上,此后每次登录进域的时候都重新下载这个配置文件,设置Windows桌面环境。

# Windows Internet Name Serving Support Section:
# WINS Support - Tells the NMBD component of Samba to enable it's WINS Server
;   wins support = yes

# WINS Server - Tells the NMBD components of Samba to be a WINS Client
#       Note: Samba can be either a WINS Server, or a WINS Client, but NOT both
;   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

  上面的这些选项是用于设置NetBIOS名字解析方式,wins support选项使得nmdb能对外表现为一个NBNS服务器。wins server用于指定一个外部名字服务器的地址(可以为NT上的wins服务器或另一个Samba服务器),使得nmbd能用做NBNS客户端,通过访问该wins名字服务器解析NetBIOS名字。

  此外,还有一些不使用名字服务器进行解析的NetBIOS客户,如果名字服务器位于另一个子网上,那么它们就无法正确解析名字,而Samba可以使用wins proxy帮助它们使用名字服务器解析地址。例如一个WINS服务器在另一个子网上,本地子网内的Samba服务器配置了wins server的地址,其他Windows客户没有设置wins服务器地址,它们使用b-node广播方式查询名字,在这台Samba服务器设置了wins proxy能力之后,它就能代替wins服务器回应客户请求。因此要用作wins代理,就必须本身能使用名字服务器进行解析,就要求先设置wins server参数。

  此外,NetBIOS名字解析也可以扩展到通过DNS查询进行帮助,使用dns proxy设置就能让Samba 服务器通过dns进行查询,回应NetBIOS名字查询请求。

    * [homes]个人目录共享

#============================ Share Definitions ==============================
[homes]
   comment = Home Directories
   browseable = no
   writable = yes

  [homes]部分使得每个Unix用户通过SMB客户登录上来的时候,可以共享使用他自己的个人目录。这个共享资源具备特别属性,当用户登录上之后,共享名就不是homes,而是被服务器映射为用户自己的标识符。

  设置这个特别的共享选项,就允许每个用户访问自己的个人目录,而不必为每个用户都配置一个共享资源部分。正由于系统会自动映射,因此就不需要定义要共享的文件目录路径,而在其它文件资源共享选项中,都需要使用path参数进行定义。

  由于Samba系统会自动将homes共享名改变为用户的个人标识符,因此要设定browseable=no ,设置homes本身这个名字不出现在资源列表中。writable为用户写权限设置,由于是在用户的个人目录下,用户可以具备写权限。

    * [netlogon]与[Profiles]

# Un-comment the following and create the netlogon directory for Domain Logons
; [netlogon]
;   comment = Network Logon Service
;   path = /usr/local/samba/lib/netlogon
;   guest ok = yes
;   writable = no
;   share modes = no

  当允许Samba服务器支持客户的网络登录功能之后(设置domain logon),就需要设置[netlogon] 部分(删除注释符号),为guest用户打开登录路径的访问权限,以保证每个用户都能访问其自己的登录脚本。由于需要使用guest对应的Unix帐户访问登录脚本,这个登录路径及其下面的脚本文件都要允许该Unix帐号可以读取。

  建立这个目录之后,要设定正确的权限,并且创建这个目录下对应各个计算机或用户的登录脚本,以提供给客户正确的登录脚本。

# Un-comment the following to provide a specific roving profile share
# the default is to use the user's home directory
;[Profiles]
;    path = /usr/local/samba/profiles
;    browseable = no
;    guest ok = yes

  当支持Windows计算机漫游能力时,可以设定[Profiles]部分,并为相应的路径建立目录,及分配权限。来为Window计算机用户设置桌面环境。

    * [Printers]打印机设置

# NOTE: If you have a BSD-style print system there is no need to
# specifically define each individual printer
[printers]
   comment = All Printers
   path = /var/spool/samba
   browseable = no
# Set public = yes to allow user 'guest account' to print
   guest ok = no
   writable = no
   printable = yes

  这个部分就用于设置将printcap中定义的所有打印机使用的相关设置,缺省情况下允许所有的合法客户使用所有的打印机。BSD风格的打印系统,不需要任何设置就能正确共享所有的打印机,当然也可以使用printer参数指定具体的打印机以提供共享。而path参数定义的是打印机缓冲区的位置。guest ok、writeable用于设置正确的权限,而printable用于设置打印属性。

  由于Windows的打印驱动已经将要打印的文件转化为打印机支持的那种描述语言,因此这些打印文件不再需要任何过滤器进行转换。因此需要在printcap中定义一个不使用任何过滤器、直接将打印文档输出到打印机端口的打印机选项。

    * 其他专有共享目录

# This one is useful for people to share files
;[tmp]
;   comment = Temporary file space
;   path = /tmp
;   read only = no
;   public = yes

# A publicly accessible directory, but read only, except for people in
# the "staff" group
;[public]
;   comment = Public Stuff
;   path = /home/samba
;   public = yes
;   writable = yes
;   printable = no
;   write list = @staff

# Other examples.
#
# A private printer, usable only by fred. Spool data will be placed in fred's
# home directory. Note that fred must have write access to the spool directory,
# wherever it is.
;[fredsprn]
;   comment = Fred's Printer
;   valid users = fred
;   path = /homes/fred
;   printer = freds_printer
;   public = no
;   writable = no
;   printable = yes

# A private directory, usable only by fred. Note that fred requires write
# access to the directory.
;[fredsdir]
;   comment = Fred's Service
;   path = /usr/somewhere/private
;   valid users = fred
;   public = no
;   writable = yes
;   printable = no

# a service which has a different directory for each machine that connects
# this allows you to tailor configurations to incoming machines. You could
# also use the %U option to tailor it by user name.
# The %m gets replaced with the machine name that is connecting.
;[pchome]
;  comment = PC Directories
;  path = /usr/pc/%m
;  public = no
;  writable = yes

# A publicly accessible directory, read/write to all users. Note that all files
# created in the directory by users will be owned by the default user, so
# any user with access can delete any other user's files. Obviously this
# directory must be writable by the default user. Another user could of course
# be specified, in which case all files would be owned by that user instead.
;[public]
;   path = /usr/somewhere/else/public
;   public = yes
;   only guest = yes
;   writable = yes
;   printable = no

# The following two entries demonstrate how to share a directory so that two
# users can place files there that will be owned by the specific users. In this
# setup, the directory should be writable by both users and should have the
# sticky bit set on it to prevent abuse. Obviously this could be extended to
# as many users as required.
;[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

  此后,缺省smb.conf中给出了一些设定各种共享文件资源、打印机资源的例子,例如设置特定打印机的 [fredprn],设置私人文件共享资源的[freddir]和[myshare],使用宏为多个用户设置共享的[pchome],提供公共访问的[public]和[tmp],FreeBSD的管理员可以根据具体情况,根据这些设置例子设置相应的共享资源,并设置相应的访问权限,以保护文件系统不被非法访问。

  需要注意的是,当使用valid user用来设置合法访问用户时,或者使用wirte list定义具备写权限的用户时,都可以使用@staff的形式使用Unix的组名,这样凡是属于该staff组成员的用户,都会具备相应权限。

  从这些例子中可以看到[global]用于设定全局参数,不会出现在资源列表中,[homes]用于设定个人目录共享,其共享的名字映射为个人标识符而非homes,[printers]设定打印机共享,将共享所有的打印机名字,除了这些标题的共享名字与标题不同之外,其他每个标题都将代表一个共享资源的名字。

  当更改设置之后,可以重新启动Samba服务器,提供新的共享服务了。但在重新启动服务器之前,最好使用 Samba软件包中提供的测试软件,检查一下设置是否正确。这些小工具程序包括检查smb.conf设置的testparm ,检查打印机名字的正确性的程序testprn,用于进行NetBIOS名字解析的nmblookup等。

    * 使用swat配置samba

  samba 2.0提供了一个能够通过浏览器来配置samba的工具──swat。它是一个专用www服务器,使用inetd 来启动,然后经过认证,可以允许用户通过浏览器来配置smb.conf。为了达到这个目的,首先要为swat分配一个固定的端口,这个工作可以通过在/etc/services中增加一行来完成:

swat    901/tcp

  出于安全的考虑,应该使用1024以下的端口,这是因为非root用户也能占用1024以上的端口,如果使用 1024之上的端口,可能在某些情况下,普通用户就可能通过欺骗的方法获得管理员的口令。

  为了启动swat,需要在inetd.conf中增加一个入口,并重起inetd:

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

  然后就能使用Netscape等浏览器来配置samba了,为了避免认证口令通过网络传输,应该在本地启动浏览器(并进一步可以使用tcp_wrapper提供保护)。输入URL为:http://localhost:901 /,浏览器将提示用户名和口令对用户进行认证,可以输入任意一个Unix用户进入swat页面,但普通用户只能读取 samba设置,而不能更改,为了设置samba,必须使用root用户进行认证。一些功能简单的浏览器不支持浏览器方式的用户认证,就无法使用swat设置Samba。

  由于改变smb.conf对于系统安全有严重的影响,因此使用swat一定要小心。为了防止进行swat认证时root密码被窃听,不应该在远程启动浏览器进行设置,应该在控制台或本地安全网络内进行设置。而且一旦设置完毕,应该立即退出浏览器,因为浏览器在内存中保存用户的认证信息,直到浏览器退出。

  注意,swat将删除原有smb.conf中的全部注释,并重新安排各个设置项的位置,因此应该在使用swat 设置之前备份原有的smb.conf。而且swat只是提供了一个容易使用的设置界面,并不能保证设置一定就是正确的,因此还是要在理解smb.conf的基础上才能正确设置。

  swat提供7个不同功能的页面,提供管理员访问。主页面HOME,提供了对Samba文档的连接,用于管理员实时查看相关手册;GLOBALS页面提供对smb.conf中[globals]部分中的各个参数进行设置;SHARES 用于选择、增加、删除各个共享资源,查看并更改其设置选项;PRINTERS用于设置打印机选项;STATUS 用于检查当前Samba服务器的状态,包括客户计算机的连接状态和用户的连接信息,管理员可以使用它来重新启动 Samba,这样就能在更改设置之后使新设置生效;VIEW用于查看当前设置的smb.conf的内容;PASSWORD 用于管理加密口令,提供加密认证情况下增加和管理用户,并可以保持Unix和Windows NT的口令一致,这个功能只在使用了加密口令功能之后才有用,更改的口令将直接保存在/usr/local/private目录下的smbpasswd 文件中。PASSWORD功能将不但更改smb.conf,还将更改Samba使用的口令选项,因此对于使用加密口令认证方式的系统,最为有用。

  使用SWAT,设置Samba就非常容易,不再需要手工编辑设置文件,而可以直接使用浏览器更改设置,并重新启动Samba服务器。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:21:16 | 显示全部楼层

FreeBSD连载(68):根据Windows网络设置Samba

根据Windows网络设置Samba

  使用SMB协议实现的网络的情况非常不同,有的网络仅仅由几台Windows计算机组成,只需要提供计算机之间最简单的资源共享,并不需要一个中心控制点 ── 文件服务器提供服务,而有的网络由多个物理网络通过路由器连接而成,网络中拥有多种文件/打印服务器,网络中的操作系统也各不相同,包括Windows和Unix。

  Samba服务器能适应这些不同要求的网络的不同要求,然而由于网络的需要各不相同,因此对Samba的设置也不相同。如何根据需要来规划网络、设置Samba是一个灵活但复杂的问题,同时存在各种各样的设置方式都能满足用户的需要,这里给出的只是一种可行性建议。

    * 小型网络,无NT服务器

  这种网络的特征是网络资源的使用程度不大,通常所有的计算机都位于一个局域网内,几乎没有专用文件/打印服务器。所有的计算机均使用工作组方式相互访问。此时使用Samba服务器的目的是为了更好的利用网络资源,提供方便的文件/打印服务。

  在这样的网络中,仅仅需要最简单的文件/打印共享服务。虽然共享级认证方式能够满足此时的需要,但是最好使用用户级认证方式,因为只有这样才能充分发挥服务器提供服务的优势。需要为每个使用者在FreeBSD服务器上分别建立帐户,这样缺省设置就自动为用户共享其个人目录,用做私人数据的保存。为了网络用户之间的相互交换数据,可以设定一个公用共享目录,例如上面例子中的[public]共享目录。

  由于Samba服务器具有优秀性能,最好将Samba服务器设置为本地的Browser,仅需要设置local master参数,并给os leverl一个较大的值就能达到目的。可以不使用nmbd的名字解析能力用做名字服务器,因为此时都在一个物理网络内,b-node广播方式能够提供正确的解析。

  当为Windows 98或者Windows NT SP3提供认证的时候,它们将使用加密过的口令进行认证,这能提供更大的网络安全性。Samba服务器也能提供这种认证,然而对于这样的小型网络,使用原有的非加密口令认证方式就足够了,因为口令不会跨越网络传输,安全问题限制于本地网络内部。在Samba的文档中,提供了将Windows 98或Windows NT SP3设置为原有认证方式的注册表信息,分别为/usr/local/share/examples/samba 目录下的Win95_PlainPassword.reg和NT4_PlainPasswor.reg文件。

    * 小型网络,与NT服务器相互协作

  这种网络中存在一个或几个Windows NT服务器,因此网络中的关键问题是认证的策略问题。有的网络中使用分散式的认证策略,即各个服务器各自认证使用自己资源的客户,适合网络上服务器属于不同管理者的情况,另一种情况是希望在访问多个服务器时使用一致的认证,无论是在NT服务器还是在Samba服务器,对于同一个用户只需要使用一个口令就能使用网络资源。

  当使用分散认证策略的时候,Samba服务器可以使用缺省设置security=user,当要求Samba 服务器和NT服务器认证同样的用户的时候,可以使用security=server,让NT服务器来认证用户,此时还需要设置password server的名字,以设置提供认证的NT服务器的名字。

  由于是使用NT服务器对用户进行认证,然而NT上的用户与FreeBSD用户的名字可能不同,为了将NT用户重新映射到FreeBSD上的Samba用户,就需要进行用户名的映射。这需要使用username map参数,这个参数设置一个用于用户名映射的文件名,在这个指定的文件中,可以设置FreeBSD用户(或用户组)等价于哪个NT 用户(或用户组)。

    * 具备多个物理网段的网络

  如果用户的网络跨越了多个物理网络,为了实现浏览,最重要的问题就是设置使用名字服务器进行名字解析。此时可以选择使用Samba的nmbd作为名字服务器,也可以使用Windows NT的WINS服务器作为名字服务器。

  但如果计划在网络上使用多个NetBIOS服务器,以提供相互备份的能力,就只能使用多个Windows NT 来运行WINS,WINS的一项功能是具备相互复制的能力,而nmbd不能和其他WINS服务器相互复制数据。WINS 使用这个功能主要是用于克服系统操作本身的故障,以提高可靠性。对于一般的网络,使用一个名字服务器,尤其是运行在高稳定性的FreeBSD系统之上的Samba,可靠性就能满足网络的需要。当然偶然发生的物理故障是无法避免的,这样将使用分布在不同地点的多个服务器会有一定的帮助。

  当选择好了名字服务器的设置策略,就可以决定Samba是用作名字服务器,还是普通的使用名字服务器的客户机。Samba可以同时设置为名字服务器和客户,这并不冲突。还可以设置Samba为wins proxy和dns proxy ,为不能使用wins和dns进行名字解析的NetBIOS客户提供b-node方式的代理解析。

  当网络使用的是分散式的工作组方式的时候,要实现跨越子网的浏览,Samba服务器就担任了重要的角色。因为不存在域控制器,此时Samba要设置成为Domain master Browser,以提供不同子网间的Local master Browser相互交换浏览信息。

  如果远程网络中的计算机不使用本地的Samba作名字服务器,该网络中的Domain master Browser 也不与本地网络的Local Master Browser交换信息,那么那个网络上的Brower就无法了解本地上的资源列表。作为本地Browser的Samba服务器能使用一种折衷的方法来通知远程网络上的Browser ,告诉它本地网络提供的资源服务,这就称为remote announce,并能用于远程网络中的浏览信息与本地网络同步。为了使用remote announce,需要设置remote announce和remote brow se sync参数,使用的设置值为远程网络的广播地址,如192.168.1.255,可以同时设置多个地址,以同步多个远程Browser。

  如果网络中使用NT域认证方式,就不要让Samba和域控制器争夺Domain master Browser 的权利,Samba还不能设置为PDC为整个域服务。因此需要设置domain master=no,但可以让Samba 服务器在没有PDC的子网中担当Local master Browser的任务,即设置local master=yes。

  当前NT服务器使用SAM数据库用于保存认证信息,但是下一代NT服务器将转向kerberos认证方式,这种认证方式本来就是在Unix上开发的,更有利于与Samba软件集成在一起。

  此时也可以使用NT的域控制器提供认证(设置security=server,并将password server 设置为PDC或BDC),以使得Samba服务器能承认域控制器认证过的用户。这样客户技术就可以使用加密认证方式,因为Samba服务器不进行认证,仅仅是把认证信息转发给相应的NT服务器进行认证。

    * 支持加密口令认证

  前面提到过为了适应Windows 98和Windows NT 4.0 SP3之后的客户使用加密过的口令认证方式,可以将客户计算机再次设回使用普通口令认证方式来解决认证问题,然而当客户可能跨越子网进行认证的时候,就应该使用加密认证,以防止口令明文跨越子网传输,提供更高的安全性。

  为了支持加密口令认证,就需要使用独立于FreeBSD系统口令文件之外的认证系统,需要在smb.conf 中的[globals]中增加设置为:

      encrypt passwords = yes
      null passwords = yes
      smbpasswd file = /usr/local/private/smbpasswd

  然后使用命令smbpasswd -a user,将用户user及其口令加入指定的口令文件smbpasswd 文件中,这样在进行认证时,就能通过这个smbpasswd文件中的设置,通过口令的加密认证方式进行认证了。然而此时将绕过系统标准认证过程,原有的用户数据必须重新一个一个加入smbpasswd文件中才能完成认证,没有添加到这个文件中的用户就无法完成认证以使用系统资源。其中null passwords的设置不是必须的,只是Windows NT中一般许可用户使用空口令,这项设置用来与Windows NT的设置保持一致。加密口令文件smbpasswd 在FreeBSD系统下缺省位于/usr/local/private目录中。

  Samba手册中使用的目录可能会与FreeBSD中的具体目录不一致,这是因为使用Packages Collection 或Ports Collection安装的Samba,其软件的安装目录均按照FreeBSD的习惯做了调整,因此会与Samba手册提到的位置不太相同。

  此时,使用SWAT的PASSWORD设置选项可以直接将一个用户加入口令数据库,并打开访问这个用户的许可,对于加密口令的管理更为简便。因此应该使用SWAT来管理加密口令数据文件,而不必直接使用smbpasswd命令。

    * 将Samba服务器加入域

  使用域代替工作组的好处是,所有的客户能使用同一个认证来访问所有的资源。虽然域的概念还是一种非常初级的目录服务的概念,但由于Microsoft网络的流行,它的重要性也非常之大。

  在一个以域为认证方式的网络中,可以将Samba加入域中去,以采用与域一致的认证和管理方式。在一个域中的 SMB计算机有各种形式,一种为提供认证服务的域控制器,分为PDC(Primary Domain Controller)和BDC(Backup Domain Controller),另一种为不提供认证服务的成员服务器,还有就是普通客户机。Samba当前能作为普通成员服务器加入域。

  为了将Samba加入域,首先要为Samba服务器在PDC服务器中创建一个帐户,这个操作就如同为普通NT 成员服务器创建用户一样,通过NT服务器的Server Manager for Domain来完成。

  加入NT域的时候首先需要停止Samba服务器的正常工作,使用smbpasswd将这个Samba服务器登记进域,这需要使用:

# smbpasswd -j DOMAINNAME -r SAMBASRV

其中DOMAINNAME为域的名字,SAMBASRV为前面PDC上为Samba服务器创建的帐户名,这样Samba服务器就加入了域。然后需要更改smb.conf的设置:

       security = domain
       workgroup = DOMAINNAME
       password server = PDC_name BDC1 BDC2

  password server设置为这个域内的PDC和BDC的名字。此后,再次启动Samba服务器,则服务器就为这个域的一个成员服务器了。

  虽然使用域认证方式和服务器认证方式都能让同样的用户访问Samba服务器上的资源,然而对于认证细节是不同的,使用域认证方式能利用域提供的更安全的认证通道。

    * 设置lmhosts

  在Miscrosfot扩展的NetBIOS协议中,可以使用查询设置文件的方法来进行名字解析,这个静态文件为 lmhosts。在Windows下的这个文件位于系统目录中,Samba将其放在与smb.conf相同的目录下,FreeBSD系统中为/usr/local/etc中。

# Sample Samba lmhosts file.
192.168.1.24  WIN95
192.168.1.21  NTSRV#20
192.168.1.121 FBSDSRV                   #PRE

  lmhosts的文件格式与/etc/hosts文件非常类似,也是IP地址/主机名字对,除了这个文件中使用的名字是NetBIOS名字。此外NetBIOS名字有一个定义属性类别的字节(NetBIOS中的第16个字节),这个属性字节可以在lmhosts中直接设置,以回应特定类别的请求,不设置这个属性,就对应所有类别。例如上例中的第二项定义的NTSRV,就明确指定了其属性为16进制的0x20。

  此外,lmhosts也支持一些特殊的语法,例如用在一个设置项之后的#PRE选项将使得这项设置在启动Samba 时自动载入系统缓冲区中,使得能最先识别。标准情况下的lmhosts文件在名字解析查询顺序的后部,在经过wins 和b-node广播之后才会检查lmhosts设置,而#PRE选项设置的名字就会在此之前进行解析。

  一般情况下不必设置这个文件,因为使用其他方法进行名字查询就足够了,这种方法用于辅助解析的,例如在跨越子网进行浏览,但wins服务器不能提供访问时的一个备份措施。其中的#PRE方式也能在系统启动时的进行一些初始名字解析设置。

未完,待续。。。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表