Конфигурирование сетевого интерфейса в FreeBSD под VirtualBox






Решено было на днях поднять-таки Jabber-сервер на одном из серверов, работающих под FreeBSD. Решение решением, но ввиду того, что лишние несколько минут простоя сервера, случись что, будут не самым радостным событием, показалось вполне логичным потренироваться, что называется, «на кошках». Полноценной FreeBSDшной «кошки» у меня, естественно, не нашлось. Ну, не получается пока из меня BSD-шника :-) В общем, подумалось, а почему бы и не старый добрый VirtualBox? Сказано — сделано. Был раздобыт ISO-шник FreeBSD-7.0, на скорую руку из которого и была поставлена ОС. Пока ставилась сама операционка, у меня было немного времени полистать уже небезызвестный для меня Хэндбук, из которого удалось понять, что так уж быстро из Ubuntu в BSD погрузиться у меня не получится. Хех, а так хотелось...

Итак, ОС установилась, загружаемся. И тут, как говорится, «опаньки». Из всего увиденного в сообщениях, не спешащей загружаться свежеустановленной BSD, удалось понять, что сетевой интерфейс никак не желает подниматься. Точнее не имеет возможности получить сетевой адрес по DHCP.

screenshot-freebsd-70-running-sun-xvm-virtualbox-31


Откуда же ноги?..

Подождав некоторое время, пока DHCP-клиент прекратит-таки судорожные и бесполезные попытки получить адрес, удалось войти в систему. Оглядевшись вокруг и поняв в очередной раз, что Юникс Линуксу, мягко говоря, рознь, решено было начать разбираться с проблемой, а не искать похожести с тем, чем мне так хотелось их видеть. Первым делом было проверено состояние сетевых интерфейсов, в частности злосчастного «pcn0»:

screenshot-freebsd-70-running-sun-xvm-virtualbox

Хм... Почему-то система считает, что Ethernet-кабель не воткнут в плату. Понятное дело, что в случае с виртуальной машиной просто не получится взглянуть на заднюю стенку системного блока и поглядеть, не выпал ли шнурок :-) Поиск по лог-файлам загрузки системы ничего не дал. Ядро торжественно отчиталось, что устройство обнаружено и всё замечательно. С этого момента становится ясно, что проблема явно не в DHCP, поскольку система просто «физически» не может получить доступ к среде передачи данных. Однако, располагая всем этим так и не ясно, что же делать дальше? Вообще, сейчас диву даюсь, как раньше без доступа к Интернет мне удавалось находить нужную мне информацию. Да, Интернет делает человека ленивым. Или человек себя при помощи Интернета. В общем, ладно. Лезем в Гугль с вопросами, авось, не я первый.

Ох уж эти баги

После нескольких минут ковыряния выдачи Гугля удалось выяснить, что таки да, проблема не у одного меня, любимого. Смысл таков. VirtualBox эмулирует сетевую плату AMD PCnet-FAST III (Am79C973) для гостевой ОС (это один из четырёх вариантов, не обратив внимания на который я и поплатился потраченным временем и полученными знаниями). Так вот, VirtualBox эмулирует её хорошо, просто замечательно, за исключением одной детали. Когда драйвер сетевой платы в FreeBSD, используя функцию автоматического определения, пытается обнаружить, какой же media подключён к плате в данный момент, VirtualBox-овый вариант AMD-шной сетевухи сообщает, что, «извините, мол, ошибочка вышла». Понятное дело, что драйверу заняться больше нечем, как устраивать эксперименты и поиски без вести пропавших. Он просто возвращает ifconfig-у сообщение о том, что никакого media обнаружить не удалось. Интерфейс с этого момента считается активным, хоть и без доступа к среде передачи. После этого, через некоторое время dhclient начинает отправлять широковещательные, естественно неудачные, запросы в поисках DHCP- сервера. И ждёт, ждёт, ждёт... Что и видно на самом первом скриншоте. По ходу развития событий как-то непонятно становится. Это что же получается, dhclient-у пофиг, что устройство не в состоянии передавать данные? То есть, «я свою работу делаю, а вы — как хотите». Мда, забавно.

Решение. Способ первый

Перед тем, как предпринимать какие-то действия, нужно было установить, каким же образом FreeBSD поднимает данное устройство. Взглянув в /etc/rc.conf стало ясно, что никаких экстраординарных действий не выполняется, и сетевая карта конфигурируется «по-умолчанию»:

screenshot-freebsd-70-running-sun-xvm-virtualbox-1Заглянув в «man 4 pcn» выясняем, что драйвер поддерживает 3 варианта того самого media: autoselect, 10baseT/UTP и 100baseTX. Что ж, пробуем все имеющиеся варианты:

screenshot-freebsd-70-running-sun-xvm-virtualbox-2

Ага! Судя по всему, последний вариант media не вызывает у драйвера никаких вопросов, о чём свидетельствует молчаливая реакция ifconfig. Проверяем, что изменилось:

screenshot-freebsd-70-running-sun-xvm-virtualbox-32

Пинаем dhclient с просьбой ещё разик попытаться получить-таки этот долбанный адрес:

screenshot-freebsd-70-running-sun-xvm-virtualbox-4

Вуаля! Сетевой интерфейс ожил, dhclient смог, наконец, достучаться к DHCP-серверу. В общем, все довольны и я больше всех :-) Осталось лишь автоматизировать вышеописанный процесс, дабы не кнопать всякий раз после загрузки ОС одно и то же, держа при этом всё в голове. Некоторые господа предлагают для этой цели написать bash-скрипт, задать автоматическое его выполнение в каких только вздумается местах конфигурационных файлов системы. Зачем всё это — непонятно, ибо же есть /etc/rc.conf, в котором всё замечательно описывается и работает на благо отчизны. Итак, модифицируем:

screenshot-freebsd-70-running-sun-xvm-virtualbox-5

Перезагружаем операционную систему и получаем удовольствие! :-)

Решение. Способ второй

Ну и, как всегда, самое смешное и интересно чуть было не оказалось за кадром.Всем, кто дочитал до этого места — «респект и уважуха» ©. Когда-то, ещё совсем давно, у меня была привычка постоянно лезть во все конфиги, опции, выпадающие списки, закладки и интересоваться каждым чекбоксом в настройках любой программы. Потом, со временем, я приучил себя не  тратить время на никому ненужное изучение всего, что навыдумывали разработчики. Сегодня глаз уже научился игнорировать всё это разнообразие параметров конфигурации софта. Несомненно, времени такой подход экономит массу, особенно если нужно «очень быстро что-то настроить». Но вот тут эта привычка сыграла-таки злую шутку. Хотя, шутку ли? Повод задуматься — минимум.

В общем, решение этой проблемы вторым способом заключается всего лишь... В смене типа эмулируемого устройства VitrualBox! Кто бы мог подумать...
screenshot-freebsd-70-settings

Ну и, конечно же, не забываем отметить появление нового интерфейса в самой FreeBSD:

screenshot-freebsd-70-running-sun-xvm-virtualbox-6

Что почитать

http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/config-network-setup.html




Конфигурирование сетевого интерфейса в FreeBSD под VirtualBox: 12 комментариев

  1. Спасибо тебе, дружище! Ты сэкономил мне кучу времени, которое могло быть потрачено на курение манов.

  2. Спасибо! Заработало, толково описано.

    Странно, что нигде толком подобные задачи не описаны, разве что поверхностно, и приходится методом тыка находить параметры интерфейсов...

  3. Вот не поверишь! Вчера ставил Фря имно для сервака в боксе и наступил на эти грабли — копал инет долго про этот бубен и «Briged connection».

    Асилил ... и тут твоя статейко...

    Огромное срасибище!

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

  5. Я обычно в rc.conf руками пишу IP, если даже DHCP работает.

    Просто у меня дома DHCP на DIR-320, а он ip клиентам меняет... Проброс портов сбивается)

    1. Андрей, DIRы легко обучаемы привязывать резервируемый IP-вдрес к MAC-адресу запрашивающего.

  6. Спасибо!

    Блин, еще со студенчества ВСЕ собирал из исходников! А тут 1 комманда — pkg_add и никакого геммороя!

    Спасибо дружище! Сэкономил мне кучу времени — на докачку, установку и сборку нужных пакетов.

    А про bridging я догадался, ничего не стал менять.

    И фря заработала с инетом и хостовой операционкой. Тип адаптера не менял.

    Еще раз СПАСИБО!

Комментарии запрещены.