Samba 源码编译安装与配置完整指南(适用于 Linux 系统)

本文详细介绍了如何从源码编译安装 Samba 服务,涵盖依赖安装、配置选项、编译构建、systemd 服务配置、启动管理及基本使用方法。适用于 Fedora、CentOS、Rocky Linux、Ubuntu、Debian、openSUSE 等主流 Linux 发行版。

提示:Samba 官方主要使用 GitLab 作为代码仓库,也可从 Samba 官网 或 GitHub 获取源码包。


1. 解压源码包

首先下载并解压 Samba 源码包(以版本 x.y.z 为例):

tar -zxf samba-x.y.z.tar.gz
cd samba-x.y.z

2. 安装依赖

2.1 使用官方脚本(适用于 Fedora / CentOS / Ubuntu / Debian / openSUSE)

Samba 提供了针对常见发行版的依赖安装脚本:

cd <samba-source-dir>/bootstrap/generated-dists/<distro-with-version>
./bootstrap.sh

<distro-with-version> 替换为实际目录名,例如 fedora38

2.2 手动安装依赖(以 Rocky Linux 为例)

若您的系统未被官方脚本覆盖,请手动安装以下依赖:

dnf install -y gcc libtirpc-devel glibc-devel zlib-devel gnutls-devel \
libattr-devel python3-devel lmdb-devel gpgme-devel perl-Parse-Yapp \
jansson-devel libarchive-devel libacl-devel openldap-devel pam-devel \
rpcgen libtalloc-devel libtdb-devel libtevent-devel

2.3 Samba 4.19.3+ 额外依赖

从 Samba 4.19.3 起,可能需要额外安装 Python 和 D-Bus 相关组件:

pip install markdown dnspython3
dnf install -y dbus-c++-devel dbus-python-devel python3-markdown python3-dns

3. 配置编译选项

3.1 查看所有配置选项

./configure --help

3.2 默认配置

./configure

3.3 自定义配置示例

以下为生产环境中常用的 FHS 兼容配置:

./configure \
  --sbindir=/usr/sbin \
  --with-piddir=/run \
  --with-configdir=/etc/samba \
  --bindir=/usr/bin \
  --localstatedir=/var \
  --enable-fhs \
  --libdir=/usr/lib64 \
  --with-modulesdir=/usr/lib64/samba \
  --sysconfdir=/etc \
  --with-lockdir=/var/lib/samba/lock \
  --with-cachedir=/var/lib/samba \
  --enable-debug \
  --enable-pthreadpool \
  --valgrind \
  --valgrind-log="/var/log/samba/" \
  --with-systemd

⚠️ 注意:如果对 Samba 进行了二次开发,需在 ./configure 前设置环境变量以避免编译3链接问题,例如:

export LDFLAGS="-lrt"

3.4 常见 configure 参数说明

参数说明
--prefix=/usr/local/myinstall指定统一安装前缀(默认分散安装)
--with-tk=/usr/local指定 Tk 库路径
--with-php-config=/path/to/php-config指定 PHP 配置工具路径(用于模块冲突时)
--without-gnu-ld不使用系统 GNU ld 链接器

3.5 设置编译环境变量(交叉编译等场景)

CC=/usr/bin/mipsel-linux-gcc
CFLAGS="-g -O2 -I/home/a/buildspace/termcap-1.3.1/install/include"
LDFLAGS="-L/home/a/buildspace/termcap-1.3.1/install/lib"
LIBS="-lpthread"

4. 编译与安装

Samba 使用 WAF 构建系统,但兼容 make 接口:

make && make install

⚠️ 重要提示:若系统默认 Python 为 v2,WAF 可能失败。请显式指定 Python 3:

PYTHON=python3.9 make -j6
PYTHON=python3.9 make install

5. 配置 systemd 服务(以 Fedora 为例)

默认安装后可能缺少 systemd 单元文件。请根据系统创建以下三个服务文件(路径可能因发行版而异):

5.1 /usr/lib/systemd/system/smb.service

[Unit]
Description=Samba SMB Daemon
Documentation=man:smbd(8) man:samba(7) man:smb.conf(5)
Wants=network-online.target
After=network.target network-online.target nmb.service winbind.service

[Service]
Type=simple
PIDFile=/run/smbd.pid
LimitNOFILE=16384
EnvironmentFile=-/etc/sysconfig/samba
ExecStart=/usr/sbin/smbd --foreground --no-process-group $SMBDOPTIONS
ExecReload=/bin/kill -HUP $MAINPID
LimitCORE=infinity
Environment=KRB5CCNAME=FILE:/run/samba/krb5cc_samba

[Install]
WantedBy=multi-user.target

5.2 /usr/lib/systemd/system/nmb.service

[Unit]
Description=Samba NMB Daemon
Documentation=man:nmbd(8) man:samba(7) man:smb.conf(5)
Wants=network-online.target
After=network.target network-online.target

[Service]
Type=simple
PIDFile=/run/nmbd.pid
EnvironmentFile=-/etc/sysconfig/samba
ExecStart=/usr/sbin/nmbd --foreground --no-process-group $NMBDOPTIONS
ExecReload=/bin/kill -HUP $MAINPID
LimitCORE=infinity
Environment=KRB5CCNAME=FILE:/run/samba/krb5cc_samba

[Install]
WantedBy=multi-user.target

5.3 /usr/lib/systemd/system/winbind.service

[Unit]
Description=Samba Winbind Daemon
After=syslog.target network.target nmb.service

[Service]
Environment=KRB5CCNAME=FILE:/run/samba/krb5cc_samba
Type=simple
NotifyAccess=all
PIDFile=/run/winbindd.pid
EnvironmentFile=-/etc/sysconfig/samba
ExecStart=/usr/sbin/winbindd --foreground --no-process-group "$WINBINDOPTIONS"
ExecReload=/usr/bin/kill -HUP $MAINPID
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

建议:默认配置文件为 Type=notify ,建议改为改为 Type=simple,避免因启动超时导致服务失败。

5.4 重载 systemd 并启动服务

systemctl daemon-reload
systemctl start smb nmb winbind
# 或使用旧版别名(部分系统支持)
systemctl start samba

5.5 停止 Samba 服务

  • 方法 1(推荐)

    systemctl stop smb nmb winbind
  • 方法 2(手动 kill)

    ps -aux | grep smbd
    kill <pid1> <pid2>

    注意:使用 smbstatus 显示的 PID 可终止特定客户端连接,不影响整体服务。

5.6 查看服务状态

# 方法 1
systemctl status smb nmb winbind

# 方法 2
smbstatus

qCtrl+C 退出 smbstatus


6. 基本使用与配置

6.1 创建 Samba 配置文件

编辑 /etc/samba/smb.conf(若不存在则新建):

[global]
    client max protocol = SMB3
    load printers = No
    map to guest = Bad User
    printcap name = cups
    security = USER
    workgroup = SAMBA
    idmap config * : backend = tdb
    cups options = raw
    guest ok = Yes

[homes]
    comment = Home Directories
    inherit acls = Yes
    read only = No
    valid users = %S %D%w%S

[printers]
    browseable = No
    comment = All Printers
    create mask = 0600
    path = /var/tmp
    printable = Yes

[print$]
    comment = Printer Drivers
    create mask = 0664
    directory mask = 0775
    force group = @printadmin
    path = /var/lib/samba/drivers
    write list = @printadmin root

[myshare]
    comment = public document
    create mask = 0777
    directory mask = 0777
    path = /home/a/share
    read only = No
    valid users = a root smb_user

⚠️ 权限要求:确保共享目录存在且权限匹配,例如:

mkdir -p /home/a/share
chmod 777 /home/a/share

6.2 添加 Samba 用户

# 创建系统用户(可选)
sudo useradd username -g usergroup

# 设置 Samba 密码(必须)
sudo smbpasswd -a username

6.3 客户端访问共享

Linux 客户端

# 确保挂载点存在
mkdir -p /cifs

# 挂载 CIFS 共享(SMB3)
mount -t cifs \
  -o username=a,password=12345678,dir_mode=0777,file_mode=0777,nounix,vers=3.0 \
  //10.0.0.10/myshare /cifs

Windows 客户端

在任务栏搜索框中输入:

\\10.0.0.10\myshare

然后输入用户名和密码即可访问。


总结

通过本文,您已掌握从源码编译安装 Samba 的完整流程,包括依赖处理、自定义配置、systemd 集成及基础共享配置。此方案适用于对安全性、性能或定制化有较高要求的生产环境。