局域网共享:SMB vs NFS
局域网文件共享是让多台设备在同一网络中共享文件和资源的一种方式。SMB(Server Message Block)和 NFS(Network File System)是两种广泛使用的文件共享协议。下面我们将分析这两种协议的特点,以帮助您决定在局域网中哪一种更适合您的需求。
SMB(Server Message Block)
SMB 是一种在 Windows 和其他操作系统中广泛使用的网络文件共享协议。它最初是为了在微软的操作系统之间实现文件和打印机共享而开发的,但现在在许多其他平台上也可以使用。
优点
- 兼容性:SMB 在 Windows 操作系统中的原生支持使得它在 Windows 环境中非常有优势。许多网络附加存储(NAS)设备也支持 SMB 协议。
- 易用性:在 Windows 操作系统中,SMB 的设置相对简单,大部分情况下用户无需进行复杂的配置。
- 支持打印机共享:SMB 不仅支持文件共享,还支持在网络中共享打印机。
缺点
- 性能:相对于 NFS,SMB 在性能方面表现较差,尤其在处理大量小文件传输时。
- 跨平台支持:虽然 SMB 可以在非 Windows 系统中使用,但在 Linux 和 macOS 系统中可能需要额外的配置和软件包。
NFS(Network File System)
NFS 是一种主要在 UNIX 和类 UNIX 系统(如 Linux 和 macOS)中使用的网络文件共享协议。它允许在网络中的设备上透明地访问和使用远程文件系统。
优点
- 性能:NFS 在文件传输性能方面表现优越,尤其是在处理大量小文件时。
- 跨平台支持:NFS 在 UNIX 和类 UNIX 系统中具有广泛的支持。尽管 Windows 系统中的支持较为有限,但通过安装适当的组件和软件包仍然可以实现 NFS 文件共享。
- 适合多用户环境:NFS 支持更灵活的权限管理和文件锁定机制,使其更适合多用户环境。
缺点
- 兼容性和易用性:在 Windows 中设置和使用 NFS 可能需要更多的配置和软件包。
- 不支持打印机共享:NFS 主要用于文件共享,不支持打印机共享。
结论
选择 SMB 还是 NFS 取决于您的特定需求和环境。如果您主要使用 Windows 设备,那么 SMB 可能是更好的选择,因为它具有更好的兼容性和易用性。然而,如果您的网络中有多种操作系统,或者对文件传输性能有较高要求,那么 NFS 可能是更好的选择。在实际应用中,您还可以考虑同时启用 SMB 和 NFS 协议,以便充分利用两者的优势。
服务部署-Samba服务器
目录
1 基础知识
1.1 Samba 服务介绍
1987
年,微软公司和英特尔公司共同制定了SMB
(Server Messages Block,服务器消息块
)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991
年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB
协议开发出了SMBServer
服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。
所需的软件包括:
Samba
服务端软件包Samba-client
客户端软件包Samba-common
公共文件软件包
Samba由smbd
和nmbd
两个守护进程组成,两个进程的启动脚本相互独立。
不管学习什么技术,资源都是必不可少的。优质资源会助你一臂之力,让你快速入门。当年我自学使用的优质资源,我也全部共享出来,涵盖Linux、云计算、虚拟化、OpenStack、Docker、K8S、网络、Python、Go等书籍和视频,访问以下链接无套路领取,祝学业有成!
nmbd
- nmb启动脚本:
/etc/rc.d/init.d/nmb
- nmbd服务进程提供
NetBIOS
名称服务,以满足基于通过网络文件系统(CIFS
)协议的共享访问环境 NetBIOS
名称服务是Windows基于主机实现互相通信的机制,性能差,一般使用CIFS- smbd服务默认监听的端口是
UCP
协议的137
,通过nmb服务启动nmbd进程
smbd
- smb启动脚本:
/etc/rc.d/init.d/smb
- smbd服务进程为客户端提供文件共享与打印机服务,还负责用户权限验证以及锁功能
- smbd服务默认监听的端口是
TCP
协议的139
与445
,通过smb服务启动smbd进程
1.2 安装 Samba 服务程序
[root@localhost ~ ]# yum install samba
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Installing:
samba x86_64 4.1.1-31.el7 rhel 527 k
Transaction Summary
================================================================================
Install 1 Package
samba.x86_64 0:4.1.1-31.el7
Complete!
2 Samba 服务主配置文件
Samba服务程序的主配置文件与前面学习过的Apache服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。创建共享资源的方法很简单,如下表自定义共享配置。
- 主配置文件/etc/samba/smb.conf
2.1 全局设定
全局设定:可以共享的设置
2.2 私有家目录
- 私有家目录:不能共享的设置
2.3 打印机共享
- 打印机共享:可以共享的设置
2.4 自定义共享
- 自定义共享:不能共享的设置
3 Samba 服务命令工具
smbclient
命令用于交互式的数据访问smbpasswd
命令为Samba账号系统独立密码pdbedit
命令用于管理SMB服务程序的账户信息数据库testparm
命令,用于测试配置文件是否有语法错误,以及显示最终生效的配置
3.1 smbclient 命令
注意事项
smbclient
命令可以直接指定用户名和密码,也可以交互式给定- 查看指定主机上用户的所有共享的资源
使用方式
- 查看指定主机上用户的所有共享的资源:
smbclient -L HOST -U USERNAME
- 获取到共享信息:
smbclint //SERVER/shared_name -U USERNAME
# 1、列出某个IP地址所提供的共享文件夹
smbclient -L 198.168.0.1 -U username%password
# 2、像FTP客户端一样使用smbclient
# 有许多命令和ftp命令相似,如cd 、lcd、get、megt、put、mput等
smbclient //192.168.0.1/tmp -U username%password
# 3、直接一次性使用smbclient命令
smbclient -c "ls" //192.168.0.1/tmp -U username%password
smbclient //192.168.0.1/tmp -U username%password
smb:/>ls
# 4、除了使用smbclient,还可以通过mount和smbcount挂载远程共享文件夹
# 挂载
mount -t cifs -o username=escape,password=123456 //192.168.0.1/tmp /mnt/tmp
# 取消挂载
umount /mnt/tmp
3.2 smbpasswd 命令
客户端访问Samba
共享服务所使用的账号名称就是服务器端系统中真实存在的系统账号名称,但是不同于微软的共享设置,访问Samba共享的密码必须是独立的Samba
密码,而不能使系统密码。即使有人获取了Samba
的账号和密码,也难以控制系统。
注意事项:
smbpasswd
命令为系统用户添加Samba
登录密码
命令参数:
[root@localhost ~ ]# smbpasswd -a escape
3.3 pdbedit 命令
注意事项:
- pdbedit命令用于管理SMB服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”
- 在第一次把账户信息写入到数据库时需要使用-a参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了
命令参数:
[root@localhost ~ ]# pdbedit -a escape
4 实战演示
4.1 服务端配置
第 1 步:创建用于访问共享资源的账户信息
CentOS
系统中,Samba
服务程序默认使用的是用户口令认证,即user
模式- 只有建立账户信息数据库之后,才能使用用户口令认证模式,确保仅让有密码且受信任的用户访问共享资源
Samba
服务的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪
[root@localhost ~]# id escape
uid=1000(escape) gid=1000(escape) groups=1000(escape)
[root@localhost ~]# pdbedit -a -u escape
new password:此处输入该账户在Samba服务数据库中的密码
retype new password:再次输入密码进行确认
Unix username: escape
NT username:
Account Flags: [U ]
User SID: S-1-5-21-507407404-3243012849-3065158664-1000
Primary Group SID: S-1-5-21-507407404-3243012849-3065158664-513
Full Name: escape
Home Directory: \\\\localhost\escape
HomeDir Drive:
Logon Script:
Profile Path: \\localhost\escape\profile
Domain: LOCALHOST
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Wed, 06 Feb 2036 10:06:39 EST
Kickoff time: Wed, 06 Feb 2036 10:06:39 EST
Password last set: Mon, 13 Mar 2017 04:22:25 EDT
Password can change: Mon, 13 Mar 2017 04:22:25 EDT
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
第 2 步:创建用于共享资源的文件目录
- 在创建时,不仅要考虑到文件读写权限的问题,还需要考虑应用于该目录的
SELinux
安全上下文所带来的限制 Samba
配置文件中就有关于SELinux
安全上下文策略的说明,只需按照说明中给的值进行修改即可- 修改完毕后执行
restorecon
命令,让应用于目录的新SELinux
安全上下文立即生效
[root@localhost ~]# mkdir /home/database
[root@localhost ~]# chown -Rf escape:escape /home/database
[root@localhost ~]# semanage fcontext -a -t samba_share_t /home/database
[root@localhost ~]# 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
第 3 步:设置 SELinux 服务与策略
- 设置
SELinux
服务与策略,使其允许通过Samba
服务程序访问普通用户家目录 - 执行
getsebool
命令筛选出所有与Samba相关的SELinux
域策略 - 根据策略的名称和经验,在使用
setsebool
命令选择出正确的策略条目进行开启
[root@localhost ~]# 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@localhost ~]# setsebool -P samba_enable_home_dirs on
第 4 步:修改 Samba 服务的主配置文件
- 在配置文件中,
[homes]
参数为来访用户的家目录共享信息,[printers]
参数为共享的打印机设备 - 如果这两项如果在今后的工作中不需要,可以像手动删除,这没有任何问题,需要的时候可以手动再次创建
[root@localhost ~]# vim /etc/samba/smb.conf
[global]
workgroup = MYGROUP server string = Samba Server Version %v log file = /var/log/samba/log.%m max log size = 50 security = user passdb backend = tdbsam load printers = yes cups options = raw
[database]
comment = Do not arbitrarily modify the database file path = /home/database public = no writable = yes
第 5 步:重启 smb 服务
[root@localhost ~]# systemctl restart smb
[root@localhost ~]# systemctl enable smb
ln -s '/usr/lib/systemd/system/smb.service' '/etc/systemd/system/multi-user.target.wants/smb.service'
[root@localhost ~]# iptables -F
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
4.2 Windows 客户端
Samba
服务程序可以解决Linux
系统和Windows
系统的资源共享问题
- 要在Windows系统中访问共享资源,只需要在命令框中输入两个反斜杠,然后再加服务器的IP地址即可
- 如果已经清空了Linux系统上iptables防火墙的默认策略,应该能看到Samba共享服务的登录界面
- 正确输入escape账户名以及使用pdbedit命令设置的密码后,就可以登录到共享界面中了
4.3 Linux 客户端
Samba
服务程序还可以实现Linux
系统之间的文件共享
- 客户端安装支持文件共享服务的软件包cifs-utils
[root@localhost ~]# yum install cifs-utils
Loaded plugins: langpacks, product-id, subscription-manager
......
Installing:
cifs-utils x86_64 6.2-6.el7 rhel 83 k
Transaction Summary
================================================================================
Install 1 Package
cifs-utils.x86_64 0:6.2-6.el7
Complete!
- 在
Linux
客户端,按照Samba
服务的用户名、密码、共享域的顺序将相关信息写入到一个认证文件中 - 为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅root管理员才能够读写
[root@localhost ~]# vim auth.smb
username=escape
password=redhat
domain=MYGROUP
[root@localhost ~]# chmod -Rf 600 auth.smb
- 在
Linux
客户端上创建一个用于挂载Samba
服务共享资源的目录 - 把挂载信息写入到
/etc/fstab
文件中,以确保共享挂载信息在服务器重启后依然生效
[root@localhost ~]# mkdir /database
[root@localhost ~]# vim /etc/fstab
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
//192.168.10.10/database /database cifs credentials=/root/auth.smb 0 0
[root@localhost ~]# mount -a
# 或者自行手动挂载
mount -t cifs //SERVER/shared_name /mount_point -o username=USERNAME,password=PASSWORD
- 进入到挂载目录/database后就可以看到Windows系统访问Samba服务程序时留下来的文件了
[root@localhost ~]# cat /database/Memo.txt
i can edit it .