В статье собраны решения распространенных ошибок и проблем FreeBSD: от аппаратных сбоев Signal 11 и паники ядра до настройки таймеров, лимитов процессов и устранения задержек в SSH.
1. Неправильное определение объема памяти (i386)
На 32-битных системах часть физической памяти (обычно между 3.5 и 4 ГБ) резервируется под адресное пространство PCI. Если оборудование не поддерживает переназначение этой памяти выше 4 ГБ, она становится недоступной для 32-битного ядра.
Решение: Используйте ядро с поддержкой PAE или перейдите на 64-битную версию FreeBSD (amd64), которая корректно работает с большими объемами памяти.
2. Ошибка Signal 11 (Segmentation Fault)
Если программы аварийно завершаются с ошибкой Signal 11, это может указывать как на программный баг, так и на неисправность оборудования.
Как диагностировать:
- Если ошибка возникает всегда в одном месте кода — это баг приложения.
- Если компиляция прерывается в разных местах — проблема в «железе».
Основные причины:
- Перегрев: Проверьте работу вентиляторов процессора и чипсета.
- Память: Протестируйте модули RAM по отдельности.
- BIOS: Сбросьте настройки на дефолтные, отключите режимы «Turbo» для памяти.
- Питание: Слабый или нестабильный блок питания может вызывать сбои.
3. Паника ядра (Fatal trap 12 / panic)
При появлении сообщений Fatal trap 12: page fault in kernel mode или panic: система останавливается. Разработчикам FreeBSD потребуется полная трассировка стека (backtrace).
Что делать: Скопируйте весь текст ошибки с экрана. Для получения детальной информации необходимо собрать отладочное ядро (kernel with debugging symbols) и воспроизвести ошибку, чтобы получить backtrace через gdb.
4. Лимит процессов (maxproc limit exceeded)
Ошибка maxproc limit exceeded by uid означает, что достигнут предел количества одновременных процессов. Этот лимит зависит от параметра kern.maxusers.
Решение: Увеличьте значение kern.maxusers в конфигурации ядра или через /etc/sysctl.conf. Также можно напрямую изменить kern.maxproc в файле /boot/loader.conf (требует перезагрузки). Убедитесь, что kern.maxprocperuid меньше общего лимита.
5. Проблемы с полноэкранными терминалами
Если удаленные приложения отображаются некорректно, проверьте переменную окружения TERM. Она должна соответствовать типу вашего терминала (например, xterm или vt100).
Для исправления размеров окна используйте команду:
stty rows 50 cols 120
Или запустите утилиту resize, если она установлена.
6. Долгое подключение по SSH/Telnet
Задержка перед запросом пароля обычно вызвана попыткой сервера выполнить обратное DNS-разрешение (reverse DNS lookup) IP-адреса клиента.
Решение:
- Проверьте настройки DNS в
/etc/resolv.conf. - Отключите проверку DNS в SSH, добавив строку
UseDNS noв файл/etc/ssh/sshd_configи перезапустив сервис.
7. Ошибка file: table is full
Сообщение в dmesg указывает на исчерпание системных файловых дескрипторов.
Решение: Увеличьте лимит kern.maxfiles через sysctl или в конфигурации ядра, согласно руководству по настройке ограничений.
8. Неправильное системное время
FreeBSD может выбрать некорректный источник времени (timecounter), например, нестабильный ACPI-таймер.
Диагностика:
dmesg | grep Timecounter sysctl kern.timecounter.hardware
Решение: Принудительно выберите стабильный таймер (например, i8254 или TSC):
sysctl kern.timecounter.hardware=i8254
Для сохранения настройки добавьте эту строку в /etc/sysctl.conf.
9. Ошибка swap_pager: indefinite wait buffer
Система не может записать данные из памяти в swap-раздел более 20 секунд. Это почти всегда указывает на проблему с диском или контроллером.
Что делать: Проверьте кабели подключения дисков, контакты и сам накопитель на наличие bad-блоков. Посмотрите логи /var/log/messages на наличие ошибок ввода-вывода.
10. Сообщения lock order reversal (LOR)
Предупреждения о нарушении порядка блокировок означают потенциальный риск взаимной блокировки (deadlock) в ядре. Чаще всего встречаются в ветке CURRENT.
Важно: Само по себе сообщение LOR не означает, что система зависла. Это предупреждение для разработчиков. Если вы используете стабильный релиз, такие сообщения стоит игнорировать, если они не сопровождаются реальными зависаниями.
11. Called … with non-sleepable locks held
Означает, что функция, способная «уснуть» (ожидать ресурса), была вызвана внутри критической секции с мьютексом. Мьютексы не позволяют потоку засыпать. Это ошибка программирования драйвера или ядра, которая может привести к зависанию системы.
12. Ошибка touch: not found при сборке мира
Если buildworld падает с ошибкой touch: not found, дело не в отсутствии утилиты. Причина в том, что даты модификации некоторых файлов установлены в будущем (рассинхронизация часов BIOS и ОС).
Решение: В однопользовательском режиме выполните синхронизацию:
adjkerntz -i

