Как устранить ошибку `bootpd`, постоянно возникающую на Mac OS X 10.6.4 Snow Leopard Server?

У меня есть Mac Pro с Mac OS X 10.6.4 Snow Leopard Server, и недавно он начал получать многочисленные "kNetworkError" в Server Admin.app при просмотре сервисов. Он действует как шлюз с 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

Он правильно настроен для обслуживания DHCP через en1 (не en0), порт "LAN". Это происходит даже при отсутствии аппаратного обеспечения (даже коммутатора), подключенного к порту "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

Любые мысли или предложения относительно решения этой проблемы?

3 ответа

Решение

Хорошо, решение найдено.

Я погуглил "PLCache_read" (последняя функция, перечисленная в /Library/Logs/DiagnosticReports/bootpd_2010-08-12-165459_localhost.crash как находящийся в ведении bootpd до переполнения буфера) и второй удар был в источнике Apple для bootpd ( bsdpd.c, Specicall). BSDP_CLIENTS_FILE() передан BSDP_CLIENTS_FILE константа, которая, глядя на верхнюю часть файла, жестко закодирована как /var/db/bsdpd_clients,

Проверка, /var/db/bsdpd_clients Я нашел псевдоплист, содержащий все клиенты NetBoot (помните, NetBoot построен на bootp) и - конечно же! - последняя запись была обрезана следующим образом, оставив файл неполным:

{
        name=NetBoot060
        identifier=

Остановился bootpd (sudo serveradmin stop dhcp), резервное копирование /var/db/bsdpd_clients и опустошил его, затем начал bootpd (sudo serveradmin start dhcp) и без сбоев!

После перезагрузки все остальные связанные службы (включая NetBoot) теперь находятся в резервном копировании, и Server Admin.app больше не выдает "kNetworkError".

Я только что решил ту же проблему с небольшими отличиями.

Я использую клиент 10.6.5 (не сервер). Те же сообщения об ошибках (или такие же, как я мог видеть).

PLCache_read также был виновником, за исключением того, что у меня не было файла / var / db / bsdpd_clients, и его создание не решило проблему.

Поиск в Google PLCache_read также привел меня к яблочному коду, за исключением того, что в данном случае это был dhcpd.c, что привело меня к жестко закодированной переменной

#define DHCP_LEASES_FILE "/var/db/dhcpd_leases"

и вот, похоже, что / var / db / dhcpd_leases заполнены мусором. Я переместил его на временное имя файла, и теперь интернет-совместимость работает просто отлично.

Моргант, спасибо за ваше всестороннее решение. Я узнал кое-что о том, как читать журналы аварий!

Хм... Журнал сбоев показывает, что bootpd выполняет функцию PLCache_read, которая копирует строку и которая каким-то образом вызывает переполнение буфера. (Между прочим, похоже, что источник для bootpd доступен здесь.)

Я предполагаю, что bootpd читает неверный файл конфигурации или получает неверные данные по сети. Я бы попробовал запустить:

sudo fs_usage -w bootpd

и посмотрите, дает ли это какой-либо ключ к пониманию источника проблемы.

Ясно, что у кого-то еще была эта проблема, но, не будучи зарегистрированным, я понятия не имею, получил ли он полезный ответ. Перемещение /etc/bootpd.plist может помочь.

Ах, вы нашли ответ, пока я печатал это. Хорошо, я отправлю этот ответ в любом случае; возможно это будет полезно кому-то еще.

Другие вопросы по тегам