12.1 SAMBA文件共享服务

上一章讲解的FTP文件传输服务确实可以让主机之间的文件传输变得简单方便,但是FTP协议的本质是传输文件,而非共享文件,因此要想通过客户端直接在服务器上修改文件内容还是一件比较麻烦的事情。

1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB是没有意义的字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的名字由此诞生(见图12-1)。Samba服务程序现在已经成为在Linux系统与Windows系统之间共享文件的最佳选择。

samba服务logo

图12-1 Samba服务程序的logo

Samba服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要先通过Yum软件仓库来安装Samba服务程序(Samba服务程序的名字也恰巧是软件包的名字):

  1. [root@linuxprobe ~ ]# yum install samba
  2. Loaded plugins: langpacks, product-id, subscription-manager
  3. ………………省略部分输出信息………………
  4. Installing:
  5. samba x86_64 4.1.1-31.el7 rhel 527 k
  6. Transaction Summary
  7. ================================================================================
  8. Install 1 Package
  9. Total download size: 527 k
  10. Installed size: 1.5 M
  11. Is this ok [y/d/N]: y
  12. Downloading packages:
  13. Running transaction check
  14. Running transaction test
  15. Transaction test succeeded
  16. Running transaction
  17. Installing : samba-4.1.1-31.el7.x86_64 1/1
  18. Verifying : samba-4.1.1-31.el7.x86_64 1/1
  19. Installed:
  20. samba.x86_64 0:4.1.1-31.el7
  21. Complete!

安装完毕后打开Samba服务程序的主配置文件,发现竟然有320行之多!有没有被吓到?但仔细一看就会发现,其实大多数都是以井号(#)开头的注释信息行。有刘遄老师在,肯定是不会让大家去“死啃”这些内容的。

  1. [root@linuxprobe ~]# cat /etc/samba/smb.conf
  2. # This is the main Samba configuration file. For detailed information about the
  3. # options listed here, refer to the smb.conf(5) manual page. Samba has a huge
  4. # number of configurable options, most of which are not shown in this example.
  5. #
  6. # The Official Samba 3.2.x HOWTO and Reference Guide contains step-by-step
  7. # guides for installing, configuring, and using Samba:
  8. # http://www.samba.org/samba/docs/Samba-HOWTO-Collection.pdf
  9. #
  10. # The Samba-3 by Example guide has working examples for smb.conf. This guide is
  11. # generated daily: http://www.samba.org/samba/docs/Samba-Guide.pdf
  12. #
  13. # In this file, lines starting with a semicolon (;) or a hash (#) are
  14. # comments and are ignored. This file uses hashes to denote commentary and
  15. # semicolons for parts of the file you may wish to configure.
  16. #
  17. # Note: Run the "testparm" command after modifying this file to check for basic
  18. # syntax errors.
  19. #
  20. ………………省略部分输出信息………………

由于在Samba服务程序的主配置文件中,注释信息行实在太多,不便于分析里面的重要参数,因此先把主配置文件改个名字,然后使用cat命令读入主配置文件,再在grep命令后面添加-v参数(反向选择),分别去掉所有以井号(#)和分号(;)开头的注释信息行,对于剩余的空白行可以使用^$参数来表示并进行反选过滤,最后把过滤后的可用参数信息通过重定向符覆盖写入到原始文件名称中。执行过滤后剩下的Samba服务程序的参数并不复杂,为了更方便读者查阅参数的功能,表12-1罗列了这些参数以及相应的注释说明。

表12-1 Samba服务程序中的参数以及作用

[global]#全局参数。
workgroup = MYGROUP#工作组名称
server string = Samba Server Version %v#服务器介绍信息,参数%v为显示SMB版本号
log file = /var/log/samba/log.%m#定义日志文件的存放位置与名称,参数%m为来访的主机名
max log size = 50#定义日志文件的最大容量为50KB
security = user#安全验证的方式,总共有4种
#share:来访主机无需验证口令;比较方便,但安全性很差
#user:需验证来访主机提供的口令后才可以访问;提升了安全性
#server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
#domain:使用域控制器进行身份验证
passdb backend = tdbsam#定义用户后台的类型,共有3种
#smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码
#tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户
#ldapsam:基于LDAP服务进行账户验证
load printers = yes#设置在Samba服务启动时是否共享打印机设备
cups options = raw#打印机的选项
[homes]#共享参数
comment = Home Directories#描述信息
browseable = no#指定共享信息是否在“网上邻居”中可见
writable = yes#定义是否可以执行写入操作,与“read only”相反
[printers]#打印机共享参数
comment = All Printers
path = /var/spool/samba#共享文件的实际路径(重要)。
browseable = no
guest ok = no#是否所有人可见,等同于"public"参数。
writable = no
printable = yes
  1. [root@linuxprobe ~]# mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
  2. [root@linuxprobe ~]# cat /etc/samba/smb.conf.bak | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf
  3. [root@linuxprobe ~]# cat /etc/samba/smb.conf

12.1.1 配置共享资源

Samba服务程序的主配置文件与前面学习过的Apache服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。创建共享资源的方法很简单,只要将表12-2中的参数写入到Samba服务程序的主配置文件中,然后重启该服务即可。

表12-2 用于设置Samba服务程序的参数以及作用

参数作用
[database]共享名称为database
comment = Do not arbitrarily modify the database file警告用户不要随意修改数据库
path = /home/database共享目录为/home/database
public = no关闭“所有人可见”
writable = yes允许写入操作

第1步:创建用于访问共享资源的账户信息。在RHEL 7系统中,Samba服务程序默认使用的是用户口令认证模式(user)。这种认证模式可以确保仅让有密码且受信任的用户访问共享资源,而且验证过程也十分简单。不过,只有建立账户信息数据库之后,才能使用用户口令认证模式。另外,Samba服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪,由此引发错误。

pdbedit命令用于管理SMB服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。在第一次把账户信息写入到数据库时需要使用-a参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。pdbedit命令中使用的参数以及作用如表12-3所示。

表12-3 用于pdbedit命令的参数以及作用

参数作用
-a 用户名建立Samba用户
-x 用户名删除Samba用户
-L列出用户列表
-Lv列出用户详细信息的列表
  1. [root@linuxprobe ~]# id linuxprobe
  2. uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe)
  3. [root@linuxprobe ~]# pdbedit -a -u linuxprobe
  4. new password:此处输入该账户在Samba服务数据库中的密码
  5. retype new password:再次输入密码进行确认
  6. Unix username: linuxprobe
  7. NT username:
  8. Account Flags: [U ]
  9. User SID: S-1-5-21-507407404-3243012849-3065158664-1000
  10. Primary Group SID: S-1-5-21-507407404-3243012849-3065158664-513
  11. Full Name: linuxprobe
  12. Home Directory: \\localhost\linuxprobe
  13. HomeDir Drive:
  14. Logon Script:
  15. Profile Path: \\localhost\linuxprobe\profile
  16. Domain: LOCALHOST
  17. Account desc:
  18. Workstations:
  19. Munged dial:
  20. Logon time: 0
  21. Logoff time: Wed, 06 Feb 2036 10:06:39 EST
  22. Kickoff time: Wed, 06 Feb 2036 10:06:39 EST
  23. Password last set: Mon, 13 Mar 2017 04:22:25 EDT
  24. Password can change: Mon, 13 Mar 2017 04:22:25 EDT
  25. Password must change: never
  26. Last bad password : 0
  27. Bad password count : 0
  28. Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

第2步:创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题,而且由于/home目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的SELinux安全上下文所带来的限制。在前面对Samba服务程序配置文件中的注释信息进行过滤时,这些过滤的信息中就有关于SELinux安全上下文策略的说明,我们只需按照过滤信息中有关SELinux安全上下文策略中的说明中给的值进行修改即可。修改完毕后执行restorecon命令,让应用于目录的新SELinux安全上下文立即生效。

  1. [root@linuxprobe ~]# mkdir /home/database
  2. [root@linuxprobe ~]# chown -Rf linuxprobe:linuxprobe /home/database
  3. [root@linuxprobe ~]# semanage fcontext -a -t samba_share_t /home/database
  4. [root@linuxprobe ~]# restorecon -Rv /home/database
  5. restorecon reset /home/database context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:samba_share_t:s0

第3步:设置SELinux服务与策略,使其允许通过Samba服务程序访问普通用户家目录。执行getsebool命令,筛选出所有与Samba服务程序相关的SELinux域策略,根据策略的名称(和经验)选择出正确的策略条目进行开启即可:

  1. [root@linuxprobe ~]# getsebool -a | grep samba
  2. samba_create_home_dirs --> off
  3. samba_domain_controller --> off
  4. samba_enable_home_dirs --> off
  5. samba_export_all_ro --> off
  6. samba_export_all_rw --> off
  7. samba_portmapper --> off
  8. samba_run_unconfined --> off
  9. samba_share_fusefs --> off
  10. samba_share_nfs --> off
  11. sanlock_use_samba --> off
  12. use_samba_home_dirs --> off
  13. virt_sandbox_use_samba --> off
  14. virt_use_samba --> off
  15. [root@linuxprobe ~]# setsebool -P samba_enable_home_dirs on

第4步:在Samba服务程序的主配置文件中,根据表12-2所提到的格式写入共享信息。在原始的配置文件中,[homes]参数为来访用户的家目录共享信息,[printers]参数为共享的打印机设备。这两项如果在今后的工作中不需要,可以像刘遄老师一样手动删除,这没有任何问题。

  1. [root@linuxprobe ~]# vim /etc/samba/smb.conf
  2. [global]
  3. workgroup = MYGROUP
  4. server string = Samba Server Version %v
  5. log file = /var/log/samba/log.%m
  6. max log size = 50
  7. security = user
  8. passdb backend = tdbsam
  9. load printers = yes
  10. cups options = raw
  11. [database]
  12. comment = Do not arbitrarily modify the database file
  13. path = /home/database
  14. public = no
  15. writable = yes

第5步:Samba服务程序的配置工作基本完毕。接下来重启smb服务(Samba服务程序在Linux系统中的名字为smb)并清空iptables防火墙,然后就可以检验配置效果了。

  1. [root@linuxprobe ~]# systemctl restart smb
  2. [root@linuxprobe ~]# systemctl enable smb
  3. ln -s '/usr/lib/systemd/system/smb.service' '/etc/systemd/system/multi-user.target.wants/smb.service'
  4. [root@linuxprobe ~]# iptables -F
  5. [root@linuxprobe ~]# service iptables save
  6. iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

12.1.2 Windows挂载共享

无论Samba共享服务是部署Windows系统上还是部署在Linux系统上,通过Windows系统进行访问时,其步骤和方法都是一样的。下面假设Samba共享服务部署在Linux系统上,并通过Windows系统来访问Samba服务。Samba共享服务器和Windows客户端的IP地址可以根据表12-4来设置。

表12-4 Samba服务器和Windows客户端使用的操作系统以及IP地址

主机名称操作系统IP地址
Samba共享服务器RHEL 7192.168.10.10
Linux客户端RHEL 7192.168.10.20
Windows客户端Windows 7192.168.10.30

要在Windows系统中访问共享资源,只需在Windows的“运行”命令框中输入两个反斜杠,然后再加服务器的IP地址即可,如图12-2所示。

Windows运行框输入远程主机信息

图12-2 在Windows系统中访问共享资源

如果已经清空了Linux系统上iptables防火墙的默认策略(即执行iptables -F命令),现在就应该能看到Samba共享服务的登录界面了。刘遄老师在这里先使用linuxprobe账户的系统本地密码尝试登录,结果出现了如图12-3所示的报错信息。由此可以验证,在RHEL 7系统中,Samba服务程序使用的果然是独立的账户信息数据库。所以,即便在Linux系统中有一个linuxprobe账户,Samba服务程序使用的账户信息数据库中也有一个同名的linuxprobe账户,大家也一定要弄清楚它们各自所对应的密码。

12.1 SAMBA文件共享服务 - 图3

图12-3 访问Samba共享服务时,提示出错

正确输入linuxprobe账户名以及使用pdbedit命令设置的密码后,就可以登录到共享界面中了,如图12-4所示。此时,我们可以尝试执行查看、写入、更名、删除文件等操作。

使用SMB服务并创建文件

图12-4 成功访问Samba共享服务

由于Windows系统的缓存原因,有可能您在第二次登录时提供了正确的账户和密码,依然会报错,这时只需要重新启动一下Windows客户端就没问题了(如果Windows系统依然报错,请检查上述步骤是否有做错的地方)。

12.1.3 Linux挂载共享

上面的实验操作可能会让各位读者误以为Samba服务程序只是为了解决Linux系统和Windows系统的资源共享问题而设计的。其实,Samba服务程序还可以实现Linux系统之间的文件共享。请各位读者按照表12-5来设置Samba服务程序所在主机(即Samba共享服务器)和Linux客户端使用的IP地址,然后在客户端安装支持文件共享服务的软件包(cifs-utils)。

表12-5 Samba共享服务器和Linux客户端各自使用的操作系统以及IP地址

主机名称操作系统IP地址
Samba共享服务器RHEL 7192.168.10.10
Linux客户端RHEL 7192.168.10.20
Windows客户端Windows 7192.168.10.30
  1. [root@linuxprobe ~]# yum install cifs-utils
  2. Loaded plugins: langpacks, product-id, subscription-manager
  3. rhel | 4.1 kB 00:00
  4. Resolving Dependencies
  5. --> Running transaction check
  6. ---> Package cifs-utils.x86_64 0:6.2-6.el7 will be installed
  7. --> Finished Dependency Resolution
  8. Dependencies Resolved
  9. ================================================================================
  10. Package Arch Version Repository Size
  11. ================================================================================
  12. Installing:
  13. cifs-utils x86_64 6.2-6.el7 rhel 83 k
  14. Transaction Summary
  15. ================================================================================
  16. Install 1 Package
  17. Total download size: 83 k
  18. Installed size: 174 k
  19. Is this ok [y/d/N]: y
  20. Downloading packages:
  21. Running transaction check
  22. Running transaction test
  23. Transaction test succeeded
  24. Running transaction
  25. Installing : cifs-utils-6.2-6.el7.x86_64 1/1
  26. Verifying : cifs-utils-6.2-6.el7.x86_64 1/1
  27. Installed:
  28. cifs-utils.x86_64 0:6.2-6.el7
  29. Complete!

在Linux客户端,按照Samba服务的用户名、密码、共享域的顺序将相关信息写入到一个认证文件中。为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅root管理员才能够读写:

  1. [root@linuxprobe ~]# vim auth.smb
  2. username=linuxprobe
  3. password=redhat
  4. domain=MYGROUP
  5. [root@linuxprobe ~]# chmod -Rf 600 auth.smb

现在,在Linux客户端上创建一个用于挂载Samba服务共享资源的目录,并把挂载信息写入到/etc/fstab文件中,以确保共享挂载信息在服务器重启后依然生效:

  1. [root@linuxprobe ~]# mkdir /database
  2. [root@linuxprobe ~]# vim /etc/fstab
  3. #
  4. # /etc/fstab
  5. # Created by anaconda on Wed May 4 19:26:23 2017
  6. #
  7. # Accessible filesystems, by reference, are maintained under '/dev/disk'
  8. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
  9. #
  10. /dev/mapper/rhel-root / xfs defaults 1 1
  11. UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
  12. /dev/mapper/rhel-swap swap swap defaults 0 0
  13. /dev/cdrom /media/cdrom iso9660 defaults 0 0
  14. //192.168.10.10/database /database cifs credentials=/root/auth.smb 0 0
  15. [root@linuxprobe ~]# mount -a

Linux客户端成功地挂载了Samba服务的共享资源。进入到挂载目录/database后就可以看到Windows系统访问Samba服务程序时留下来的文件了(即文件Memo.txt)。当然,我们也可以对该文件进行读写操作并保存。

  1. [root@linuxprobe ~]# cat /database/Memo.txt
  2. i can edit it .

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。