转载说明
本文转载自:http://www.senra.me/build-your-own-cloud-storage-series-extra-samba/

上一次提到了NFS,挺好用的,我拿来给我的OVH官方小鸡挂KS的大硬盘存储,官方的存储贼贵,我放弃。因为是一个机房,所以效果还不错。那么问题来了,NFS适合于Linux系统之间共享存储,那么如果Windows掺和进来了,我们又该选择什么呢?当然是选择原谅它啊,好吧,不扯淡,我们需要的是Samba,很多人可能对这个不知道是啥,但是玩NAS之类的同学们肯定很熟悉。不过你不知道Samba你肯定知道网上邻居吧,当初在XP时代很多人在局域网内共享文件靠得就是这个了,而网上邻居使用的是SMB协议也称作CIFS协议,Samba服务是SMB的一个开源实现。

所以,正好符合我们Windows和Linux两手抓的需求。

一.安装配置

因为不需要自己编译,所以安装配置放一起说了就,另外,这部分就说Linux的,Windows下怎么共享我就不说了……挂载部分会提到Linux怎么挂载Windows的

yum install samba samba-client cifs-utils -y

samba是提供服务的,后面两个是作为客户端的,有yum的就是方便……走完进度就装好了,下面是配置

首先我建议是关闭selinux,防止出问题

setenforce 0
sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config

当然如果你不想关,那么也行,运行如下命令改下权限

#允许使用useradd/groupadd来控制samba的数据库
setsebool -P samba_domain_controller on
#允许samba共享用户目录
setsebool -P samba_enable_home_dirs on
#允许samba共享系统创建的目录(只读)
setsebool -P samba_export_all_ro on
#允许samba共享系统创建的目录(读写)
setsebool -P samba_export_all_rw o

selinux这玩意说是为了安全……不过一般人还是真的玩不懂,头疼

vi /etc/samba/smb.conf
#我们略过开头的一堆注释
#全局设定
[global]
#工作组名
workgroup = MYGROUP 
#这边应该是服务器名称或者信息啥的,感觉类似motd之类的
server string = Samba Server Version %v
#默认被注释掉的netbios别名,应该是用于局域网发现啥的
;netbios name = MYSERVER
#默认被注释监听的网卡还有ip段啥的?
;interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
#默认被注释,大概是允许连接的主机IP
;hosts allow = 127. 192.168.12. 192.168.13.
#日志保存位置(按照不同的连接客户端分割)
log file = /var/log/samba/log.%m
#单位为KB,是日志分割大小
max log size = 50
#安全等级,有share、user、server、domain、ads五种
security = user
passdb backend = tdbsam
#允许打印机共享
load printers = yes
#这个说不太清,反正就这么配吧
cups options = raw
#一堆打印机相关,默认注释掉了懒得管
;printcap name = /etc/printcap
;printcap name = lpstat
;printing = cups
#一堆文件系统相关的,默认注释掉了不用管
;map archive = no
;map hidden = no
;map read only = no
;map system = no
;store dos attributes = y
 
#默认的用户家目录共享,就是Linux各用户的Home目录
[homes]
comment = Home Directories
browseable = no
writable = yes
;valid users = %S
;valid users = MYDOMAIN\%S
 
#打印机共享设置
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
一些配置参数说明
workgroup:工作组名称
server string:服务器描述
security:安全级别,user为要求用户验证
comment:对此共享目录的说明文字
path:共享目录的实际位置
browseable:是否可见,no为隐藏
public:是否所有人可见
writable:是否可写,与read only相反
guest ok:是否允许guest用户访问
write list:拥有写权限的用户列表,可与read only一起用
这个需要举个栗子,write list = admin, root, @staff @表示一个group

需要了解更多的可以使用man 5 smb.conf来查看文档

基础了解了这个我们就能添加自定义共享了

在smb.conf 最后加上来创建一个test_share的共享文件夹

[test_share]
comment = This is test share
path = /data/smbdata
public =no
browsable= yes
writable = yes

如果不清楚smb.conf是否有改错的地方,可以使用如下命令校验

testparm -s /etc/samba/smb.conf

另外介绍一下上面的那个安全等级
1.share:所有人都可以访问这台samba服务器(不需要输入用户名和密码)
2.user:需要输入有效的用户名和密码才能访问samba服务器(身份验证由samba服务器负责)
3.server:与user相同,只是将身份验证交由指定的另一台samba服务器负责
4.domain:将身份验证交由域控制器负责
5.ads:将身份验证交由域控制器负责(比domain更为安全一点)

下面是我觉得Samba最二的地方……

Linux中/etc/passwd里的用户和Samba里的用户几乎没啥关系,硬说有的话,那就是:Samba的所有用户都必须是系统里已存在的用户。

我个人理解是因为有文件归属权的问题,所以Samba的用户必须是系统用户,但是,默认Samba是不吃系统的用户的,所以必须额外添加用户,这就是真的很蛋疼啊,有种脱裤子放屁的感觉

因为有着脱裤子放屁的设定,所以如果我们需要的用户默认不是系统用户的话

#先添加一个没有登录权限的系统用户,只用于Samba登录
useradd -s /sbin/nologin smbuser

这样才行,然后才能在Samba中添加用户,那么怎么添加呢?

请注意,更蛋疼的地方来了……

在/etc/samba/smb.conf中有一项参数passdb backend,就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam

①passdb backend = smbpasswd

(这边如果需要更改smbpasswd存储位置,可以passdb backend = smbpasswd:/etc/samba/smbpasswd  这样,记得需要完整路径)

该方式是使用smb自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件

smbpasswd命令的一些参数 
smbpasswd -a 增加用户(要增加的用户必须已经是系统用户)
smbpasswd -d 冻结用户,就是这个用户不能在登录了
smbpasswd -e 恢复用户,解冻用户,让冻结的用户可以在使用
smbpasswd -n 把用户的密码设置成空. 注意如果设置了"NO PASSWORD"之后,要允许使用者以空口令登入到Samba服务器,管理员必须在smb.conf配置档案的[global]段中设置以下的参数:null passwords = yes
smbpasswd -x 删除用户

我们可以使用cat /etc/passwd|mksmbpasswd.sh >> /etc/samba/smbpasswd 来直接将系统内所有用户导入添加为Samba用户,注意!需要另设密码

②passdb backend = tdbsam(这是默认的

该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb 用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户并由其pdbedit管 理。

用户的建立可以类似smbpasswd单独添加,也可以指定smbpasswd文件来直接用pdbedit将文件里的用户导入数据库。注意!这个操作是覆盖性的

pdbedit命令的参数很多,部分和smbpasswd类似
pdbedit -i smbpasswd:/etc/samba/smbpasswd
pdbedit -a username:新建Samba账户。
pdbedit -x username:删除Samba账户。
pdbedit -L:列出Samba用户列表,读取passdb.tdb数据库文件。
pdbedit -Lv:列出Samba用户列表的详细信息。
pdbedit -c “[D]” –u username:暂停该Samba用户的账号。
pdbedit -c “[]” –u username:恢复该Samba用户的账号。

③passdb backend = smbpasswd

该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server”。
一般人也用不到,主要是公司内可能有这种需求

修改完用户需要重启smb服务

二、挂载使用

真的是一番艰辛,终于配置完了,然后我们就能挂载了

①Windows挂载

Win下挂载有多种方法,通常的是映射为本地分区

然后还有使用net use命令啥的,不过有图形界面的当然最方便了,就懒得说了

②Linux挂载

#这个类似一个命令行

smbclient //1.2.3.4/共享文件夹名 -U 用户名

#这个就是实际挂载了

mount -t cifs //1.2.3.4/共享文件夹名 /path/to/mount -o username=XXX,password=XXX

如果需要开机挂载,可以将上面那个写入/etc/rc.local中,当然也可以使用下面的方法

在/etc/fstab中加入

//1.2.3.4/test_share   /mnt/test_share        cifs      defaults,uid=1000,gid=1000,credentials=/etc/samba/senrapass     0 0
/etc/samba/senrapass中内容如下
username=senra
password=test

这样就行了

PS.最后,是最需要注意的一点,由于前阵子Samba漏洞横行,导致许多运营商以及机房都对Samba相关端口进行了封堵,所以建议在局域网内使用,并注意更新软件包。