Релиз ядра Linux 3.7. Обзор новшеств

Линус Торвальдс представил релиз ядра Linux 3.7. В новой версии представлена большая порция существенных изменений, связанных с архитектурой ARM: возможность формирования многоплатформенных ARM-сборок, поддержка архитектуры AArch64 (ARM64), адаптация Xen для работы на процессорах ARM Cortex A15. Из других улучшений можно отметить реализацию пространства имён для идентификаторов пользователей, возможность проверки цифровой подписи при загрузке модулей ядра, использование инструкций SMAP для защиты от эксплуатации уязвимостей в ядре, поддержку протоколов SMB2.1 и VXLAN, реализацию GRE и NAT для IPv6, поддержку режима TFO на стороне сервера.

В новую версию принято 10409 исправлений от более чем 1200 разработчиков, размер патча - 95 Мб (изменения затронули 15886 файлов, добавлено 1570793 строк кода, удалено 1246965 строк). В связи с изменением структуры размещения и переработкой иерархии дириекторий некоторых частей ядра, размер нынешнего патча более чем в два раза больше по сравнению с прошлыми выпусками. Около 33% всех представленных в 3.7 изменений связаны с драйверами устройств, примерно 23% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 6% связано с сетевым стеком, 3% - файловыми системами и 3% c внутренними подсистемами ядра.

Наиболее интересные новшества ядра 3.7:

  • Аппаратные архитектуры
    • Поддержка 64-разрядной архитектуры AArch64 (ARM64), реализованной в процессорах, поддерживающих набор команд ARMv8. 64-рязрядная архитектура AArch64 включает в себя новый набор команд A64, примечательный расширением числа регистров, новыми командами для вычислений с плавающей запятой (FP) и новыми векторными SIMD-инструкциями NEON, такими как инструкции для ускорения работы алгоритмов шифрования AES и SHA-1/SHA-256. Реализация AArch64 для Linux поддерживает расширенную 39-разрядную адресацию памяти для ядра и пользовательского уровня и предоставляет режим совместимости, позволяющий выполнять 32-битные программы, собранные для архитектуры ARMv7 (ARM EABI). В настоящее время устройства на базе ARMv8 пока находятся на стадии тестирования прототипов, поступление в продажу первых ARMv8-систем ожидается в следующем году;
    • Унификация кода поддержки архитектуры ARM и обеспечение возможности формирования многоплатформенных ARM-сборок. Если ранее требовалось собирать отдельный вариант ядра для каждого типа SoC, то начиная с выпуска 3.7 появится возможность собрать одно ядро, которое будет содержать поддержку различных ARM-платформ. Унифицированная сборка ядра 3.7 сможет работать на платформах Calxeda Higbank (серверы HP Moonshot), Versatile Express (эталонная плата, поддерживается эмулятором QEMU), Marvell ARMADA (от мини-серверов до телеприставок), Altera SoC FPGA и Picohip picoXcell (мини-базовые станции для офисов). В будущих выпусках ядра число поддерживаемых платформ будет расширено. Указанное нововведение существенно упростит жизнь разработчикам дистрибутивов для ARM-систем, которым теперь не придётся формировать отдельный загрузочный образ для каждой ARM-платформы.
  • Виртуализация и безопасность
    • Поддержка механизмов виртуализации Xen для систем на базе процессоров ARM Cortex A15. Таким образом Xen стал первым гипервизором, поддерживаемым в Linux на платформе ARM. Представленный для интеграции в ядро код основан на использовании аппаратных расширений для обеспечения виртуализации, поддерживаемых архитектурой ARMv7. Особенностью реализации Xen для ARMv7 является отсутствие разделения в поддержке запуска гостевых систем в режиме паравиртуализации (PV) и аппаратной виртуализации (HVM). Вместо этого используется один комбинированный режим запуска гостевых систем, напоминающий запуск PV поверх HVM без необходимости эмуляции оборудования при помощи Qemu. Гостевые системы при этом всегда запускаются в режиме полной виртуализации, но для доступа к сетевым и блочным устройствам должны использовать специальные паравиртуальные драйверы (т.е. для гостевых окружений не требуется модификация ядра системы, но необходимо наличие нескольких драйверов).
    • Добавлена рабочая реализация пространств имён для идентификаторов пользователей (user namespaces). Указанная возможность позволяет сформировать в контейнерах собственные наборы идентификаторов групп и пользователей, а также связанные с ними привилегии (например, в каждом контейнере может быть свой root);
    • Поддержка набора инструкций SMAP (Supervisor Mode Access Prevention), реализованного в процессорах Intel на базе микроархитектуры Haswell. Задействование SMAP в ядре позволяет блокировать доступ к данным в пространстве пользователя из привилегированного кода, выполняемого в пространстве ядра (по аналогии с тем, как добавленная в ядре 3.0 поддержка SMEP не позволяет переходить из режима ядра к выполнению кода, находящегося в пользовательских областях). При обеспечении оборудованием поддержки инструкций SMAP, представленные средства защиты будут включаться автоматически, что существенно усложнит эксплуатацию уязвимостей в ядре, вызванных такими ошибками, как разыменование NULL-указателя;
    • Поддержка загрузки модулей ядра с проверкой их корректности по цифровой подписи. Указанная возможность разработана в рамках проекта по обеспечению поддержки загрузки верифицированного ядра Linux на системах с включенным режимом UEFI Secure Boot. При активации данной опции, ядро будет отвергать загрузку любых модулей для которых нет корректной цифровой подписи. Поддерживается и отладочный режим, при котором выполняется проверка, но она не влияет на загрузку модулей и информирует о проблемах через лог. При сборке ядра, при наличии открытого и публичного ключей процесс создания подписей для собираемых модулей выполняется автоматически, а проверочный ключ интегрируется в файл crypto/signature/key.h. Отмечается, что генерация цифровых подписей немного замедляет процесс сборки;
    • В соответствии с пожеланиями разработчиков systemd, расширенные атрибуты для управляющих групп (control groups) могут задаваться через создание иерархии директорий. При использовании неиерархических групп управления во вложенных элементах иерархических групп будет выдаваться ошибка;
  • Дисковая подсистема, ввод/вывод и файловые системы
    • В файловую систему Btrfs добавлена поддержка "hole punching", технологии при которой часть файла можно пометить как более неиспользуемую. Это позволяет файловой системе и носителям (например, накопителям SSD) заранее освобождать неактуальные неиспользуемые блоки в середине файла. Кроме того, в новой версии ядра сильно ускорена работа системного вызова fsync() на btrfs;
    • В реализации файловой системы CIFS обеспечена поддержка протокола SMB2.1. Статус поддержки SMB2 на уровне ядра переведен из разряда "поломанный" в "экпериментальный";
    • Добавление модуля IMA (Integrity Measurement Architecture) для обеспечения хранения и проверки базы хэшей для проверки целостности файлов и связанных с ними метаданных. Данные для контроля целостности сохраняются как атрибуты xattr;
    • В реализацию программных RAID (MD RAID) и файловой системы JFS добавлена поддержка команды TRIM (discard), которая позволит увеличить производительность при работе с SSD-накопителями и повысить их срок службы;
    • Перевод реализации NFS 4.1 в разряд стабильных (ранее поддержка NFS 4.1 была помечена как экспериментальная);
  • Сетевая подсистема
    • Поддержка протокола туннелирования GRE (Generic Routing Encapsulation) для IPv6;
    • Поддержка трансляции адресов (NAT) для IPv6. IPv6 NAT позволяет осуществить подмену адресной информации в пакетах IPv6 в соответствии с заданными правилами трансляции, примерно так как это делается в классическом трансляторе адресов для IPv4. Для реализации поддержки IPv6 NAT, существующий в ядре код netfilter был переработан с целью разделения модуля NAT на два независимых компонента, один из которых включает в себя ядро подсистемы NAT, а второй реализует поддержку того или иного протокола третьего уровня;
    • Поддержка режима быстрого открытия TCP-соединений (TFO - TCP Fast Open) на стороне сервера. Режим TFO позволяет сократить число шагов установки соединения за счёт комбинирования в один запрос первого и второго шагов классического 3-этапного процесса согласования соединения, и давая возможность отправки данных на начальном этапе установки соединения. В ядре 3.6 поддержка TFO была ограничена возможностью управления только на стороне клиента в процессе создания соединения. Теперь TFO может быть активирован и по инициативе серверной стороны;
    • Поддержка протокола VXLAN для туннелирования виртуализированных сетей второго уровня поверх сетей третьего уровня. Указанный протокол позволяет обойти ограничение на 4096 VLAN-ов (в VXLAN используются 24-разрядные идентификаторы);
  • Память и системные сервисы
    • Началась интеграция результатов работы по рефакторингу заголовочных файлов, конечной целью которой является разделение по разным иерархиям директорий заголовочных файлов для UAPI (Userspace API) и KAPI (Kernel API). Подобное разделение позволит более явно выделить необходимые для использования в пространстве пользователя заголовочные файлы, которые теперь перемещены в include/uapi и arch/$(ARCH)/include/uapi. Например, разработчики дистрибутивов получат возможность подготовить сокращённый пакет (включить только заголовки UAPI) для сборки пользовательских компонентов, завязанных на API ядра. В рамках проекта также проведена работа по упрощению сложившейся усложнённой и запутанной схемы внутренних зависимостей между заголовочными файлами, например, разработчики сталкивались с проблемами добавления inline-функций в заголовочный файл, так как нередко в таких функциях необходимо было использовать компоненты из других заголовочных файлов. В ядро 3.7 включены не все из предложенных патчей, многие изменения перенесены на следующий выпуск ядра;
    • Загрузчик прошивок теперь пытается загрузить файлы непосредственно из пространства пользователя, без задействования udev. Наличие прошивок пока проверяется в /lib/firmware, в будущем будут добавлены гибкие настройки выбора пути;
    • API для кэширования прошивок, позволяющий перед переходом в спящий режим поместить в память копии прошивок для активно используемых устройств, что позволит гарантировать наличие прошивок в памяти в момент пробуждения системы;
    • В системный вызов epoll_ctl() добавлена опция EPOLL_CTL_DISABLE, позволяющая отключить пулинг для указанного файлового дескриптора;
    • В утилиту perf добавлена команда trace ("perf trace PID") по выполняемым функциям напоминающая утилиту strace, но дополнительно позволяющая отображать события не связанные с системными вызовами;
    • Добавлена новая утилита "trace agent", использующая virtio для эффективного перемещения данных о трассировке из гостевой системы в окружение хоста;
    • Добавлена утилита acpidump для записи в текстовый файл дампа системных таблиц ACPI;
  • Оборудование
    • Полностью переписана базовая часть драйвера Nouveau, в которой теперь учтены дополнительные особенности чипсетов NVIDIA, которые не были известны в момент написания ранее доступной базовой части драйвера;
    • Проведена реорганизация подсистемы Video4Linux 2, код драйверов теперь размещён по поддиректориям в зависимости от используемого типа шины. Переписан код для обеспечения работы DVB-устройств с интерфейсом USB;
    • В звуковую подсистему ALSA добавлен новый API (PCM channel-mapping API) для управления звуковыми каналами, позволяющий настроить привязку каналов или получить точные данные о том, какой канал привязан к какой позиции в пространстве (например, для surround 4.0 используются каналы - левый впереди, правый впереди, левый сзади, правый сзади);
    • Поддержка Raspberry Pi, а также SoC Broadcom BCM2835, Micrel KS8695; Freescale P5040DS, Freescale / iVeia P1022RDK и MIPS Technologies SEAD3;
    • Для приложений, работающих на системах на базе архитектуры s/390, добавлена возможность использования аппаратной транзакционной памяти System zEC12;
    • Поддержка игровых пультов Sony PS3 BD;
    • Поддержка сетевых контроллеров Silicom Bypass, Freescale XGMAC MDIO и Microchip MRF24J40;
    • Поддержка модемов ST-Ericsson STE и звуковых плат Wolfson Bells;
    • Поддержка USB-контроллеров: Broadcom BCM63xx, Marvell USB 3.0 PHY, ZTE USB-to-serial переходников и плат Cambridge Electronic Design 1401 USB;

© OpenNet