前面讲到过,nfs只能实现unix或类unix系统间的文件系统共享,而无法跨平台。而samba能够实现linux和windows之间的文件共享。
一、Samba介绍
Samba是在Linux和UNIX系统上实现SMB协议的一个软件,由服务器及客户端程序构成。另外,它又是基于NetBIOS协议工作的。
1、NetBIOS和SMB/CIFS的概念
NetBIOS(Network Basic Input/Output System,网络基本输入/输出系统协议)是一种在局域网上的程序可以使用的应用程序编程接口(API),作用是为了给局域网提供网络以及其他特殊功能。系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS Name(特指基于NetBIOS协议获得的计算机名称)解析为相应IP地址,实现信息通讯,所以在局域网内部使用NetBIOS协议可以方便地实现消息通信及资源的共享。NetBIOS 是一种会话层协议,因其占用系统资源少、传输效率高,所以几乎所有的局域网都是在NetBIOS协议的基础上工作的,它已被适配到各种其它协议上,如IPX/SPX和TCP/IP。
SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机等的通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务,是一种客户端/服务器型协议。
SMB最初被设计为运行在NetBIOS协议之上(而NetBIOS本身运行于TCP/IP或NetBEUI、IPX/SPX上),后来可直接运行于TCP/IP上。
CIFS(Common Internet File System)。
windows系统默认支持这两种协议,如果在linux上也提供支持,则linux和windows系统之间就能实现资源共享了。
二、samba安装配置
1、客户端
samba-client
smbclient -L HOST -U USERNAME
例如 smbclient -L 192.168.30.8 -U jack
⑵访问服务器端共享资源的方式:
交互式数据访问:smbclient //SERVER/shared_name -U USERNAME
基于挂载的方式访问:mount -t cifs //SERVER/shared_name /mount_point -o username=USERNAME[,password=PASSWORD]
例如 mount -t cifs //192.168.30.8/paper /mnt -o username=jack
[root@node1 ~]# rpm -qa | grep 'samba' samba-winbind-3.6.9-164.el6.x86_64 samba4-libs-4.0.0-58.el6.rc4.x86_64 samba-winbind-clients-3.6.9-164.el6.x86_64 samba-client-3.6.9-164.el6.x86_64 #客户端默认已安装 samba-common-3.6.9-164.el6.x86_64 #此软件提供是的服务器和客户端都会用到的资料,主配置文件 (smb.conf)、语法检查命令 (testparm)
示例:以linux主机作为客户端访问windows主机的共享资源
①在windows主机上设置共享
②linux作为客户端访问
[root@node1 ~]# smbclient -L 192.168.30.8 -U wittgentein
Enter wittgentein's password:
session request to 192.168.30.8 failed (Called name not present)
Domain=[MICROSOF-70941A] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]
Sharename Type Comment
--------- ---- -------
E$ Disk 默认共享
IPC$ IPC 远程 IPC
paper Disk
ADMIN$ Disk 远程管理
C$ Disk 默认共享
session request to 192.168.30.8 failed (Called name not present)
session request to 192 failed (Called name not present)
Domain=[MICROSOF-70941A] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]
Server Comment
--------- -------
Workgroup Master
--------- -------
[root@node1 ~]# mount -t cifs //192.168.30.8/paper /mnt -o username=wittgenstein
Password:
[root@node1 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
//192.168.30.8/paper on /mnt type cifs (rw) #显示已挂载
[root@node1 ~]# ls /mnt
samba.txt
[root@node1 ~]# cd /mnt
[root@node1 mnt]# cat samba.txt
hello
[root@node1 mnt]# echo "hi,long time no see" >> samba.txt
[root@node1 mnt]# touch fromcentos.txt
2、服务器:
yum -y install samba
⑴服务脚本:
/etc/rc.d/init.d/nmb(实现netbios协议)
nmbd监听137、138/UDP
/etc/rc.d/init.d/smb(实现cifs协议)
smbd监听139、445/TCP
⑵主配置文件:/etc/samba/smb.conf(由samba-common包提供)
■global段:
workgroup
server string = Samba Server Version %v #samba server的注释信息
netbios name
hosts allow
可以是:
ip,如 192.168.30.10
网段,如 192.168.30. 或192.168.30.0/255.255.255.0
domain,如 .magedu.com
log file
指定Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏变量%m(客户端的netbios name),表示对每台访问Samba Server的客户端都单独记录一个日志文件
security
设置用户访问Samba Server的验证方式,一共有四种:
share:使用者不需帐号和密码即可登陆samba server,安全性低
user:登录samba server需要提供帐号和密码,此为默认值
server
domain
passdb backend
samba用户后端,即samba用户和密码库的格式,有三种:
tdbsam:使用一个数据库文件存储,默认值。文件的默认路径为/var/lib/samba/private/passdb.tdb
smbpasswd
ldapsam
■共享资源的设定:
①私有家目录:
[homes]
comment = Home Directories
browseable = no #除了使用者可以看到自己的家目录以外,是否允许其它人浏览
writable = yes #是否可写
valid users = %S # %S表示替换[]中的内容,例如用户jack登录,[homes]就被替换为[jack],用户rose登录,就被替换为[rose],由些实现每个使用者都能看到自己的家目录
②打印机共享
自定义共享
[shared_name]
path = /path/to/share_directory
comment = Comment String
guest ok = {yes|no} #是否允许来宾账户访问
public = {yes|no} #是否公开,其参数作用同guest ok
writable = {yes|no}
read only = {yes|no}
write list = USER_NAME,+GROUP_NAME(也可写作@GROUP_NAME)
经过测试,修改samba的配置文件后要restart后才能生效
⑶用户认证:
帐号:都是本地用户,也即必须是/etc/passwd文件中存在的用户
密码:samba服务自有密码文件
添加本地用户为samba用户:
smbpasswd -a local_user
其它选项:
-d:禁用
-e:启用
-x:删除
testparm:测试配置文件是否有语法错误,以及显示最终生效的配置
权限取决于如下二者的交集:
共享配置中授予的权限
用户对目录或文件本身所具有的权限
三、samba服务配置示例
建立samba共享,共享目录为/data,要求:
以下node2为服务器端,node1和windows xp为客户端
[root@node2 ~]# yum -y install samba
...
[root@node2 ~]# rpm -ql samba
/etc/logrotate.d/samba
/etc/openldap/schema
/etc/openldap/schema/samba.schema
/etc/pam.d/samba
/etc/rc.d/init.d/nmb
/etc/rc.d/init.d/smb
/etc/samba/smbusers
/usr/bin/eventlogadm
/usr/bin/mksmbpasswd.sh
/usr/bin/smbstatus
/usr/lib64/samba/auth
...
[root@node2 ~]# groupadd develop
[root@node2 ~]# useradd -G develop gentoo
[root@node2 ~]# useradd -G develop centos
[root@node2 ~]# useradd ubuntu
[root@node2 ~]# passwd gentoo
Changing password for user gentoo.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
[root@node2 ~]# passwd centos
...
[root@node2 ~]# passwd ubuntu
...
[root@node2 ~]# smbpasswd -a gentoo #添加为samba用户
New SMB password:
Retype new SMB password:
[root@node2 ~]# smbpasswd -a centos
...
[root@node2 ~]# smbpasswd -a ubuntu
...
[root@node2 ~]# mkdir /data #创建一个用户共享的目录
[root@node2 ~]# ls -ld /data
drwxr-xr-x 2 root root 4096 Nov 24 21:11 /data
[root@node2 ~]# cp /etc/fstab /data
[root@node2 ~]# setfacl -m g:develop:rwx /data #对欲共享的目录给组develop和用户ubuntu开放rwx的权限
[root@node2 ~]# setfacl -m u:ubuntu:rwx /data
[root@node2 ~]# vim /etc/samba/smb.conf
...
workgroup = magedu #设置samba服务器加入的工作组
server string = Samba Server Version %v
; netbios name = MYSERVER
; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
hosts allow = 192.168.30. #仅允许指定网段内的客户端访问
...
[shared] #自定义共享
path = /data #共享出去的目录
public = yes
write list = +develop #仅对develop组开放写权限
[root@node2 ~]# testparm #检查配置文件语法是否有误
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[shared]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
[global]
workgroup = MAGEDU
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
max log size = 50
idmap config * : backend = tdb
hosts allow = 192.168.30.
cups options = raw
[homes]
comment = Home Directories
read only = No
browseable = No
[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
print ok = Yes
browseable = No
[shared]
path = /data
write list = +develop
guest ok = Yes
[root@node2 ~]# service nmb start;service smb start #要启动两个服务
Starting NMB services: [ OK ]
Starting SMB services: [ OK ]
[root@node2 ~]# netstat -tuanp | grep '[n|s]mb'
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 59776/smbd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 59776/smbd
tcp 0 0 :::139 :::* LISTEN 59776/smbd
tcp 0 0 :::445 :::* LISTEN 59776/smbd
udp 0 0 192.168.30.255:137 0.0.0.0:* 59763/nmbd
udp 0 0 192.168.30.20:137 0.0.0.0:* 59763/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 59763/nmbd
udp 0 0 192.168.30.255:138 0.0.0.0:* 59763/nmbd
udp 0 0 192.168.30.20:138 0.0.0.0:* 59763/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 59763/nmbd
[root@node1 ~]# smbclient -L 192.168.30.20 -U ubuntu #查看指定服务器上的共享信息
Enter ubuntu's password:
Domain=[MAGEDU] OS=[Unix] Server=[Samba 3.6.23-24.el6_7]
Sharename Type Comment
--------- ---- -------
shared Disk
IPC$ IPC IPC Service (Samba Server Version 3.6.23-24.el6_7)
ubuntu Disk Home Directories
Domain=[MAGEDU] OS=[Unix] Server=[Samba 3.6.23-24.el6_7]
Server Comment
--------- -------
NODE2 Samba Server Version 3.6.23-24.el6_7
Workgroup Master
--------- -------
MAGEDU NODE2
[root@node1 ~]# mount -t cifs //192.168.30.20/shared /mnt -o username=ubuntu #以指定的samba用户挂载
Password:
[root@node1 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
//192.168.30.20/shared on /mnt type cifs (rw)
[root@node1 ~]# ls /mnt
fstab
[root@node1 ~]# cd /mnt
[root@node1 mnt]# tail -3 fstab
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=MYDATA /mydata ext4 defaults 0 0
[root@node1 mnt]# touch test.txt
#虽然前面针对共享目录给用户ubuntu开放了写权限,但共享配置中限制其为只读,二者取交集,故ubuntu仍无法写入文件
touch: cannot touch `test.txt': Permission denied
[root@node1 mnt]# cd
[root@node1 ~]# mount -t cifs //192.168.30.20/shared /mnt -o username=gentoo #以gentoo用户身份挂载
Password:
[root@node1 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
//192.168.30.20/shared on /mnt type cifs (rw)
//192.168.30.20/shared on /mnt type cifs (rw)
[root@node1 ~]# ls /mnt
fstab
[root@node1 ~]# cd /mnt
[root@node1 mnt]# touch test.txt #gentoo用户属于组develop,拥有写权限
[root@node1 mnt]# ll test.txt #服务器上的gentoo用户的UID为503,它对应客户端上的davinci
-rw-r--r-- 1 davinci 504 0 Jan 5 21:10 test.txt
[root@node2 ~]# ls /data
fstab test.txt
[root@node2 ~]# ll /data/test.txt
-rw-r--r-- 1 gentoo gentoo 0 Jan 5 2016 /data/test.txt
[root@node2 ~]# id gentoo
uid=503(gentoo) gid=504(gentoo) groups=504(gentoo),503(develop)
以windows为客户端访问linux的共享资源:
四、samba-swat
samba-swat是一个基于web的samba管理工具,支持从任何具有 Web 浏览器的计算机进行 GUI 配置。swat本身就是一个服务器,独立于samba服务器。其服务进程又被设计为由超级守护进程xinetd管理,由xinetd代为监听在901/tcp。
安装:yum -y install samba-swat
服务脚本:/etc/xinetd.d/swat
配置启动:
①方式1:vim /etc/xinet.d/swat
disable = no
方式2:chkconfig swat on
②启动或重启xinetd,让xinetd代为监听起来
service xinetd restart
[root@node2 ~]# yum -y install samba-swat
...
Installed:
samba-swat.x86_64 0:3.6.23-24.el6_7
Dependency Installed:
xinetd.x86_64 2:2.3.14-39.el6_4
root@node2 ~]# rpm -ql samba-swat
/etc/xinetd.d/swat
/usr/lib64/samba/de.msg
/usr/lib64/samba/en.msg
...
/usr/sbin/swat
/usr/share/man/man8/swat.8.gz
...
[root@node2 ~]# ls /etc/xinetd.d
chargen-dgram chargen-stream daytime-dgram daytime-stream discard-dgram discard-stream echo-dgram echo-stream rsync swat tcpmux-server time-dgram time-stream
[root@node2 ~]# vim /etc/xinetd.d/swat
# default: off
# description: SWAT is the Samba Web Admin Tool. Use swat \
# to configure your Samba server. To use SWAT, \
# connect to port 901 with your favorite web browser.
service swat
{
port = 901 #监听在901号端口
socket_type = stream
wait = no
only_from = 192.168.30.0/24 #默认为127.0.0.1。
#swat对samba拥有绝对的控制权,为安全起见,默认仅允许通过127.0.0.1连接
user = root #默认以root用户登录
server = /usr/sbin/swat
log_on_failure += USERID
disable = no
[root@node2 ~]# service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[root@node2 ~]# ss -tunl | grep '901'
tcp LISTEN 0 64 :::901 :::*
如果远程访问swat,不加密意味着登录的用户名和密码会以明文的方式在网络上传输,这无疑很危险。为安全起见,应将SSL加密添加到swat配置。