linux入门系列16--文件共享之Samba和NFS

 约 34 分钟

前一篇文章“linux入门系列15--文件传输之vsftp服务”讲解了文件传输,本篇继续讲解文件共享相关知识。

文件共享在生活和工作中非常常见,比如同一团队中不同成员需要共同维护同一个文档,在windows环境下,通常会选用第三方协作工具,如腾讯文档,石墨文档等等。

之前讲解了基于ftp的文件传输,为何还会单独讲解文件共享呢?试想一下,假如我们要修改服务器上某个文件,如果使用ftp的话,需要先下载下来进行修改,然后在上传到服务器。这样是很繁琐的,这时候就可以使用文件共享来解决这个问题。

文件传输和文件共享有本质的区别,基于ftp协议的文件传输可以实现不同机器之间文件的传输和拷贝,会产生多个副本。而文件共享则只有一个副本,各个客户端连接到共享服务器操作的是同一份文件。

Linux环境下可以通过Samba服务或NFS服务来实现文件共享,下面分别进行介绍。

一、文件共享服务Samba

1.1 Samba概述

为了解决局域网内的文件和打印机等资源的共享问题,微软和英特尔与1987年共同制定了 SMB(Server Messages Block,服务器消息块)协议,这使得多个主机之间共享文件变得简单。

到了1991年,一个国外牛逼大学生 为了解决 Linux 系统 与 Windows 系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。它是一款开源的文件共享软件、只需要简单的配置就能实现文件共享。

后来作者把它注册商标为Samba,它现在已经成为Linux系统和Windows系统之间共享文件的最佳选择

1.2 Samba安装及配置文件

安装之前规划并准备实验环境

image.png

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]参数为共享的打 印机设备,如果不需要可以手动直接删除即可。

1.3 Samba文件共享实操

通过前文可以看到,Samba服务程序的主配置文件包括全局配置参数和区域配置参数。顾名思义,全局配置参数用于设置整体的资源共享环境,对每一个独立的共享资源都有效;而区域配置参数则用于设置单独的共享资源,且只对该资源有效。

下面我们就来配置并使用Samba服务

1.3.1 文件共享服务器配置

(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的情况。

1.3.2 Linux客户端访问文件共享服务

在之前准备的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 ~]#

1.3.3 Windows访问文件共享服务

本演示以win10为例

在开始菜单输入共享服务器地址

w1.png

在弹出弹出登录框输入正确的账号密码

w2.png

进入共享目录

image.png
进入目录后,就可以执行查看、写入、更名、删除文件等操作,在samba服务器和对应的其他客户端就可以看到文件的变化。因此就实现了文件共享。

二、网络文件系统NFS

如果你只是在Linux主机之间共享文件,那NFS将更加简单。

NFS(Network File System即网络文件系统)服务可以将远程 Linux 系统上的文件共享资源挂载到本地主机的目录上,从而使得客户端基于TCP/IP协议,像使用本地主机上的资源一样读写远程Linux系统上的共享文件。

虚拟机准备,可以单独新克隆两台虚拟机,此处我就直接用原来的2台机器,只是要注意为了避免上一实验的干扰,将之前的Samba客户端作为nfs的服务器,将Samba服务器当作nfs的客户端。规划如下:

image.png

2.1 NFS服务器配置

(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 客户端(共享权限参数)

相关参数及作用如下

image.png

按上边的语法格式,把第一步创建的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客户端。

2.2 NFS客户端使用

(1)查看NFS服务器

查看NFS服务器远程共享信息使用showmount命令。

语法:

showmount [参数] 服务器ip

参数:

image.png

输出格式为:“共享的目录名称 允许使用客户端地址”

[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

这样就在本地完成了服务器的文件共享。

三、自动挂载服务autofs

3.1 autofs概述

无论是之前讲解本地yum源的安装还是本文讲解的Samba和NFS服务,都需要将挂载信息接入到/etc/fstab文件中,这样才会使共享资源自动随服务器开机而进行挂载。

但是如果挂载的远程资源太多,则会给网络带宽和硬件资源带来很大的压力。如果挂载后长期不使用,会造成资源的浪费。

为了不造成浪费,可以在每次需要使用才才去手动挂载,但是这样操作又非常繁琐。为了解决这个问题,autofs自动挂载服务应运而生。

与mount命令不同,autofs服务程序是一 种Linux系统守护进程,当检测到用户视图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。

简单说就是,将挂载信息写入/etc/fstab文件后,系统在每次开机时都自动将其挂载,而autofs 服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。

3.2 autofs安装及配置文件

3.2.1 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]#

3.2.2 配置文件解释

autofs服务程序主配置文件为:/etc/auto.master,我们一般采用主配置和子配置的方式进行配置。原因是生产环境中,可能会同时管理很多设备的挂载操作,如果把所有挂载信息都写入主配置文件,一旦内容多了将难以管理,且不利于服务执行效率。

主配置文件中采用“挂载目录 子配置文件”的格式填写,挂载目录是设备挂载位置的上一级目录。例如,光盘设备一般挂载到/media/cdrom目录中,那么主配置文件中的挂载目录就写成/media即可。

子配置文件需要用户自定义,文件名称没有严格要求,后缀建议以.misc结束。格式为:“挂载目录 挂载文件类型及权限 :设备名称”。

下边就以自动挂载光驱为例,进行演示autofs的用法

3.3 以光驱为例演示sutofs使用

3.3.1 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 则是定义要挂载的设备名称。

3.3.2 启动autofs服务

配置完成后,启动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]#

3.3.3 使用autofs服务

经过以上操作我们配置并开启了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搭建邮件系统。

阅读 211

推荐阅读
大数据开发
用户专栏

专注分享linux,docker,hadoop,kafka,hbase,spark,flink等大数据生态技术(微信公号:自学帮)

2 人关注
24 篇文章
专栏主页
目录