О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

17.08.2008

AMD64 и POSIX-системы. 2005

2005 г

Преамбула

Два знаменательных события практически совпали по времени: появление (у меня) машины на AMD64 и выход первой бета-версии FreeBSD 6-й ветки (в том числе и в 64-битном варианте). Созданные друг для друга, они и рассказа заслуживают совместного.

Правда, "шестьдесятчетверкой" я обзавелся несколько раньше анонса "шестерки". И за этот промежуток времени успел перепробовать на ней немало систем. В числе коих были:

  • и CRUX для x86-64 (версии 2.01),
  • и Archlinux - в исполнении под абстрактный i686 (ибо иного в природе не существует),
  • и релизная FreeBSD 5.4 в варианте под AMD64,
  • и DragonFlyBSD о 32 битах (64-разрядная ее версия, видимо, нам в ближайшее время не светит.

И ни одна из этих систем не вызвала у меня чувства глубокого удовлетворения. Почему? Чтобы ответить на этот вопрос, нужно несколько слов сказать о том "железе", на которое они устанавливались.

О железе

С процессором все просто: Athlon64 3200+ (реальная тактовая частота - 2 Ггц) под 939 сокет, в боксовом исполнении - разумный компромисс между тягой каждого русского к быстрой езде и заботой о семейном бюджете (правда, семейство на этот счет имеет другое мнение).

Материнская плата - также без особых затей: Epox EP-9NDA3I на чипсете nForce3 250 (не Ultra). Которая несла на борту достаточно скромную оснастку: 2 разъема PATA, 2 - SATA, 4 слота под память, 4 напаянных USB'ки и два разъема для подключения еще 4-х таких же, последовательный и параллельный порты, PS/2 разъемы под мышь и клавиши. Плюс обычные чипсетные сеть и звук. Никаких новомодных FireWire и ATA RAID. Однако, как в рюкзаке хорошего туриста, все необходимое было, а ничего лишнего, напротив, не имелось. По крайней мере, по моим потребностям. А некоторая ее моральная... не старость даже, а зрелость, была гарантией того, что хотя бы с основными компонентами - ATA-контроллерами и видеокартой - проблем не возникнет. У меня были большие сомнения в беспроблемности установки Linux или BSD систем на мать с чипсетом nForce4 и шиной PCI-E. Тем более, что последняя мне абсолютно без надобности.

На памяти экономить - дело последнее. И потому - две планки имени Samsung original (вроде действительно), по 512 Мбайт каждая: меньше - западло, больше вроде и не к чему. Зато видеокарта запрошена была такая: самая простая и дешевая не от дядюшки Ляо. Что на поверку оказалось, как ни странно, Gigabyte на Radeon 9250 о 128 набортных мегабайтах, да еще и с TV-Out. Странные нынче представлени о простоте видеосистемы, однако...

Винчестеры у меня сохранились с прежних, десктопных, времен: SATA Seagate на 120 Мбайт, который планировался в качестве главного рабочего, и два PATA из того же инкубатора - на 40 и 80 Гбайт; первый предназначался для экспериментов, второй же долгое время служит мне файлопосвалкой. Имелся и сидюшник - NEC 350AG, не последнее слово науки и техники, конечно, но роль и читала, и писала, как для CD, так и для DVD, исполняющий вполне справно.

Все это требовало упаковки в корпус. Каковой заслуживает пары слов отдельно. Имя ему - Chieftec DX-01, с одноименным блоком питания на 360 ватт. Строгого цвета свежеотлитого чугуна и умеренно-модерновый внешне, он имел запирающуюся на ключ крышку, прикрывавшую от несанкционированного доступа кнопки питания и Reset'а (последняя - утоплена, так что случайно и при открытой крышке не нажать), 4 наружных 5-дюймовых отсека и 2 - трехдюймовых (в связи с отмиранием флоппи-дисководов - более чем достаточно. В моем случае крышка несла еще одну функцию: сокрытия от взора эстета бледнолицей фронтали сидюшника (ну не подобрал я ее в тон). Ниже крышки - шторка, прикрывающая два фронтальных USB-разъема плюс один - FireWare, для меня бесполезный.

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

Кроме фурнитуры, внутри корпуса имелись:

  • четыре пятидюймовых отсека - как уже сказано, с наружным доступом;
  • две корзины для трехдюймовых устройств, на три посадочных места каждая, к двум из которых возможен доступ извне; корзины легко (без отвертки) снимаются независимо друг от друга;
  • три посадочных места для вентиляторов - два на фронте и один в тылу; верхний из фронтовых направлен непосредственно на нижнюю трехдюймовую корзину;
  • аккуратно закрепленные на дне корпуса салазки для крепления пятидюймовиков;
  • связка питающих проводов, среди которых - два для SATA.

В общем, корпус оказался исключительно удобным как для сборки, так и при дальнейшем ковырянии. Так что настоятельно рекомендую. Да и по цене это разумный компромисс между набившим оскомину Inwine и супернавороченными Xaser или CoolerMaster.

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

Наступила минута включения, после которого обычно принято лезть в Setup BIOS'а. Не изменил этому обычаю и я. Хотя говорить о BIOS особенно нечего - стандартный современный Award aka Phoenix со столь же стандартным набором опций, многократно описанных, например, на iXBT. Тем более что и дел-то у меня там было - выставить время по Гринвичу, отключить ненужные мне устройства (флоппи, последовательные и параллельный порт), убедиться, что все нужное мне (USB Mouse, набортные сеть и звук) включены по умолчанию, да изменить порядок загрузочных устройств: CD -> SATA -> PATA 1. Последнее делается в два захода - отдельно устанавливается последовательность CD -> винчестер, и отдельно - очередь винтов на загрузку.

Эксперименты с Linux'ами

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

Стопка установочных компактов была заготовлена заранее. Начал я с CRUX'а, благо имел он уже 64-битную версию. Установка системы (процедура, ничем не отличающаяся от описанной ранее) прошла без всяких проблем, все железо (включая диск SATA) виделось нормально. Однако после перезагрузки, когда я начал настраивать сеть для подключения к Интернету (у меня стандартная городская выделенка), то столкнулся с отсутствием сетевой карты - повторяю, она была встроенной в материнку. Анализ собственных действий, изучение Google и обсуждение на Линуксофруме показали, что я, поверив документации к системной плате, тривиально ошибся при сборке ядра (в CRUX оно собирается собственноручно на стадии инсталляции). Перекопилировав ядро с поддержкой

Reverse engeneered nForce net driver

я получил вожделенный доступ в Интернет.

Быстродействие машины под CRUX'ом впечатляло. Это вообще, на мой взгляд, визуально самый быстрый дистрибутив, но на AMD64 его "скорострельность" казалась возведенной в энную степень. Тестированием как таковым мне заниматься было недосуг (в стопе сидюшников ждали своей очереди другие системы - а до тестов, надеюсь, дело еще дойдет), поэтому - только маленький штришок: сборка ядра командой make all заняла менее трех минут. Конечно, ядро у меня было очень облегченным, и практически без модулей, однако - аналогично сконфигурированные (с поправками на версии) ядра на машинах с P-IV/2,53-2,66 собирались минут 7-8.

Следующим в стопке лежал Archlinux - правда, 32-разрядный и довольно старый, версии 0.7 от конца прошлого года. Что, впрочем, особого значения не имело: при установке по FTP (как это описано в соответствующей статье) задействуются пакеты текущей (current) версии. А препятствий к такой установке не было: опыт CRUX показал, что встроенная сетевая работает нормально.

Правда, поначалу обнаружилась другая сложность: загрузка с CD (а даже для ftp-установки грузиться с чего-то нужно) проходила до стадии определения ATA-устройств, после чего начиналась kernel panic. Размышления и изучение установочного help'а дали решение: при приглашении к начальной загрузке с компакта не жать сразу Enter в пустой командной строке, а ввести в ней команду

arch-noscsi

то есть выбрать ядро без поддержки SCSI. После этого установка Arch'а прошла нормально. Правда, после загрузки я с удивлением обнаружил отсутствие диска SATA - по доброй Linux'овой традиции, таковые предстают перед системой как своего рода разновидность SCSI. Интересно, что в ARCHIE (это такой LiveCD, сделанный на базе Arch'а, очень аккуратный и быстродействующий) такого глюка не наблюдалось. Не было никаких проблем и с последующей (уже после установки) загрузкой типового прекомпилированного IDE-ядра Archlinux - и диск SATA при нем прекрасно виделся. За счет модулей, подгружаемых из initrd, конечно...

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

Эксперименты с BSD'ями

Список Linux-кандидатов был исчерпан: ставить Gentoo под AMD64 мне почему-то не хотелось, так что пора было переходить к BSD-системам. Их, собственно, было две с половиной: FreeBSD, отложенная напоследок, ее "причесанная" под user-friendly разновидность - PC-BSD, и DragonFlyBSD. Начал с последней позиции.

Собственно, никаких неожиданностей здесь не предвиделось: в листе совместимости этой ОС было английским по белому сказано, что

  • процессор AMD64 прекрасно поддерживается в 32-битном режиме (и не поддерживается - в родном,
  • и чипсет nForce3 поддерживается также замечательно, хотя его встроенные сеть и звук не работают.

Проверив для страховки, не изменилось ли что-нибудь со времени сочинения документа (я ставил последнюю Preview-версию, а DragonFly меняется гораздо быстрее, чем документация к ней) и убедившись, что так оно и есть, что сети нет, я извлек из закромов Родины запасенные специально на такие случаи наистандартнейшие карты - SB AWE128 для звука и нечто NE2000-совместимое - для сети.

После этого - никаких неожиданностей: все установилось, запустилось, заработало, точно также, как это описывалось ранее. Ядро и "мир" пересобрались благополучно - правда, с флагом -march=i686; было у меня искушение попробовать флаг -march=athlon64, но решил отложить это до лучших времен: ведь если бы тут все было так просто - Мэтт сотоварищи давно бы уже соответствующую версию выпустили бы...

Далее в программе стояла PC-BSD. Поводом к ее установке послужил выход очередной промежуточной версии - 0.7.5, в которой, по сравнению с описанной ранее 0.7, обещано было ликвидировать кардинальный недостаток инсталлятора - невозможность произвольной разбивки диска.

Действительно, инсталлятор оказался переработанным. Во-первых, добавилась поддержка разных языков. Правда, русского среди них не оказалось - но это уж сами виноваты - не выдвинули из своей среды энтузиаста-переводчика. Во-вторых, действительно: теперь под PC-BSD можно выделить слайс на неразбитом дисковом пространстве. А уж его разбить на BSD-разделы под разные файловые системы - типа там /var, /usr и /home. Однако дело до конца еще не доведено: можно создавать разделы только под файловые системы, монтируемые непосредственно в корень: часто целесообразных /usr/src, /usr/ports, /usr/ports/distfiles разметить по преднему не удастся. Однако на стадии инсталляции они и не нужны - их можно создать и подмонтировать позднее, озаботившись сейчас только наличием неразмеченного дискового пространства. В общем, процесс превращения PC-BSD из демо-версии в юзерофильный вариант полноценной FreeBSD идет полным ходом...

И, наконец, главная героиня сегодняшней истории - FreeBSD for AMD64. Первая попытка в ее отношении была предпринята с версией 5.4, то есть стабильной. Что не обещало каких-либо неожиданностей.

И действительно, установка (многократно описывавшаяся ранее, в том числе и автором этих строк) прошла без всяких неожиданностей. За одним исключением: при конфигурировании сетевых интерфейсов (Configure -> Networking -> Interfaces) sysinstall упорно видел лишь slip и ppp, как будто в машине не было ни встроенной сетевой, ни той самой внешней, типа NE2000. Тогда я не придал этому значения, подумал - ну, в крайнем случае, ядро потом пересоберу. И оказалось - напрасно.

После завершения установки и перезагрузки я первым делом кинулся смотреть каталог /boot/kernel. Модуля для nVidia'вской сети там не оказалось, а для карт типа NE2000 вроде бы и быть не должно.

Внимательный просмотр конфигов ядра для AMD64 показал, что опция device ed в /usr/src/sys/amd64/conf/GENERIC присутствует - но закрыта комментарием, и сопровождается предупреждением, что использовать ее не нужно. Я позволил себе усомниться, снял комментарий и попробовал пересобрать ядро. Компиляция оборвалась как раз на сборке ed...

Собственно о героине: FreeBSD 6 for AMD64

Я совсем было приуныл - дело шло к покупке новой сетевой карты. И тут свершилось - в новостях промелькнуло сообщение о выходе 1-й бета-версии FreeBSD 6, уже доступной на ftp.freebsd.org (хотя официального объявления еще не было).

Для 1-й беты на сервере проекта (в каталоге ISO-IMAGES-amd64/6.0) было доступно три образа дисков: 6.0-BETA1-amd64-bootonly.iso, 6.0-BETA1-amd64-disc1.iso и 6.0-BETA1-amd64-disc2.iso (47, 520 и 140 Мбайт, соответственно).

Диск bootonly, как и во всех предыдущих версиях, - это просто большая загрузочная дискета, предназначенная только для старта системы и запуска sysinstall в предположении, что вся дальнейшая установка будет выполняться по сети или с наличного дискового раздела, несущего дистрибутив. Диск 1, судя по объему, должен был бы содержать базовую систему (FreeBSD Distributions) и хоть какие пакеты, например, Иксы. Содержание диска 2 оставалось загадкой: если на нем дополнительные пакеты - почему бы их не впрессовать в первый диск?

В общем, скачал я и "сболванил" диски 1 и 2. И оказалось: на первом диске в наличии только Distributions, без всяких пакетов и Иксов. А на втором - разноязычная документация. В том числе и русская, однако вряд ли ради нее стоит качать 140 Мбайт - на freebsd.org.ua ее есть гораздо больше.

Так что практически нужен оказался один диск, с коего и выполнялась установка. Никаких изменений в sysinstall по сравнению с предыдущей веткой не произошло, так что говорить о ней не буду. Тем паче интересным был только один момент - настройка сети. И тут - о чудо - в списке доступных интерфейсов к slip и ppp присоединился nve! Легко было догадаться, что это и есть та самая чипсетная сеть nVidia - хотя и отмечен этот пункт был как неизвестный интерфейс. Однако уже само его наличие внушало надежды.

И они оправдались, хотя и не сразу. Действительно, сеть благополучно настроилась, хотя и не через sysinstall, а руками. По причинам, описанным в недавней заметке про MAC-адрес, эта процедура у меня требовала еще некоторых телодвижений. И все с новоустановленной системой в общем было хорошо (насколько хорошо - расскажу чуть позже), да вот только на первую консоль время от времени выскакивали сообщения:

nve0: device timeout (#)

Обращение к священному писанию фришников (FreeBSD Handbook) дало по этому поводу разъяснение, что это "нормально для некоторых сетевых карт". Я решил, что моя карта относится именно к этим некоторым, и успокоившись, занялся установкой необходимых пакетов.

Кончилось это плохо: через некоторое время машина начала самопроизвольно перезагружаться, переходя предварительно в режим отладки - без всякого с моей стороны к тому повода (то есть нажатия каких-либо Alt+Control+Escape). Мне это не очень понравилось...

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

device nve

отвечающей за поддержку чипсетной сети nForce. Поддержка этого интерфейса благополучно скопилировалась в виде модуля /boot/kernel/if_nve.ko, автоматическую загрузку которого при старте я определил в /boot/loader.conf:

if_nve_load="YES"

Таймауты устройства после этого не пропали, но вреда, по крайней мере видимого, уже не наносили.

Там же я заодно добавил модуль

atapicam_load="YES"

Это нечто вроде эмуляции SCSI через IDE в Linux, и нужно оно для использования cdrecord и базирующихся на нем фронт-эндов типа k3b.

Ну и модули поддержки звука не забыл. Как ни странно, для чипсетного аудио от nVidia это делается точно также, как для интеловского, двумя строками. Строка

sound_load="YES"

обеспечивает звук вообще (этот модуль, начиная с версии 5.3, если не ошибаюсь, заменил прежнее устройство pcm), а строка

snd_ich_load="YES"

отвечает конкретно за чипсетный звук в наборах от Intel, nVidia и, кажется, еще каких-то.

Конечно, при конфигурировании ядра я не ограничился изменением одной строки. А заодно почистил его от всех ненужным мне опций (поддержки немерянного количества сетевых, SCSI- и RAID-контроллеров, "лишних" файловых систем (а практически все они, кроме UFS, лишние, так как прекрасно поддерживаются модульно). Кроме того, в конфиге ядра для AMD64 есть несколько опций, отвечающих за совместимость с 32-разрядными бинарниками для Linux. Сами по себе они, может, и не лишние, но с их включением ядро у меня не собралось - пришлось избавиться и от этого балласта. А из того, чего по умолчанию нет в GENERIC, хорошо бы (по моему мнению, так почти обязательно нужно) включить такую строку:

options         SC_PIXEL_MODE

которая отвечает за поддержку так называемой графической консоли - эта фича в 6-й ветке очень усовершенствовалась. Кроме того, я увеличил размер экранного буфера

options         SC_HISTORY_SIZE=1000

и вкомпилировал в ядро кириллический шрифт

options         SC_DFLT_FONT
makeoptions SC_DFLT_FONT=koi8-r

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

Во FreeBSD 6-й ветки в качестве компилятора по умолчанию используется gcc версии 3.4.X (в 1-й бете - 3.4.4), допускающий множество флагов оптимизации под процессор, которые прописываются в /etc/make.conf (в свежеинсталлированной системе его нет - берется из /usr/share/examples/etc/). Однако я ограничился явным указанием типа процессора

CPUTYPE=athlon64

Внимание: в примере конфига здесь по прежнему фигурирует i686. А также непритязательными флагами

CFLAGS= -O2 -pipe
COPTFLAGS= -O2 -pipe

для "мира" и ядра, соответственно. Ходят упорные слухи, что посредством gcc-3.4.4 и то, и другое можно собрать и с -O3 - но я решил для начала не рисковать (да и польза от этого видится сомнительной).

Вот и все. Можно а) начинать работать (собрав или установив необходимые для того порты/пакеты), и б) на досуге смотреть, а что нам дал переход на новую ветку - раз, и удвоение разрядности процессора и ОС - два.

Сначала - об особенностях 6-й ветки вообще. Внутреннее ее устройство не претерпело столь радикальных изменений, как при переходе с ветки 4 на 5-ю. Однако усовершенствования весьма многочисленны. Ознакомиться с ними можно на сайте проекта, поэтому внутренностей системы я затрагивать не буду. Скажу только о том, что мне показалось важным для конечного пользователя, например, меня.

Здесь на первом месте я поставил бы усовершенствования в подсистеме ACPI. Почему? Да потому, что раньше именно она препятствовала установке FreeBSD на некоторые конфигурации, например, немалое число ноутбуков. И, соответственно, остальные особенности этой ОС их пользователей уже не волновали. Не знаю, рассосалась ли эта проблема окончательно, но что дело значительно улучшилось - убедился на собственном опыте (впрочем, со временем это составит предмет отдельного рассказа).

На втором месте - глобальное усовершенствование подсистемы ATA-устройств, в том числе и SATA. Что оно именно глобальное - сомнений нет: скорость файловых операций по сравнению с 5.X возросла просто неимоверно. А поскольку о каком-то кардинальном ускорении UFS2 речи нигде не было, остается списывать это на рост быстродействия работы с диска. Или все-таки 64-битная UFS2 лучше чувствует себя в "равно-разрядном" окружении?

На треть место я поставил бы расширение возможностей графической консоли. Сама по себе во FreeBSD она существует очень давно (как минимум, с 4-й ветки), но ограничивалась одним-единственным режимом - 800x600. Для 5-й ветки были созданы патчи, основанные на заимствованным из DragonFlyBSD коде, позволявшие получать практически любые физически доступные для видеокарты разрешения. И вот эти патчи включены в основное дерево системы. Почему мне кажется это важным? Скоро догорят последние CRT-мониторы, и на смену им придут LCD-панели. А на них стандартный текстовый режим 80x25 выглядит вполне отвратительно...

И наконец - столь долгожданная поддержка ReiserFS. Правда, в режиме read only (и пока не известно, планируется ли режим read/write вообще), но и это уже расширяет возможности обмена данными между Linux и FreeBSD на локальной машине.

Дал что-нибудь переход на 64 бита? Можно ответить вопросом на вопрос: а чего вы хотели бы от этого получить? Если расширения адресуемых памяти и дискового пространства - то очень даже дало, только вот для настольного пользователя это не актуально. А в плане быстродействия - сказать трудно, так как объективно мне сравнивать не с чем. Могу констатировать, что визуально FreeBSD для AMD6 работает на этом процессоре быстрее, чем FreeBSD для i386 - на Pentium-IV/2,53-2,66 (количество смайликов тут ограничивается только вашим расположением духа). Хотя, возможно, что и 64 бита внесли свою лепту в ускорение файловых операций.