☰
Debian Jessie/Stretch 上 Samba 4 域控脚本配置与备份验证实战
2026/11/2 12:51:30 网站建设 项目流程

简介:这份资源面向在 Debian 环境下运维 Samba 4(AD-DC)的工程师与运维人员,汇集了作者日常使用的实用脚本,覆盖备份、权限检查、sysvol ACL 设置、域信息查看与调试信息收集等场景,可帮助读者减少手工排查与重复配置的工作量。压缩包共 25 个文件,以 12 个 sh 脚本、9 个 txt 说明文档和 3 个 md 文件为主,另含一份 backup_samba4 备份脚本,整体约 71KB,体积轻便。其中 txt 与 md 文档记录了 Debian Stretch、Buster 及 Ubuntu 18.04 上搭建 Samba AD-DC、成员服务器与文件服务器的操作要点,脚本则对应备份、SePrivileges 检查、sysvol 权限设置、DNS 批量添加、数据库复制检查等具体任务。已有 250 人学习,适合需要快速上手或完善现有 Samba 4 部署的读者参考借鉴。

1. 从一台域控装完却连不上开始说 Samba 4

上周帮一个朋友收拾他实验室里那台 Debian 机器,Samba 4 装完、smb.conf也照着某篇老帖抄了一遍,结果smbclient -L localhost直接报NT_STATUS_CONNECTION_REFUSED,systemctl status smbd看着又是 active。折腾到半夜才发现,他装的是 Debian Stretch 的 Samba 4.5,而抄的配置是 Jessie 时代 4.2 的写法,server max protocol和ntlm auth两处默认值都变了。这种「装上了但跑不通」的场面,在 Debian Jessie 和 Stretch 上做 Samba 4 域控、文件共享、sysvol 备份的人几乎都遇过。这篇笔记就是围绕一套在 Debian Jessie / Stretch 上实测过的 Samba 4 脚本工具集来写,从版本选择、依赖安装、脚本配置到备份验证,一步步走完,适合刚接手域控运维、又不想每次手敲一长串smbclient和rsync的开发者。

2. 装前把版本和依赖钉死:Jessie 与 Stretch 的差异

2.1 两个发行版到底差在哪

这套脚本的标题写得很直白:在 Debian Jessie 和/或 Debian Stretch 上测试过。这句话不是客套,它决定了你后面所有命令能不能直接抄。Jessie 自带的是 Samba 4.2.x,Stretch 自带的是 Samba 4.5.x,两者在域控角色、备份路径、samba-tool子命令上都有细微差别。我一般会先确认系统版本和 Samba 版本,再决定用哪套参数:

# 确认发行版代号,jessie 还是 stretch cat /etc/debian_version lsb_release -a 2>/dev/null # 确认 Samba 主版本,4.2 和 4.5 的配置项默认值不同 smbd --version samba-tool --version

/etc/debian_version在 Jessie 上返回8.x,Stretch 上返回9.x;smbd --version会打印类似Version 4.2.14-Debian或4.5.16-Debian。这两条信息决定了后面smb.conf里server max protocol要不要显式写、ntlm auth要不要打开。脚本本身不挑版本,但它调用的samba-tool子命令在 4.2 和 4.5 之间参数名有变化,所以装之前先把版本钉死,比装完再救省事得多。

2.2 依赖清单和安装命令

Samba 4 域控和这套备份脚本依赖的东西不多,但少一个就会在某个环节翻车。常见做法是把下面这组包一次装齐:

# 更新索引后安装 Samba 4 及脚本依赖 apt-get update apt-get install -y samba samba-common-bin smbclient \ rsync cron tar gzip # 如果这台机器要当域控,还需要这些 apt-get install -y krb5-user libpam-winbind libnss-winbind \ attr acl

samba是主服务包,samba-common-bin提供smbclient、smbpasswd等工具,smbclient单独列出来是因为有些最小化镜像里它不在依赖链上。rsync和tar、gzip是备份脚本的核心,脚本里做 sysvol 同步和打包全靠它们。krb5-user在配域控时用于 Kerberos,libpam-winbind和libnss-winbind让系统账户能和域账户对上,attr、acl则是保留文件权限和扩展属性的关键——备份 sysvol 时如果丢了 ACL,恢复出来的共享权限全是错的,这个坑后面还会提。

提示:Jessie 的apt-get源如果已经归档,需要先把/etc/apt/sources.list指向归档地址再apt-get update,否则装到一半报 404。Stretch 同理,装之前先确认源可用。

2.3 脚本放哪、权限怎么给

这套脚本是 Shell 写的,拿到之后不要随手丢在/tmp里跑。我一般统一放在/usr/local/sbin/samba4-scripts/,属主 root,脚本本身给750,避免普通用户误执行改坏配置:

# 建目录、放脚本、收紧权限 mkdir -p /usr/local/sbin/samba4-scripts cp -a ./samba4-scripts/* /usr/local/sbin/samba4-scripts/ chown -R root:root /usr/local/sbin/samba4-scripts chmod -R 750 /usr/local/sbin/samba4-scripts # 确认脚本首行是 bash,避免 sh 解释器差异 head -n 1 /usr/local/sbin/samba4-scripts/*.sh

chmod 750意味着只有 root 和 root 组能读执行,其他用户连看都看不到,这对含域控凭据的备份脚本是必要的。head -n 1那步别省,Debian 上/bin/sh指向 dash,脚本里如果用了[[ ]]或数组,用sh跑会直接语法报错,确认首行是#!/bin/bash再往下走。

3. 配置 Samba 4 与脚本参数:把路径和凭据写对

3.1 smb.conf 里必须显式写的几项

不管脚本怎么封装,底层还是靠smb.conf和samba-tool。在 Jessie 的 4.2 上,server max protocol默认是SMB3,Stretch 的 4.5 也是,但如果你要和更老的客户端互通,得手动降;反过来,ntlm auth在 4.5 里默认只允许ntlmv2,老设备连不上就是这个原因。我一般会在[global]里显式写死这几项,避免默认值随版本漂移:

[global] workgroup = WORKGROUP server string = Samba4 DC netbios name = DC01 server role = active directory domain controller dns forwarder = 127.0.0.1 # 4.2 和 4.5 都建议显式指定,避免默认值差异 server max protocol = SMB3 # 老客户端需要时再打开,默认保持 ntlmv2 ntlm auth = ntlmv2-only # 备份脚本读取的共享路径 path = /var/lib/samba/sysvol read only = no

server role = active directory domain controller是域控角色的开关,写错成standalone server后面samba-tool domain provision会直接拒绝。dns forwarder指向本机是因为域控通常自带 DNS,转发给上游解析。ntlm auth那行是血泪经验:Stretch 上默认值收紧后,一批老打印机和扫描仪连不上共享,改成ntlmv2-only能兼容大部分设备,实在不行才降到yes,但那等于放开 ntlmv1,安全性打折,能不用就不用。

3.2 脚本的配置文件怎么填

这套脚本一般会读一个独立的配置文件,把域控地址、管理员凭据、备份目录集中管理,而不是硬编码在脚本里。常见做法是在脚本目录下放一个samba4.conf,权限600:

# 脚本配置文件示例,权限必须收紧 cat > /usr/local/sbin/samba4-scripts/samba4.conf <<'EOF' # 域控主机名或 IP DC_HOST="dc01.example.lan" # 域管理员账号,不要用 root DC_ADMIN="Administrator" # 备份输出目录,确保磁盘空间足够 BACKUP_DIR="/backup/samba4" # sysvol 源路径 SYSVOL_PATH="/var/lib/samba/sysvol" # 保留最近几份备份 KEEP_DAYS=7 EOF chmod 600 /usr/local/sbin/samba4-scripts/samba4.conf

DC_HOST填域控的 FQDN 或 IP,脚本里smbclient连的就是它;DC_ADMIN用域管理员而不是本地 root,因为samba-tool的域操作认的是域账户。BACKUP_DIR要提前mkdir -p并确认剩余空间,sysvol 里全是策略文件和脚本,体积不大但文件数多,rsync同步时 inode 消耗比空间更值得关注。KEEP_DAYS=7是保留策略,脚本按天打目录,超过 7 天的自动清理,这个值按你的合规要求改,别拍脑袋写 30 又忘了磁盘只有 20G。

3.3 域控初始化与脚本首次运行

如果这台机器还没 provision,先跑域控初始化,再让脚本接管备份。初始化命令在两个版本上基本一致,但域名和密码要一次写对:

# 停止服务后做域控初始化,域名按实际改 systemctl stop smbd nmbd winbind samba-tool domain provision \ --use-rfc2307 \ --realm=EXAMPLE.LAN \ --domain=EXAMPLE \ --server-role=dc \ --dns-backend=SAMBA_INTERNAL \ --adminpass='YourStrongPassw0rd!' # 把生成的 krb5.conf 放到系统位置 cp /var/lib/samba/private/krb5.conf /etc/krb5.conf # 启动服务并设为开机自启 systemctl unmask samba-ad-dc systemctl enable samba-ad-dc systemctl start samba-ad-dc

--use-rfc2307让 Samba 在 AD 里存 Unix 属性,后面和 Linux 客户端对接时省事;--dns-backend=SAMBA_INTERNAL用内置 DNS,不依赖外部 bind,单机域控首选。--adminpass的密码要满足复杂度,太简单会直接报错退出。初始化完krb5.conf必须拷到/etc/,否则kinit和samba-tool的域认证会失败。服务名是samba-ad-dc而不是smbd,这点在 Debian 上容易搞混,systemctl start smbd起的是普通文件服务,域控要走samba-ad-dc。

初始化通过后,再跑脚本的备份子命令做首次验证:

# 首次手动跑备份,观察输出 /usr/local/sbin/samba4-scripts/backup-sysvol.sh --config /usr/local/sbin/samba4-scripts/samba4.conf # 看备份目录是否按日期生成 ls -lh /backup/samba4/

脚本正常会打印同步了多少文件、打包到哪个 tar,ls能看到类似20250101/的日期目录。如果卡在smbclient认证,先回头查samba4.conf里的DC_ADMIN和密码,再确认kinit Administrator能不能拿到票据。

4. 避坑与排查:五条装完才发现的坑

4.1 现象:smbclient 报 NT_STATUS_CONNECTION_REFUSED

原因多半是服务没起对。Debian 上 Samba 4 域控的服务单元是samba-ad-dc,很多人习惯性systemctl start smbd,结果smbd起来了但域控端口 389、445 的监听不全。解决是先systemctl status samba-ad-dc看状态,再ss -tlnp | grep -E '389|445'确认端口,没监听就systemctl restart samba-ad-dc,还不行看journalctl -u samba-ad-dc -n 50里的具体报错。

4.2 现象:备份出来的 sysvol 恢复后权限全乱

原因是rsync没带 ACL 和扩展属性参数。sysvol 里的组策略依赖 ACL 决定谁能读,普通rsync -a只保留基本权限,ACL 和xattr全丢。解决是脚本里同步命令必须带-AX:

# 保留 ACL 和扩展属性,sysvol 备份必须带 -AX rsync -aAX --delete "$SYSVOL_PATH/" "$BACKUP_DIR/$TODAY/sysvol/"

-A保留 ACL,-X保留扩展属性,--delete让备份和目标严格一致。少了-AX,恢复时samba-tool不报错,但客户端访问策略会莫名其妙被拒,排查起来非常玄学。

4.3 现象:Stretch 上老设备连不上共享

原因是 4.5 的ntlm auth默认只允许 ntlmv2,老设备只会 ntlmv1。解决是在[global]里显式写ntlm auth = ntlmv2-only先试,仍不行才临时改yes,并在改完后用smbclient -L从老设备侧验证。改yes等于放开弱认证,只在内网隔离环境用,用完记得改回。

4.4 现象:脚本跑一半报 command not found

原因是脚本用了 bash 特性但被 dash 解释,或者依赖包没装全。解决是先head -n 1确认 shebang 是#!/bin/bash,再bash -n script.sh做语法检查,最后dpkg -l | grep -E 'rsync|smbclient'确认依赖在。Debian 的/bin/sh是 dash,直接sh script.sh跑 bash 脚本必翻车。

4.5 现象:备份目录越积越大,磁盘告警

原因是KEEP_DAYS设太大或清理逻辑没生效。解决是先du -sh /backup/samba4/*看每天体积,再确认脚本的清理分支真的在跑——有些脚本把清理写在if里但条件写反了。我一般会额外加一条 cron 兜底:

# 每天凌晨 2 点备份,3 点清理 7 天前目录 0 2 * * * /usr/local/sbin/samba4-scripts/backup-sysvol.sh --config /usr/local/sbin/samba4-scripts/samba4.conf >> /var/log/samba4-backup.log 2>&1 0 3 * * * find /backup/samba4 -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;

cron 里重定向日志别省,出问题时/var/log/samba4-backup.log是唯一的黑匣子。

5. 装完怎么验证:三条命令确认真的跑通

装完不等于跑通,我一般用三条命令做收尾验证,缺一条都不算完。第一条验域控本身,第二条验脚本备份产物,第三条验恢复可用性——备份不验证恢复,等于没备份。

# 1. 域控健康检查:看域信息能否正常拉出 samba-tool domain level show samba-tool domain info 127.0.0.1 # 2. 备份产物检查:日期目录、文件数、tar 完整性 ls -lh /backup/samba4/ find /backup/samba4/$(date +%Y%m%d) -type f | wc -l tar -tzf /backup/samba4/$(date +%Y%m%d)/sysvol.tar.gz > /dev/null && echo "tar ok" # 3. 恢复演练:解到临时目录比对关键文件 mkdir -p /tmp/sysvol-restore tar -xzf /backup/samba4/$(date +%Y%m%d)/sysvol.tar.gz -C /tmp/sysvol-restore diff -r /var/lib/samba/sysvol /tmp/sysvol-restore/sysvol | head

samba-tool domain level show能打印出 domain 和 forest 的功能级别,说明域控数据库可读;domain info连本机 127.0.0.1 能返回域信息,说明 LDAP 和内部 DNS 链路通。第二步的find | wc -l给出文件数,和源目录find /var/lib/samba/sysvol -type f | wc -l对比,数量对不上就是同步漏了;tar -tzf只列不解,能过说明包没损坏。第三步的diff -r是最实在的验证,解出来的 sysvol 和源目录比对,没有输出或只有时间戳差异才算过。

下面这张表是我验证时对照用的,出问题按行排查:

验证项命令通过标准失败先看
域控服务systemctl status samba-ad-dcactive (running)journalctl -u samba-ad-dc
端口监听ss -tlnp | grep -E '389|445'有 LISTEN服务是否起对
域信息samba-tool domain info 127.0.0.1返回域 DNkrb5.conf路径
备份文件数find ... -type f | wc -l与源目录一致rsync是否带-AX
包完整性tar -tzf ... > /dev/null无报错磁盘空间、gzip
恢复比对diff -r 源 解压目录无实质差异ACL、路径拼接

有一次我只跑了前两条就以为万事大吉,结果三个月后真要恢复时发现 tar 里少了Policies子目录——原因是脚本里rsync的源路径末尾少了斜杠,同步的是目录本身而不是内容。从那以后我每次装完这套脚本,都强制把上面三条验证走一遍,尤其是diff -r那步,宁可多花五分钟,也不想在真出事时才发现备份是空的。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询