Отчёт о развитии OpenBSD за сентябрь 2010

Основные изменения в базовой системе:

  • Заметно переработан pflog(4). Теперь в log-пакете при редиректе исходного пакета дополнительно сохраняется изначальный адрес, а сами log-пакеты генерируются по мере прохода по соответствующим match-правилам. В частности, это позволяет теперь полностью в реальном времени отлаживать сложные наборы правил.
  • Исправлена семантика работы match- и pass/block-правил: теперь последним применяется итоговое pass/block-правило, даже если подходящее match-правило было обнаружено позднее. Нынешняя логика работы выглядит следующим образом:
    1. Правила проходятся по порядку, сверху вниз.
    2. Изначально перед началом обхода считается последним подошедшим правило pass all. Дальше шаги 3-6 выполняются для каждого имеющегося в наборе правила.
    3. Если это pass- или block-правило и оно подошло к пакету, то оно запоминается как последнее подошедшее.
    4. Если это pass- или block-правило, оно подошло к пакету и содержит опцию quick, то обход списка правил заканчивается (переход на шаг 7).
    5. Если это match-правило, и оно подошло к пакету, то оно применяется.
    6. Происходит переход к следующему правилу в списке (на шаг 3).
    7. Если правил в списке больше нет, применяется последнее подошедшее правило.

    Также добавлена новая опция логирования matches. При её использовании все подходящие пакеты будут отмечаться на pflog(4) не только для указанного правила, но и для всех последующих подошедших к данному пакету правил.

  • pfctl(8) теперь разрешает rdr-to для исходящих правил и nat-to для входящих. Собственно, сам PF это уже давно позволял делать. Оставлено лишь требование указания направления для таких правил (хотя ядро, опять-таки, позволит создать и такое правило). Помимо прочего, теперь можно использовать rdr-to и nat-to одновременно в одном правиле.
  • В route(8) добавлен параметр командной строки -label, позволяющий ограничить список отображаемых маршрутов только теми, которые имеют заданную метку.
  • Для доступа к tun(4)-интерфейсам более не требуются в обязательном порядке права root: для создания интерфейсов без участия файловой системы эти права всё равно требуются, а для файлов /dev/tun* по умолчанию владельцем файлов и так является root. В то же время теперь по необходимости доступ к tun(4)-интерфейсам может быть дан отдельным пользователям, для чего раньше было необходимо использовать sudo(8) или другие способы эскалации привилегий.
  • В OCF (OpenBSD/FreeBSD Cryptographic Framework) добавлена поддержка AES-GCM; и в ядре, и в userland-утилитах isakmpd(8), ipsecctl(8) и iked(8)). На данный момент поддерживается только 128-битный вариант.
  • Добавлен новый псевдоинтерфейс pppx(4) — PPP-мультиплексор. pppx(4) создаёт интерфейс в момент установки сессии, благодаря чему ALTQ и PF могут с ней взаимодействовать.
  • Улучшена пропускная способность сетевого стека под высокими нагрузками и общее поведение ядра в условиях острой нехватки памяти. В частности, буфер отправки TCP теперь автоматически подстраивается без учёта посланных, но не подтверждённых, пакетов. А буфер приёма автоматически подстраивается аналогично FreeBSD, базируясь на произведении задержки и пропускной способности. Это позволило поднять скорость загрузки для ftp.eu.openbsd.org с 300кбит/с до 4.4Мбит/с. Также исправлена ошибка в коде генерации отметок времени для TCP, проявившаяся в результате вышеописанных изменений.
  • На loopback-интерфейсах более не производится откладывание ACK-пакетов.
  • Добавлена поддержка чипов SiS191 в se(4).
  • Завершена переработка кода, работающего с управлением питанием. Жалобы на проблемы с ACPI к концу сентября практически сошли на нет.
  • Поддержка файловой системы NTFS включена теперь по умолчанию в GENERIC-ядре после исправления ряда проблем с надёжностью работы. В ближайшее время ожидается дальнейшее развитие.
  • Исправлен ряд проблем с отрисовкой псевдографики на UTF8-терминалах, в частности, PuTTY.
  • Исправлена как минимум одна из серьёзных проблем, мешающих использованию опции bigmem на платформе amd64.
  • Добавлена поддержка чипов 82583V в em(4).
  • Исправлены проблемы с atw(4), возникшие после переезда на GCC 4.
  • Функциональность pmsi(4) перемещена в состав pms(4).
  • Исправлены досадные, периодически проявляющиеся ошибки в umass(4), один из которых приводил к kernel panic при работе с umass-устройствами, имеющими несколько логических подустройств (LUN-ов), а другой — при подключении umass-устройств без подключённых дисков.
  • Некоторых дисковые устройства (например, CD-приводы) теперь не читают разметку своего диска сразу при подключении; вместо этого принудительно используется псевдоразметка, что позволяет использовать уникальные идентификаторы с такими устройствами.
  • uyurex(4) переименован в utwitch(4) и включён в сборку по умолчанию.
  • Для glob(3) добавлен новый флаг, GLOB_KEEPSTAT, который позволяет сохранить копию использовавшейся структуры stat, дабы избежать последующего вызова stat(2)/lstat(2).
  • Также в libc добавлена timingsafe_bcmp(3), функция, реализующая сравнение областей памяти за непредсказуемое время. Изначально она была создана и использовалась в OpenSSH для предотвращения раскрытия косвенной информации.
  • Добавлен новый демон iscsid(8), iSCSI-инициатор, использующий ранее созданный vscsi(4). На данный момент реализован абсолютный минимум протокола, необходимый для работы, поэтому для production пока не подходит (даже формат конфигурационного файла iscsi.conf пока что ещё не устоялся). В сопутствующей утилите iscsictl(8) реализованы пока что только обнаружение устройств и перезагрузка конфигурации. iscsid(8), iscsictl(8) и собственно vscsi(4) включены в базовую сборку.
  • Убраны утилиты msgs(1) и tn3270, как неактуальные в современном мире.
  • В ldapd(8) реализована прямая поддержка BSD-аутентификации, без использования SASL, посредством использования префикса {BSDAUTH}.
  • Приятная мелочь: dhclient(8) теперь можно указать в качестве интерфейса egress, что позволяет принудительно обновлять аренду без необходимости знать, на каком интерфейсе dhclient(8) запускали до этого.
  • GCC 4 теперь успешно работает на MIPS64-архитектурах, а также корректно делает кросс-компиляцию как таковую. Все MIPS-архитектуры переведены на GCC 4.
  • Добавлена поддержка L2TP для PIPEX в ядре и npppd, в том числе для IPv6.
  • После исправления проблем со сборкой на архитектурах, не поддерживающих динамическое связывание, утилита для работы с Web-камерами video(1) вновь включена в сборку.
  • Продолжена работа на OpenRCS/OpenCVS. В частности, исправлены досадные проблема с рекурсивным созданием каталогов и с не-игнорированием каталогов CVS при некоторых операциях в OpenCVS. Возможно, OpenCVS снова будет поставляться в OpenBSD 4.9.
  • Perl обновлён до версии 5.12.2.
  • В mod_headers системного Apache 1.3 добавлена поддержка директивы RequestHeader аналогично Apache 2.x.
  • Новые опции в tmux:
    Опция сервера exit-unattached
    указывает серверной части завершиться после отключения последнего клиента, даже если остались какие-то сессии.
    Опция сессии destroy-unattached
    указывает, что сессию следует завершить после отключения последнего клиента.

Изменения в OpenSSH:

  • Добавлена опция KexAlgorithms, позволяющая выбирать среди поддерживаемых алгоритмов обмена ключевой информацией.
  • Исправлена проблема вида «гонка ресурсов» с управляющими сокетами; теперь дохлые серверные сокеты будут автоматически убираться клиентами.
  • В sftp(1) добавлена поддержка управления скоростью потока (опция командной строки -l), аналогично scp(1).

Заметные изменения в портах:

  • Вместо GNU libtool по умолчанию теперь используется собственная версия libtool, написанная на Perl. Основные плюсы альтернативной реализации:
    • Отсутствие проблем при сборке пакетов параллельно с наличием их же установленных: GNU libtool зачастую подцепляет в этих случаях библиотеки из системы, а не из того места, в котором идёт сборка, что приводит к конфликтам при использовании программ из данных пакетов и от них зависящих.
    • Большая скорость работы: общая скорость полной сборки портов возросла на 15%.
    • Более компактный и простой в понимании код, который проще поддерживать и который лучше учитывает специфику OpenBSD.

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

  • Порт Ruby разбит на две версии, 1.8 и 1.9, аналогично тому как это делается для Python. По умолчанию на данный момент используется 1.8. Программы из портов проверены на работу без наличия симлинка /usr/local/bin/ruby, однако для сторонних программ он может понадобиться.

Также ряд (других) улучшений наблюдался в USB- и звуковой подсистемах (прежде всего касаемо поддержки ждущего режима), программных реализациях RAID, подсистеме IEEE 802.11, поддержке NetAtalk, bridge(4), cwm, gcvt(3), iked(8), mandoc(1), npppd(8), procfs, softraid(4), tcpbench и других многочисленных частях ОС.

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

Полный текст статьи читайте на OpenNet