Линус Торвальдс представил релиз ядра Linux 3.4. Из основных улучшений можно отметить: поддержка x32 ABI (64-разрядный режим с 32-разрядными указателями); модуль Yama для блокирования некоторых типов атак; механизм dm-verity для проверки целостности хранимых блоков данных по криптографическим хэшам; улучшения в реализации Btrfs (повышение производительности работы с метаданными, улучшение обработки ошибок и добавление средств для восстановления файлов с повреждённой ФС); расширение возможностей видеодрайверов (поддержка Nvidia Geforce 600 'Kepler', Intel Medfield, AMD RadeonHD 7xxx и AMD Trinity APU); автоматизация проверки наличия драйверов для задействования специфичных возможностей x86 CPU; GUI на базе GTK2+ для анализа отчётов подсистемы perf; возможность использования отдельного хранилища в качестве доступной только для чтения основы для нескольких LVM-разделов.
В новую версию принято около 10 тысяч исправлений от более чем 1200 разработчиков, размер патча - 42 Мб (изменения затронули 11086 файлов, добавлено 576 тыс. строк кода, удалено 358 тыс. строк). Около 40% всех представленных в 3.4 изменений связаны с драйверами устройств, примерно 30% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 5% - файловыми системами и 6% c внутренними подсистемами ядра.
Наиболее интересные новшества ядра 3.4:
Память и системные сервисы
В ядро интегрированы наработки проекта X32, в рамках которого разработан гибридный x86_64 ABI с 32-разрядной адресацией памяти. X32 представляет собой прослойку поверх стандартного x86_64 ABI ядра, позволяющую использовать на 64-разрядных системах 32-разрядную модель адресации памяти. ABI X32 позволяет приложениям использовать все преимущества архитектуры x86_64, такие как дополнительные регистры и более быстрые инструкции, PIC ABI. В то же время ABI X32 даёт возможность работать с 32-разрядными указателями памяти, что позволяет экономить память, способствует более эффективному наполнению процессорного кэша и положительно сказывается на общей скорости исполнения кода. При тестировании в ситуациях, связанных с интенсивной работой с указателями, новый ABI продемонстрировал ускорение исполнения кода вплоть до 30% в сравнении с классическим x86_64 ABI. Ограничением ABI X32 является невозможность адресации из приложения более 4 Гб памяти;
Поддержка автоматической проверки необходимости загрузки дополнительных драйверов (autoprobing) для задействования специфичных возможностей x86 CPU. Ранее для загрузки данных драйверов создателям дистрибутивов приходилось придумывать обходные пути, основанные на субъективных методах, которые не всегда работали. Например, часто возникали проблемы с загрузкой модуля CRC, использующего для ускорения работы инструкции SSE 4.2. В результате того, что нужный CRC-модуль не загружался, наблюдалось заметное понижение производительности подсистем, требующих быстрого вычисления контрольных сумм (например, Btrfs). Другой проблемой был выбор корректного для текущего CPU модуля с поддержкой CPUFREQ - дистрибутивы просто пытались последовательно перебрать все доступные модули, пока один из них не заработает. Теперь данные проблемы остались в прошлом и нужные модули могут быть автоматически загружены при помощи стандартные механизмов автозагрузки udev, на основании предоставленных ядром уведомлений (проверка выполняется на основании флагов cpuid по связке вендор/семейство/модель, как и для других драйверов);
Расширение возможностей инструментария perf для использования встроенной в ядро отладочной подсистемы Performance Events. Представлен GUI-интерфейс на базе библиотеки GTK+ для наглядного анализа отчётов, генерируемых командой 'perf report' (запускается через "perf report --gtk"). Улучшена визуализация при выполнении 'perf annotate'. Добавлена возможность профилирования веток с задействованием аппаратных механизмов CPU. Реализована возможность фильтрации вывода по пользователям (например, "perf top --uid 1000") и отдельным нитям (например, "perf top -p 21483,21485");
Дисковая подсистема, ввод/вывод и файловые системы
Расширение возможностей файловой системы Btrfs:
Добавлена новая утилита btrfs-restore для выполнения недеструктивного восстановления файлов с повреждённой ФС - утилита не занимается непосредственным восстановлением целостности ФС, а лишь пытается выделить и отдельно сохранить файлы из повреждённой ФС;
В утилиту fsck добавлена начальная поддержка восстановления целостности повреждённой ФС (опция "--repair"). В настоящее время реализована только поддержка восстановления повреждений в дереве распределения экстентов;
Возможность работы с блоками метаданных, размер которых превышает 4 Кб (вплоть до 64 Кб). Наиболее хорошие результаты наблюдаются при использовании блоков в 16 или 32 Кб, которые теперь рекомендуются к применению, так как при использовании блоков в 16 или 32 Кб наблюдается существенное уменьшение размера дерева распределения экстентов и уменьшение фрагментации. Размер блоков может быть задан на этапе создания ФС через утилиту mkfs (например, "mkfs.btrfs -l 32K"). Отмечается, что возможность работы с блоками разного размера была изначально заложена в архитектуру Btrfs, но данная функция была отключена из-за неготовности кода (использовались только блоки размером 4 Кб, соответствующие размеру страницы памяти для систем x86);
Улучшение производительности Btrfs в нескольких областях. Отмечается изменение метода взаимодействия метаданных со страничным кэшем и увеличение агрессивности отбрасывания страниц для метаданных, ставших ненужными. Проведена работа по снижению нагрузки на CPU в процессе работы. Сокращено число лишних чтений данных в процессе взаимодействия механизма copy-on-write и Linux VM. К увеличению производительности также приводит использование увеличенного размера блоков метаданных, за счёт снижения накладных расходов на обработку дерева распределения экстентов и общего снижения фрагментации данных.
В итоге, удалось заметно повысить производительность в конфигурациях, связанных с интенсивной работой с метаданными. Например, при выполнении теста по созданию 32 миллионов пустых файлов Btrfs теперь обеспечивает производительность создания файлов на уровне 170 тыс. файлов в секунду. Для сравнения, в данном тесте ext4 позволяет создавать 110 тыс. файлов в секунду, а XFS - 115.000 тыс. файлов в секунду;
Интеграция подготовленных проектом SUSE патчей с улучшением обработки ошибочных ситуаций. Надлежащая обработка подобных непредвиденных ситуаций ранее не была реализована во многих функциях Btrfs, которые в случае выявления проблем просто останавливали работу системы, переходя в режим "паники". В новой версии ядра проведён аудит обработки ошибок и реализована возможность в случае проблем прервать выполнение ошибочной транзакции и перейти в режим только для чтения, не прерывая функционирования системы.
Возможность подключения внешнего хранилища, доступного в режиме только для чтения в качестве основы для создания типовых LVM-разделов. Например, для систем виртуализации можно подготовить базовый образ виртуального окружения, на основе которого сформировать LVM-разделы для клиентов, которые будут использовать неизменные данные из одной эталонной области, т.е. на все такие LVM-разделы будет использована только одна копия изначальных данных. При такой конфигурации все обращения на чтение не изменённых данных прозрачно транслируются к базовому эталонному хранилищу, а все изменённые или новые данные обрабатываются в отдельном локально хранимом слое, все операции записи в котором обрабатываются как в обычном LVM-разделе. Данная возможность базируется на ранее реализованной в Device Mapper поддержке динамического выделения места в хранилище (thin provisioning), которая позволяет создать несколько виртуальных дисковых разделов, суммарный размер которых превышает физический размер доступных накопителей;
Поддержка файловой системы qnx6fs, используемой в новых версиях операционной системы QNX. Данная ФС была представлена в QNX 6.4.0 и используется по умолчанию начиная с выпуска 6.4.1. Представленная для ядра Linux поддержка qnx6fs пока работает в режиме только для чтения;
Виртуализация и безопасность
Модуль "verity" для Device Mapper, позволяющий обеспечить проверку неизменности загружаемых данных с точки зрения их возможной модификации злоумышленниками. Проверка выполняется через сверку считанных с накопителя блоков файловой системы с сохранёнными в отдельной области криптографическими хэшами (используется древовидная структура хэша, в которой каждый элемент учитывает содержимое соседей, а проверка корректности корневого элемента осуществляется с использованием методов асимметричного шифрования). Если элемент хэша не совпадает, то операция чтения завершается ошибкой. Указанная возможность уже используется в продуктах Chrome OS и Netflix для того, чтобы гарантировать, что образ системы загружается в неизменном виде;
В состав ядра включён модуль Yama, разработанный компанией Canonical и используемый в Ubuntu для блокирования некоторых типов атак. В частности, вносятся ограничения на использование отладочного вызова ptrace, который до этого позволял любому процессу с привилегиями CAP_SYS_PTRACE обращаться к памяти всех процессов с тем же идентификатором пользователя. При использовании Yama область доступа ограничивается только потомками отслеживаемого процесса. Также Yama поддерживает средства борьбы с атаками через подстановку символических ссылок (следование по символическим ссылкам разрешается в общедоступных каталогах только при совпадении UID ссылки и пытающегося перейти по ссылке процесса) и манипулирование жесткими ссылками (запрещается создание жестких ссылок, если у пользователя нет прав на доступ к файлу, на который направляется ссылка);
Сетевая подсистема
Реализована новая дисциплина управления очередями пакетов "plug", позволяющая из пространства пользователя используя интерфейс Netlink закрывать и открывать выход из очереди исходящих пакетов. Например, выполнив команду plug пакеты будут накапливаться в очереди до поступления команды unplug;
Для mesh-протокола B.A.T.M.A.N. ("Better Approach To Mobile Adhoc Networking), позволяющего создавать децентрализованные сети, каждый узел в которых связан через соседние узлы, добавлена поддержка изменения алгоритма маршрутизации;
Добавлены новые опции сетевых сокетов IP_UNICAST_IF и IPV6_UNICAST_IF, которые были необходимы для улучшения поддержки вызовов Windows в системе Wine;
В Netfilter добавлено расширение для привязки политики использования таймаутов для потока;
В ipset добавлена поддержка опции "nomatch" для типов "hash:*net*", которая позволяет определять исключения из набора правил;
Добавлена поддержка канала мониторинга для отслеживания всех пакетов и событий в подсистеме Bluetooth. Добавлены новые команды Bluetooth: Read Supported Commands, Set SSP и Set LE;
Оборудование и аппаратные архитектуры
С DRM-модуля nouveau снят гриф экспериментального драйвера - в текущей версии ядра модуль nouveau перемещён из экспериментальной области "staging" в основное дерево ядра Linux. В новой версии DRM-модуля Nouveau обеспечена поддержка новой серии графических процессоров NVIDIA GeForce 600, базирующихся на архитектуре Kepler, пришедшей на смену архитектуры Fermi. Поддержка 3D акселерации для Kepler пока не реализована, доступен только код поддержки переключения режимов на уровне ядра;
В DRM-модуле для карт Radeon обеспечена поддержка дискретных GPU семейства Southern Islands (Radeon HD 7000) и нового поколения APU Fusion Trinity (CPU+GPU). Среди добавленных в DRM/KMS-драйвер Radeon возможностей отмечается начальная поддержка "Watermarks" (настройка уровня сигнала для синхронизации памяти с GPU), средства выборочной подачи питания на CRTC (CRTC power gating), поддержка встроенного датчика температуры, код для сброса GPU, система проверки VM CS (Command Stream) и другой код, необходимый для работы Radeon HD 7000.
В драйвер gma500 для интегрированных видеокарт Intel (Poulsbo, Oaktrail, Cedarview) добавлена поддержка графической подсистемы SoC Medfield (Atom Z2460), позиционируемого прежде всего для смартфонов.