Глава 5. Устранение некоторых проблем
Пред. |  | След.

## Глава 5. Устранение некоторых проблем

5.1. Почему FreeBSD определяет неправильное количество памяти на аппаратуре i386™?
5.2. На моём винчестеры есть запорченные блоки!
5.3. Почему FreeBSD не распознаёт SCSI-контроллер на машине HP Netserver?
5.4. Выдаются сообщения типа ed1: timeout.
5.5. Почему мой адаптер 3Com® 3C509 перестал работать без всякой видимой причины?
5.6. Мой параллельный принтер печатает невероятно медленно. Что тут можно сделать?
5.7. Программы аварийно завершают работу с ошибкой Signal 11.
5.8. Моя система аварийно завершает работу с сообщениями Fatal trap 12: page fault in kernel mode либо panic:, и выдаёт много дополнительной информации. Что мне делать?
5.9. При загрузке монитор темнеет и теряет синхронизацию!
5.10. Почему FreeBSD использует только 64 Мбайт ОЗУ, тогда как установлено все 128 Мбайт?
5.11. Объём оперативной памяти моей системы превышает 1 Гбайт, работа завершается аварийно с выдачей сообщения kmem_map too small messages. Что не так?
5.12. В моей системе нет 1 Гбайта оперативной памяти, однако FreeBSD аварийно завершает работу, выдавая сообщение kmem_map too small!
5.13. Почему я получаю сообщение об ошибке kernel: proc: table is full?
5.14. При перезагрузке с новым ядром выдаётся сообщение CMAP busy panic.
5.15. Что означает сообщение ahc0: brkadrint, Illegal Host Access at seqaddr 0x0
5.16. При загрузке моей системы выдается сообщение об ошибке ahc0: illegal cable configuration. С подключением кабеля все в порядке. Что происходит?
5.17. Sendmail сообщает, что mail loops back to myself
5.18. Полноэкранные приложения на удалённой машине ведут себя неправильно!
5.19. Почему мой PnP-адаптер не обнаруживается (или определяется как unknown)?
5.20. Почему при запуске некоторых программ, например, top или systat, выдается сообщение об ошибке nlist failed?
5.21. Почему подключение через ssh или telnet к моему компьютеру занимает так долго времени?
5.22. Что означает сообщение stray IRQ?
5.23. Почему в dmesg(8) регулярно выводятся сообщения file: table is full?
5.24. Почему выводятся сообщения calcru: negative runtime или calcru: runtime went backwards?
5.25. Почему часы на моем компьютере показывают неправильное время?
5.26. Почему мой лэптоп некорректно распознаёт PC-карты?
5.27. Сразу после экрана BIOS начальный загрузчик FreeBSD выводит сообщение Read error и останавливается.
5.28. Другая операционная система уничтожила мой менеджер загрузки, как мне его восстановить?
5.29. Что означает сообщение swap_pager: indefinite wait buffer:?
5.30. Что означают ошибки UDMA ICRC, и как их исправить?
5.31. Что означают сообщения lock order reversal?
5.32. Что означают сообщения Called ... with the following non-sleepable locks held?
5.33. Почему процесс buildworld/installworld завершается с сообщением touch: not found?

5.1. | Почему FreeBSD определяет неправильное количество памяти на аппаратуре i386™?

Наиболее вероятная причина заключается в различии между адресами физической и виртуальной памяти.

Существующее соглашение для большинства оборудования ПК заключается в использовании пространства памяти, лежащей в диапазоне между 3.5 ГБ и 4 ГБ для специальных нужд (обычно для нужд PCI). Это пространство адресов используется для доступа к PCI оборудованию. Как результат, реальная физическая память не может быть получена в данном адресном пространстве.

Какие действия выполняются с памятью в данном регионе зависит от вашего оборудования. К сожалению, некоторое оборудование ничего не выполняет и возможность использовать эти 500 МБ ОЗУ полностью потеряна.

К счастью, большинство оборудования перераспределяет память к более верхней позиции, так что она всё ещё может использоваться. Тем не менее, это может вызвать некоторое замешательство, если вы посмотрите сообщения, выдаваемые при загрузке.

На 32-битной версии FreeBSD кажется, что эта память потерялась. На самом деле она перераспределится в промежуток, лежащий за 4 ГБ, который не видим для 32 битного ядра. В данном случае, решение заключается в сборке ядра, с включенной опцией PAE. За дополнительной информацией обращайтесь к статье об ограничениях памяти и о различных ограничениях памяти на различных платформах.

На 64nbsp;битной версии FreeBSD или в случае использования ядра с включённым PAE FreeBSD корректно определит и перераспределит память, так, что она станет годной к использованию. Тем не менее, во время загрузки может показаться, что FreeBSD определяет больше памяти, чем реально имеется в системе из-за описанного перераспределения. Это нормально, и информация о доступной памяти будет скорректирована по окончанию процесса загрузки.

5.2. | На моём винчестеры есть запорченные блоки!

Если это SCSI-устройство, то винчестер должен иметь возможность автоматической переадресации таких блоков. Однако во многих поставляемых дисках эта возможность отключена.

Для включения переадресации запорченных блоков, измените режим работы устройства, что может быть выполнено пользователем `root` по команде

`#` `camcontrol modepage sd0 -m 1 -e -P 3`

и изменить значения параметров AWRE и ARRE с 0 на 1:

AWRE (Auto Write Reallocation Enbld): 1 ARRE (Auto Read Reallocation Enbld): 1

Контроллеры современных IDE-дисков имеют встроенную функцию переадресации запорченных блоков, которая на момент продажи включена.

Если вы увидите предупреждения о запорченных блоках (на любом типе устройства), это значит, что пришло время подумать над заменой диска. Вы можете воспользоваться диагностической программой производителя диска для поиска этих запорченных блоков, и в лучшем случае это только отнимет ваше время.

5.3. | Почему FreeBSD не распознаёт SCSI-контроллер на машине HP Netserver?

В общем-то это известная проблема. EISA-контроллеры SCSI, расположенные на материнской плате машин HP Netserver, занимают EISA-слот номер 11, так что все «настоящие» слоты EISA будут ему предшествовать. Так как адресное пространство для слотов EISA выше 10 пересекается с адресным пространством, предназначенным для PCI, то автоконфигуратор FreeBSD в настоящее время не может эту проблему нормально обойти.

Так что пока лучшее, что вы можете предпринять, это попытаться указать, что пересечения диапазонов адресов нет :), установив опцию ядра `EISA_SLOTS` в значение 12. Отконфигурируйте и откомпилируйте ядро так, как это описано в разделе Руководства о конфигурировании ядра.

Конечно, это даст вам типичную ситуации "курица или яйцо" при установке системы на такой машине. Для обхода этой проблемы внутри UserConfig есть специальный хак. Не используя «визуального» интерфейса, а только интерфейс командной строки, просто наберите следующую команду в приглашении и установите систему как обычно.

eisa 12 quit

В любом случае рекомендуется, что вы отконфигурируете и установите собственное ядро.

Надеемся, что будущие версии будут содержать полное решение этой проблемы.

### Примечание:

Вы не сможете использовать режим `dangerously dedicated` на машинах HP Netserver. Полное описание причин содержится в этом замечании.

5.4. | Выдаются сообщения типа ed1: timeout.

Обычно это вызвано конфликтом прерываний (например, двух адаптеров, использующих один и тот же IRQ). Загрузите систему с опцией `-c` и смените строку, описывающую `ed0`/`de0`/... на соответствующую вашей системе.

Если вы используете разъём BNC сетевого адаптера, таймауты устройства могут быть вызваны плохим терминированием. Чтобы это проверить, подключите терминатор к адаптеру (без кабеля) и посмотрите, не исчезли ли сообщения об ошибках.

Некоторые NE2000-совместимые адаптеры выдают такую ошибку, если нет связи по UTP-порту или отключен кабель.

5.5. | Почему мой адаптер 3Com® 3C509 перестал работать без всякой видимой причины?
| Этот адаптер имеет странную привычку терять информацию о своих настройках. Обновите настройки вашего адаптера при помощи утилиты `3c5x9.exe` из DOS.
5.6. | Мой параллельный принтер печатает невероятно медленно. Что тут можно сделать?
| Если проблема только в том, что принтер работает ужасно медленно, попробуйте сменить режим работы порта принтера так, как это описано в разделе Настройка принтера Руководства.
5.7. | Программы аварийно завершают работу с ошибкой Signal 11.

Ошибки выполнения, связанные с сигналом 11, происходят, когда ваш процесс пытается обратиться к области памяти, доступ к которой ему не был дан операционной системой. Если что-то подобное происходит в случайные, на первый взгляд, промежутки времени, то вам нужно попытаться выяснить подробности происходящих событий более детально.

Эти проблемы могут быть классифицированы следующим образом:

1. Если проблема возникает только в определённом приложении, которое было самостоятельно вами разработано, то, скорее всего, это ошибка в вашем коде.

2. Если это проблема в части базового комплекта системы FreeBSD, то это тоже может быть ошибка в программном коде, хотя в большинстве случаев такие проблемы обнаруживаются и ошибки исправляются задолго до того, как обычным читателям FAQ доводится использовать этот код (именно для этого предназначена версия -current).

В частности, достоверно не ошибка FreeBSD, если вы сталкиваетесь с проблемой при компиляции программы, но при работе компилятора место сбоя каждый раз изменяется.

Например, положим, что вы запускаете команду `make `buildworld`` и компиляция завершилась аварийно при попытке компиляции `ls.c` в `ls.o`. Если при следующей попытке повторно выполнить `make `buildworld`` и компиляция прервётся на том же самом месте, то это ошибки процесса построения — попробуйте обновить исходные тексты и попробуйте снова. Если же компиляция прерывается в каком-то другом месте, то в этом практически достоверно виновато оборудование.

Что вы должны сделать:

В первом случае вы должны воспользоваться отладчиком, к примеру, gdb(1), для нахождения точки программы, в которой делается попытка доступа к неверному адресу и затем исправить эту ошибку.

Во втором случае вам нужно проверить, что ваше оборудование исправно.

Среди часто приводящих к этому причин:

1. Ваши винчестеры могут перегреваться: Проверьте работу вентиляторов в вашем системном блоке, так как ваш диск (и может, также другие компоненты, могут перегреваться).

2. Работающий процессор перегревается: Это может произойти из-за выхода частоты процессора за рабочие границы или поломки вентилятора на процессоре. В любом случае вам нужно убедиться, что ваше оборудование работает так, как ему положено, по крайней мере, на момент поиска причин неисправности, другими словами, установите частоту работы на настройки по умолчанию.

   Если вы превысили рабочие частоты работы процессора, заметьте, что дешевле обходится медленная система, чем сгоревшая система, требующая замены! Также общество не часто симпатизирует проблемам на таких системах, вне зависимости от того, считаете ли вы увеличение рабочей частоты не влияющим на работу или нет.

3. Хитрая память: Если у вас установлено множество микросхем SIMM/DIMM, то вытащите их все и попытайтесь поработать индивидуально с каждой микросхемой SIMM или DIMM и локализовать проблему либо до проблематичной микросхемы DIMM/SIMM, либо даже их комбинации.

4. Чересчур оптимистические настройки материнской платы: При настройке вашей BIOS и выборе положения перемычек на материнской плате вы имеете возможность задать различные частоты и задержки, и в большинстве случаев настройки по умолчанию достаточны, но иногда установка слишком малых периодов ожидания для ОЗУ, установка параметра «RAM Speed: Turbo» и подобных параметров в BIOS вызовет странное поведение. Возможным решением может стать установка параметров BIOS по умолчанию, но сначала стоит записать ваши настройки!

5. Неустойчивое или недостаточное электропитание материнской платы. Если в вашей системе есть неиспользуемые адаптеры ввода/вывода, винчестеры или приводы компакт-дисков, попробуйте временно их убрать или отключить от кабеля электропитания, чтобы посмотреть, сможет ли ваш блок питания работать с меньшей нагрузкой. Или попробуйте воспользоваться другим блоком питания, желательно большей мощности (например, если имеющийся блок питания рассчитан на 250 Ватт, попробуйте другой мощностью 300 Ватт).

Вы также должны прочитать FAQ по SIG11 (ссылка дана ниже), в котором даны прекрасные описания всех этих проблем, хотя и с точки зрения Linux®. Также обсуждается, как аппаратура или программное обеспечение для тестирования памяти могут пропускать сбойную память.

Наконец, если ничего из этого не помогает, то возможно, что просто вы нашли ошибку во FreeBSD и должны следовать инструкциям по посылке сообщений о проблемах.

Подробная информация по этому вопросу содержится в FAQ по проблеме SIG11.

5.8. | Моя система аварийно завершает работу с сообщениями Fatal trap 12: page fault in kernel mode либо panic:, и выдаёт много дополнительной информации. Что мне делать?

Разработчики FreeBSD очень интересуются такими ошибками, но им нужно несколько больше информации, чем просто факт возникновения этой ошибки. Полностью скопируйте сообщение. Затем обратитесь к разделу FAQ об аварийных завершениях работы ядра, постройте отладочное ядро и получите трассу вызовов. Это может звучать трудной задачей, но вам не нужны никакие знания программирования; просто следуйте указаниям.

5.9. | При загрузке монитор темнеет и теряет синхронизацию!

Это известная проблема с видеоадаптерами ATI Mach64. Она вызвана тем, что этот адаптер использует адрес `2e8`, как и четвёртый последовательный порт. Из-за ошибки (или особенности работы?) в драйвере sio(4) он обращается к порту, даже если он не существует, и даже если вы отключите `sio3` (четвёртый порт), который, как правило, использует этот адрес ввода/вывода.

Пока это не исправлено, используйте следующий метод:

1. В приглашении загрузчика наберите `-c`. (Это переведёт ядро в режим конфигурации).

2. Отключите устройства `sio0`, `sio1`, `sio2` и `sio3` (все их). После этого драйвер sio(4) не будет активизироваться и проблем не будет.

3. Для продолжения загрузки наберите exit.

Если вам нужно использовать последовательные порты, вы должны построить новое ядро со следующей модификацией: в файле `/usr/src/sys/dev/sio/sio.c` (или в файле `/usr/src/sys/pc98/cbus/sio.c` для pc98) найдите строчку, содержащую число `0x2e8` и удалите её вместе с предшествующий запятой (оставив следующую). После этого следуйте обычным указаниям по построению ядра.

5.10. | Почему FreeBSD использует только 64 Мбайт ОЗУ, тогда как установлено все 128 Мбайт?

Так как для определения объёма памяти FreeBSD использует информацию BIOS, она ограничена 16 битами, используемыми для выражения размера ОЗУ в килобайтах (65535 Кбайт = 64 Мбайт) (или меньше... некоторые BIOS ограничивают размеры памяти до 16 Мбайт). Если у вас больше чем 64 Мбайт ОЗУ, FreeBSD будет пытаться обнаружить эту память; однако эта попытка может и не удаться).

Для решения этой проблемы вам нужно использовать опцию ядра, указанную ниже. Способ выяснения полной информации о памяти из BIOS существует, но у нас нет места в загрузочном блоке, чтобы это делать. Когда проблема нехватки места в загрузочных блоках будет решена, мы будем использовать расширенные функции BIOS для получения полной информации о памяти... но пока мы остановились на опции ядра.

options MAXMEM=`n`

Здесь `n` - это объём памяти в килобайтах. Для машины со 128 Мбайт ОЗУ вам нужно использовать значение `131072`.

5.11. | Объём оперативной памяти моей системы превышает 1 Гбайт, работа завершается аварийно с выдачей сообщения kmem_map too small messages. Что не так?

Как правило, FreeBSD определяет параметры ядра, в частности, максимальное количество одновременно открытых файлов, исходя из объёма памяти, установленного в системе. В системах, имеющих 1 Гбайт или больший объём оперативной памяти, этот механизм «автоматического определения параметров» может выбрать слишком большие значения: при запуске ядро выделяет пространство под различные таблицы и другие структуры, которые заполняют основной объём доступной ядру памяти. В дальнейшем при работе системы у ядра не остаётся пространства для динамического распределения памяти, и оно завершает работу аварийно.

Скомпилируйте новое ядро, добавив параметр `VM_KMEM_SIZE_MAX` в конфигурационный файл ядра, увеличив его максимальный размер до 400 Мбайт (`options VM_KMEM_SIZE_MAX=419430400`). 400 Мбайт должно быть достаточно для машин с объёмом оперативной до 6 Гбайт.

5.12. | В моей системе нет 1 Гбайта оперативной памяти, однако FreeBSD аварийно завершает работу, выдавая сообщение kmem_map too small!
| Такое завершение работы показывает, что системе не хватает виртуальной памяти для сетевых буферов (точнее, структур mbuf). Вы можете увеличить количество виртуальной памяти для структур mbuf, если будете действовать в соответствии с инструкциями раздела Ограничения сети Руководства.
5.13. | Почему я получаю сообщение об ошибке kernel: proc: table is full?

Ядро FreeBSD позволяет существовать одновременно ограниченному числу процессов. Оно зависит от значения переменной sysctl(8) `kern.maxusers`. `kern.maxusers` также влияет на другие ограничения ядра, такие как буферы работы с сетью (обратитесь к этому рассмотренному ранее вопросу). Если ваша машина сильно загружена, вам, наверное, понадобится увеличить `kern.maxusers`. Кроме максимального числа процессов это увеличит значения и других параметров, ограничивающих систему.

Для корректировки значения `kern.maxusers` обратитесь к разделу Ограничения файлов/процессов Руководства. (Хотя в нём говорится об открытых файлах, те же самые ограничения касаются и процессов.)

Если ваша машина загружена слабо, и просто у вас слишком много процессов, то вы можете настроить это через sysctl `kern.maxproc`. Если данная переменная нуждается в настройке, она должна быть определена в `/boot/loader.conf`. За дополнительной информацией, касающейся работы с sysctl переменными обращайтесь к страницам справочника loader.conf(5) и sysctl.conf(5). Если эти процессы запущены одним и тем же пользователем, вам также задать значение `kern.maxprocperuid` на единицу меньшим, чем новое значение `kern.maxproc`. (Оно должно быть по крайней мере на единицу меньшим, потому что системная программа init(8), должна работать всегда.)

Чтобы сохранить значения sysctl, задайте их в `/etc/sysctl.conf`. Дополнительную информацию о настройке системы с помощью sysctl(8) можно найти в главе Руководства Настройка с помощью sysctl

5.14. | При перезагрузке с новым ядром выдаётся сообщение `CMAP busy panic`.
| Процедура определения устаревших файлов `/var/db/kvm_*.db` иногда даёт сбой и использует не те файлы, что может вызвать аварийный останов системы. Если это случилось, загрузитесь в однопользовательский режим и выполните команду: `#` `rm /var/db/kvm_*.db`
5.15. | Что означает сообщение ahc0: brkadrint, Illegal Host Access at seqaddr 0x0
| Это - результат конфликта со SCSI-адаптером Ultrastor. Во время загрузки войдите в меню конфигурации ядра и выключите устройство `uha0`, являющееся источником этой проблемы.
5.16. | При загрузке моей системы выдается сообщение об ошибке ahc0: illegal cable configuration. С подключением кабеля все в порядке. Что происходит?

На вашей материнской плате отсутствует внешняя логика поддержки автоматического терминирования. Установите в вашем SCSI BIOS правильное терминирование для вашей конфигурации вместо автоматического терминирования. Драйвер ahc(4) не может определить, есть ли внешняя логика для распознавания кабеля (и, соответственно, автоматического терминирования). Драйвер просто полагает, что эта поддержка должна быть, если конфигурация, содержащаяся в EEPROM, установлена в «automatic termination». Без внешней логики распознавания кабеля драйвер часто будет ошибаться при настройке терминирования, что может сказаться на надежности шины SCSI.

5.17. | Sendmail сообщает, что mail loops back to myself
| Подробный ответ вы можете получить в Руководстве.
5.18. | Полноэкранные приложения на удалённой машине ведут себя неправильно!

На удалённой машине тип терминала может быть установлен в значение, отличное от типа терминала `cons25`, требуемом при использовании консоли FreeBSD.

Есть несколько возможных способов решения этой проблемы:

- После входа на другую машину установите значение переменной окружения `TERM` равным `ansi` или `sco`, если эта машина знает об этих типах терминалов.

- Используйте эмулятор VT100, например screen на консоли FreeBSD. Screen даёт вам возможность открывать несколько рабочих сеансов на одном терминале, и она имеет ещё ряд полезных особенностей. Каждое окно программы screen ведёт себя как терминал VT100, так что переменная `TERM` на удалённой машине должна быть установлена в значение `vt100`.

- Опишите терминал `cons25` в базе данных характеристик терминалов на удалённой машине. Способ описания зависит от используемой на этой машине операционной системе. Вам может помочь чтение руководств по администрированию удалённой системы.

- Запустите X-сервер на стороне FreeBSD и войдите на удалённую систему с помощью какого-либо эмулятора терминала, работающего в X Window, такого, как `xterm` или `rxvt`. Переменная окружения `TERM` на удалённой машине должна быть установлена в значение `xterm` или `vt100`.

5.19. | Почему мой PnP-адаптер не обнаруживается (или определяется как `unknown`)?

Причины такого поведения объясняются в следующем сообщении электронной почты, опубликованном в Список рассылки, посвящённый вопросам и ответам пользователей FreeBSD Питером Уэммом (Peter Wemm `<peter@FreeBSD.org>`) в ответ на вопрос о внутреннем модеме, который перестал распознаваться после обновления до FreeBSD 4.`X` (комментарии внутри `[]` были добавлены для пояснения контекста послания).

### Примечание:

Содержание этой цитаты по сравнению с оригинальным текстом было изменено.

> BIOS, поддерживающая PNP, предварительно отводит и оставляет ему [модему] место в адресном пространстве портов, так что [в 3.`X`] процедура обнаружения в старом стиле ISA «находит» его здесь.

> В 4.0 код для работы с ISA гораздо более PnP-центричен. [В 3.`X`] было возможно при распознавании ISA найти «беспризорное» устройство и затем по идентификатору PNP-устройства произвести поиск и получить ошибку из-за конфликта ресурсов. Поэтому для предотвращения повторной процедуры распознавания в нём сначала выключаются все управляемые адаптеры. Это также означает, что для поддерживаемого оборудования PnP нужно знать их PnP-идентификаторы. Имеются планы на обеспечение возможности настройки этого со стороны пользователя.

Чтобы заставить устройство работать снова, требуется определить его PnP-идентификатор и добавить его в список, который используется процедурой распознавания ISA для идентификации устройств PnP. Этот идентификатор можно получить при помощи программы pnpinfo(8), найдя устройство в её выдаче, вот, например, вывод команды pnpinfo(8) в случае внутреннего модема:

`#` `pnpinfo` Checking for Plug-n-Play devices... Card assigned CSN #1 Vendor ID PMC2430 (0x3024a341), Serial Number 0xffffffff PnP Version 1.0, Vendor Version 0 Device Description: Pace 56 Voice Internal Plug & Play Modem Logical Device ID: PMC2430 0x3024a341 #0 Device supports I/O Range Check TAG Start DF I/O Range 0x3f8 .. 0x3f8, alignment 0x8, len 0x8 [16-bit addr] IRQ: 4 - only one type (true/edge)

[лишние строки TAG исключены]

TAG End DF End Tag Successfully got 31 resources, 1 logical fdevs -- card select # 0x0001 CSN PMC2430 (0x3024a341), Serial Number 0xffffffff Logical device #0 IO: 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 IRQ 5 0 DMA 4 0 IO range check 0x00 activate 0x01

Информация, которая вам нужна, находится в строке `Vendor ID` в самом начале вывода команды. Шестнадцатеричное число в скобках (в этом примере `0x3024a341`) является PnP-идентификатором, а строчка, идущая прямо перед ним (`PMC2430`) является уникальным ASCII-идентификатором.

Либо, если в списке, выдаваемом pnpinfo(8), адаптера нет, можно воспользоваться утилитой pciconf(8). Вот часть выдачи команды `pciconf -vl` для интегрированного в материнскую плату звукового адаптера:

`#` `pciconf -vl` chip1@pci0:31:5: class=0x040100 card=0x00931028 chip=0x24158086 rev=0x02hdr=0x00 vendor = 'Intel Corporation' device = '82801AA 8xx Chipset AC'97 Audio Controller' class = multimedia subclass = audio

В данном случае вам нужно использовать значение для `chip`, `0x24158086`.

Эту информацию (ID производителя или номер микросхемы) нужно добавить в файл `/usr/src/sys/dev/sio/sio_isa.c`.

Сначала вы должны сделать резервную копию файла `sio_isa.c` просто на тот случай, если что-то пойдёт не так. Эта копия также может потребоваться для создания патча для посылки его вместе с вашим PR (вы же собираетесь послать PR, не правда ли?) отредактировав файл `sio_isa.c` и поискав строчку:

static struct isa_pnp_id sio_ids[] = {

Затем переместитесь ниже и найдите подходящее место, чтобы добавить строчку для вашего устройства. Записи имеют примерно такой вид, и они отсортированы по ASCII-строкам Vendor ID, которые должны быть помещены в поле комментария справа от строки кода вместе с полным описанием устройства (если оно поместится) или частью из Device Description вывода программы pnpinfo(8):

{0x0f804f3f, NULL}, /* OZO800f - Zoom 2812 (56k Modem) */ {0x39804f3f, NULL}, /* OZO8039 - Zoom 56k flex */ {0x3024a341, NULL}, /* PMC2430 - Pace 56 Voice Internal Modem */ {0x1000eb49, NULL}, /* ROK0010 - Rockwell ? */ {0x5002734a, NULL}, /* RSS0250 - 5614Jx3(G) Internal Modem */

Добавьте шестнадцатеричный идентификатор Vendor ID вашего устройства в соответствующее место, сохраните файл, перестройте ядро и выполните перезагрузку. Ваше устройство должно теперь быть найдено в виде устройства `sio`.

5.20. | Почему при запуске некоторых программ, например, `top` или `systat`, выдается сообщение об ошибке nlist failed?

Проблема в том, что приложение, которое вы пытаетесь запустить, ищет специфические ссылки в ядре, но по каким-либо причинам не может их найти; эта ошибка происходит от одной из следующих проблем:

- Ваше ядро и программы пользователей не соответствуют друг другу (например, вы построили ядро, но не выполнили команду `installworld`, или наоборот), и поэтому таблица имен отличается от того, что думают о ней пользовательские приложения. Если это ваш случай, просто завершите процесс обновления (обратитесь к файлу `/usr/src/UPDATING` для выяснения правильной последовательности действий).

- Для загрузки ядра вы не используете `/boot/loader`, а делаете это непосредственно из `boot2` (обратитесь к справочно странице по boot(8)). Хотя нет ничего плохого в обходе `/boot/loader`, обычно работу по доступности символьной информации ядра из пользовательских приложений он выполняет лучше.

5.21. | Почему подключение через `ssh` или `telnet` к моему компьютеру занимает так долго времени?

Симптом: между моментом установления TCP-соединения и выдачей клиентским программным обеспечением запроса на ввод пароля (или, в случае использования telnet(1), выдачей приглашения на вход) проходит большой промежуток времени.

Проблема: скорее всего, задержка вызвана программным обеспечением на стороне сервера, которое пытается преобразовать IP-адрес клиента в имя хоста. Многие серверы, включая Telnet и SSH, поставляемые с FreeBSD, делают это для того, чтобы, кроме всего прочего, записать имя хоста в файле журнала для справки администратора.

Лечение: Если проблема возникает вне зависимости от того, к какому серверу вы подключаетесь с вашего компьютера (клиента), то причина в клиенте; или же, если проблема возникает только при чьей-либо попытке подключиться к вашему компьютеру (серверу), то проблема с сервером.

Если проблема с клиентом, то единственным методом ее решения является исправление DNS, чтобы сервер смог распознать вашу машину. Если это происходит в локальной сети, то предположите, что это проблема с сервером и продолжайте чтение; обратно, если это происходит в глобальной сети Интернет, то в большинстве случаев вам нужно обратиться к вашему провайдеру и попросить исправить положение.

Если проблема с сервером, и это происходит в локальной сети, то вам нужно настроить сервер для разрешения запросов на преобразование адреса в имя хоста в диапазоне ваших локальных адресов. Обратитесь к страницам Справочника по hosts(5) и named(8) для получения более подробной информации. Если это происходит в глобальной сети Интернет, то проблема может заключаться в некорректной работе ресолвера вашего сервера. Для проверки попробуйте найти другой хост, скажем, `www.yahoo.com`. Если это не работает, то проблема у вас.

Из-за свежей установки FreeBSD, также возможно, что информация о домене и сервере имён отсутствует в `/etc/resolv.conf`. Это часто будет вызывать задержку в работе SSH, так как опция `UseDNS` по умолчанию установлена в значение `yes` в файле `sshd_config` из каталога `/etc/ssh`. Если именно это является причиной проблемы, то вам нужно будет либо добавить недостающую информацию в `/etc/resolv.conf`, либо в качестве временной меры установить `UseDNS` в `no` в файле `sshd_config`.

5.22. | Что означает сообщение stray IRQ?

Потерянные IRQ являются признаком странностей в работе аппаратных IRQ, в основном оборудования, которое удаляет свои запросы на прерывание посреди цикла подтверждения запроса на прерывание.

Имеется три варианта работы с такими ситуациями:

- Примириться с сообщениями. В любом случае подавляются все сообщения, кроме каждых первых 5 на IRQ.

- Убрать предупреждающие сообщения, изменив значение `MAX_STRAY_LOG` с `5` на `0` в файле `intr_machdep.c` для вашей платформы (например, i386™), и собрать новое ядро, и тогда все предупреждения будут подавлены.

- Избавиться от предупреждений, установив параллельный порт, использующий IRQ 7 и драйвер PPP для него (это есть на большинстве систем), и установив диск IDE или другое оборудование, использующее IRQ 15 и подходящий драйвер.

5.23. | Почему в dmesg(8) регулярно выводятся сообщения file: table is full?
| Такое сообщение об ошибке сигнализирует о том, что в вашей системе исчерпано количество доступных файловых дескрипторов. Пожалуйста, обратитесь к разделу kern.maxfiles главы о Настройке ограничений ядра Руководства для выяснения всех подробностей и устранения этой проблемы.
5.24. | Почему выводятся сообщения calcru: negative runtime или calcru: runtime went backwards?

При включении в BIOS Intel® Enhanced SpeedStep может возникнуть проблема, при которой ядро начинает выводить сообщения calcru как показано ниже:

calcru: runtime went backwards from 6 usec to 3 usec for pid 37 (pagezero) calcru: runtime went backwards from 6 usec to 3 usec for pid 36 (vmdaemon) calcru: runtime went backwards from 170 usec to 138 usec for pid 35 (pagedaemon) calcru: runtime went backwards from 553 usec to 291 usec for pid 15 (swi6: task queue) calcru: runtime went backwards from 15521 usec to 10366 usec for pid 2 (g_event) calcru: runtime went backwards from 25 usec to 12 usec for pid 11 (swi1: net) calcru: runtime went backwards from 4417 usec to 3960 usec for pid 1 (init) calcru: runtime went backwards from 2084385 usec to 1793542 usec for pid 1 (init) calcru: runtime went backwards from 408 usec to 204 usec for pid 0 (swapper)

Причиной является то, что Intel® SpeedStep (EIST) не совместим с некоторыми системными платами.

Обходной путь: отключить EIST в BIOS. При этом у вас сохраняется возможность управлять частотой ACPI-совместимого процессора, используя powerd(8).

5.25. | Почему часы на моем компьютере показывают неправильное время?

На вашем компьютере установлены двое или большее количество таймеров, а FreeBSD выбрала не тот.

Запустите dmesg(8) и посмотрите строки, содержащие слово `Timecounter`. FreeBSD выбирает таймер с наибольшим значением качества.

`#` `dmesg | grep Timecounter` Timecounter "i8254" frequency 1193182 Hz quality 0 Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000 Timecounter "TSC" frequency 2998570050 Hz quality 800 Timecounters tick every 1.000 msec

Вы можете удостовериться в этом, проверив sysctl(3)-переменную `kern.timecounter.hardware`.

`#` `sysctl kern.timecounter.hardware` kern.timecounter.hardware: ACPI-fast

Это может быть неработающий таймер ACPI. Самым простым решением будет отключить таймер ACPI в `/etc/loader.conf`:

debug.acpi.disabled="timer"

Либо же BIOS может изменить частоту TSC—может, для изменения скорости работы процессора при работе от батареек или переводя в режим пониженного электропитания, но FreeBSD не отслеживает это и в результате часы начинают спешить или отставать.

В этом примере имеется также и таймер `i8254`, и он может быть выбран записью его имени в sysctl(3)-переменную `kern.timecounter.hardware`.

`#` `sysctl -w kern.timecounter.hardware=i8254` kern.timecounter.hardware: TSC -> i8254

Теперь ваш компьютер будет аккуратнее следить за временем.

Чтобы это изменение вступало в силу во время загрузки системы, добавьте в файл `/etc/sysctl.conf` такую строчку:

kern.timecounter.hardware=i8254

5.26. | Почему мой лэптоп некорректно распознаёт PC-карты?

Эта проблема часто встречается на лэптопах, которые работают более чем с одной операционной системой. Некоторые не-BSD операционные системы оставляют аппаратную часть PC-карт в неустойчивом состоянии. pccardd(8) распознает карту как "(null)""(null)", а не как реально используемую модель.

Вы должны убрать всё питание со слота PC-карты для полного сброса аппаратуры. Полностью выключите лэптоп. (Не переводите его ни в спящий, ни в ждущий режим; питание должно быть выключено полностью.) Подождите несколько секунд и выполните перезагрузку. Теперь ваша PC-карта должна заработать.

В некоторых лэптопах аппаратная часть неверно сообщает о своём выключении. Если описанное выше не работает, остановите работу, выньте батарею, подождите несколько секунд, вставьте батарею и выполните перезагрузку.

5.27. | Сразу после экрана BIOS начальный загрузчик FreeBSD выводит сообщение Read error и останавливается.

Начальный загрузчик FreeBSD неверно определяет параметры винчестера. Их можно установить вручную утилитой fdisk(8) при создании или изменении параметров слайса FreeBSD.

Правильные значения параметров диска можно посмотреть в BIOS. Обратите внимание на число дорожек, головок и секторов для этого диска.

В подпрограмме fdisk утилиты sysinstall(8) нажмите G для установки параметров диска (disk geometry).

Появится диалоговое окно, запрашивающее количество дорожек, головок и секторов. Задайте значения, взятые из BIOS и разделяемые символами слэша. Например, 5000 дорожек, 250 головок и 60 секторов будут введены как `5000/250/60`.

Нажмите Enter для установки этих значений, а затем клавишу W для того, чтобы записать новую таблицу разделов на диск.

5.28. | Другая операционная система уничтожила мой менеджер загрузки, как мне его восстановить?
| Запустите утилиту sysinstall(8) и выберите пункт Configure, а затем Fdisk. Выберите диск, на котором ранее находился менеджер загрузки, при помощи клавиши Пробел. Нажмите W для записи изменений на диск. Появится диалоговое окно для выбора устанавливаемого начального загрузчика. Выберите нужный, и он будет восстановлен.
5.29. | Что означает сообщение swap_pager: indefinite wait buffer:?

Это значит, что процесс пытается сбросить страницу памяти на диск, и попытка сделать это оканчивается неудачно вот уже в течение более чем 20 секунд. Это может быть вызвано испорченными блоками на диске, кабелями, подключением или другим оборудованием ввода/вывода. Если диск сам по себе на самом деле испорчен, вы также увидите ошибки работы с диском в `/var/log/messages` и при работе команды `dmesg`. В противном случае проверьте кабели и подключения.

5.30. | Что означают ошибки UDMA ICRC, и как их исправить?

Драйвер ata(4) сообщает об ошибках UDMA ICRC, когда нарушается передача в или с диска в режиме DMA. Драйвер будет повторять передачу несколько раз. Если повторные попытки окончатся неудачей, он переключится из режима DMA в более медленный режим PIO взаимодействия с устройством.

Проблема может возникать по многим причинам, хотя самым распространённой является неправильное или сбоящее подключение кабелей. Проверьте кабели ATA на наличие повреждений и соответствие используемому режиму Ultra DMA. Если вы используете диски на съёмных салазках, они также должны быть совместимыми с этим режимом. Удостоверьтесь, что все соединения подключены хорошо. Проблемы также наблюдались, когда старый диск устанавливался на тот же самый канал ATA, что и Ultra DMA 66 (или более быстрый) диск. Наконец, такие ошибки могут указывать на сбойность самого диска. Большинство производителей дисков предоставляют программное обеспечение для тестирования своих дисков, так что проверьте свой диск, и, если это необходимо, сделайте резервную копию данных и замените его.

Для просмотра и выбора режимов DMA или PIO для каждого устройства ATA можно использовать утилиту atacontrol(8). В частности, команда `atacontrol mode `channel`` выдаст режимы, используемые заданным каналом ATA, причём первичный канал нумеруется нулём, и так далее.

5.31. | Что означают сообщения lock order reversal?
| Ответ на этот вопрос можно найти в глоссарии FreeBSD, смотрите LOR.
5.32. | Что означают сообщения Called ... with the following non-sleepable locks held?

Это означает, что функция, которая может находиться в «спящем» состоянии была вызвана во время использования мьютекс (или другого не «засыпающего») блокирования.

Причина этого - ошибка, потому что мьютексы не предполагают находиться в удерживаемом состоянии длительные промежутки времени, а блокировать только на короткие периоды синхронизации. Это правило позволяет драйверам устройств использовать мьютексы для синхронизации с остальной частью ядра во время прерываний. Прерывания (во FreeBSD) могут находиться не в «спящем состоянии». Следовательно необходимо, чтобы не было подсистем в ядре, которые бы занимались блокировкой длительный период, используя мьютекс.

Для ловли таких ошибок, в ядро могут быть добавлены assertions, которые будут взаимодействовать с подсистемой witness(4) для генерирования предупреждения или фатальной ошибки (в зависимости от системной конфигурации) в случаях когда производится потенциально блокирующий вызов с удержанием мьютекса.

В общем, такие предупреждения не критичны, но тем не менее, с неудачной синхронизацией (timing) они могут вызвать нежелательные эффекты, начиная от незначительной задержки в ответной реакции системы до полной блокировки системы.

5.33. | Почему процесс `buildworld`/`installworld` завершается с сообщением touch: not found?
| Эта ошибка не означает, что не найдена утилита touch(1). Ошибка наверняка появляется из-за того, что даты модификации файлов установлены в будущем. Если ваши CMOS часы установлены на локальное время, то вам надо отрегулировать часовой механизм ядра, запустив команду `adjkerntz -i`, при загрузке в однопользовательском режиме.

Пред. |  | След.
4.8. Другое оборудование | Начало | Глава 6. Коммерческие приложения

Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку <doc@FreeBSD.org>.