前一篇文章“linux入门系列15–文件传输之vsftp服务”讲解了文件传输,本篇继续讲解文件共享相关知识。
文件共享在生活和工作中非常常见,比如同一团队中不同成员需要共同维护同一个文档,在windows环境下,通常会选用第三方协作工具,如腾讯文档,石墨文档等等。
之前讲解了基于ftp的文件传输,为何还会单独讲解文件共享呢?试想一下,假如我们要修改服务器上某个文件,如果使用ftp的话,需要先下载下来进行修改,然后在上传到服务器。这样是很繁琐的,这时候就可以使用文件共享来解决这个问题。
文件传输和文件共享有本质的区别,基于ftp协议的文件传输可以实现不同机器之间文件的传输和拷贝,会产生多个副本。而文件共享则只有一个副本,各个客户端连接到共享服务器操作的是同一份文件。
Linux环境下可以通过Samba服务或NFS服务来实现文件共享,下面分别进行介绍。
为了解决局域网内的文件和打印机等资源的共享问题,微软和英特尔与1987年共同制定了 SMB(Server Messages Block,服务器消息块)协议,这使得多个主机之间共享文件变得简单。
到了1991年,一个国外牛逼大学生 为了解决 Linux 系统 与 Windows 系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。它是一款开源的文件共享软件、只需要简单的配置就能实现文件共享。
后来作者把它注册商标为Samba,它***现在已经成为Linux系统和Windows系统之间共享文件的最佳选择***。
安装之前规划并准备实验环境
角色 | 操作系统 | ip地址 | 主机名称 |
---|---|---|---|
Samba服务器 | Centos7 | 192.168.78.101 | sambaserver |
Samba客户端 | Centos7 | 192.168.78.102 | cliet |
Samba客户端 | Windows10 | 宿主机即可 |
Samba服务程序的名字就是软件包的名字,安装后的服务名叫smb,在sambaserver主机上,通过rpm名称查看系统是否已经安装,如果没有安装则通过Yum软件仓库进行安装。
[root@sambaserver ~]# rpm -q samba
package samba is not installed
[root@sambaserver ~]# yum install samba
Loaded plugins: fastestmirror, langpacks
...省略部分内容
Installed:
samba.x86_64 0:4.1.1-31.el7
Complete!
[root@sambaserver yum.repos.d]# ^C
[root@sambaserver yum.repos.d]# rpm -q samba
samba-4.1.1-31.el7.x86_64
[root@sambaserver yum.repos.d]#
安装完成成后,配置文件所在目录为:/etc/samba/,主配置文件为:smb.conf
[root@sambaserver yum.repos.d]# ll /etc/samba/
total 20
-rw-r--r--. 1 root root 20 Dec 3 01:48 lmhosts
-rw-r--r--. 1 root root 706 Dec 3 01:48 smb.conf
-rw-r--r--. 1 root root 11327 Dec 3 01:48 smb.conf.example
[root@sambaserver yum.repos.d]#
接下来我们看下配置文件里的主要内容,还是按“linux入门系列15–文件传输之vsftp服务”中的2.4.1提到的老规矩,将注释以及空行信息去掉,便于观察配置项。
[root@sambaserver yum.repos.d]# mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
[root@sambaserver yum.repos.d]# cat /etc/samba/smb.conf.bak | grep -v "#" |grep -v ";" | grep -v "^$">/etc/samba/smb.conf
以上脚本通过grep命令-v参数反向选择,去掉以#和分号开头的注释信息,用^$过滤掉空白行,过滤无用信息后通过重定向覆写到原始配置文件中。
接下来看看主配置文件的内容:
[root@sambaserver yum.repos.d]# cat /etc/samba/smb.conf
[global]
workgroup = SAMBA #工作组名称
security = user #安全验证的方式,总共有4种:share、user、server、domain
passdb backend = tdbsam #定义用户后台的类型,共有3种:smbpasswd、tdsam、ldapsam
printing = cups
printcap name = cups
load printers = yes #设置在 Samba 服务启动时是否共享打印机设备
cups options = raw #打印机的选项
[homes] #共享参数
comment = Home Directories #描述信息
valid users = %S, %D%w%S
browseable = No #指定共享信息是否在“网上邻居”中可见
read only = No
inherit acls = Yes
[printers] #打印机共享参数
comment = All Printers
path = /var/tmp
printable = Yes
create mask = 0600
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/drivers
write list = @printadmin root
force group = @printadmin
create mask = 0664
directory mask = 0775
[root@sambaserver yum.repos.d]#
我直接把注释添加到每项配置的后边,方便查看。
其中[homes]参数为来访用户的家目录共享信息,[printers]参数为共享的打 印机设备,如果不需要可以手动直接删除即可。
通过前文可以看到,Samba服务程序的主配置文件包括全局配置参数和区域配置参数。顾名思义,全局配置参数用于设置整体的资源共享环境,对每一个独立的共享资源都有效;而区域配置参数则用于设置单独的共享资源,且只对该资源有效。
下面我们就来配置并使用Samba服务
(1)Samba主配置文件配置
[root@sambaserver yum.repos.d]# cd /etc/samba/
[root@sambaserver samba]# vim smb.conf
...省略原有内容
[database] #共享名称设为database
comment=请勿随意修改数据库哟 #提示信息
path=/home/database #共享目录/home/database
public=no #关闭所有人可见
writeable=yes #允许写入操作
添加以上内容并保存退出。
补充一下主配置文件中全局配置global的2个参数,security和passdb backend 。
从1.2中讲到的主配置文件中可以看出,它们的默认值分别为user和tdbsam。
其中security有4种安装认证方式,分别如下:
share:来访主机无需验证口令,比较方便,但安全性很差
user:需验证来访主机提供的口令后才可以访问,提升了安全性
server:使用独立的远程主机验证来访主机提供的口令(集中管理账户)
domain:使用域控制器进行身份验证
passdb backend有3种方式,定义用户后台的类型:
smbpasswd:使用 smbpasswd 命令为系统用户设置 Samba 服务程序的密码
tdbsam:创建数据库文件并使用 pdbedit 命令建立 Samba 服务程序的用户
ldapsam:基于 LDAP 服务进行账户验证
接下来我们就采用默认的user验证模式来进行设置,其他模式的搭配使用暂时不做讲解。
(2)创建访问共享资源的账号
从默认配置文件中可以看出,在RHEL7中Samba采用默认的user认证模式,可以确保仅让有密码且受信任的用户访问共享资源,需要先建立账户信息数据库,并且要求账户必须在当前系统中已经存在。
与前文讲解ftp时类似,要求用户在当前系统中已经存在,是为了避免在创建文件时引起文件权限属性混乱而引发错误。
用于管理 SMB 服务程序的账户信息数据库的命令为:pdbedit。
语法格式:
pdbedit [参数] 账户
参数:
参数 | 作用 |
---|---|
-a | 建立Samba用户 |
-x | 删除Samba用户 |
-L | 列出账户列表 |
-Lv | 列出账户详细信息的列表 |
先创建用户samba,并设置密码为:123456
[root@sambaserver samba]# useradd -s /sbin/nologin samba
[root@sambaserver samba]# passwd samba
Changing password for user samba.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@sambaserver samba]# id samba
uid=1001(samba) gid=1001(samba) groups=1001(samba)
[root@sambaserver samba]#
使用功能pdbedit创建samba服务的用户,密码为888888(注意此处的密码不是samba系统用户登录的密码,虽然也可以设置密码给之前密码相同,但一定要分清楚这2个密码是单独的,不要弄混淆)
[root@sambaserver samba]# pdbedit -a -u samba
new password: #此处输入密码,密码不一定要给samba用户登录系统的密码一致
retype new password: #重复输入密码
Unix username: samba
NT username:
Account Flags: [U ]
User SID: S-1-5-21-3641161961-465911512-1567372236-1000
Primary Group SID: S-1-5-21-3641161961-465911512-1567372236-513
Full Name:
Home Directory: \\sambaserver\samba
HomeDir Drive:
Logon Script:
Profile Path: \\sambaserver\samba\profile
Domain: SAMBASERVER
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: Wed, 22 Jan 2020 14:45:50 CST
Password can change: Wed, 22 Jan 2020 14:45:50 CST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[root@sambaserver samba]#
(3)创建共享资源的目录
在前面的第一步中我们配置了共享目录为/home/database。因此我们来创建此目录,需要考虑到文件读写权限问题。
[root@sambaserver samba]# mkdir /home/database
[root@sambaserver samba]# chown -Rf samba:samba /home/database/
[root@sambaserver samba]#
(4)SELinux上下文和策略设置
由于/home目录是系统中普通用户的家目录,因此不仅要考虑文件读写权限,还要注意SELinux安全上下文以及域策略所带来的限制(原始的主配置文件中有关于SELinux安全上下文策略的配置说明)。
设置SELinux安全上下文
[root@sambaserver samba]# semanage fcontext -a -t samba_share_t /home/database
[root@sambaserver samba]# restorecon -Rv /home/database/
restorecon reset /home/database context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:samba_share_t:s0
[root@sambaserver samba]#
除了设置上下文,还需要设置SELinux域相关策略,开启相关的策略即可
[root@sambaserver samba]# getsebool -a |grep samba
samba_create_home_dirs --> off
samba_domain_controller --> off
samba_enable_home_dirs --> off
samba_export_all_ro --> off
samba_export_all_rw --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
use_samba_home_dirs --> off
virt_sandbox_use_samba --> off
virt_use_samba --> off
[root@sambaserver samba]# setsebool -P samba_enable_home_dirs on
[root@sambaserver samba]#
(5)防火墙设置
samba服务名称为smb,重启并设为开机启动,清空防火墙策略
[root@sambaserver samba]# systemctl restart smb
[root@sambaserver samba]# systemctl enable smb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
[root@sambaserver samba]# iptables -F
至此,就可以用客户端使用samba服务实现文件共享了
先在共享目录准备一个文件用于客户端共享
[root@sambaserver home]# cd database/
[root@sambaserver database]# ll
total 0
[root@sambaserver database]# echo "samba server">samba.txt
[root@sambaserver home]# chown -Rf samba:samba /home/database/
[root@sambaserver database]# ll
total 4
-rw-r--r--. 1 samba samba 13 Jan 22 15:44 samba.txt
这样客户端就可以查看并编辑此共享文件了。
Samba支持Windows、Linux、macOS之间文件共享,接下来演示客户端是Linux和Windows的情况。
在之前准备的samba客户端主机上安装客户端后,用之前的samba账号密码就可以共享文件了。
(1)安装共享客户端
[root@cliet ~]# yum install cifs-utils
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...省略部分内容
Installed:
cifs-utils.x86_64 0:6.2-10.el7
Complete!
[root@cliet ~]#
(2)创建认证文件
[root@cliet ~]# vim auth.smb
username=samba
password=888888
domain=SAMBA
保存并退出,用户密码为之前1.3.1第二步中创建的samba用户及对应的密码,domain为主配置文件中的域。
为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅root管理才能够读写。
[root@cliet ~]# ll auth.smb
-rw-r--r--. 1 root root 44 Jan 22 15:37 auth.smb
[root@cliet ~]# chmod 600 auth.smb
[root@cliet ~]# ll auth.smb
-rw-------. 1 root root 44 Jan 22 15:37 auth.smb
[root@cliet ~]#
(3)本地创建目录挂载Samba共享目录
[root@cliet ~]# mkdir /database
[root@cliet ~]# vim /etc/fstab
//192.168.78.101/database /database cifs credentials=/root/auth.smb 0 0
#保存并退出
[root@cliet ~]# mount -a
这样就可以查看并修改共享服务器内的内容
[root@cliet ~]# ll /database/
total 4
-rw-r--r--. 1 root root 13 Jan 22 15:44 samba.txt
[root@cliet ~]# cat /database/samba.txt
samba server
[root@cliet ~]#
本演示以win10为例
在开始菜单输入共享服务器地址
在弹出弹出登录框输入正确的账号密码
进入共享目录
进入目录后,就可以执行查看、写入、更名、删除文件等操作,在samba服务器和对应的其他客户端就可以看到文件的变化。因此就实现了文件共享。
如果你只是在Linux主机之间共享文件,那NFS将更加简单。
NFS(Network File System即网络文件系统)服务可以将远程 Linux 系统上的文件共享资源挂载到本地主机的目录上,从而使得客户端基于TCP/IP协议,像使用本地主机上的资源一样读写远程Linux系统上的共享文件。
虚拟机准备,可以单独新克隆两台虚拟机,此处我就直接用原来的2台机器,只是要注意为了避免上一实验的干扰,将之前的Samba客户端作为nfs的服务器,将Samba服务器当作nfs的客户端。规划如下:
角色 | 操作系统 | ip地址 | 主机名称 |
---|---|---|---|
NFS客户端 | Centos7 | 192.168.78.101 | sambaserver |
NFS服务器 | Centos7 | 192.168.78.102 | cliet |
(1)安装NFS
RHEL7系统中默认已经安装了NFS服务,可以通过rpm命令查看,当然也可以直接执行如下安装命令,如果有新的包会自动更新,如果已是最新版本则提示Nothing to do。
[root@cliet ~]# rpm -q nfs-utils
nfs-utils-1.3.0-0.65.el7.x86_64
[root@cliet ~]# yum install nfs-utils
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Package 1:nfs-utils-1.3.0-0.65.el7.x86_64 already installed and latest version
Nothing to do
[root@cliet ~]#
NFS包名为nfs-utils。
(2)在NFS服务器创建共享目录
[root@cliet ~]# mkdir /nfs
[root@cliet ~]# chmod -Rf 777 /nfs/
[root@cliet ~]# echo "nfs server">/nfs/nfs.txt
[root@cliet ~]# chmod -Rf 777 /nfs/
[root@cliet ~]# ll /nfs/
total 4
-rwxrwxrwx. 1 root root 11 Jan 22 23:11 nfs.txt
[root@cliet ~]#
创建目录,修改权限,并创建共享文件。
(3)NFS服务配置
NFS服务程序配置文件为/etc/exports,默认为空。采用如下格式定义要共享的目录和相应的权限。
格式:共享目录的路径 允许访问的 NFS 客户端(共享权限参数)
相关参数及作用如下
参数 | 作用 |
---|---|
ro | 只读 |
rw | 读写 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 |
no_root_squash | 当 NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 |
all_squash | 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 |
sync | 同时将数据写入到内存与硬盘中,保证不丢失数据 |
async | 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会 丢失数据 |
按上边的语法格式,把第一步创建的nfs目录共享给192.168.78.0/24网段内的所有主机,让这些主机都有读写权限。为了最大限度保证数据不丢失,在将数据写入到NFS服务器的硬盘中后才会结束操作,同时把来访客户端root管理员映射为本地的匿名用户,配置如下:
[root@cliet ~]# vim /etc/exports
/nfs 192.168.78.*(rw,sync,root_squash)
保存并退出,注意ip地址与权限之间没有空格。
(4)设置防火墙策略
直接清空iptables防火墙的默认策略,以免默认的防火墙策 略禁止正常的NFS共享服务。
[root@cliet ~]# iptables -F
(5)启动NFS服务程序
[root@cliet ~]# systemctl restart rpcbind
[root@cliet ~]# systemctl enable rpcbind
[root@cliet ~]# systemctl start nfs-server
[root@cliet ~]# systemctl enable nfs-server
在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call,远程过程调用)服务将NFS服务器的I 地址和端口号等信息发送给客户端。
因此,在启动NFS服务之前,还需要重启并启用 rpcbind 服务程序,并将这两个服务一并加入开机启动项中。
至此NFS服务器端配置完成,接下来配置NFS客户端。
(1)查看NFS服务器
查看NFS服务器远程共享信息使用showmount命令。
语法:
showmount [参数] 服务器ip
参数:
参数 | 作用 |
---|---|
-e | 显示NFS服务器的共享列表 |
-a | 显示本机挂载的文件资源的情况 |
-v | 显示版本号 |
输出格式为:“共享的目录名称 允许使用客户端地址”
[root@sambaserver database]# showmount -e 192.168.78.102
Export list for 192.168.78.102:
/nfs 192.168.78.*
[root@sambaserver database]#
(2)创建目录并挂载
[root@sambaserver database]# mkdir /nfs
[root@sambaserver database]# mount -t nfs 192.168.78.102:/nfs /nfs
[root@sambaserver database]# ll /nfs/
total 4
-rwxrwxrwx. 1 root root 11 Jan 22 23:11 nfs.txt
使用mount命令并结合-t 参数,指定要挂载的文件系统的类型为nfs,并在命令后面写上服务器的 IP地址、服务器上的共享目录以及要挂载到本地系统的目录/nfs,这样就可以看到共享的目录文件了。
(3)挂载信息持久化
为了保证上一步骤的挂载能一直生效,需要将其写入到fstab文件中。
[root@sambaserver database]# vim /etc/fstab
...省略无关内容
192.168.78.102:/nfs /nfs nfs defaults 0 0
这样就在本地完成了服务器的文件共享。
无论是之前讲解本地yum源的安装还是本文讲解的Samba和NFS服务,都需要将挂载信息接入到/etc/fstab文件中,这样才会使共享资源自动随服务器开机而进行挂载。
但是如果挂载的远程资源太多,则会给网络带宽和硬件资源带来很大的压力。如果挂载后长期不使用,会造成资源的浪费。
为了不造成浪费,可以在每次需要使用才才去手动挂载,但是这样操作又非常繁琐。为了解决这个问题,autofs自动挂载服务应运而生。
与mount命令不同,autofs服务程序是一 种Linux系统守护进程,当检测到用户视图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。
简单说就是,将挂载信息写入/etc/fstab文件后,系统在每次开机时都自动将其挂载,而autofs 服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。
[root@sambaserver database]# yum install autofs
Loaded plugins: fastestmirror, langpacks
...省略部分内容
Installed:
autofs.x86_64 1:5.0.7-106.el7
Dependency Installed:
hesiod.x86_64 0:3.2.1-3.el7
Complete!
[root@sambaserver database]#
autofs服务程序主配置文件为:/etc/auto.master,我们一般采用主配置和子配置的方式进行配置。原因是生产环境中,可能会同时管理很多设备的挂载操作,如果把所有挂载信息都写入主配置文件,一旦内容多了将难以管理,且不利于服务执行效率。
主配置文件中采用“挂载目录 子配置文件”的格式填写,挂载目录是设备挂载位置的上一级目录。例如,光盘设备一般挂载到/media/cdrom目录中,那么主配置文件中的挂载目录就写成/media即可。
子配置文件需要用户自定义,文件名称没有严格要求,后缀建议以.misc结束。格式为:“挂载目录 挂载文件类型及权限 :设备名称”。
下边就以自动挂载光驱为例,进行演示autofs的用法
主配置文件
[root@sambaserver database]# vim /etc/auto.master
#
# Sample auto.master file
# This is a 'master' automounter map and it has the following format:
# mount-point [map-type[,format]:]map [options]
# For details of the format look at auto.master(5).
#
/media /etc/iso.misc
/misc /etc/auto.misc
#
# NOTE: mounts done from a hosts map will be mounted with the
# "nosuid" and "nodev" options unless the "suid" and "dev"
# options are explicitly given.
#
/net -hosts
#
# Include /etc/auto.master.d/*.autofs
# The included files must conform to the format of this file.
#
+dir:/etc/auto.master.d
#
# Include central master map if it can be found using
# nsswitch sources.
#
# Note that if there are entries for /net or /misc (as
# above) in the included master map any keys that are the
# same will not be seen as the first read key seen takes
# precedence.
#
+auto.master
[root@sambaserver database]#
添加/media /etc/iso.misc保存并退出,其他内容不变。
子配置文件
[root@sambaserver database]# vim /etc/iso.misc
iso -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
保存并退出。
说明:把光盘设备挂载到/media/iso 目录中,子配置文件可将挂载目录写为 iso,而-fstype 为文件系统格式参数,iso9660 为光盘设备格式,ro、nosuid 及 nodev 为光盘设备具体的权限参数,/dev/cdrom 则是定义要挂载的设备名称。
配置完成后,启动autofs服务并加入开机启动
[root@sambaserver database]# systemctl start autofs
[root@sambaserver database]# systemctl enable autofs
Created symlink from /etc/systemd/system/multi-user.target.wants/autofs.service to /usr/lib/systemd/system/autofs.service.
[root@sambaserver database]#
经过以上操作我们配置并开启了autofs服务,我们先来看下是否已经给我们挂载好了光盘设备
[root@sambaserver database]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 18G 4.3G 14G 25% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 76K 914M 1% /dev/shm
tmpfs 914M 29M 886M 4% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 120M 377M 25% /boot
192.168.78.102:/nfs 18G 4.6G 13G 26% /nfs
[root@sambaserver media]# ls /media/
[root@sambaserver media]#
可以看到光标设备没有挂载上,并且/media 目录中根本就没有 iso 子目录
接下来,我们直接进入到挂载的/media/iso目录,看看是否有内容
[root@sambaserver media]# cd /media/
[root@sambaserver media]# ll
total 0
[root@sambaserver media]# cd iso
[root@sambaserver iso]# ls
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
[root@sambaserver iso]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 18G 4.3G 14G 25% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 76K 914M 1% /dev/shm
tmpfs 914M 29M 886M 4% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 120M 377M 25% /boot
192.168.78.102:/nfs 18G 4.6G 13G 26% /nfs
/dev/sr0 3.9G 3.9G 0 100% /media/iso
[root@sambaserver iso]#
以上演示说明,当切换到iso目录时,也就是说只有使用挂载资源时,autofs才自动进行挂载。当系统重启后可以看到它没有挂载上去,而再次切换到/media/iso目录时,又会自动挂载。通过这种方式实现了按需分配,从而节约带宽等资源。
在讲解完文件共享之后,下一篇文章将分享使用Postfix和Dovecot搭建邮件系统。