使用Samba或NFS实现文件共享

时间:2024-07-15 07:08:11

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 

一、SAMBA文件共享服务

1987年,微软公司和英特尔公司共同定制了SMB(Server Messages Block)服务器消息块协议,旨在解决局域网内的文件或打印机等资源的共享问题。Tridgwell为了解决此问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单的配置就能实现Linux与Windows系统之间的文件共享工作;后更名为Samba;Samba服务程序已经成为的在Linux系统与Windows系统之间共享文件最佳选择;

首先安装Samba服务程序,顺手再安装一个samba-client软件包,这用于测试共享目录的客户端程序:

[root@Linux ~]# yum install samba samba-client

查看Samba服务程序的主配置文件:其中24-29行代表共享该登录用户的家目录内容,虽然某些情况下可以更方便的共享文件,但这个默认操作有点危险,建议删掉;31-36行是用SMB协议共享本地的打印机设备,方便局域网内的用户可以远程使用,当前我们没有打印机设备,因此也删掉;最的38-42行依然为共享打印机设备的参数,删除;

 [root@Linux ~]# vim /etc/samba/smb.conf
 1 # See smb.conf.example for a more detailed config file or
   2 # read the smb.conf manpage.
   3 # Run 'testparm' to verify the config is correct after
   4 # you modified it.
   5 #
   6 # Note:
   7 # SMB1 is disabled by default. This means clients without support for SMB2 or
   8 # SMB3 are no longer able to connect to smbd (by default).
   9 
  10 [global]                    # 全局参数
  11         workgroup = SAMBA       # 工作组名称
  12         security = user         # 安全验证的方式,总共有4种
  13 
  14         passdb backend = tdbsam # 定义用户后台的类型,总共有3种
  15 
  16         printing = cups         # 打印服务协议
  17         printcap name = cups    # 打印服务名称
  18         load printers = yes     # 是否加载打印机
  19         cups options = raw      # 打印机的选项    
  20 
  21         # Install samba-usershares package for support
  22         include = /etc/samba/usershares.conf
  23 
  24 #[homes]                        # 共享名称
  25 #       comment = Home Directories  # 描述信息
  26 #       valid users = %S, %D%w%S    # 可用账户
  27 #       browseable = No             # 指定共享信息是否在"网上邻居"中可见
  28 #       read only = No              # 是否只读
  29 #       inherit acls = Yes          # 是否继承访问控制列表
  30 
  31 #[printers]                     # 共享名称
  32 #       comment = All Printers      # 描述信息
  33 #       path = /var/tmp             # 共享路径
  34 #       printable = Yes             # 是否可打印
  35 #       create mask = 0600          # 文件权限
  36 #       browseable = No             # 指定共享信息是否在"网上邻居"中可见
  37 
  38 #[print$]                       # 共享名称
  39 #       comment = Printer Drivers   # 描述信息
  40 #       path = /var/lib/samba/drivers   # 共享路径
  41 #       write list = @printadmin root   # 可写入文件的用户列表
  42 #       force group = @printadmin       # 用户组列表

还能删!16-19行所提到的cups全称叫做Common UNIX Printing System,中文名也叫UNIX打印系统服务,依然是用于打印机或打印服务机器的,删除;

  [root@Linux ~]# vim /etc/samba/smb.conf
 ...
  10 [global]
  11         workgroup = SAMBA
  12         security = user
  13 
  14         passdb backend = tdbsam
  15 
  16 #        printing = cups
  17 #        printcap name = cups
  18 #        load printers = yes
  19 #        cups options = raw

上述security参数代表用户登录samba时的验证方式,共有四种:

  • share:代表主机无需验证口令,相当于vsftpd服务的匿名公开访问模式。方便但不安全
  • user:代表登录samba服务时需要使用账号密码进行验证默认方式
  • domain:通过控制器进行身份验证,限制用户的来源域;
  • server:代表使用独立主机验证来访用户的提供的口令,相当于集中管理账户,不常用

早期,samba服务使用pam模块调用本地账户和密码信息,后在5、6版本时替换成了smboasswd命令设置独立的samba服务账号和密码口令。到RHEL 7/8版本又进行了一次改革,将传统的验证方式换成了tdbsam数据库,这是专门用于保存samba服务账号口令的数据库,需要使用pdbedit命令进行独立的添加操作;

1、配置共享资源

Samba服务程序的主配置文件与Apache服务相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对立面的每一个资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。创建共享资源的方法简单,写入参数即可:

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

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

pdbedit命令用于管理samba服务程序的账户信息数据库,语法:"pdbedit [选项] 账户";第一次写入数据库需要使用-a参数;使用的参数及作用如下:

参数 作用
-a 用户名 建立Samba用户
-x 用户名 删除Samba用户
-L 列出用户列表
-Lv 列出用户详细信息的列表
 [root@Linux ~]# id linuxprobe
 uid=1002(linuxprobe) gid=1002(linuxprobe) groups=1002(linuxprobe)
 [root@Linux ~]# pdbedit -a -u linuxprobe
 new password:   # 输入该账户在Samba服务数据库中的密码
 retype new password:    # 再次输入进行确认
 Unix username:        linuxprobe
 NT username:          
 Account Flags:        [U          ]
 User SID:             S-1-5-21-2480315105-886177666-1809780899-1000
 Primary Group SID:    S-1-5-21-2480315105-886177666-1809780899-513
 Full Name:            
 Home Directory:       \\LINUX\linuxprobe
 HomeDir Drive:        
 Logon Script:         
 Profile Path:         \\LINUX\linuxprobe\profile
 Domain:               LINUX
 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:    Tue, 09 Jul 2024 11:11:45 CST
 Password can change:  Tue, 09 Jul 2024 11:11:45 CST
 Password must change: never
 Last bad password   : 0
 Bad password count  : 0
 Logon hours         : F

第2步创建用于共享资源的文件目录;考虑文件读写权限问题与SELinux安全上下文所带来的限制。在samba的帮助手册中告诉用户正确的文件上下文值应该是samba_share_t,修改完后执行restorecon命令使其生效;

 [root@Linux ~]# mkdir /home/database
 [root@Linux ~]# chown -Rf linuxprobe:linuxprobe /home/databse
 [root@Linux ~]# semanage fcontext -a -t samba_share_t /home/database
 [root@Linux ~]# restorecon -Rv /home/database

第3步设置SELinux服务与策略,使其允许通过Samba服务程序访问普通用户家目录

 [root@Linux ~]# getsebool -a | grep samba
 ...
 samba_enable_home_dir --> off
 [root@Linux ~]# setsebool -P samba_enable_home_dir on

第4步:在Samba的服务程序的主配置文件中;写入以下共享信息

 [root@Linux ~]# vim /etc/samba/smb.conf
 [global]
     workgroup = SAMBA
     security = user
     passdb backend = tdbsam
     include = /etc/samba/usershares.conf
     
 [database]
     comment = Do not arbitrarily modify the database file
     path = /home/database
     public = no
     writable = yes

第5步:Samba服务程序的配置工作基本完毕。Samba服务程序在Linux系统中的名字为smb,所以重启并加入到启动项中:

 [root@Linux ~]# systemctl restart smb
 [root@Linux ~]# systemctl enable smb
 Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.

避免防火墙会限制用户访问,因此决定将iptables防火墙清空,再把Samba服务添加到firewalld防火墙:

[root@Linux ~]# iptables -F
[root@Linux ~]# iptables-save 
[root@Linux ~]# firewall-cmd --zone=public --permanent --add-service=samba
success
[root@Linux ~]# firewall-cmd --reload 
success

第6步:在服务器本地检查samba服务是否启动;使用"systemctl status smb"查看,若想进一步看samba服务都共享出去了哪些共享目录,使用smbclient命令来查看共享详情,-U参数指定了用户名称,建议一会用哪位用户进行挂载,就哪位用户身份进行查看;-L参数列举共享清单:

[root@Linux ~]# smbclient -U linuxprobe -L 10.0.0.2
Password for [SAMBA\linuxprobe]:

	Sharename       Type      Comment
	---------       ----      -------
	database        Disk      Do not arbitrarily modify the database file
	IPC$            IPC       IPC Service (Samba 4.19.4)
SMB1 disabled -- no workgroup available

2、Windows挂载共享

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

主机名称 操作系统 IP地址
Samba共享服务器 RHEL 8 10.0.0.2
Linux客户端 RHEL 8 10.0.0.2
Windows客户端 Windows 10 192.168.10.10

要在Windows系统中访问共享资源,只需要点击开始按钮后输入两个反斜杠,然后再加服务器的IP地址即可

现在就能看到登录界面了;正确写入linuxprobe账户名以及使用pdbedit命令设置的密码后,就可以登录到共享界面中了;尝试执行查看、写入、更名、删除文件等操作

由于系统缓存的原因,有可能在第二次登录时提供了正确的账户和密码,依然会报错,这时候重新启动一下即可。

3、Linux挂载共享

Samba服务程序还可以实现Linux系统之间的文件共享。按照下表来设置Samba服务程序所在主机(即Samba共享服务器)和Linux客户端使用的IP地址,然后在客户端安装支持文件共享服务的软件包:

主机名称 操作系统 IP地址
Samba共享服务器 RHEL 8 10.0.0.2
Linux客户端 RHEL 8 10.0.0.2
Windows客户端 Windows 10 192.168.10.10
[root@Linux ~]# yum install cifs-utils

安装好后,在客户端上创建一个用于挂载Samba服务共享资源的目录,可以与服务器上的共享名称同名,这样便于日后查找。mount 命令的-t参数指定协议类型,-o参数指定用户名和密码,最后追加上服务器IP地址和共享名称和本地挂载目录即可。服务器IP地址后面的共享名称指的是配置文件中[database]的值,而不是服务区本地挂载的目录名称,虽然一样,但我们应该认出他们的区别。

[root@Linux ~]# mkdir /database
[root@Linux ~]# mount -t cifs -o username=linuxprobe,password=redhat //10.0.0.2/database /database
[root@Linux ~]# df -h
...
//10.0.0.2/database		17G		3.9G  	14G		23%		/database

按照Samba服务的用户名、密码、共享域的顺序将相关信息写入到一个认证文件,让/etc/fstab文件和系统自动加载它。最后把这个文件权限修改为为仅root管理员才能查看:

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

挂载信息写入到/etc/fstab文件中,确保在服务重启后依然生效:

[root@Linux ~]# vim /etc/fstab
...
//10.0.0.2/database					/database	cifs	credentials=/root/auth.smb
[root@Linux ~]# mount -a

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

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

二、NFS网络文件系统

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

由于RHEL 8系统中默认安装了NFS服务,外加NFS服务的配置步骤也简单;首先检查系统是否安装NFS软件包

[root@Linux ~]# yum install nfs-utils

第1步:使用两台Linux主机(一台充当NFS服务器,一台充当NFS客户端)配置IP地址;

主机名称 操作系统 IP地址
NFS服务端 RHEL 8 10.0.0.2
NFS客户端 RHEL 8 10.0.0.3

配置好防火墙,以免默认的防火墙策略禁止正常的NFS共享服务;

[root@Linux ~]# iptables -F
[root@Linux ~]# iptables-save
[root@Linux ~]# firewall-cmd --permanent --zone=public --add-service=nfs
success
[root@Linux ~]# firewall-cmd --permanent --zone=public --add-service=rpc-bind
success
[root@Linux ~]# firewall-cmd --permanent --zone=public --add-service=mountd
success
[root@Linux ~]# firewall-cmd --reload

第2步在NFS服务器上建立用于NFS共享的目录,并设置足够的权限确保其他人有写入权限

[root@localhost ~]# mkdir /nfsfile
[root@localhost ~]# chmod -R 777 /nfsfile
[root@localhost ~]# echo "Welcome to linuxprobe.com" > /nfsfile/readme

第3步:NFS服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容;可按照"共享目录的路径 允许访问的NFS客户端(共享权限参数)"的格式,定义要共享的目录与相应的权限;配置NFS服务程序配置文件的参数

参数 作用
ro 只读
rw 只写
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
all_suqash 无论NFS客户端使用什么账号访问,均映射为NFS服务器的匿名用户
aync 同时将数据写入到内存与硬盘中,保证不丢失数据
async
[root@localhost ~]# vim /etc/exports
/nfsfile 10.0.0.*(rw,sync,root_squash)

第4步启动和启用NFS服务程序。由于在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call,远程过程调用)服务将NFS服务器的IP地址和端口号等信息发送给客户端。因此,在启动NFS服务之前,还需要顺带重启并启用rpcbind服务程序,并将这两个服务一并加入开机自启项;

[root@localhost ~]# systemctl restart rpcbind
[root@localhost ~]# systemctl enable rpcbind
[root@localhost ~]# systemctl start nfs-server
[root@localhost ~]# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

NFS客户端的配置步骤:先使用showmount命令查询NFS服务器的远程共享信息,必要的参数如下;其输出格式为"共享的目录名称 允许使用的客户端地址"

参数 作用
-e 显示NFS服务器的共享列表
-a 显示本机挂载的文件资源的情况NFS资源的情况
-v 显示版本号
[root@localhost ~]# showmount -e 10.0.0.2
Export list for 10.0.0.2:
/nfsfile 10.0.0.*

然后在NFS客户端创建一个挂载目录。使用mount目录结合-t参数,指定要挂载的文件系统的类型,并在命令后写上服务器的IP地址、服务器上的共享目录以及要挂载到本地系统(及客户端)的目录

[root@localhost /]# mkdir nfsfile
[root@localhost /]# mount -t nfs 10.0.0.2:/nfsfile /nfsfile
[root@localhost /]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G     0  1.9G   0% /dev/shm
tmpfs                    1.9G   13M  1.9G   1% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  3.9G   14G  23% /
/dev/sda1               1014M  185M  830M  19% /boot
tmpfs                    378M   24K  378M   1% /run/user/0
10.0.0.2:/nfsfile         35G  7.6G   28G  22% /nfsfile

挂载成功后就应该能够顺利地看到在执行前面的操作时写入的文件内容了。如果希望一直有效,则写入fstab文件中;

[root@localhost /]# cat /nfsfile/readme 
Welcome to linuxprobe.com
[root@localhost /]# vim /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Tue Jul  2 00:30:23 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=beecf916-556f-4ad8-a04b-8a32026c9dde /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
10.0.0.2:/nfsfile				/nfsfile	nfs	defaults	0 0

三、AutoFs自动挂载服务

如果在/etc/fstab中挂载的资源太多,会带来很多负载。若长期不使用,也会导致服务器硬件资源的浪费。

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

[root@Linux ~]# yum install autofs

在autofs服务程序的主配置文件中需要按照"挂载目录 子配置文件"的格式进行填写。挂载目录是设备挂载位置的上一级目录。例如:光盘设备一般挂载到/media/cdrom目录中,那么挂载目录写成/media即可。对应的子配置文件则是对这个挂载目录内的挂载设备信息作进一步说明。子配置文件需要用户自行定义,文件名字没有严格要求,但建议以.misc结束

[root@Linux ~]# cat /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
...

在子配置文件中,应按照"挂载目录 挂载文件类型与权限 :设备名称"的格式进行填写。例如:要把光盘设备挂载到/media/iso目录中,可将挂载目录写成iso,而-fstype为文件系统格式参数,iso9660为光盘设备格式,ro、nosuid及nodev为光盘设备具体权限参数,/dev/cdrom则是定义要挂载的设备名称。配置完成后再顺手将autofs服务程序加入到开机自启项中;

[root@Linux ~]# vim /etc/iso.misc
iso   -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
[root@Linux ~]# systemctl start autofs
[root@Linux ~]# systemctl enable autofs
Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/lib/systemd/system/autofs.service.

先查看当前的光盘设备的挂载情况,发现/media目录中根本没有iso子目录:

[root@Linux ~]# umount /dev/cdrom
[root@Linux ~]# df -h
...
[root@Linux media]# cd /media
[root@Linux media]# ls
[root@Linux media]# 

但是,我们却可以使用cd命令切换到这个iso子目录中,而且光盘设备会被立即挂载上,也就能顺利查看光盘的内容了:

[root@Linux iso]# cd iso
[root@Linux iso]# ls
AppStream	EULA ...
[root@Linux iso]# df -h
...
/dev/sro		6.7G	6.7G	0	100%	/media/iso

光盘设备的名称变成/dev/sr0;实际上和/dev/cdrom是连接方式,只是名称不同而已

[root@Linux ~]# ls -l /dev/cdrom
lrwxrwxrwx. 1 root root 3 Jul 2 00:38 /dev/cdrom -> sr0

下面对NFS服务操作:

首先把NFS共享目录卸载,然后在autofs服务程序的主配置文件中会有一条"/misc /etc/auto.misc"参数,这个auto.misc相当于自动挂载的参考文件,而它默认就已经存在,所以这步不用操作:

[root@Linux ~]# umount /nfsfile
[root@Linux ~]# vim /etc/auto.master
...
/media  /etc/iso.misc
/misc	/etc/auto.misc

接下来找到这个对应的auto.misc文件,填写本地挂载的路径和NFS服务器的挂载信息

[root@Linux ~]# vim /etc/auto.misc
...
nfsfile		10.0.0.2:/nfsfile

重启autofs程序服务,进入到/misc/nfsfile目录时,共享信息便会自动挂载:

[root@Linux ~]# systemctl restart autofs
[root@Linux ~]# cd /misc/nfsfile
[root@Linux nfsfile]# df -h 
...
10.0.0.2:/nfsfile		6.7G	6.7G	0	100%	/media/iso

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!