Samba使用到的协议为CIFS:Common Internet File System。Samba可以在linux与linux或windows之间互相共享文件。CIFS在windows上监听的端口为137/udp,138/udp、139/udp、445/tcp,137和138是实现NetBISO的,它是一种基于主机名的通信机制。Samba支持三种服务,第一种nmdb服务,实现netbios协议,第二种smbd服务实现CIFS协议,第三种服务winbindd服务,让linux加入到windows的ad中去的,默认不启动。

安装samba:

yum -y install samba samba-client samba-common

samba-client 客户端工具。

samba-common 公共包。

samba-winbind windows的AD域控认证功能。


服务脚本:

        CentOS 7上的服务脚本:

                /usr/lib/systemd/system/nmb.service

                /usr/lib/systemd/system/smb.service

        CentOS 6上的服务脚本:

                /etc/rc.d/init.d/nmb

                /etc/rc.d/init.d/smb

配置文件目录:

/etc/samba/smb.conf # 主配置文件


samba用户:

        samba的用户都是系统用户都是/etc/passwd中的用户名,但是密码为samba服务器的自有密码文件,创建好系统用户后要将这个用户加入到samba密码文件中去。将系统用户转换为samba用户的命令为smbpasswd。

useradd -r samba
smbpasswd -a samba

                -a    添加

                -d    禁用

                -e    启用

                -x    删除

启动samba:

        启动服务:

                CentOS 6:service smb start; service nmb start;

                CentOS 7:systemctl start smb; systemctl start nmb;

        查看状态:netstat -tunl,查看几个端口是否启动了。


windows端访问samba共享目录:

        添加了账号启动好服务就可以在客户端访问samba共享目录了,在windows的文件夹浏览器的地址栏上输入地址\\192.168.96.130\ 回车后弹出对话框,让你输入用户名和密码,输入后即可进入共享目录中。在里面可以创建文件等等。再服务端可以在这个用户的家目录中查看到创建的文件。


linux端访问samba共享目录:

        1、探测共享目录:smbclient -L host -U username,然后会出现一个列表:

~]# smbclient -L 192.168.0.183 -U root
Enter SAMBA\root's password: 

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	share           Disk      
	IPC$            IPC       IPC Service (Samba 4.10.16)
	root            Disk      Home Directories
Reconnecting with SMB1 for workgroup listing.

	Server               Comment
	---------            -------

	Workgroup            Master
	---------            -------

                连接共享目录的方式就是将Sharename这一列的名称添加到地址后面,然后即可访问,方式如下:

smbclient //192.168.0.183/share -U username

        2、基于挂载的访问方式:

mount -t cifs //IP/directory /挂载点 -o username=username,password=password

配置文件:

        上面的这种访问方式只能访问用户的家目录,可以编辑配置文件来共享特定的目录,配置文件位置在/etc/samba/smb.conf文件,配置可分为全局的配置设定,和特定的共享设定。特定共享设定可以分为三类:私有家目录、打印机、自定义共享目录。

        1、配置项:

                netbios name = MYSERVER        netbios名称

                interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24        监听的网卡或地址,不指定监听所有

                hosts allow = 127. 192.168.12. 192.168.13.        白名单,基于IP地址的访问控制,空格分格

                log file = /var/log/samba/log.%m        日志文件,%m表示客户端地址,所以每个客户端都有单独的日志。

                max log size = 50        每个日志文件的大小单位M兆,超过这个大小就滚动

                security = user             表示每个访问samba的用户都要有一个用户名

                passdb backend = tdbsam        密码存放的库

        2、下面这一段配置为公共的家目录配置,表示是否可以访问家目录:

                [homes]

                comment = Home Directories        注释信息

                browseable = no        目录是否可让别人浏览

                writable = yes             是否可写,创建文件

                valid users = %S          %S表示自己,表示此目录只能让自己访问,默认机制,所以不用开启

                valid users = MYDOMAIN\%S

        3、共享打印机,方便使用samba服务器的共享打印机,目的就是windows可以共享linux上的打印机设备。

                [printers]

                browseable = No

                comment = All Printers

                create mask = 0600

                path = /var/tmp

                printable = Yes

        4、自定义共享的方式:

                [shared_name]                                      共享名称

                path = /path/to/shared_directory        共享目录

                common = common string

                guest ok = yes|no            是否允许来宾账号访问,同public = yes|no

                writable = yes|no             是否可写,同read only = yes|no

                write list = +group_name        组用户是否可写,例:write list = @groupname, username

        5、测试配置文件是否有效命令:testparm,可以查看到所有的配置项,重启两个服务后即可。


问题:

service iptables stop     #关闭防火墙
setenforce 0              # 关闭SElinux


没有写权限解决方法:

setfacl -m u:samba:rwx /shared/test/        # 这里的samba为用户名


将samba共享目录挂载到其他linux主机上:

mount -t cifs -o username=samba -l //192.168.96.128/tools /mnt/test/


遇到的错误:

        1、mount: block device //192.168.96.128/tools is write-protected, mounting read-only

        mount: cannot mount block device //192.168.96.128/tools read-only

        解决方法:yum -y install cifs*重新挂载即可

        2、session setup failed: NT_STATUS_LOGON_FAILURE,解决方法:没有将用户添加到samba用户。

        3、NT_STATUS_ACCESS_DENIED opening remote file \fstab,解决方法:此用户没有写权限,要使用setfacl赋予此用户权限。

        4、tree connect failed: NT_STATUS_BAD_NETWORK_NAME ,要共享的文件夹没有创建。


开机自动挂载:

在文件 /etc/fstab 中添加如下:

//192.168.96.128    /mnt    cifs    credentials=/etc/samba/cred.passwd    0 0

在这个文件中 /etc/samba/cred.passwd 保存这密码账号等凭证,内容如下:

username=samba
password=123

给这个文件设置不可访问:

chmod og=--- /etc/samba/cred.passwd


测试自动挂载是否可用:

umount /mnt/test        # 先卸载
ls /mnt/test
mount -a                # 再挂载
ls /mnt/test            # 查看是否挂载成功


samba图形化管理工具:

        yum install samba-swat,这个管理工具是基于web服务提供图形界面的,但是这个进程不会有很大的访问量,所以是使用超级守护进程xinetd代为管理的,安装好之后会在/etc/xinetd.d/下会生成一个文件swat,打开这个文件将disable选项改为no,将only_from选项改为主机的IP地址。

        service swat

        {

                port                 = 901

                socket_type     = stream

                wait                 = no

                only_from        = 192.168.96.0/24

                user                 = root

                server              = /usr/sbin/swat

                log_on_failure  += USERID

                disable            = no

        }

        然后启动xinetd服务,service xinetd start,使用ss -tnl,查看901端口是否可以访问。然后在浏览器输入地址192.168.96.128:901即可访问,然后输入用户名root和root的密码,这个用户可以在swat配置文件中设置其他用户,也可以在图形化界面修改密码。



快速配置:在配置文件的最后添加如下配置。

vim /etc/samba/smb.conf
[share]
path = /home/disk2
public = yes
writable = yes
valid users = root
#valid users = user1, user2, user3
#valid users = @group1, @group2
create mask = 0644
force create mode = 0644
directory mask = 0755
force directory mode = 0755
available = yes
browseable = yes
#guest ok = yes
#public = yes

开机启动:

systemctl enable smb --now

添加密码:

]# useradd root # samba的用户就是系统用户,但是密码是samba的自有密码,此处root只是演示
]# smbpasswd -a root
]# smbclient -L 192.168.0.6 -U root

在windows中挂载:

\\192.168.0.6\share # 上面的配置段写的[名称]就是登录时候的路径名称

在linux中挂载:不写password字段则回车在提示框中输入密码

mount -t cifs //192.168.0.100/share /mnt/samba -o username=smbuser,password=smbpass

隐藏用户名密码:

mount -t cifs //192.168.0.100/share /mnt/samba -o credentials=pass.txt
cat > pass.txt <<EOF
username=smbuser
password=smbpass
EOF;
chmod 600