我们有一个运行 DNS(和一些其他服务)的 Mac OS X 10.5.8 服务器。
当我连接到它(使用 Server Admin 10.5.3 [来自 Server Admin 10.5.7 工具])并单击查看 DNS 设置时,一切看起来都很正常 - 它显示许多反向条目和两个顶级域。但是,当我选择我们的一个域并打开三角形时,列表是空的![应该有十几个条目,并且反向条目确实会显示出来。] 如果我告诉它我想向域添加 A 记录,几乎所有东西都会消失 - 我只剩下一个显示我们两个域的列表,一个域下面有一个三角形,显示一个条目,一个反向条目与新的 A 记录相对应。
named
似乎运行正常。DNS 名称解析。似乎只是服务器管理员在计算机上的数据方面遇到了问题。这里没有人会手动创建 DNS 条目。
现在,虽然我认为我已经备份了 DNS(我备份了/var/named/
、/etc/named.conf
和/etc/dns/
,如上所述这里),如果出现问题,我真的不确定仅替换文件是否能恢复我们拥有的 DNS 设置。我正在考虑进入设置并将日志级别从“信息”更改为“调试”,但 1) 我只是有点担心它可能会将错误的配置写入磁盘,2) 我认为这只会影响named
服务器管理而不会影响服务器管理,而且据我所知,named
没有问题。(当我通过控制台/终端打开 /Library/Logs/named.log 时,它看起来没有什么异常。但奇怪的是,当我单击服务器管理中 DNS 的“日志”按钮时,我看不到任何文本,只有一个完全白色的窗口。当我查看我们的一个辅助 DNS 服务器时,我能够通过服务器管理查看日志文件。)
当我在服务器上运行 Server Admin 时,系统日志中出现以下条目:
Jun 17 09:02:08 od1 Server Admin[3892]: Unexpected call to doMarkConfigurationAsDirty by 'DNS' plugin during updateConfigurationViewFromDescription
在我查看了 DNS、查看了另一项服务,然后单击回 DNS 后,似乎发生了这种情况。
认为最可能的原因是配置文件损坏,我浏览了我备份的所有文件,没有一个是明显的乱码。
以下是我从远程计算机运行服务器管理来管理 DNS 时发现的一些奇怪现象。
当我单击查看 DNS 的日志文件时,服务器开始将如下消息写入其 system.log:
Jun 17 09:59:04 od1 kernel[0]: Limiting open port RST response from 252 to 250 packets per second Jun 17 09:59:06 od1 kernel[0]: Limiting open port RST response from 258 to 250 packets per second
当我点击其他服务时,此过程会停止。
不确定的进度指示器(服务器管理右下角“恢复”和“保存”按钮旁边的旋转轮)看起来非常奇怪。据我所知,它不是只是旋转和等待,而是被告知开始反复旋转,导致动画不流畅。
以下是运行 Server Admin 的计算机上记录的一些消息:
启动时:
*** ERROR: -[GRAxes computeLayout]:1124 - plotRect height = 0.000000 <= 0.0 ***
*** ERROR: -[GRChartView computeLayout]:1194 - Layout for overlay axes (0x18758f50) failed. ***
(这些消息不会太让我担心,因为如果你删除 ~/Library/Preferences/com.apple.ServerAdmin.plist,它们就会消失一段时间)。
关机时:
2010-06-17 10:02:17.202 Server Admin[7770:10b] *** -[GroupTextField windowDidResignKey:]: unrecognized selector sent to instance 0x16e12490
更令人担忧的是这些信息:
2010-06-17 09:59:47.269 Server Admin[7770:10b] Unexpected call to doMarkConfigurationAsDirty by 'DNS' plugin during updateConfigurationViewFromDescription
Server Admin(7770,0xb0453000) malloc: *** error for object 0x1c115390: double free
*** set a breakpoint in malloc_error_break to debug
2010-06-17 10:01:00.795 Server Admin[7770:10b] *** -[ServiceEntry sessionHost]: unrecognized selector sent to instance 0x2af500
有任何想法:
- 问题是什么
- 我该如何解决它
- 或者如何修复它?
如果我确实需要清除 DNS 并重新启动,有什么好方法吗?
答案1
我的猜测是区域文件中的一些内容的格式与服务器管理员(好吧,技术上是 servermgrd)所期望的格式稍有不同——我发现它因为一些简单的事情而感到困惑,例如字段之间的空格数“错误”。
为了排除故障,我建议从 SOA 记录下的区域文件(/var/named/zones 中的文件)中删除所有内容,但 NS 记录除外(您说您有备份,对吗?)。它应该看起来像这样:
;GUID=34FEA604-B204-A7D7-95A5-B6D812B46454
$TTL 10800
example.com. IN SOA server.example.com. admin.example.com (
2010042600 ;Serial
86400 ;Refresh
3600 ;Retry
604800 ;Expire
345600 ;Negative caching TTL
)
example.com. IN NS server.example.com.
注意:我不确定,但我认为文件末尾必须有一个空白行。如果您需要在故障排除时保留正常的 DNS 服务,则可以将其他记录移至另一个区域文件(/var/named 中的文件),其中 named 会正常读取它们,但 servermgrd 不会查看。
无论如何,将区域文件缩减到最小后,退出并重新启动服务器管理,看看它是否正常运行(即,您可以查看日志、向区域添加条目等)。如果它正常工作,请尝试将记录一点一点地重新添加到 /var/named/zones 文件中——我怀疑其中一个或多个有点奇怪,如果您将其忽略(即从服务器管理中重新创建它,而不是直接添加到区域文件),您可能会让事情恢复正常。
答案2
我在我们的 MacOS X 10.5 服务器上发现并修复了类似的问题。
原来是 DNS 区域文件之一的文本字段中的括号字符“(”和“)”。我在命令行中使用文本编辑器删除了括号,现在服务器管理又可以正常工作了。
在 10.5 上,区域文件位于/var/named/zones
。
使用 grep 扫描区域文件中的“)”字符:
sudo grep -R --include "*" \) .
滚动查看输出并查找任何异常。(所有区域文件的顶部都有一个左括号和右括号;您要在文件中查找记录。)如果您没有找到任何内容,您可能还需要 grep 查找左括号。
找到可疑文件后,打开它进行编辑:
sudo nano db.mydomain.zone.apple
找到有问题的行并删除括号字符。保存并关闭。重新启动服务器管理员。
可能还有其他令人反感的字符,但就我而言,一直是括号。
答案3
周五,我决定拆除 DNS 并重建它。(叹气)。
我发现最好的重新开始指导这里,尽管我发现我必须做比那里所说的更多的事情。
首先,我备份了 DNS(如上面的问题中所述)。
我关闭了 DNS。(好吧,我本来是想关闭的。我稍后再关闭它,但此时我认为应该关闭它。)
我进行了编辑/etc/dns/publicView.conf.apple
,删除了我们创建的所有区域的名称,同时保留了我们未创建的区域。以下是文件,中间有一个大注释,所有区域都位于其中。(我实际上并没有在文件中放置注释;我只是删除了条目)。
acl “com.apple.ServerAdmin.DNS.public” {192.168.1.254;192.168.5.254;192.168.10.254;192.168.15.254;192.168.20.254;192.168.25.254;192.168.30.254;192.168.35.254;192.168.40.254;192.1 68.45.254;192.168.55.254;192.168.75.254;192.168.70.254;192.168.80.254;本地网络;192.168.65.251;192.168.65.185;192.168.80.0;192.168.65.253;}; // // 这是服务器管理中显示的视图 // 这是一个自动生成的文件。 // 请不要手动修改此文件! // 请在 named.conf 文件中做出更改 // 查看“com.apple.ServerAdmin.DNS.public”{ //GUID=3EA358EF-5C55-4619-98D0-5004B310D1B0; 允许递归 {“com.apple.ServerAdmin.DNS.public”;}; // ------------------------------------------------------------- // 我们创建的文件中有多个区域 // 我把它们全部删除了。 // 以下区域看起来不像我们创建的区域,所以我离开了 // 保持原样 // ------------------------------------------------------------- 区域“。”{ 类型提示; 文件“named.ca”; }; 区域“localhost”IN { 類型主屬; 文件“localhost.zone”; 允许更新 { 无; }; }; 区域“0.0.127.in-addr.arpa”在{ 類型主屬; 文件“named.local”; 允许更新 { 无; }; }; };
完成上述操作并重新启动 DNS 后,服务器管理员仍然不满意。再次关闭 DNS,我进入/var/named
和/var/named/zones
文件夹并删除了我们创建的所有文件。之前(和之后)的列表/var/named
如下所示:
db.100.168.192.in-地址.arpa。 db.15.168.192.in-地址.arpa。 db.20.168.192.in-地址.arpa。 db.203.244.66.in-地址.arpa。 db.34.168.192.in-地址.arpa。 db.40.168.192.in-地址.arpa。 db.5.168.192.in-地址.arpa。 db.55.168.192.in-地址.arpa。 db.65.168.192.in-地址.arpa。 db.75.168.192.in-地址.arpa。 db.somedomain.ab.ca。 db.anotherdomain.net。 本地主机区域 命名 命名的本地 区域/
我保留了localhost.zone
、named.ca
和named.local
文件zones
夹,并删除了其他所有内容。(sudo rm db*
)。
该/var/named/zones
文件夹看起来非常相似,但似乎不包含任何未由服务器管理员创建的文件,因此sudo rm db*
删除了所有内容。
此时,我重新启动了 DNS(并且可能重新启动)并可以再次使用服务器管理员。
现在我必须重新填充所有 DNS 条目。幸运的是,备份/var/named/db.{$DOMAIN}.
(每个域一个文件)清楚地说明了重新创建域需要做什么,只需列出主机名称、记录类型和 IP 地址,例如:
... 筒仓 IN A 192.168.100.254 旧 IN A 192.168.100.116 psmain IN A 192.168.100.121 邮件 IN CNAME ghs.google.com。 ...
当我重新创建两个域的进度达到三分之二时,服务器管理员突然出现了和我刚开始时相同的问题 —— 即无法再使用它来显示或编辑区域。哦,天哪!
我输入的最后一个主机条目是ftp
。我决定看看它是否出现在任何文件中:
$cd /private/var/named/zones $grep -R --include “*” ftp 。 ./db.somedomain.ab.ca.zone.apple:ftp 在 192.168.100.254 中 ./db.somedomain.ab.ca.zone.apple:ftp IN TXT “原先指向网络服务器 (192.168.100.116),现在指向 silo (192.168.100.254)。”
我删除了这两行,服务器管理员就又高兴了。(谢天谢地)。
问题似乎出在 ftp 服务器的注释上。(我们使用的注释很少;只有两个,而且我看不出有什么理由不创建它们。我相信以后我会更加小心。)也许是因为注释中包含了 IP 地址。
(也存在一种可能性,即 ftp 服务器作为一台已经有 A 记录的机器的 A 记录,从而导致了问题,但我认为这不太可能。)
我将 ftp 条目重新创建为 CNAME,并且没有添加注释。
后来想想,更改 ftp 服务器条目很可能是我们几周前对 DNS 所做的最后一次更改。
我完成了所有主机的重新安装,并检查了我的工作:
mkdir DNSDiff && cd DNSDiff
# repeat for each domain
cat /path/to/backup/var/named/zones/db.somedomain.ab.ca.zone.apple | sort > old.somedomain.txt
cat /var/named/zones/db.somedomain.ab.ca.zone.apple | sort new.somedomain.txt
diff --side-by-side {old,new}.somedomain.txt
# or, with TextWrangler,
twdiff *.somedomain*
# (or, use the diff tool of your choice.)
DNS 现在似乎运行良好。