上一篇文章把建域的整体规划和域名、主机规划聊完了,这篇就是系列里偏实操的第一步:把 Samba 装到系统里。很多朋友第一次碰“Linux 建域”这个概念,总觉得要自己编译内核、手写配置,其实完全不用。现代主流发行版直接通过包管理器就能装好一套能跑 AD 域控的 Samba,关键是把该装的组件装全、把环境前置条件理清楚。这篇文章我会把“安装 Samba”这件事拆开讲透:装哪些包、为什么需要这些包、不同发行版的安装命令、装完怎么验证,以及安装阶段最容易踩的坑。
不管你是准备用一台闲置服务器把公司内网的账号统一管起来,还是单纯想练手搭一套 Windows 和 Linux 都能登录的域环境,这篇文章都可以直接照着做。
1. 安装前的整体规划与准备
把安装命令敲下去之前,我建议你先花半个小时把环境检查一遍。Samba 建域对系统环境的要求不算苛刻,但有几个前置条件一旦不满足,后面初始化域控的时候会卡得怀疑人生。我见过最典型的例子:有人跳过时间同步直接装 Samba,结果后面 Kerberos 认证永远报错,查了两天才发现是系统时间偏了 10 分钟。
1.1 先确认系统版本和仓库里的 Samba 版本
不同发行版仓库里的 Samba 版本差异很大。Debian 12 和 Ubuntu 22.04/24.04 的仓库里 Samba 版本通常在 4.15 到 4.19 之间,RHEL/Rocky/Alma 系则要看具体的系统小版本。这里要先建立一个认知:Samba 从 4.0 开始才内置了 AD 域控功能,版本越新,对 AD 域控的兼容性和稳定性越好。如果你手头的发行版实在太老,比如还在用 Samba 3.x,那不建议直接在这上面做新域控。
我一般建议至少选择 Samba 4.15 以上的版本。原因倒不是低版本完全不能用,而是 4.15 之后对 AD 域控默认配置的生成、DNS 集成、Kerberos 支持都成熟了很多,网上能查到的坑也基本都被填平了。检查仓库版本的方法很简单:
# Debian/Ubuntu 系 apt info samba 2>/dev/null | grep -E "^Version" # RHEL/Rocky 系 dnf info samba 2>/dev/null | grep -E "^Version"如果版本太低,优先考虑升级整个系统到较新的发行版稳定版,而不是只升级 Samba 包。因为 Samba 域控对依赖库版本很敏感,单独升级 Samba 版本容易把系统里其他组件的依赖关系搅乱。
1.2 固定主机名与 IP 地址
域控的地址必须稳定,这一点没什么好商量的。安装阶段就要把主机名和 IP 定下来,因为 Samba 初始化域控的时候会把主机名写进 AD 数据库,初始化完再改主机名会非常麻烦。
主机名建议用全小写字母加短横线的形式,比如dc01或srv-ad01,尽量不要用DC01.test.com这种带点的主机名,也不要夹杂下划线。这里的逻辑是:Samba 在初始化域控时会自动用“主机名 + DNS 域后缀”拼出完整的机器 FQDN,如果主机名本身带了点,解析逻辑会混乱。另外,/etc/hosts 文件里要确保有一行把固定 IP 和完整 FQDN 对应起来,例如:
10.10.10.10 dc01.example.lab dc011.3 时间同步是建域的前置条件
Kerberos 认证协议对客户端和服务器之间的时间偏差极度敏感,默认允许的最大偏移量是 5 分钟,超过这个值就会直接拒绝认证。AD 域里时间偏差过大的机器甚至无法加入域。所以装 Samba 之前,先确认系统安装了 chrony 或者 ntp,并设置好时间服务器。
这个步骤很多人觉得“无所谓”,但实际上它决定了你后面/etc/krb5.conf配得再好、samba-tool domain provision执行得再顺利,最终客户端加入域的时候能不能通过认证。我的习惯是装完系统第一件事就配好 chrony,强制同步一次,然后再开始装 Samba:
# Debian/Ubuntu apt install -y chrony systemctl enable --now chrony chronyc makestep # 确认时间已同步 timedatectl如果这一步没做,后面出现“KDC has no support for encryption type”或者“Clock skew too great”这类报错,再倒回来排查就很浪费时间。先把地基打牢,后面会省很多事。
2. 核心组件拆解:一个 Samba 域控到底要装哪些东西
很多新手在这里容易迷糊:我明明装的是“Samba”,为什么还要装 Kerberos 客户端?为什么还要配 DNS?这是因为 Samba 的 AD 域控本质上是用开源组件重新实现了 Windows AD 域控制器的一组服务,它需要把 LDAP、Kerberos、DNS、SMB/CIFS 文件共享等多套协议组合在一起工作。装包的时候不能只装一个samba,而是要把它周边的配套服务一并拉起来。
2.1 samba、samba-client、samba-common 各自管什么
以 Debian/Ubuntu 为例,最基础的三个包是:
samba:核心服务包,包含 smbd(文件共享服务进程)、nmbd(NetBIOS 名称服务进程),以及 Samba 4.x 里作为 AD 域控主体的samba进程。samba-client:客户端工具集合,包含smbclient、rpcclient等命令行工具,用来验证 SMB 连接和远程管理。samba-common:公共文件与配置工具,包含testparm、pdbedit、net等命令,以及共享库。
这三个包是所有 Samba 场景的基础。但在建域控的场景里,光有它们还不够。
2.2 域控模式下的关键组件
Samba 4.x 的 AD 域控由一体化进程samba掌控,它不再像传统文件共享模式那样只靠 smbd/nmbd 干活,而是内部集成了四个关键服务角色:
| 服务角色 | 实现协议 | 对应端口 |
|---|---|---|
| Kerberos KDC | Kerberos 5 认证 | TCP/UDP 88 |
| LDAP 服务 | 轻量目录访问协议 | TCP/UDP 389, 636 |
| DNS 服务 | DNS 域名解析(内置或外部 Bind) | TCP/UDP 53 |
| SMB/CIFS 文件共享 | 文件和打印机共享 | TCP 445, 139 |
这就解释了为什么在安装阶段要一并搞定 Kerberos 客户端库、DNS 相关组件。在 Debian/Ubuntu 上,我习惯一次性安装下面这组包:
apt install -y samba smbclient samba-client samba-common \ attr acl winbind libpam-winbind libnss-winbind \ krb5-user bind9 bind9utils dnsutils这里逐个说说为什么需要它们:
winbind、libpam-winbind、libnss-winbind:用来让 Linux 系统通过域账号认证登录,虽然正式加入域之后才需要,但安装阶段一起装掉可以避免后续反复补包的麻烦。attr、acl:AD 域控需要处理大量的扩展属性和 POSIX ACL,Samba 在初始化 SYSVOL 共享时需要这些工具来维护高级权限标记。krb5-user:提供kinit、klist等 Kerberos 客户端工具,用来测试域控的 Kerberos 认证是否正常。bind9:在 Debian/Ubuntu 上,Samba 域控默认可以自动生成一份面向 AD 的 DNS 配置,也可以选择让 Samba 自带内置 DNS。装 Bind9 是为了保留“用外部 DNS 托管 AD 区域”这个选项,避免后面想切换的时候发现系统里根本没有 DNS 服务。
装完这组包之后,你在/etc/samba目录下会看到smb.conf(初始模板),但这还只是一个普通的文件共享配置模板,远不是域控配置。真正的域控配置要在执行samba-tool domain provision之后才会生成,这是下一篇系列文章要聊的内容。
2.3 RHEL 系的包管理差异
如果你用的是 Rocky Linux 或者 AlmaLinux,安装逻辑稍微有点区别。在 RHEL 8/9 系里,Samba 的一体化域控支持在不同版本里有所调整,部分官方源的samba-dc包已经不再提供。所以在 RHEL 系上跑 Samba AD 域控,最好先确认仓库里有没有可用的域控支持包:
dnf install -y samba samba-client samba-common \ krb5-workstation bind bind-utils \ python3 python3-libs # 查看是否存在域控支持包 dnf list --all | grep samba-dc如果samba-dc包不存在,通常有两个选择:第一,改用 Debian/Ubuntu 来跑域控;第二,使用 Samba 内置 DNS 的模式,不依赖外部 Bind。国内很多老教程还在用 CentOS 7 + samba4 的套路,但到了 RHEL 9 时代,这个路线已经没那么顺畅了。我个人的经验是:如果纯粹是为了跑 AD 域控,Debian/Ubuntu 对 Samba 的支持更省心,官方文档和社区示例也都以 Debian 系为第一参考对象。
3. 分发行版安装实操:从命令到出结果
明确了要装哪些包之后,下面进入实战环节。我分 Debian/Ubuntu 和 RHEL/Rocky 两条线来写,命令直接复制就能用。
3.1 Debian/Ubuntu 系安装步骤
第一步先更新软件包索引,避免源缓存里是旧版本:
apt update apt install -y samba smbclient samba-client samba-common \ attr acl winbind libpam-winbind libnss-winbind \ krb5-user bind9 bind9utils dnsutils安装过程中,Debian 系会弹出 Kerberos 配置交互界面,问你默认 Realm 和 KDC 服务器地址。这里有个小技巧:先随便填或者直接留空跳过,不用太在意,因为安装完我们还要针对 Samba 域控重新生成 krb5.conf。如果在这里填错了也没关系,后面用模板覆盖就行。
装完之后检查一下版本:
smbd --version输出类似Version 4.19.3-Debian,看到 4.x 就放心了。然后确认服务状态:
systemctl status smbd nmbd在 Debian/Ubuntu 上,传统文件共享服务默认会自动启动。但我要强调一点:如果这台机器将来要作为域控,samba一体化进程会成为唯一的主进程,smbd 和 nmbd 甚至建议直接禁用,避免端口冲突。不过在“安装”这个阶段,它们起来也无妨,只要不急着初始化域控,不影响我们验证安装结果。
3.2 RHEL/Rocky 系安装步骤
Rocky Linux 9 上,启用仓库后直接安装:
dnf update -y dnf install -y samba samba-client samba-common \ krb5-workstation bind bind-utils \ attr acl python3 \ vim-enhancedRHEL 系默认不启动任何 Samba 服务,需要手动启用:
systemctl enable --now smb nmb不过这里同样要注意,将来做域控的时候samba进程才是主角,RHEL 系上 smb 和 nmb 也不参与域控逻辑。验证安装时执行:
smbd --version testparm --version如果都能正常输出版本号,说明核心组件已经就位。
3.3 什么时候才需要编译安装
有人会问:为什么不直接源码编译 latest Samba?这里必须泼一盆冷水。Samba 4.x 的 AD 域控功能依赖python3-dns、gssapi、ldb等一堆底层库,源码编译时如果某个依赖版本匹配不上,configure阶段就会失败。而且编译安装完之后,你在系统目录结构里的配置文件路径会跟发行版默认差异很大,以后排查问题、升级维护都更费劲。
所以我的结论很明确:除非你有特殊需求,否则一律用发行版仓库里的包。编译安装主要适合那些需要自定义 Samba 特性集、或者目标系统仓库版本过于陈旧的场景。这类场景少之又少,而且需要你先具备完整的 C 编译链和 Python 开发库的排错能力,新手不建议碰。
3.4 安装完成后的目录结构与配置文件说明
安装完成之后,有几个关键路径你需要心里有数:
| 路径 | 作用 |
|---|---|
/etc/samba/smb.conf | Samba 主配置,默认是通用模板 |
/etc/samba/ | 域控初始化后还会生成private/子目录,存放密钥数据库 |
/var/lib/samba/ | Samba 状态数据,AD 数据库sam.ldb最终会在这里 |
/var/lib/samba/sysvol/ | 域控制器共享卷目录,存放组策略文件 |
/etc/krb5.conf | Kerberos 主配置,域控初始化时会被 Samba 自动生成 |
注意,现在这些目录大多还是空的或者只有样板文件,真正的内容要等执行samba-tool domain provision后才会生成。安装阶段的成果标准是:命令可执行、服务能启动、库文件齐全。
4. 安装后的初步验证与配置前检查
别急着去编辑什么配置文件,我先带你把安装结果系统地验证一遍。这个环节能在几分钟内暴露 80% 的环境问题,而且比等初始化失败后再返工要快得多。
4.1 验证 Samba 相关命令可用
逐个执行下面这些命令,看它们是否在 PATH 里且能正常输出:
which smbd nmbd samba smbclient testparm net smbd --version samba --version smbclient --versionsamba-tool 也是最重要的管理命令之一,检查它是否存在:
samba-tool --help | head -30如果你正常能看到帮助信息,说明 Python 模块加载没有问题。这一步卡住的人非常多,最常见的原因是在装 Samba 之前没有装好python3-dns或者python3-gpg,导致 samba-tool 启动时直接报模块找不到。
4.2 检查系统服务端口监听情况
安装完成后,可以确认一下 Samba 相关的端口是否在监听。这里要特别提醒:在还没初始化域控之前,传统的 smbd/nmbd 会监听 445/139 端口,但 Kerberos 的 88 端口不会监听,DNS 的 53 端口也不会监听。如果这时候你用netstat看不到 88 端口,这完全正常。
你可以检查一下当前实际监听情况:
ss -tlnp | grep -E '445|139'看到 445 在 LISTEN 即可,说明 smbd 起来了。如果你在 Debian 系装好了 bind9,53 端口也应该在监听:
systemctl status named ss -tlnp | grep :53在 RHEL 系里,bind 服务名一般叫named;在 Debian/Ubuntu 上则叫named或bind9。无论哪种,确认 DNS 服务已启用就行。
4.3 用 testparm 检查默认配置
testparm 是我们检查 smb.conf 是否合法的工具。刚装完不可能有语法错误,但跑一遍可以验证配置解析正常:
testparm -s这个命令会把/etc/samba/smb.conf的最终有效配置打印出来,看起来内容很长,但基本是模板加注释。此时不用去理解每一行,只要确认没有ERROR字样即可。
4.4 防火墙与 SELinux 预检查
ufw 或 firewalld 是否开启,决定了后续客户端能不能连过来。安装阶段就顺手把端口放行,后面初始化域控后省得再折腾:
# RHEL 系 firewalld firewall-cmd --permanent --add-service=dns firewall-cmd --permanent --add-service=kerberos firewall-cmd --permanent --add-service=ldap firewall-cmd --permanent --add-service=smb firewall-cmd --reload # Debian/Ubuntu ufw ufw allow dns ufw allow kerberos ufw allow ldap ufw allow smb ufw reload顺带提一句:即使没有开防火墙,也建议把上面的命令记录下来,因为很多云服务器或内网环境还有安全组这一层过滤规则,端口不通会导致后面“服务明明起来了,客户端就是连不上”的诡异问题。
如果你用的是 RHEL 系,还需要看看 SELinux 的状态:
getenforce如果返回Enforcing,在初始化域控之前就要考虑调整 Samba 相关布尔值。最直接的方式是先临时放到 Permissive 模式做验证:
setenforce 0确认域控和客户端登录都正常之后,再回去决定是否需要补 SELinux 策略。这里不是让你直接关闭 SELinux 然后不管,而是建域初期用 Permissive 模式排除 SELinux 干扰,能大幅减少排查变量的数量。
4.5 检查域名解析和主机名解析
在安装阶段我还喜欢做一个简单的 DNS 查询测试,确认系统能正确解析自己的 FQDN:
ping -c 2 $(hostname -f) getent hosts $(hostname -f)如果/etc/hosts写得对,应该能解析到你自己设定的固定 IP。这一步看起来基础,但 Samba 域控初始化时会用本机的主机名做大量用途,如果解析结果指向127.0.1.1或者解析失败,初始化时会出现“无法确定主机名对应的 IP 地址”这类问题。
5. 安装阶段的常见问题与排查技巧
写这篇文章之前,我在自己预装的虚拟机和几台测试服务器上把安装流程跑了几遍,也回忆了不少以前带新人时遇到的共同问题。下面这些都是安装阶段真实发生过的高频故障,我把典型报错和排查思路整理成了一张速查表。
5.1 安装报错速查表
| 典型报错场景 | 可能原因 | 处理方法 |
|---|---|---|
apt update时源仓库签名错误 | 系统源配置过期或时区不对导致密钥校验失败 | 先校正时间,再apt-key adv --refresh-keys或重新配置源列表 |
E: Unable to locate package samba-dc | Ubuntu 源里没有单独 samba-dc 包 | 建域不需要单独 samba-dc,一体化功能已集成在samba包内 |
dnf install提示包冲突 | 系统里已有的旧版 samba 相关包与新包冲突 | dnf remove samba*后用dnf clean all再重装 |
samba-tool执行后报ModuleNotFoundError | Python 依赖库未安装齐 | 安装python3-dns、python3-gpg,或直接重装samba包 |
smbd --version显示 3.x | 源仓库版本太旧,或者装错套件 | 检查源优先顺序,升级系统到较新稳定版再装 |
启动服务时Failed to start smb.service | 配置文件语法错误 | 运行testparm -s定位错误行 |
| 445 端口被占用 | 其他 SMB 服务或旧实例仍在运行 | lsof -i :445找到 PID,停掉冲突进程或换端口 |
5.2 安装后服务反复重启的排查思路
如果你发现 smbd 或 nmbd 启动后几秒钟就自动退出,打开系统日志看一下:
journalctl -u smbd --no-pager | tail -50多数情况下,问题的根源不是 Samba 包本身,而是配置文件里写入了无效路径或权限不对。安装阶段如果只是回答向导、没有手动改过 smb.conf,服务不应该反复重启。如果确认没改过配置还出问题,就检查一下/etc/samba和/var/log/samba目录的属主,确保是 root 或 samba 用户可写。
5.3 关于“装完了但 88 端口没监听”的一个规律
这个问题我几乎每次带人都会遇到。很多人装完 Samba,查端口发现 88 端口没起来,就以为安装失败了。实际上,Samba 的 Kerberos KDC 是由一体化进程samba在初始化完成域控后才会加载的,而samba进程默认不随包安装自动启动。换句话说,只要还没有执行samba-tool domain provision,88 端口和 389 端口永远都不会出现。
顺带说一个很多人忽略的小规律:在装完但尚未初始化的时候,系统里只会有smbd和nmbd,压根没有samba这个常驻进程。所以后续我们在系列第三篇配置域控的时候,一定要先把这些传统服务管理起来,再启动一体化进程。
5.4 时间同步相关的坑
前面提到了时间同步很重要,这里再展开讲一个真实场景:在同一套测试环境里,有一台 Windows 主机加入域后总是每隔几分钟就被踢下线,排查日志看到大量 Kerberos 错误,最后发现是域控服务器本身的 BIOS 时钟漂移了 8 分钟。而安装 Samba 的当时,chronyc makestep确实同步过,但后续服务器重启过程中 RTC 时间没有正确同步回系统。
解决办法是在安装阶段就设置好时间同步的持久化服务,并且确保 chrony 或 ntp 开机自启:
systemctl enable --now chrony另外,如果这套环境用的是虚拟机,建议在宿主机和虚拟机两端都开启时间同步选项,避免每次快照回滚之后时间又歪掉。
5.5 安装阶段要不要禁用 IPv6
这个问题在多个网络环境里反复出现。逻辑是:Samba 服务默认监听 IPv6 地址,但很多内网环境并没有正确配置 IPv6 路由,导致为客户端服务的某些请求解析到 IPv6 地址后超时。
我的个人习惯是:除非明确有 IPv6 需求,否则从安装阶段就把 IPv6 在系统层禁用掉,这样可以减少后续域控对外提供解析服务时出现未知问题的概率。具体做法是编辑/etc/default/grub,在GRUB_CMDLINE_LINUX这一行追加ipv6.disable=1,然后更新 grub 并重启:
sed -i 's/^GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 ipv6.disable=1"/' /etc/default/grub update-grub reboot不过要说明一点:禁用 IPv6 不是一个必须动作,只是我在这里统一的习惯。如果你的网络里需要在 AD 域控上启用 IPv6,那就不动它。
6. 安装完成后的经验收尾
Samba 的安装本身不复杂,但我不建议把它当成“敲完命令就结束”的流程。我个人在实际操作中有一个固定习惯:装完系统里所有 Samba 相关组件后,先把/etc/samba、/var/lib/samba和/etc/krb5.conf这三个位置分别打一个干净的备份包,存到独立目录。这一步只需要三分钟,但能让你在执行域控初始化前始终有一个绝对干净的“可回滚点”。
另外,装完之后我还会顺手把smbd --version的输出、systemctl status smbd的信息、以及hostnamectl的主机名状态全部记录到一个部署笔记里。这样做不是为了形式主义,而是当整个域环境后续出现莫名其妙的问题时,你可以快速确认“安装阶段的基线到底是什么状态”,不用靠记忆去翻。
最后再分享一个利用零碎时间的技巧:装完 Samba 之后、真正初始化域控之前,强烈建议你动手敲一遍smbclient -L localhost -U guest,看看能不能连上本机的 SMB 匿名共享。如果能出现共享列表或者正常的拒绝访问提示,那至少说明 445 端口的服务链路是通的,这能为下一篇配置域控减少一个变量。到这里,Samba 的安装已经算真正完成了,接下来就等samba-tool domain provision这一步了。