00:00/00:00

章节简述: 

本章节为读者讲述文件共享系统的作用,了解Samba与NFS服务程序的开发背景以及用法。

详细逐条讲解Samba服务配置参数,演示安全共享文件的配置的方法,并使用autofs服务程序自动挂载设备,

学会后即可实现Linux系统之间或与Windows系统之间的文件共享,以及在共享文件时如何配置防火墙与SELinux策略规则。

 

12.1 了解文件共享服务

早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据,这样确实不太方便,于是便出现了NFS开源文件共享程序:NFS(NetworkFile System)是一个能够将多台Linux的远程主机数据挂载到本地目录的服务,属于轻量级的文件共享服务,不支持Linux与 Windows系统间的文件共享。

samba服务logo

随后在1991年时大学生Tridgwell为了解决Linux与Windows系统之间共享文件的问题,便开发出了SMB协议与Samba服务程序。

SMB(Server Messages Block)协议:实现局域网内文件或打印机等资源共享服务的协议。

当时Tridgwell想要注册SMBServer这个商标,但却被因为SMB是没有意义的字符被拒绝了,经过Tridgwell不断翻看词典,终于找到了一个拉丁舞蹈的名字——SAMBA,而这个热情舞蹈的名字中又恰好包含了SMB(SAMBA),于是这便是Samba程序名字的由来。

Samba服务程序是一款基于SMB协议并由服务端和客户端组成的开源文件共享软件,实现了Linux与Windows系统间的文件共享。

Samba舞蹈

12.2 Samba服务
12.2.1 安装服务程序

通过安装Samba服务程序后细致的分析其配置文件参数,更能够帮助读者们理解Samba服务的安全验证方式。

安装Samba服务软件包:

[root@linuxprobe Desktop]# yum install samba
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分安装过程………………
Installing:
 samba           x86_64           4.1.1-31.el7            rhel7           527 k
………………省略部分安装过程………………
Complete!
浏览Samba配置文件:
[root@linuxprobe ~]# cat/etc/samba/smb.conf
配置文件竟然有320行!有没有被吓到?其实Samba服务配置文件中大部分是注释信息,我们可以来筛选过滤下:

备份原始的配置文件:

[root@linuxprobe ~]# mv /etc/samba/smb.conf /etc/samba/smb.conf.bak

过滤掉无用的内容:
先使用cat命令读入Smb配置文件后通过grep命令-v参数(反向选择)去掉所有注释信息,然后分别删选掉包含#号的行("#"),包含;号的行(";")以及所有的空白行("^$"),最后最后将过滤后的信息覆盖写入到/etc/samba/smb.conf文件中。

cat /etc/samba/smb.conf.bak | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf
让我们来看看过滤后的配置文件吧:
[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:需由SMB服务验证来访主机提供的口令后才可建立访问,更加的安全。
#server:使用独立的远程主机验证来访主机提供的口令(集中管理帐号)。
#domain:使用PDC来完成验证
passdb backend = tdbsam #定义用户后台的类型,共有3种。
#smbpasswd:使用SMB服务的smbpasswd命令给系统用户设置SMB密码。
#tdbsam:创建数据库文件并使用pdbedit建立SMB独立的用户。
#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

标准的Samba共享参数是这样的:
参数 作用
[linuxprobe] 共享名称为linuxprobe
comment = Do not arbitrarily modify the database file 警告用户不要随意修改数据库
path = /home/database 共享文件夹在/home/database
public = no 关闭所有人可见
writable = yes 允许写入操作

我们将上面的配置参数直接追加到SMB服务配置文件(/etc/samba/smb.conf)并重启SMB服务程序即可生效。
但此时SMB服务默认的验证模式为user,我们需要先创建用户数据库后才可以正常使用,现在来学习下如何创建吧~
12.2.2 安全共享文件

使用Samba服务口令验证方式可以让共享文件更加的安全,做到仅让信任的用户访问,而且验证过程也很简单,要想使用口令验证模式,我们需要先创建Samba服务独立的数据库。

第1步:检查当前是否为user验证模式。

[root@linuxprobe ~]# cat /etc/samba/smb.conf
修改SMB服务为帐户验证模式

 

第2步:创建共享文件夹:

[root@linuxprobe ~]# mkdir /database

第3步:描述共享文件夹信息。

SMB服务主配置文件最下面追加共享文件夹的配置参数:

[database]
comment = Do not arbitrarily modify the database file
path = /database
public = no
writable = yes

保存smb.conf文件后重启启动SMB服务:

[root@linuxprobe ~]# systemctl restart smb

添加到开机启动项:

[root@linuxprobe ~]# systemctl enable smb
ln -s '/usr/lib/systemd/system/smb.service' '/etc/systemd/system/multi-user.target.wants/smb.service'

第4步:使用Windows主机尝试访问

读者按照下表的IP地址规划动手配置下Windows的网卡参数,应该都会吧~

主机名称 操作系统 IP地址
Samba共享服务器 红帽RHEL7操作系统 192.168.10.10
客户端 红帽RHEL7操作系统 192.168.10.20
客户端 微软Windows7操作系统 192.168.10.30

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

在Windows主机的运行框中输入远程主机的信息
访问Samba服务报错

此时访问Samba服务报错

此时访问Samba服务是报错的,如果读者已经看完Apache(httpd)服务程序的章节,应该还记得防火墙和SELinux规则吧。

第5步:清空防火墙规则链:

Windows访问Samba主机提示报错,我们怀疑是Iptables阻止了访问操作,于是执行:

[root@linuxprobe ~]# Iptables -F
[root@linuxprobe ~]# service iptables save

因为Windows系统的缓存关系,可能需要先重启Windows主机再尝试访问Samba共享。

Windows提示验证密码

Windows系统被要求验证帐户口令

那么这个问题就是出在Iptables防火墙的默认规则中了,所以请对SELinux多一点耐心,不要直接关闭SELinux。

第6步:创建SMB服务独立的帐号。

现在Windows系统要求先验证后才能访问共享,而SMB服务配置文件中密码数据库后台类型为"tdbsam",所以这个帐户和口令是Samba服务的独立帐号信息,我们需要使用pdbedit命令来创建SMB服务的用户数据库。

pdbedit命令用于管理SMB服务的帐户信息数据库,格式为:“pdbedit [选项] 帐户”。

参数 作用
-a 用户名 建立Samba用户
-x 用户名 删除Samba用户
-L 列出用户列表
-Lv 列出用户详细信息的列表

创建系统用户:

[root@linuxprobe ~]# useradd smbuser

将此系统用户提升为SMB用户:

[root@linuxprobe ~]# pdbedit -a -u smbuser
new password:设置SMB服务独立的密码
retype new password:
Unix username: smbuser
NT username:
Account Flags: [U ]
User SID: S-1-5-21-4146456071-3435711857-2069708454-1000
Primary Group SID: S-1-5-21-4146456071-3435711857-2069708454-513
Full Name:
Home Directory: \\linuxprobe\smbuser
HomeDir Drive:
Logon Script:
Profile Path: \\linuxprobe\smbuser\profile
Domain: LINUXPROBE
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Wed, 06 Feb 2036 23:06:39 CST
Kickoff time: Wed, 06 Feb 2036 23:06:39 CST
Password last set: Sat, 11 Jul 2015 18:27:04 CST
Password can change: Sat, 11 Jul 2015 18:27:04 CST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
第7步:使用Windows主机验证共享结果:
请您按照下面的幻灯片逐步操作,可点击图片两侧箭头或下方小圆点“○”切换步骤。

  • Windows验证SMB服务口令

第8步:允许SELinux规则

使用Windows主机访问Samba共享果然可以使用smbuser用户登入,但对于共享文件这么重要的事情,SELinux一定会强制管理,刚刚没有妥当的配置好SELinux,现在果然又报错了。

将共享目录的所有者和所有组设置为smbuser用户:

[root@linuxprobe ~]# chown -Rf smbuser:smbuser /database

允许SELinux对于SMB用户共享家目录的布尔值:

[root@linuxprobe ~]# setsebool -P samba_enable_home_dirs on

将共享目录的SELinux安全上下文设置妥当:

[root@linuxprobe ~]# semanage fcontext -a -t samba_share_t /database

使新的安全上下文立即生效:

[root@linuxprobe ~]# restorecon -Rv /database/
第9步:使用Windows主机验证共享结果
我们配置好Samba服务后又陆续的调整好了Iptables防火墙与SELinux安全规则,现在终于可以正常的使用共享了。
使用SMB服务并创建文件
使用SMB服务并创建文件
第10步:使用Linux主机验证共享结果
刚刚好像让读者产生了一些小误解,Samba服务程序并不仅仅是能够实现Linux与Windows系统间的文件共享,还可以实现Linux系统之间的文件共享哦,先动手配置下客户端主机的IP地址吧:
主机名称 操作系统 IP地址
Samba共享服务器 红帽RHEL7操作系统 192.168.10.10
客户端 红帽RHEL7操作系统 192.168.10.20
客户端 微软Windows7操作系统 192.168.10.30

在客户端安装cifs-utils软件包:

[root@linuxprobe ~]# yum install -y cifs-utils
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分安装过程………………
Installing:
 cifs-utils          x86_64          6.2-6.el7             rhel7           83 k
………………省略部分安装过程………………
Complete!

创建挂载目录:

[root@linuxprobe ~]# mkdir /database

在root家目录创建认证文件(依次为SMB用户名、SMB用户密码、SMB共享域):

[root@linuxprobe ~]# vim auth.smb
username=smbuser
password=redhat
domain=MYGROUP

此文件太重要了,权限应该给小一些:

[root@linuxprobe ~]# chmod -Rf 600 auth.smb

配置其挂载信息(内容依次为远程共享信息、本地挂载目录、文件系统类型、认证文件以及开机自检选项):

[root@linuxprobe ~]# vim /etc/fstab
//192.168.10.10/database /database cifs credentials=/root/auth.smb 0 0

使用mount命令的-a参数挂载所有在fstab文件中定义的文件信息:

[root@linuxprobe ~]# mount -a

成功挂载Samba的共享目录(能够看到共享文件了):

[root@linuxprobe ~]# cat /database/Memo.txt
i can edit it .
Samba服务真的是太强大了,不仅能够实现Linux系统之间分享数据还能与Windows主机进行文件共享。

出现问题?大胆提问!

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

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

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

12.3 NFS网络文件系统

NFS(Network Files System)即网络文件系统,NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,NFS客户端可以像使用本地资源一样读写远端NFS服务端的资料,需要注意NFS服务依赖于RPC服务与外部通信,所以必需保证RPC服务能够正常注册服务的端口信息才能正常使用NFS服务。

有个学员问过NFS是不是need for speed的缩写啊?哈哈,NFS配置和使用都是非常快捷,所以这么说也是有道理的。

红帽RHEL7系统已经默认安装NFS服务:

[root@linuxprobe ~]# yum install nfs-utils
Loaded plugins: langpacks, product-id, subscription-manager
(1/2): rhel7/group_gz | 134 kB 00:00
(2/2): rhel7/primary_db | 3.4 MB 00:00
Package 1:nfs-utils-1.3.0-0.el7.x86_64 already installed and latest version
Nothing to do

本次的实验需要两台Linux主机,网络配置情况:

主机名称 操作系统 IP地址
NFS服务端 红帽RHEL7操作系统 192.168.10.10
NFS客户端 红帽RHEL7操作系统 192.168.10.20


第1步:创建NFS服务端的共享目录。
清空iptables默认的规则链:

[root@linuxprobe ~]# iptables -F

保存清空后的iptables规则:

[root@linuxprobe ~]# service iptables save

创建nfsfile共享目录:

[root@linuxprobe ~]# mkdir /nfsfile

为共享目录设置权限(让其他人可以有写入权限):

[root@linuxprobe ~]# chmod -Rf 777 /nfsfile

写入一个文件,用于NFS客户端读取:

[root@linuxprobe ~]# echo "welcome to linuxprobe.com" > /nfsfile/readme

NFS服务端配置文件是"/etc/exports",用于定义要共享的目录以及相应权限。

[root@linuxprobe ~]# vim /etc/exports
//格式为:共享目录的绝对路径 允许访问NFS资源的客户端(权限参数)
/nfsfile 192.168.10.*(rw,sync,root_squash)

NFS配置共享的参数有:

参数 作用
ro 只读默认
rw 读写模式
root_squash 当NFS客户端使用root用户访问时,映射为NFS服务端的匿名用户。
no_root_squash 当NFS客户端使用root用户访问时,映射为NFS服务端的root用户。
all_squash 不论NFS客户端使用任何帐户,均映射为NFS服务端的匿名用户。
sync 同时将数据写入到内存与硬盘中,保证不丢失数据。
async 优先将数据保存到内存,然后再写入硬盘,效率更高,但可能造成数据丢失。


看完后来分析下/etc/exports文件中参数作用吧“/nfsfile 192.168.10.* (rw,sync,no_root_squash)(答案模式)

答案:将/nfsfile目录共享给192.168.10.0/24网段,运行NFS客户端读写数据、同步数据并映射为NFS服务器的root用户。

第2步:启动NFS服务端

刚刚讲到NFS服务是依赖于RPC服务的,但在红帽RHEL7系统中RPC服务已经默认运行(active)了,所以无需再配置RPC服务啦。

[root@linuxprobe ~]# systemctl status rpcbind

启动nfs-server程序:

[root@linuxprobe ~]# systemctl start nfs-server

设置NFS服务端为开机启动:

[root@linuxprobe ~]# systemctl enable nfs-server

第3步:配置NFS客户端
如果NFS客户端也是红帽RHEL7系统,那么软件包nfs-utils一定也是已经默认安装,直接挂载共享就可以了。
showmount命令用于查询NFS服务端共享信息,格式为:“showmount [参数] [远程主机]”。

参数 作用
-e 显示NFS服务端的共享列表
-a 显示本机挂载NFS资源的情况
-v 显示版本号


查询远程NFS服务端中可用的共享资源:

[root@linuxprobe ~]# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/nfsfile (everyone)

创建本地挂载目录:

[root@linuxprobe ~]# mkdir /nfsfile
[root@linuxprobe ~]# mount -t nfs 192.168.10.10:/nfsfile /nfsfile

顺利查看到刚刚写入文件内容:

[root@linuxprobe ~]# cat /nfsfile/readme
welcome to linuxprobe.com

如果希望开机后自动将NFS资源挂载到本地,那么就可以通过修改fstab文件来实现:

[root@linuxprobe ~]# vim /etc/fstab
192.168.10.10:/nfsfile /nfsfile nfs defaults 0 0
12.4 AutoFs自动挂载服务

AutoFs服务与Mount/Umount命令不同之处在于它是一种守护进程,只有检测到用户试图访问一个尚未挂载的文件系统时才自动的检测并挂载该文件系统,换句话说,将挂载信息填入/etc/fstab文件后系统将在每次开机时都自动将其挂载,而运行AutoFs后则是当用户需要使用该文件系统了才会动态的挂载,节约网络与系统资源。

模拟训练:每次进入/media/iso目录时都会自动挂载镜像。

主机名称 操作系统 IP地址
NFS服务端 红帽RHEL7操作系统 192.168.10.10
NFS客户端 红帽RHEL7操作系统 192.168.10.20


安装autofs服务:

[root@linuxprobe ~]# yum install autofs
………………省略部分安装过程………………
Installing:
autofs x86_64 1:5.0.7-40.el7 rhel 550 k
Installing for dependencies:
hesiod x86_64 3.2.1-3.el7 rhel 30 k
………………省略部分安装过程………………
Complete!

启动autofs服务并加入到开机启动项中:

[root@linuxprobe ~]# systemctl start autofs
[root@linuxprobe ~]# systemctl enable autofs
ln -s '/usr/lib/systemd/system/autofs.service' '/etc/systemd/system/multi-user.target.wants/autofs.service'

修改autofs主配置文件(格式为:挂载目录 映射配置文件):

[root@linuxprobe ~]# vim /etc/auto.master
/media /etc/iso.misc

编辑挂载配置参数文件(映射文件):

[root@linuxprobe ~]# vim /etc/iso.misc
iso   -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom

重新加载启动autofs服务:

[root@linuxprobe ~]# systemctl restart autofs

进入自动挂载目录中:

[root@linuxprobe ~]# cd /media/iso

查看当前目录下的文件:

[root@linuxprobe iso]# ls
addons images Packages RPM-GPG-KEY-redhat-release
EFI isolinux release-notes TRANS.TBL
EULA LiveOS repodata
GPL media.repo RPM-GPG-KEY-redhat-beta

出现问题?大胆提问!

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

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

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

本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

1:要想实现Linux与Windows系统之间的文件共享,要用samba服务还是nfs服务?

答案:必须用samba服务,NFS服务仅能实现Linux系统之间的文件共享。

2:管理samba服务独立帐户信息的命令是?

答案:执行pdbedit命令用于管理SMB服务的帐户信息数据库。

3:如果Linux系统默认没有安装NFS服务端程序,需要安装什么软件包?

答案:NFS服务端软件包名字叫做nfs-utils,安装命令是yum install nfs-utils -y

4:NFS共享资源时,若希望不论NFS客户端使用任何帐户访问共享资源都会被映射成本地匿名用户的参数是?

答案:需要添加all_squash。

5:NFS客户端查看远程NFS服务端共享资源列表的命令是?

答案:使用showmount命令。

刘遄

刘遄

我们懂得《Linux就该这么学》作为一本Linux入门读物,更加有责任,有必要将文章质量不断提高,知识点不断扩充,让实验更加的实用,不辜负每位读者给予我们的支持,因此我们正在全球各地部署书籍的镜像站点,想用最迅猛的访问速度满足您心中那颗求知的小宇宙,同时,向每位会员承诺,本书可永久免费学习,提供所有所需工具以及在能力范围内的答疑支持。收费培训服务:http://www.linuxprobe.com/training
刘遄