如何解决 Mac OS X 10.6.4 Snow Leopard Server 上“bootpd”不断崩溃的问题?

如何解决 Mac OS X 10.6.4 Snow Leopard Server 上“bootpd”不断崩溃的问题?

我有一台运行 Mac OS X 10.6.4 Snow Leopard Server 的 Mac Pro,最近在查看服务时,Server Admin.app 中开始出现大量“kNetworkError”。它充当带 NAT 的网关,并且这种情况已经持续了相当长一段时间。

有一个明显的问题,bootpd总是崩溃,并在“/var/log/system.log/”中出现以下错误:

Aug 12 16:54:59 servername bootpd[3572]: server starting
Aug 12 16:54:59 servername bootpd[3572]: server name servername.domain.tld
Aug 12 16:54:59 servername bootpd[3572]: interface en0: ip 10.0.1.9 mask 255.255.255.0
Aug 12 16:54:59 servername bootpd[3572]: bsdpd: re-reading configuration
Aug 12 16:54:59 servername bootpd[3572]: bsdpd: shadow file size will be set to 48 megabytes
Aug 12 16:54:59 servername bootpd[3572]: bsdpd: age time 00:15:00
Aug 12 16:54:59 servername bootpd[3572]: [3572] detected buffer overflow
Aug 12 16:54:59 servername com.apple.launchd[1] (com.apple.bootpd[3572]): Job appears to have crashed: Abort trap
Aug 12 16:54:59 servername com.apple.ReportCrash.Root[3571]: 2010-08-12 16:54:59.828 ReportCrash[3571:2807] Saved crash report for bootpd[3572] version ??? (???) to /Library/Logs/DiagnosticReports/bootpd_2010-08-12-165459_localhost.crash

它已正确配置为通过 en1(不是 en0),即“LAN”端口提供 DHCP。即使没有硬件(甚至是交换机)连接到“LAN”端口,也会发生这种情况。没有列出 DHCP 客户端。奇怪的是,“概览”显示 1 个静态地图,但“静态地图”下没有列出任何内容,Open Directory 中也没有“计算机”。/var/db/dhcp_leases为空。

/Library/Logs/DiagnosticReports/bootpd_2010-08-12-165459_localhost.crash如下:

Process:         bootpd [3572]
Path:            /usr/libexec/bootpd
Identifier:      bootpd
Version:         ??? (???)
Code Type:       X86-64 (Native)
Parent Process:  launchd [1]

Date/Time:       2010-08-12 16:54:59.713 -0400
OS Version:      Mac OS X Server 10.6.4 (10F569)
Report Version:  6

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
__abort() called

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libSystem.B.dylib                   0x00007fff803c13d6 __kill + 10
1   libSystem.B.dylib                   0x00007fff80461913 __abort + 103
2   libSystem.B.dylib                   0x00007fff80456157 mach_msg_receive + 0
3   libSystem.B.dylib                   0x00007fff803b92cf __strncpy_chk + 14
4   bootpd                              0x0000000100014e5d PLCache_read + 782
5   bootpd                              0x0000000100004a3d BSDPClients_init + 68
6   bootpd                              0x00000001000053b5 bsdp_init + 2396
7   bootpd                              0x000000010000200b S_update_services + 1228
8   bootpd                              0x0000000100002344 S_server_loop + 571
9   bootpd                              0x0000000100003963 main + 1766
10  bootpd                              0x0000000100000984 start + 52

Thread 0 crashed with X86 Thread State (64-bit):
  rax: 0x0000000000000000  rbx: 0x00007fff5fbfe220  rcx: 0x00007fff5fbfe218  rdx: 0x0000000000000000
  rdi: 0x0000000000000df4  rsi: 0x0000000000000006  rbp: 0x00007fff5fbfe240  rsp: 0x00007fff5fbfe218
   r8: 0x0000000000000001   r9: 0x0000000100114280  r10: 0x00007fff803bd412  r11: 0xffffff80002e1680
  r12: 0xffffffffffffffff  r13: 0x00007fff5fbfe330  r14: 0x00007fff5fbfe33b  r15: 0x00007fff7009bec0
  rip: 0x00007fff803c13d6  rfl: 0x0000000000000202  cr2: 0x000000010004c000

对于解决这个问题您有什么想法或建议吗?

答案1

好的,找到解决方案了。

在 Google 上搜索“PLCache_read”(在缓冲区溢出之前/Library/Logs/DiagnosticReports/bootpd_2010-08-12-165459_localhost.crash运行的最后一个函数)第二个命中是在 Apple 的源代码中(bootpdbootpd源代码,具体来说)。BSDP_CLIENTS_FILE()传递了一个BSDP_CLIENTS_FILE常量,从文件顶部来看,该常量被硬编码为/var/db/bsdpd_clients

检查后,/var/db/bsdpd_clients我发现了一个包含所有 NetBoot 客户端的伪 plist(记住,NetBoot 是基于 bootp 构建的),果然!最后一项被截断如下,导致文件不完整:

{
        name=NetBoot060
        identifier=

停止bootpdsudo serveradmin stop dhcp),备份/var/db/bsdpd_clients并清空它,然后启动bootpdsudo serveradmin start dhcp)并且没有崩溃!

重启后,所有其他相关服务(包括 NetBoot)现已恢复,并且 Server Admin.app 不再抛出“kNetworkError”。

答案2

嗯...崩溃日志显示 bootpd 正在运行一个名为 PLCache_read 的函数,该函数正在复制一个字符串,不知何故,这导致了缓冲区溢出。(顺便说一句,bootpd 的源代码似乎可用这里

我猜想 bootpd 正在读取错误的配置文件或通过网络获取错误数据。我会尝试运行:

sudo fs_usage -w bootpd

看看是否能提供问题根源的线索。

很清楚其他人遇到了这个问题,但由于没有注册,我不知道他们是否得到了有用的答案。移动 /etc/bootpd.plist 可能会有所帮助。

啊,在我输入这些的时候,你找到了答案。好吧,无论如何我都会发布这个答案;也许它对其他人有用。

答案3

我刚刚解决了完全相同的问题,但略有不同。

我运行的是 10.6.5 客户端(不是服务器)。错误消息相同(或者与我看到的一样)。

PLCache_read 也是罪魁祸首,只是我没有 /var/db/bsdpd_clients 文件,而创建一个文件也无法解决问题。

谷歌搜索 PLCache_read 也让我找到了苹果代码,只不过在这种情况下它是dhcpd.c,这让我找到了硬编码变量

#define DHCP_LEASES_FILE "/var/db/dhcpd_leases"

瞧瞧 /var/db/dhcpd_leases 看起来全是垃圾。我将其移动到一个临时文件名,现在互联网共享就可以正常工作了。

Morgant,感谢您的深入解决方案。我学到了一些如何阅读崩溃日志的知识!

相关内容