我有一台运行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
它被正确configuration为通过en1(不是en0)(“LAN”端口)提供DHCP服务。 即使没有连接到“LAN”端口的硬件(甚至交换机)也会发生这种情况。 没有列出DHCP客户端。 奇怪的是,“概述”显示了1个静态地图,但“静态地图”下没有列出,在开放目录中没有“计算机”。 /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
任何想法或build议,以解决这个问题?
好的,find解决scheme。
我search了'PLCache_read' (在/Library/Logs/DiagnosticReports/bootpd_2010-08-12-165459_localhost.crash列出的最后一个函数,由缓冲区溢出之前的bootpd运行),第二个命中是在Apple的bootpd源文件中( bsdpd .c ,specificall)。 BSDP_CLIENTS_FILE()传递了BSDP_CLIENTS_FILE常量,它看起来在文件的顶部,被硬编码为/var/db/bsdpd_clients 。
检查/var/db/bsdpd_clients ,我发现一个包含所有NetBoot客户端的伪plist(请记住,NetBoot是build立在bootp之上的) – 确实已经足够了 – 最后一个条目被截断如下,导致文件不完整:
{ name=NetBoot060 identifier=
停止的bootpd ( sudo serveradmin stop dhcp ),备份/var/db/bsdpd_clients &清空它,然后启动bootpd ( sudo serveradmin start dhcp ),没有崩溃!
重新启动后,所有其他相关服务(包括NetBoot)现在都备份了,Server Admin.app不再抛出'kNetworkError'。
嗯……崩溃日志显示bootpd正在运行一个名为PLCache_read的函数,该函数正在复制一个string,并以某种方式导致缓冲区溢出。 (顺便说一句,它看起来像bootpd的来源可在这里 。)
我的猜测是,bootpd正在读取一个错误的configuration文件,或通过networking获取错误的数据。 我会尝试运行:
sudo fs_usage -w bootpd
看看是否能够提供有关问题根源的线索。
很显然, 别人有这个问题 ,但没有注册,我不知道他们是否得到了有用的答案。 移动/etc/bootpd.plist可能会有帮助。
啊,当我打字时,你已经find了答案。 那么,我会发布这个答案反正; 也许这对其他人有用。
我刚刚解决了完全相同的问题,略有不同。
我正在运行10.6.5客户端(不是服务器)。 相同的错误信息(或者我可以看到)。
PLCache_read也是罪魁祸首,除了我没有/ var / db / bsdpd_clients文件,并创build一个没有解决问题。
Googling的PLCache_read也会把我引向苹果代码,除非在这个例子中是dhcpd.c ,这导致我变成硬编码的variables
#define DHCP_LEASES_FILE "/var/db/dhcpd_leases"
而且看到/ var / db / dhcpd_leases看起来充满了垃圾。 我把它移动到一个临时文件名,现在互联网共享工作得很好。
Morgant,感谢您的深入解决scheme。 我学到了关于如何阅读崩溃日志的东西!