Linux下架设Samba服务器

andylanzhiyong 2011-08-10

1. 基础概念

    Samba(SMB是其缩写) 是一套让UNIx系统能够应用Microsoft网络通讯协议的软件,用于Linux和

    Windows共享文件之用;Samba 即可以用于Windows和Linux之间的共享文件,也一样用于Linux

    和Linux之间的共享文件;不过对于Linux和Linux之间共享文件有更好的网络文件系统NFS,NFS也是

    需要架设服务器 的。

    在Windows 网络中的每台机器即可以是文件共享的服务器,也可以同是客户机;Samba 也一样能行,

    比如一台Linux的机器,如果架了Samba Server 后,它能充当共享服务器,同时也能做为客户机来访

    问其它网络中的Windows共享文件系统,或其它Linux的Sabmba 服务器。

    在Windows网络中,看到共享文件功能可知道,直接就可以把共享文件夹当做本地硬盘来使用。在Linux

    中,就是通过Samba向网络中的机器提供共享文件系统,也可以把网络中其它机器的共享挂载在本地机

    上 使用;这在一 定意义上说和FTP是不一样的。

    SMB(Server Message Block)通信协议是微软和英特尔在1987年制定的协议,主要作为Microsift网络

    的通讯协议, 而Samba则是将SMB协议搬到UNIX上来应用,Samba的核心是SMB协议。SMB是在会

    话层和表示层以及下部分应用层的协议。最近微软又将SMB改名为:CIFS(Common Internet File

    System)。

2. 应用范围

    Samba 应用范围主要是Windows和Linux 系统共存的网络中使用;如果一个网络环境都是Linux或Unix

    类的系统,没有必要用Samba,应该用NFS;而Samba主要是共享文件和共享打印机和其他硬件设备的

    服 务。

3. 服务理解及命令操作

3.1Samba有两个服务:smb和nmb,各自的功能是:

     smb是Samba 的主要启动服务器,让其它机器能知道此机器共享了什么;如果不打开nmb服务器的话,

     只能通过IP来访问,比如在Windows的IE浏览器上打入下面的一条来访问;

     \\192.168.1.168\共享目录

     \\192.168.1.168\public

     nmb用于将Linux机器所共享的工作组及在此工作组下的netbios name解析出来。

3.2常见命令操作

    查看本机安装的samba库:rpm -qa | grep ^samba

    查询阮家安保中有关samba的软件包:yum search samba

    服务启动:

    [root@localhost ~]# /etc/init.d/smb start

    [root@localhost ~]# service smb start

    服务停止:    [root@localhost ~]# /etc/init.d/smb stop

    [root@localhost ~]# service smb stop

    服务重启:    [root@localhost ~]# /etc/init.d/smb restart

    [root@localhost ~]# service smb restart

    smb命令所在目录:

    [root@localhost ~]# /usr/sbin/smbd

     nmb命令个所在目录:
    [root@localhost ~]# /usr/sbin/nmbd
    系统重启时自动启动Samba服务: chkconfig --level 345 smb on
    启动命令行配置:ntsysv

    可视化配置smb和nmb服务(RHEL6):

    选择“系统”,“管理”,“服务”,将smb和nmb服务启动,同时将iptables服务关闭,该设置在服务重启后将

    被保留。

   
    查看服务器是否运行:
    [root@localhost ~]# pgrep smbd
    [root@localhost ~]# pgrep nmbd
    [root@localhost ~]# service smb status

    关掉Samba服务器,要root权限来执行;   [root@localhost ~]# pkill smbd

    [root@localhost ~]# pkill nmbd

3.3 查看Samba服务器的端口及防火墙
    因为防火墙可能会把smbd服务器的端口封掉,所以应该开放smbd服务器所占用的端口:
    [root@localhost ~]# netstat -tlnp | grep smb
    tcp     0      0 0.0.0.0:139       0.0.0.0:*        LISTEN      10639/smbd
    tcp     0      0 0.0.0.0:445       0.0.0.0:*        LISTEN      10639/smbd
    其中:smbd所占用的端口是139和445 ;

    如果您有防火墙,一定要把这两个端口打开。如果不知道怎么打开。是新手,还是把防火墙规则清掉:

    [root@localhost ~]# iptables -F

    [root@localhost ~]# /sbin/iptables -F

    [root@localhost ~]# service iptables stop

3.4查看Samba服务器的配置文件
    使用Linux发行版自带的Samba软件包,一般情况下Samba服务器的配置文件都位于/etc/samba目录
    中,服务器的主配置文件是smb.conf;也有有户配置文件 smbpasswd、smbusers和lmhosts等(
    最好查看一下这些文件的内容);还有一个文件是secrets.tdb,这个文件是 Samba 服务器启动手自动
    生成的。
    lmhosts文件用于维护NetBIOs名与主机的对应关系。
3.5 Samba在Linux中的一些工具(服务器端和客户端)
    smbcacls    smbcontrol  smbencrypt  smbmount    smbprint    smbstatus   smbtree
    smbclient  smbcquotas   smbmnt      smbpasswd   smbspool    smbtar      smbumount 
    smbd nmbd   mount
    其中服务器端的是:smbd、nmbd、smbpasswd;其它的大多是客户端。
3.6 Linux系统中查看网络中Windows共享文件及Linux中的Samba共享文件;
    [root@localhost ~]# smbclient  -L  //ip地址或计算机名

    smbclient 是Samba 的Linux 客户端,在Linux机器上用来查看服务器上的共享资源,也可以象FTP一

    样,用户可以登录Samba服务器,也可以上传put和下载get文件,但对中文支持并不友好;

    查看服务器上的资源:

    smbclient -L //IP  [-U 用户名]

    如果您的Samba服务器配置为user模式,就要加 “-U 用户名“,如果是share模式,省略也可;

    比如:

    [root@localhost ~]# smbclient -L   //192.168.1.168 -U FDC

    如果您是用share模式,就可以不必理会用户和密码,直接用;

    [root@localhost ~]# smbclient -L  //192.168.1.168

    Enter root's Password: 直接按回车即可

    登录用户身份Samba服务器共享
    以用户身份登录共享后,能象FTP用户一样,下传和下载文件;用put表示上传,用get表示下载;
    smbclient  //IP地址/共享文件夹    -U 用户

    说明:IP地址可以用/sbin/ifconfig 来查看; 共享文件夹是我们在smb.conf中定义的[共享文件夹],

    比如[sir01]。-U 用户名表示Samba 的用户;

    比如:

    [root@localhost ~]# smbclient //192.168.1.168/FDC -U FDC

    Password:

    Domain=[LINUXSIR] OS=[Unix] Server=[Samba 3.5.4-68.el6]

    smb: \> ls
    说明:登录到Samba服务器上,就可以用smbclient的一些指令,可以象用FTP指令一样上传和下载
    文件;

    smbclient 命令:

     命令                                    说明

?或help[command]提供关于帮助或某个命令的帮助

![shellcommand]执行所用的SHELL命令,或让用户进入SHELL提示符

     cd [目录]                             切换到服务器端的指定目录,如未指定,则 smbclient 返回当前本地

                                               目录

lcd[目录]切换到客户端指定的目录;

dir或ls列出当前目录下的文件;

exit或quit退出smbclient

     get file1  file2                    从服务器上下载file1,并以文件名file2存在本地机上;如果不想改名,可以把

                                               file2省略

mgetfile1file2file3filen从服务器上下载多个文件;

md或mkdir目录在服务器上创建目录

rd或rmdir目录删除服务器上的目录

putfile1[file2]向服务器上传一个文件file1,传到服务器上改名为file2;

     mput file1 file2 filen            向服务器上传多个文件

4. 挂在主机共享文件

    切换至root用户

    su - root

    mount //192.168.1.168/WinLinux /mnt/hgfs

    取消挂载:umount /mnt/hgfs

5. smb.con文件

    本文件中:"#"和";"均为注释,去除注释和范例的命令:grep -v "^#" smb.conf | grep -v "^;"

    Global Setting 部分:

    workgroup=MYGROUP:Windows主机的工作组名,Windows主机必须工作在同一个组中;

    server string = Samba Server Version %v:显示在Window上的信息

    log file,max log size均为日志配置。

    共享部分:  

    [Linux Share] #在Windows主机中看到的共享文件名,不一定与Linux中共享的文件名一样

    comment = This is Linux Share Directory #对此目录的说明

    path = /home/LinuxShare #Linux系统真实的共享目录,要写绝对路径

    public = yes #是否允许所有人看到此目录,no为看不到

    writable = yes #是否允许用户在此目录下科协,no为不可写,如果可写还需要该目录具有写权限

    read only = yes #设置用户是否只读

    create mode = 0700 #如果有可写权限,建立的文件默认的权限掩码

    directory mode = 0775 #如果有可写权限,建立的目录默认的权限掩码

6. 案例

6.1 在Windows系统中不用输入密码访问Linux共享目录

    (1) Linux下创建要共享的目录:mkdir /home/LinuxShare

    (2) 编辑配置文件:vi smb.conf

    将文件中得内容修改:security=user改成:security=share

    在文件末尾添加:

    [Linux Share]

    comment = This is Linux Share Directory

    path = /home/LinuxShare

    public = yes

    writable = yes

    保存,退出。

    测试配置参数是否正确命令:testparm

    (3) 重启服务:service smb restart

    (4) Windows下访问:运行中输入:\\192.168.1.168\LinusShare,若输入:\\192.168.1.168则打

    开Linux中所有共享目录。

6.2 在Windows系统中需要输入用户名才能访问Linux共享目录

    (1) 更改:security = user

    (2) 在smb.conf的securoty = user 下添加:smb passwd file = /etc/samba/smbpasswd

         在共享部分添加:valid users = %S

    (3) 新建smbpasswd文件:

    touch /etc/samba/smbpasswd

    smbpasswd -a FDC

    NEW SMB passwd

    Retype new SMB passwd:

    (4) 服务重启。

6.3 在Linux中访问Windows中共享的目录

    (1)查看服务器上的资源

    访问格式:smbclient -L //ip地址或计算机名  [-U 用户名]

    smbclient -L //192.168.1.106

    smbclient -L //192.168.1.106 -U Administrator

    (2)以用户身份登录

    smbclient //IP地址/共享文件夹 -U 用户

    smbclient //192.168.1.168/FDC -U FDC

    smbclient命令:

   ?或help,![Shell Command],cd,lcd,dir或ls,exit或quit,get file1 file2,mget file1 fiel2 file3 filen,

    md或mkdir,rd或rmdir,put file1 [file2],mput file1 file2 filen

6.4 Windows下访问Linux共享文件

    浏览器上输入:\\ip地址或计算机名或"开始","运行","\\192.168.1.168"

    这样就能看到这个机器上有什么共享的了,点鼠标操作完成;如果访问不了,不要忘记把Linux的防火墙

    规则清掉,或让相应的端口通过。

    其他方式:下载explore2fs软件:http://www.chrysocome.net/explore2fs,使用该软件访问。

6.5 Linux下smbfs文件系统的挂载(待验证)

    smbmount '\\Windows主机IP\共享目录名' 挂载点 -o username

    例如:smbmount '\\192.168.1.106\WinLinux' /mnt/hgfs -o username="Administrator"

    说明:

    如果服务器是以share共享的,则无需用户名和密码就能挂载,如果出现要密码的提示,直接回车就行;

    也可以用smbmount 来挂载,这样就无需用mount -t smbfs来指定文件系统的类型了;

    对于挂载点,需要自己建立一个文件夹,比如可以建在/opt/smbhd或mnt/hgfs;

    在mount的命令中,有这样的一个参数codepage=cp936,这是服务器端文件系统的编码的指定,

    cp936就是简体中文,当然可以用utf8等其他编码;

    如果挂载了远程的smbfs文件系统出现的是简体中文乱码,就要考虑挂载时要指定编码了。

7. 常见异常解决

7.1 session setup failed: NT_STATUS_LOGON_FAILURE

    Samba的用户应该与具Linux系统用户账号同名来访问系统资源,samba用户密码独立于系统,同名的系

    统账号不设密码,为安全起见,不能登录系统。

    原因:Samba所使用过的账户必须是系统中现存的用户。

    解决:smbpasswd -a FDC

     # -a添加指定的用户帐号

     # -d禁用指定的用户帐号
     # -e启用指定的用户帐号
     # -h显示smbpasswd的命令格式帮助
     # -x删除指定的用户帐号

7.2 Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.24]

     Server not using user level security and no password supplied.

     Server requested LANMAN password (share-level security) but 'client lanman auth' is disabled

     tree connect failed: NT_STATUS_ACCESS_DENIED

     解决:在/etc/samba/smb.conf的[global]字段里面加入:

       client lanman auth = yes
     这时既可以用smbclient连接,也可以用mount挂载,还可以通过gnome里面的“连接到服务器“来连接。
7.3 指定具体的用户访问
     [Linux Share]

     comment = This is Linux Share Directory

     path = /home/LinuxShare

     valid users = FDC

     public = yes

     writable = yes

7.4 用户权限设定无效

     设定具体的用户访问Linux下的共享文件,除了需要在smb.conf中配置writable=yes之外,还需该用户

     对共享资源有写权限,最简单的实现办法是赋予其他人对目录写权限:

     chmod o+w /LinuxShare

     最佳方法是将设置权限的用户加入到目录对应的组中,对组授权,进行统一管理。

7.5 Error returning browse list :NT_status_ok

      原因:用smbclinet //Windows主机IP/WinLinux -U Administrator,来访问xp上的共享文件,但是

      用

      smbclient -L  //Windows主机IP, 来查看xp上的共享资源时,却得到Error returning browse list  

      :NT_status_ok的提示。

      解决方法:

      修改WINDOWS注册表的值/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa

      /restrictanonymous 为0,重启WINDOWS的系统则可解决。

7.6 Tree connect failed: NT_STATUS_BAD_NETWORK_NAME

8. Samba官方文档

    http://samba.org/samba/docs/man/Samba-HOWTO-Collection/

9. Samba打印机共享

    在smb.conf文件中配置如下两行,即可自动的添加打印机列表:

    # -------------------- Printing Options -----------------------

loadprinters=yes

    cups options = raw    #表示自动加载共享打印机

    RHEL默认的打印系统是cups,打印机的配置文件是/etc/cups/printers.conf,性能配置文件是

    /etc/printcap.

    系统默认的打印机配置:

    [printers]

comment=AllPrinters

path=/var/spool/samba#存放发送给打印机的文件的缓冲目录

browseable=no#标示是否在Samba网络中显示在共享列表中,建议设为yes

guestok=no#设为yes标示不需要对用户进行身份认证即可访问

writable=no

       printable = yes #取值为yes标示此共享为打印共享,否则为磁盘共享

   示例:设置个人打印机的配置案例:

   [printers]        comment = FDC's Printer

        valid users = FDC

path=/var/FDC

browseable=no

guestok=no

writable=no

        printable = yes

        public = no # 不共享打印机

10. Samba共享权限管理:设置口令文件

      (1)首先将Linux中的系统用户口令文件(/etc/passwd)导入到samba口令文件中(/etc/samba

      /smbpasswd):

      cat  /etc/passwd | mksmbpasswd.sh > /etc/samba/smbpasswd

      (2)给smbpasswd等文件及文件夹设置访问权限

      chown root.root /etc/samba/smbpasswd

      chmod 600 /etc/samba/smbpasswd

      chomd 600 /etc/samba

      (3)若要手动添加一个用户,则首先要保证Linux中存在该用户存在

      useradd SambUser

      passwd SambPasswd

      smbpasswd -a SambUser

11. 匿名用户可读可写的实现

      (1)修改smb.conf文件

      # cd /etc/samba

      # mv smb.conf smb.confBAK  #备份文件

      touch smb.con #重新创建一份配置文件

      在新创建的配置文件中加入以下内容:

      [Global]

workgroup=Linux

netbiosname=Linux_FDC

serverstring=LinuxSambaServerTestServer

security=share

[LinuxShare]

path=/home/LinuxShare

writeable=yes

browseable=yes

      guest ok = yes

      (2)建立响应目录并授权

      mkdir -p /home/LinuxShare

      id nobody #查看nobody用户信息

      chown -R nobody:nobody /home/LinusShare

      (3)启动smb服务

      service smb restart

      (4)查看smb进程

      pgrep smbd

      (5)访问Samba服务器共享

      Linux下:smbclient -L //192.168.1.168

      Win下: \\192.168.1.168

相关推荐