samba服务
1. samba诞生背景
1987 年,微软公司和英特尔公司共同制定了 SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。
到了 1991 年,当时还在读大学的 Tridgwell 为了解决 Linux 系统
与 Windows 系统之间的文件共享问题,基于 SMB 协议开发出了 SMBServer 服务程序。
这是一款开源的文件共享软件,经过简单配置就能够实现 Linux 系统与 Windows 系统之间的文件共享工作。当时,Tridgwell 想把这款软件的名字 SMBServer 注册成为商标,但却被商标局以“SMB 是没有意义的字符”为由而拒绝了申请。后来 Tridgwell 不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba 服务程序的名字由此诞生Samba 服务程序现在已经成为在 Linux 系统与Windows 系统之间共享文件的最佳选择。
2. samba简介
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。
3. samba配置文件详解
配置文件:/etc/samba/smb.conf
// 下面均为注释信息
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.
// 表示共享每位登录用户的家目录内容
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
// 用SMB协议共享本地的打印机设备,方便局域网内用户远程使用打印机设备
[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
// UNIX系统的用于打印机或打印服务器
printing = cups
printcap name = cups
load printers = yes
cups options = raw
参数 | 作用 |
---|---|
global | 全局参数,影响samba服务 |
homes | 设置与其他用户共享目录的地方,当用户访问服务器时与自己有同名的共享目录时,会将其映射过去 |
printers | 配置打印机的部分 |
3.1 配置文件中参数的作用
参数 | 作用 |
---|---|
[global] | 全局参数 |
workgroup = SAMBA | 工作组名称 |
security = user | 安全验证的方式,有四种 |
passdb backend = tdbsam | 定义用户后台类型,共三种 |
printing = cups | 打印服务协议 |
printcap name = cups | 打印服务名称 |
load printers = yes | 是否加载打印机 |
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 | 目录权限 |
3.1.1 security参数的四种验证方式
参数 | 作用
share | 代表主机无须验证密码
user | 代表登录samba服务时需要使用账号密码进行验证,正确后才能获取文件,默认方式
domain | 代表通过域控制器进行身份验证,用来限制用户的来源域。
server | 代表使用独立主机验证来访用户提供的密码。
3.1.2 passdb backend定义用户后台的类型
passdb backend有三种类型:
-
在最早期的 RHEL/CentOS 系统中,Samba 服务使用的是 PAM(可插拔认证模块)来调用本地账号和密码信息
-
后来在 5、6 版本中替换成了用 smbpasswd 命令来设置独立的 Samba服务账号和密码。
-
到了 RHEL 7/8 版本,则又进行了一次改革,将传统的验证方式换成使用tdbsam 数据库进行验证。这是一个专门用于保存 Samba 服务账号密码的数据库,用户需要用pdbedit 命令进行独立的添加操作。
4. samba服务部署与配置
// 安装samba
[root@samba ~]# yum -y install samba samba-client
pdbedit命令用来管理samba服务,因为在第一次将账号写入数据库时需要使用-a参数,以后在执行修改密码、删除账户等操作时就不需要此参数了
pdbedit命令参数和作用
参数 | 作用 |
---|---|
-a 用户名 | 建立samba用户 |
-x 用户名 | 删除samba用户 |
-L | 列出用户列表 |
-Lv | 列出用户详细信息的列表 |
// 先创建一个用户,用于添加到samba数据库中
[root@samba ~]# useradd samba
[root@samba ~]# pdbedit -a -u samba
new password: //为samba用户设置一个samba数据库中的密码,后面会用到
retype new password:
Unix username: samba
NT username:
Account Flags: [U ]
User SID: S-1-5-21-3436471043-1171090348-3227004907-1000
Primary Group SID: S-1-5-21-3436471043-1171090348-3227004907-513
Full Name:
Home Directory: \\samba\samba
HomeDir Drive:
Logon Script:
Profile Path: \\samba\samba\profile
Domain: SAMBA
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, 12 Jul 2023 11:00:21 CST
Password can change: Wed, 12 Jul 2023 11:00:21 CST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
// 创建一个共享资源目录
[root@samba ~]# mkdir -p /opt/data/
[root@samba ~]# chown -R samba.samba /opt/data
// 修改配置文件
// 删除配置文件中用不到的部分,留下一下内容
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
[data] //共享名称为data,这里随意
comment = zhe shi miao shu xin xi //描述信息可写可不写
path = /opt/data //共享目录
public = no //关闭所有人可见
writable = yes //允许写操作
// 重启samba服务
[root@samba ~]# systemctl enable --now smb
[root@samba ~]# systemctl restart smb
// 查看是否共享了目录
[root@samba ~]# smbclient -U samba -L 192.168.182.130 //本机IP地址
Enter SAMBA\samba's password: //输出刚才设置的数据库密码
Sharename Type Comment
--------- ---- -------
data Disk zhe shi miao shu xin xi //这里可以看到共享了data目录
IPC$ IPC IPC Service (Samba 4.10.16)
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
windos共享
// 输入本机IP地址
// 输入刚才创建的samba用户和密码
// 进来之后看到data目录为空
// 在data创建一个文件,完成之后咱们到linux上去看
linux挂载共享
环境说明:
主机名称 | IP地址 |
---|---|
samba | 192.168.182.130 |
localhost | 192.168.182.131 |
// 配置客户端
[root@localhost ~]# hostname
localhost.localdomain
[root@localhost ~]# yum -y install cifs-utils
// 安装完成后在客户端挂载一个samba服务共享资源目录
[root@localhost ~]# mkdir data-client // 创建共享目录
[root@localhost ~]# mount -t cifs -o username=samba,password=linux //192.168.182.130/data /data-client // -t是指定协议类型,-o指定用户名和密码IP后面的共享名称是samba配置文件里面的[data],不是服务器本地挂载目录的名字
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 1.9G 49G 4% /
/dev/sda1 1014M 151M 864M 15% /boot
/dev/mapper/centos-home 47G 33M 47G 1% /home
tmpfs 182M 0 182M 0% /run/user/0
//192.168.182.130/data 50G 2.4G 48G 5% /root/data-client //挂载成功
若系统重启有需要重新挂载,这样就很麻烦,我们这里写一个samba认证文件,到时候不需要我们再敲命令挂载
[root@localhost ~]# vim auth.smb
username=samba
password=linux
domain=SAMBA
[root@localhost ~]# tail -1 /etc/fstab //在此文件中添加下面的内容
//192.168.182.130/data /root/data-client cifs credentials=/root/auth.smb
[root@localhost ~]# mount -a //执行此命令后即可生效
[root@localhost data-client]# pwd
/root/data-client
[root@localhost data-client]# cat test.txt //可以看到samba服务器上text文件共享成功
this is a windows system
[root@localhost data-client]#