在 CentOS 系统中,通过源码方式安装 Samba 能够提供更高的灵活性和定制性,允许用户获取最新版本的软件,并根据特定需求编译功能模块,相较于使用 yum 或 dnf 等包管理器,源码安装虽然过程稍显复杂,但对于追求性能优化和特定功能集的系统管理员和开发者而言,是不可或缺的技能,本文将详细介绍在 CentOS 环境下从源码编译并安装 Samba 的完整流程。

准备工作:构建编译环境
在开始编译之前,必须确保系统已安装所有必要的开发工具和依赖库,这一步是成功编译的基础,缺少任何一个依赖都可能导致编译失败。
更新系统软件包到最新状态,这是一个良好的维护习惯。
sudo yum update -y
安装“开发工具”软件包组,它包含了 GCC 编译器、make 等核心构建工具。
sudo yum groupinstall -y "Development Tools"
安装 Samba 编译所依赖的特定库,这些库提供了 Samba 运行所需的各种功能支持,如加密、目录服务、打印等。
sudo yum install -y
perl
python3
python3-devel
gnutls-devel
libacl-devel
openldap-devel
popt-devel
readline-devel
cups-devel
zlib-devel
krb5-devel - perl/python3: Samba 的构建脚本和一些工具依赖这些解释器。
- gnutls-devel: 提供 SSL/TLS 加密支持,对于安全通信至关重要。
- openldap-devel: 如果需要与 LDAP 或 Active Directory 集成,此库必不可少。
- cups-devel: 用于支持打印服务功能。
下载与解压 Samba 源码
访问 Samba 官方网站获取最新的稳定版源码,推荐从官方镜像站点下载,以确保文件的完整性和安全性,这里以 Samba 4.19.5 版本为例。
wget https://download.samba.org/pub/samba/samba-4.19.5.tar.gz
下载完成后,使用 tar 命令解压源码包,并进入解压后的目录。
tar -xf samba-4.19.5.tar.gz cd samba-4.19.5
编译与安装 Samba
编译过程分为三个主要步骤:配置、编译和安装。
配置编译选项
configure 脚本用于检查系统环境、依赖库,并根据用户指定的参数生成 Makefile,为了将 Samba 安装到独立的目录(便于管理和升级),并启用 systemd 支持,推荐使用以下配置:
./configure
--prefix=/usr/local/samba
--with-systemd
--with-ads
--enable-selftest --prefix=/usr/local/samba: 指定安装目录,避免与系统自带的软件冲突。--with-systemd: 生成 systemd 服务单元文件,便于使用systemctl管理服务。--with-ads: 启用 Active Directory 支持,适用于企业环境。--enable-selftest: 启用自测套件,方便开发者和高级用户进行功能验证。
编译源码
配置成功后,执行 make 命令进行编译,为了充分利用多核 CPU 的性能,可以指定并行任务数。
make -j$(nproc)
-j$(nproc) 选项会自动检测 CPU 核心数并并行编译,显著缩短编译时间。
安装程序

编译无误后,使用 make install 将编译好的文件安装到 --prefix 指定的目录中。
sudo make install
配置与启动服务
安装完成后,需要进行一系列配置才能让 Samba 正常运行。
配置环境变量
为了方便直接使用 Samba 的命令行工具(如 smbclient, testparm),需要将其 bin 和 sbin 目录添加到系统的 PATH 环境变量中。
echo 'export PATH=/usr/local/samba/bin:/usr/local/samba/sbin:$PATH' >> ~/.bashrc source ~/.bashrc
创建主配置文件
Samba 的核心配置文件是 smb.conf,在安装目录下创建它:
sudo mkdir -p /usr/local/samba/etc sudo vim /usr/local/samba/etc/smb.conf
一个最简单的匿名可读共享配置示例如下:
[global]
workgroup = SAMBA
server string = Samba Server %v
netbios name = centos-samba
security = user
map to guest = Bad User
[anonymous]
path = /srv/samba/anonymous
browseable = yes
writable = yes
guest ok = yes
read only = no 创建共享目录并设置权限
根据 smb.conf 中的配置,创建共享目录并赋予适当的权限。
sudo mkdir -p /srv/samba/anonymous sudo chmod -R 0775 /srv/samba/anonymous sudo chown -R nobody:nobody /srv/samba/anonymous
创建 systemd 服务单元
为了让系统能够管理 Samba 服务,需要手动创建 systemd 服务文件。
sudo vim /etc/systemd/system/smb.service
[Unit] Description=Samba SMB Daemon After=network.target [Service] Type=forking PIDFile=/usr/local/samba/var/run/smbd.pid ExecStart=/usr/local/samba/sbin/smbd -D ExecReload=/bin/kill -HUP $MAINPID LimitNOFILE=16384 [Install] WantedBy=multi-user.target
启动并启用服务
重新加载 systemd 配置,然后启动并设置 Samba 服务开机自启。

sudo systemctl daemon-reload sudo systemctl start smb sudo systemctl enable smb
防火墙与 SELinux 配置
必须配置防火墙和 SELinux,否则客户端将无法访问共享。
配置防火墙
使用 firewall-cmd 开放 Samba 服务所需的端口。
sudo firewall-cmd --permanent --add-service=samba sudo firewall-cmd --reload
配置 SELinux
如果共享目录不在标准路径下,需要修改其 SELinux 安全上下文。
sudo semanage fcontext -a -t samba_share_t "/srv/samba/anonymous(/.*)?" sudo restorecon -Rv /srv/samba/anonymous
如果需要用户访问自己的主目录,还需执行:
sudo setsebool -P samba_enable_home_dirs on
至此,一个完整的从源码编译安装 Samba 的流程已经结束,你可以通过 testparm 命令测试配置文件语法,并从其他 Windows 或 Linux 客户端尝试访问共享。
相关问答FAQs
问题1:在执行 ./configure 时,提示“error: ‘xxx.h’ not found”怎么办?
解答: 这个错误表示编译器找不到所需的头文件,通常是因为缺少对应的开发库,解决方法是首先确定缺失的库属于哪个软件包,可以使用 yum provides '*/xxx.h' 命令来搜索提供该头文件的包,如果提示 gssapi.h not found,可以运行 yum provides '*/gssapi.h',搜索结果会指向 krb5-devel 包,然后使用 sudo yum install <package_name>-devel 安装对应的开发包即可,安装完毕后,重新运行 ./configure 命令。
问题2:安装完成后,客户端无法访问 Samba 共享,可能的原因有哪些?
解答: 客户端无法访问共享是一个常见问题,原因可能涉及多个层面,可以按以下步骤排查:
- 服务状态:首先在服务器上检查 Samba 服务是否正在运行,使用
systemctl status smb和ps aux | grep smbd确认进程存在。 - 防火墙:检查防火墙是否正确放行了 Samba 服务,使用
sudo firewall-cmd --list-all查看services列表中是否包含samba。 - SELinux:这是在 CentOS 上最容易被忽略的问题,检查
/var/log/audit/audit.log中是否有关于smbd或samba_share_t的拒绝(denied)记录,如果有,请按照上文中的方法正确设置 SELinux 上下文或布尔值。 - 配置文件语法:运行
testparm命令检查smb.conf文件是否存在语法错误。 - 共享目录权限:确保共享目录本身以及其父目录的 Linux 文件系统权限(
rwx)允许 Samba 守护进程(通常以nobody或指定用户运行)和客户端用户访问。 - 网络连通性:使用
ping命令确保客户端与服务器之间的网络是通的。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复