☰
Debian Samba 4域控巡检与sysvol备份脚本实践
2026/11/6 3:52:43 网站建设 项目流程

简介:面向在 Debian Jessie 或 Stretch 上维护 Samba 4 AD-DC 的运维人员与自建域环境爱好者,这套脚本集合围绕日常备份、权限与 ACL 核查、域信息查看、DNS 批量配置及故障信息收集等场景,提供可直接参考和复用的命令行工具与操作记录。zip 压缩包共 25 个文件,以 12 个 Shell 脚本和 9 个 txt 说明为主,另有 3 个 Markdown 文档与 1 个 backup_samba4 文件,整体约 71KB,体量轻便,便于随取随用。已有约 250 人学习,说明其在 Samba 4 运维圈具有一定参考价值。读者可按主题查阅脚本实现、对照 howto 文档理解配置思路,并借鉴检查、排错与备份流程,减少重复摸索成本。

1. 从一台 Jessie 旧机说起:版本没对齐,Samba 4 的备份等于没做

在 Debian 上搭 Samba 4 域控,最麻烦的地方通常不在provision那一步,而在于装完之后,维护脚本没有跟系统版本对齐。Debian Jessie 和 Debian Stretch 这两个代号只差一代,但仓库里 Samba 4 的打包方式、服务单元名、krb5 默认配置路径都不一样。同一份 howtos 直接照搬过去,经常卡在启动服务或者备份还原上。

这套 samba4 脚本集合是 Shell 写的,作者明确说在 Debian Jessie 和/或 Debian Stretch 上测过,核心功能就是两样:samba-info 负责巡检,backup-script 负责备份 sysvol。它适合已经在跑 AD DC、备份还靠手工敲命令的人,也适合第一次搭域控、不想在排错上耗一晚上的新手。装不好最典型的后果是:备份目录里文件一个不少,真出事那天却一个都还原不回去。

2. 环境准备:Debian Jessie 与 Stretch 的包名差异和仓库配置

装 Samba 4 脚本之前,先花十分钟把系统层面弄清楚。这一步在图省事的人眼里是多余的,但脚本本身只是外壳,真正决定成败的是它调用的samba-tool、smbclient、systemctl在你这台机器上是不是同一个版本体系里的东西。Jessie 和 Stretch 的差异主要集中在三块:Samba 包的分组、systemd 单元的组织方式,以及 Kerberos 配置文件的默认落点。先把这三块确认掉,后面再谈脚本怎么跑。

2.1 先把版本对齐再谈安装

不要急着apt-get install samba,先看清楚这台机器到底是什么。发行代号决定了仓库里的 Samba 4 在哪个分支上,也决定了后面systemctl能不能用samba-ad-dc这个单元名。常见的做法是先读系统标识,再看包策略:

# 发行代号:Jessie 对应 8,Stretch 对应 9 cat /etc/os-release # 架构,后面判断是不是要装 amd64 之外的东西 uname -m # 关键:看清楚仓库里的 samba 来自哪个源、候选版本是什么 apt-cache policy samba apt-cache policy winbind

apt-cache policy这三行的输出信息量比samba -V大得多。它会告诉你候选包来自jessie/main、stretch/main,还是被人手工加进去的 backports 源。我见过不止一次装不起来的环境,原因就是有人为了一个依赖把 backports 源加进去,结果 samba 和 samba-libs 来自两个不同的分支,samba-tool一跑就报符号找不到。

提示:如果apt-cache policy samba显示存在多个来源,并且已安装版本与候选版本不一致,先不要升级,先记录当前状态。域控上的 Samba 升级属于变更操作,不是修修补补。

两个发行版在包结构上的差别,对脚本影响最直接的是这几点:

能力Jessie 上的常见形态Stretch 上的常见形态
主服务单元依赖 SysV 脚本或samba-ad-dc服务以samba-ad-dc.service为主
winbind 相关库拆成独立包,需要单独装同样拆包,但依赖关系更明确
ACL / xattr 支持需装samba-vfs-modules需装samba-vfs-modules
Kerberos 客户端krb5-user必装krb5-user必装

这张表的用法不是让你背下来,而是装之前先确认。脚本里的备份逻辑会用到rsync -aHAX,-A和-X分别要求目标文件系统支持 ACL 和扩展属性;如果samba-vfs-modules没装全,后面 sysvol 里的 ACL 在备份和还原之间就会悄悄丢失。这类问题不会在备份时报错,只会在还原后客户端访问共享时报“拒绝访问”,排查起来极其费时。

2.2 依赖清单与 apt 安装

确认完版本,再一次性把依赖装齐。分开装也不是不行,但每装一个包就apt-get autoremove一次,在域控上属于自找麻烦。我一般会先更新索引,再用一条命令把整套装完:

apt-get update apt-get install -y --no-install-recommends \ samba \ samba-common-bin \ samba-vfs-modules \ smbclient \ winbind \ libnss-winbind \ libpam-winbind \ krb5-user \ dnsutils \ acl \ attr \ rsync \ chrony

逐项说一下为什么是这些:

  • samba和samba-common-bin提供samba-tool、smbpasswd这些脚本要调用的入口,缺一个脚本就会在开头几行直接退出。
  • samba-vfs-modules是 ACL 和扩展属性能力的来源,备份脚本里rsync -aHAX的-A、-X靠它兜底。
  • smbclient用于验证共享是否可达;很多验证步骤只有它能给出直观输出。
  • winbind、libnss-winbind、libpam-winbind让系统能解析域用户,脚本里如果涉及getent passwd之类的检查会用到。
  • krb5-user提供kinit、klist,是 Kerberos 自检的必备工具。
  • acl、attr提供getfacl、setfacl、getfattr,还原演练时用来确认权限真的回来了。
  • rsync和chrony分别对应备份和时间同步。

装完之后立刻做一件事:把 winbind 接进名称服务解析链。否则getent passwd永远查不到域用户,你会以为是 Samba 出了问题,其实是 nsswitch 没配。

# /etc/nsswitch.conf 里这两行必须带 winbind # passwd: compat winbind # group: compat winbind sed -i 's/^passwd:.*/passwd: compat winbind/' /etc/nsswitch.conf sed -i 's/^group:.*/group: compat winbind/' /etc/nsswitch.conf grep -E '^(passwd|group):' /etc/nsswitch.conf

sed这两行的作用是把原来的compat或files后面补上winbind,让 NSS 在本地文件查不到时继续向 winbind 询问。改完必须重启 winbind 才生效,但顺序上要等服务单元那一步再统一重启,现在只改配置不改状态。

2.3 主机名、时区与 DNS 回环

这三件事在装域控时经常被当成小事,实际是最影响首次启动的关键步骤。主机名不是 FQDN,provision之后的 DNS 记录会缺;/etc/resolv.conf指向外部 DNS,Kerberos 会一直失败;时间和上游差几分钟,kinit直接报时钟偏移。三样一起配,顺序是先主机名、再时间、最后 DNS:

# 1. 主机名必须是短名 + FQDN 同时在 /etc/hosts 里 hostnamectl set-hostname dc01 cat > /etc/hosts <<'EOF' 127.0.0.1 localhost 127.0.1.1 dc01.corp.example.local dc01 EOF # 2. 时间同步,只保留一个时间服务,不要 chrony 和 timesyncd 同时开 timedatectl set-timezone Asia/Shanghai systemctl disable --now systemd-timesyncd 2>/dev/null || true systemctl enable --now chrony chronyc sources -v # 3. DNS 回环:域控自己就是 DNS,resolv.conf 必须指向本机 cat > /etc/resolv.conf <<'EOF' nameserver 127.0.0.1 search corp.example.local EOF

hostnamectl set-hostname只改静态主机名,/etc/hosts里那行127.0.1.1是让本机能把 FQDN 解析回自己。很多provision失败其实就出在这一行:samba-tool在创建_msdcs记录时需要反查本机名,/etc/hosts里没有 FQDN,它就找不到。chronyc sources -v里要看的是^*标记,有星号才说明当前有生效的同步源。DNS 那一步写成127.0.0.1而不是上游地址,是因为 AD DC 的 SRV 记录由自己托管,指向外部 DNS 时所有_ldap._tcp查询都会落空。

注意:chrony和systemd-timesyncd同时启用会互相抢时钟控制权,表现为chronyc sources时有时无。两个只能留一个。

3. 部署域控:从 provision 到 smb.conf 的参数取舍

环境准备完之后,核心动作是samba-tool domain provision。这个命令的参数看着不多,但每一个都决定了后面脚本能不能正常工作。Realm 写错,Kerberos 主体全对不上;DNS 后端选错,samba-tool dns这类命令直接不可用;服务单元启错,445 端口会被另一个进程占着。这一步我一般会放慢速度,在测试机上跑一遍再上生产。

3.1 provision 之前先定死四个参数

这四个参数没有默认值可依赖,必须提前想清楚:--realm、--domain、--dns-backend、--adminpass。Realm 用大写域名形式,Domain 用短的 NetBIOS 名,DNS 后端选SAMBA_INTERNAL(由 Samba 自己托管 DNS,不依赖外部 BIND),管理员密码要符合复杂度要求,否则provision会在最后一步拒绝。

# 备份已有配置,provision 会覆盖 /etc/samba/smb.conf cp -a /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date +%F) 2>/dev/null || true samba-tool domain provision \ --realm=CORP.EXAMPLE.LOCAL \ --domain=CORP \ --server-role=dc \ --dns-backend=SAMBA_INTERNAL \ --adminpass='ChangeMe_2024!'
  • --realm=CORP.EXAMPLE.LOCAL:Kerberos 域,全大写,脚本里凡是有@CORP.EXAMPLE.LOCAL的地方都依赖它。
  • --domain=CORP:NetBIOS 名,登录时CORP\administrator用的就是它,长度不要超过 15 个字符。
  • --server-role=dc:明确这台机器是域控,不是成员服务器。脚本里的samba-tool domain系列命令只有在 DC 角色下才有意义。
  • --dns-backend=SAMBA_INTERNAL:让 Samba 内置 DNS 接管解析,省掉再维护一套 BIND 的麻烦;如果要接外部 DNS,这里换成BIND9_DLZ,但同时得改 BIND 配置。
  • --adminpass:这个密码后面要在kinit、smbclient里反复用,别设成带特殊字符又没人记得住的组合。

provision成功后,第一件事是把生成的krb5.conf拷到系统路径。Samba 会在/var/lib/samba/private/下生成一份,路径和系统默认的不一样,不拷过去的话kinit会一直报找不到 realm。

# 先备份系统原有配置,再覆盖 cp -a /etc/krb5.conf /etc/krb5.conf.bak.$(date +%F) 2>/dev/null || true cp /var/lib/samba/private/krb5.conf /etc/krb5.conf # 验证 Kerberos 配置是否能拿到票据 kinit administrator@CORP.EXAMPLE.LOCAL klist

klist输出里能看到krbtgt/CORP.EXAMPLE.LOCAL@CORP.EXAMPLE.LOCAL这行,说明票据链路通了。这一步失败的话,后面所有依赖认证的脚本都跑不起来,必须先解决再往下走。

3.2 smb.conf 只改必要的那几行

provision生成的smb.conf已经能用,但实际部署时要补几项:接口绑定、DNS 转发、日志。不要大改,改多了反而会让samba-tool的某些检查失效。

[global] workgroup = CORP realm = CORP.EXAMPLE.LOCAL netbios name = DC01 server role = active directory domain controller dns forwarder = 192.0.2.1 interfaces = lo eth0 bind interfaces only = yes log level = 1 auth:3 log file = /var/log/samba/log.%m max log size = 1000 [sysvol] path = /var/lib/samba/sysvol read only = no [netlogon] path = /var/lib/samba/sysvol/corp.example.local/scripts read only = no
  • server role = active directory domain controller:这一行是 DC 模式的开关,缺了它samba-ad-dc启动会退化成普通文件服务器。
  • dns forwarder:填现场实际可用的上游解析地址。留空也能跑,但客户端解析外网域名会失败。
  • interfaces和bind interfaces only:只监听回环和内网网卡,避免多网卡机器上把服务暴露到不该暴露的网段。这两个参数名要写对,interfaces是复数,写错会静默失效。
  • log level = 1 auth:3:认证相关日志提到 3 级,排查登录失败时有用;全局保持 1 级,避免日志量把磁盘吃掉。
  • [sysvol]和[netlogon]两段的path必须和provision生成的路径一致,脚本备份的对象就是这两个目录。

提示:[netlogon]的路径里带的是小写 realm,provision生成的就是小写。手工改成大写会让登录脚本找不到。

3.3 服务单元的启用顺序与首启自检

Debian 上最容易出问题的一步:smbd、nmbd、winbind和samba-ad-dc不能同时跑。前三个是成员服务器/文件服务器模式的组件,DC 模式下应该全部停掉,只保留samba-ad-dc。

# 1. 先停掉非 DC 模式的三个服务,并取消开机自启 systemctl disable --now smbd nmbd winbind 2>/dev/null || true # 2. 启用 DC 服务单元 systemctl unmask samba-ad-dc systemctl enable samba-ad-dc systemctl start samba-ad-dc # 3. 看状态,重点是 Active 和 445 端口 systemctl status samba-ad-dc --no-pager ss -lntp | grep -E ':(53|88|389|445)\b'

systemctl unmask那行是为了处理一种情况:有些镜像里samba-ad-dc被 mask 掉了,enable会直接失败,报Unit is masked。ss -lntp的输出要能看到 53、88、389、445 四个端口都在监听。如果 445 被别的进程占着,systemctl status里会有Address already in use,这时候要查是谁占的,而不是反复重启服务。

如果所在环境是 Jessie 且samba-ad-dc.service不存在,会报Unit samba-ad-dc.service not found。这种情况下走 SysV 脚本:

# Jessie 上部分环境只有 init 脚本 ls -l /etc/init.d/samba-ad-dc 2>/dev/null && invoke-rc.d samba-ad-dc start

启动完立刻做一次本地自检,别等到配完脚本才发现域控本身没起来:

# 域级别与功能级别 samba-tool domain level show # 用户列表,能看到 Administrator 就说明数据库正常 samba-tool user list # DNS 记录查询,看 _ldap._tcp 的 SRV 记录在不在 samba-tool dns query 127.0.0.1 corp.example.local @ ALL -U administrator

三条命令的输出要能互相对上:domain level show给出的 domain 和 forest 功能级别应该一致;user list至少有一条 Administrator;dns query里要能看到_ldap._tcp、_kerberos._tcp这几条 SRV。缺任何一条,后面的脚本巡检都会报异常。

4. 脚本落地:samba-info 巡检与 backup-script 备份 sysvol 的配置

到这一步域控已经能跑了,接下来是这套资源真正要解决的问题:把巡检和备份从手工敲命令变成两条可重复执行的入口。samba-info 负责在出问题之前告诉你哪里不对,backup-script 负责在出事之后给你一条退路。两个脚本都是 Shell 写的,落地方式一致:放到/usr/local/sbin,给 0750 权限,root 可执行。

4.1 samba-info 脚本怎么放、输出怎么读

脚本不要放在家目录里跑,也不要用sh script.sh的方式调用。放到系统路径下、给可执行权限,才能被 cron 和其他脚本稳定引用:

# 落位与授权 install -o root -g root -m 0750 samba-info.sh /usr/local/sbin/samba-info install -o root -g root -m 0750 backup-script.sh /usr/local/sbin/samba-backup # 检查语法,Shell 脚本上线前必做 bash -n /usr/local/sbin/samba-info bash -n /usr/local/sbin/samba-backup # 跑一次,把输出落盘 /usr/local/sbin/samba-info > /var/log/samba-info.$(date +%F).log 2>&1

install -m 0750而不是cp加chmod,是因为install一步到位设置属主和权限,不会出现中间态。bash -n只做语法检查,不执行,能挡掉大部分因为换行符或引号不配对导致的低级失败。

samba-info 的输出通常是分段落的,读的时候按这个顺序看:

  1. 服务状态段:samba-ad-dc是否 active,四个关键端口是否监听。这一段有问题,后面的都不用看。
  2. 域信息段:domain level、forest level、DC 列表。用于确认这台机器在域里的角色没变。
  3. 共享与 sysvol 段:共享列表、sysvol 目录大小、最近修改时间。sysvol 大小突然掉一半,通常意味着同步或挂载出了问题。
  4. 认证段:kinit是否成功、票据有效期。票据过期时间异常短,往往是时间同步出了偏差。

脚本输出的价值不在于“有没有报错”,而在于趋势。我第一次把它挂进 cron 之后,连续看了两周的日志,才发现 sysvol 的修改时间每周有一天会停住——那是备份窗口和同步任务撞在一起了。

注意:samba-info 是只读巡检,不要在里面加任何samba-tool的写操作。巡检脚本一旦带副作用,出问题时你分不清是环境坏了还是脚本改坏的。

4.2 backup-script 的备份对象与一致性

备份 sysvol 最容易踩的坑不是路径写错,而是在 DC 运行时直接 rsync 整个目录。AD 的 sysvol 底下有 GPO 目录和脚本目录,DC 在线时文件在被写入的瞬间被读走,备份出来的就是半写状态。这种备份平时看不出来,还原时才暴露,属于典型的黑匣子问题。

先确认手上的samba-tool有没有域备份子命令:

# 有 online 子命令就优先用它,这是官方的一致性备份入口 samba-tool domain backup --help 2>/dev/null | head -20

如果有online子命令,备份主体就用它;如果没有(老分支上常见),退回到“配置 + 私有目录 + sysvol 打包”的组合方案,并且明确告诉自己:这不是崩溃一致备份,只能算应急快照。下面这份是我一般用的写法:

#!/bin/bash set -euo pipefail umask 077 BACKUP_ROOT=${BACKUP_ROOT:-/srv/backup/samba} RETENTION=${RETENTION:-7} STAMP=$(date +%Y%m%d-%H%M) DEST="${BACKUP_ROOT}/${STAMP}" LOG="/var/log/samba-backup.log" exec >>"$LOG" 2>&1 echo "=== backup start: ${STAMP} ===" mkdir -p "$DEST" # 1. 配置与私有目录:private 里是密钥材料,缺了它还原出来的域是废的 rsync -aHAX --numeric-ids /etc/samba/ "${DEST}/etc-samba/" rsync -aHAX --numeric-ids /var/lib/samba/private/ "${DEST}/samba-private/" # 2. sysvol:用 tar 抓一份,尽量缩短读写窗口 tar -C /var/lib/samba -cpf "${DEST}/sysvol.tar" sysvol # 3. 记录版本与时间,还原时对号 { samba -V; date -Iseconds; } > "${DEST}/version.txt" # 4. 归档、清理中间目录 tar -C "$BACKUP_ROOT" -czf "${BACKUP_ROOT}/samba-${STAMP}.tar.gz" "$STAMP" rm -rf "$DEST" # 5. 按天清理过期归档 find "$BACKUP_ROOT" -maxdepth 1 -name 'samba-*.tar.gz' -mtime "+${RETENTION}" -delete echo "=== backup done: $(du -h "${BACKUP_ROOT}/samba-${STAMP}.tar.gz" | cut -f1) ==="

几个参数的含义值得单独说:

  • set -euo pipefail:任何一条命令失败、任何变量未定义、管道中间环节失败,脚本立即退出。备份脚本最怕“错了一半还继续跑”,跑完日志显示成功,实际少了一半文件。
  • umask 077:备份产物里包含密钥材料,权限必须是只有 root 能读。
  • rsync -aHAX --numeric-ids:-a归档模式,-H保留硬链接,-A保留 ACL,-X保留扩展属性,--numeric-ids避免 uid/gid 在目标端被重新映射。sysvol 里的 GPO 权限大量依赖 ACL,少一个-A就会在还原后出现权限错乱。
  • tar -C ... -cpf:-C切换目录,-p保留权限,-f指定输出文件。用 tar 而不是 rsync 抓 sysvol,是为了把读写窗口压缩到一次遍历。
  • RETENTION默认 7 天,用-mtime "+${RETENTION}"清理,注意-mtime的粒度是天,别写成小时。

提示:/var/lib/samba/private/里是域密钥,备份归档的权限和存放位置要当作敏感数据对待。别放在 Web 可访问目录,也别用匿名共享往外传。

4.3 挂进 cron 与日志轮转

手工跑通不等于每天都能跑通。cron 环境和登录 shell 的差别,是备份脚本最常见的失败来源:PATH短、HOME不存在、umask不同。用/etc/cron.d显式写死环境变量,比在脚本里猜要可靠。

cat > /etc/cron.d/samba-backup <<'EOF' SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MAILTO="" 0 2 * * * root /usr/local/sbin/samba-backup EOF chmod 0644 /etc/cron.d/samba-backup

/etc/cron.d下的文件格式比crontab -e多一个用户字段,root那一列不能省。MAILTO=""是显式关掉邮件,避免每台机器都往本地投递。时间放在凌晨 2 点,是为了和 sysvol 的同步任务错开;具体几点要看你自己环境里同步窗口落在哪。

日志不轮转的话,一年下来能把/var/log撑满。用 logrotate 加一条:

cat > /etc/logrotate.d/samba-backup <<'EOF' /var/log/samba-backup.log { weekly rotate 8 compress missingok notifempty create 0640 root adm } EOF

rotate 8配合weekly,相当于留两个月。create 0640 root adm让新日志文件继承权限,不然轮转之后新文件可能是 0600,adm组的监控读不到。配完用logrotate -d /etc/logrotate.d/samba-backup做一次 dry run,看解析有没有问题。

5. 踩坑记录:Debian 上跑 Samba 4 脚本的五个高频翻车点

下面这几条都是我在 Jessie 和 Stretch 上真实遇到过、并且在新环境里反复提醒自己检查的。每一条按现象、原因、解决写,照着对号入座比自己从日志里猜快得多。

5.1 安装与首启阶段

现象一:systemctl start samba-ad-dc报Address already in use。

原因是smbd或nmbd还在跑,占着 445 和 139。provision不会自动帮你停掉这些服务,装完samba包之后它们默认就是 enabled 状态。解决是先停再启,并且取消开机自启,否则重启之后又回来:

systemctl disable --now smbd nmbd winbind ss -lntp | grep ':445' systemctl restart samba-ad-dc

现象二:kinit administrator一直提示Cannot contact any KDC。

先查/etc/krb5.conf是不是还指向旧路径或者旧 realm。provision生成的配置在/var/lib/samba/private/krb5.conf,系统路径下那份可能还是安装krb5-user时的模板。第二个要查的是/etc/resolv.conf,指向外部 DNS 时 KDC 的 SRV 记录查不到。解决顺序是先拷配置、再改 DNS 回环、最后重启服务:

cp /var/lib/samba/private/krb5.conf /etc/krb5.conf grep -E 'nameserver|search' /etc/resolv.conf kinit administrator@CORP.EXAMPLE.LOCAL

现象三:provision跑到创建 DNS 记录那一步报错退出。

多数情况下是主机名不是 FQDN,或者/etc/hosts里缺127.0.1.1那行。samba-tool需要反查本机全名来生成_msdcs记录,查不到就中断。解决是把主机名和 hosts 一起改好,删掉残留的/var/lib/samba/重新provision。注意重新provision会覆盖配置,先把smb.conf备份出来。

5.2 运行与备份阶段

现象四:备份文件都在,还原之后客户端访问共享报拒绝访问。

原因是备份时rsync少了-A,或者目标文件系统挂载时没开 ACL 支持。rsync不会在 ACL 丢失时报错,它只是默默地不同步。解决分两步:备份命令补上-aHAX --numeric-ids;还原前先用getfacl抽查一个 GPO 目录,对比源和目标的 ACL 是否一致。

# 还原演练时的抽查命令 getfacl -p /var/lib/samba/sysvol/corp.example.local/Policies 2>/dev/null | head -20

现象五:手工跑备份脚本正常,cron 跑出来是空的。

这是最典型的环境差异。cron 的PATH里没有/usr/local/sbin,HOME指向/root甚至不存在,umask是 022。脚本里调用的samba-tool如果在/usr/local/sbin下,就会报 command not found。解决是在/etc/cron.d里显式写PATH和SHELL,脚本内部再用绝对路径调用关键命令。排查方法很简单:把 cron 那行的命令改成带env > /tmp/cron-env.txt的形式跑一次,对比登录 shell 的env输出。

现象六:kinit偶尔成功偶尔失败,报Clock skew too great。

Kerberos 默认容忍 5 分钟偏差,虚拟机挂起恢复、宿主机时间漂移都会触发。查timedatectl的输出,看System clock synchronized是不是yes。解决是只保留一个时间服务,chrony和systemd-timesyncd二选一,然后强制同步一次:

timedatectl status chronyc makestep chronyc tracking

6. 装完怎么验证:三条命令加一次恢复演练确认真的跑通

装完不等于跑通。域控这类服务的麻烦之处在于,它坏的时候往往不是整个挂掉,而是某一个环节悄悄失效——认证还能过,DNS 少了一条记录;共享还能访问,sysvol 的 ACL 已经不对。所以验证要分层做,从服务层、认证层到数据层,每条命令对应一个明确的检查目标。

先做服务层和认证层的三件事,输出对不上就别急着往下:

# 1. 域功能级别,domain 和 forest 应该一致 samba-tool domain level show # 2. 认证链路,klist 里要能看到 krbtgt 票据 kinit administrator@CORP.EXAMPLE.LOCAL && klist # 3. 共享可达性,-U% 表示匿名列举,能列出 netlogon 和 sysvol 就说明服务在 smbclient -L localhost -U%

domain level show的输出里,Domain function level和Forest function level不一致时,说明provision时的参数和后来改的smb.conf有冲突。klist里票据的Expires时间应该在 10 小时左右,如果只有几分钟,回去查时间同步。smbclient -L如果报NT_STATUS_CONNECTION_REFUSED,问题在服务层,不用再往下看数据层。

数据层的验证靠一次真实的恢复演练,这一步不能省。把最近一份备份解开,用getfacl和ls对比源目录:

检查项命令期望结果
归档完整性tar -tzf samba-*.tar.gz | head能列出目录结构,无unexpected EOF
sysvol 文件数tar -tf sysvol.tar | wc -l与源目录find计数一致
ACL 保留getfacl -p <还原路径>/Policies能看到group:BUILTIN\administrators之类条目
版本对号cat version.txtSamba 版本与当前机器一致或明确记录差异
# 恢复演练:解到临时目录,只比对不覆盖 mkdir -p /tmp/restore-test tar -C /tmp/restore-test -xzf /srv/backup/samba/samba-20240101-0200.tar.gz # 比对 sysvol 条目数,两个数字应该一样 tar -tf /tmp/restore-test/*/sysvol.tar | wc -l find /var/lib/samba/sysvol -mindepth 1 | wc -l

两个数字对不上,就说明备份抓取的那一刻有文件正在写入,或者tar的-p没生效导致权限差异。这时候要做的不是重跑备份,而是回去看备份窗口和同步任务的时间是否重叠。

注意:恢复演练永远解到临时目录,不要直接往/var/lib/samba/上覆盖。演练的目的是验证备份可用,不是制造第二次事故。

从那以后我每次新装一台 DC,都会在交付前强制走一遍这三条命令加一次解包比对,不管当天多晚。因为域控这种东西,平时不出声,出事就是全公司登不上。这套 samba-info 加 backup-script 的组合,价值不在于代码有多少行,而在于它把“巡检”和“有退路”变成了两条每天自动执行的命令。希望帮到你。

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

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

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

立即咨询