Релиз ядра Linux 5.6

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.6. Среди наиболее заметных изменений: интеграция VPN-интерфейса WireGuard, поддержка USB4, пространства имён для времени, возможность создания обработчиков перегрузки TCP при помощи BPF, начальная поддержка MultiPath TCP, избавление ядра от проблемы 2038 года, механизм «bootconfig», ФС ZoneFS.

В новую версию принято 13702 исправлений от 1810 разработчиков, размер патча — 40 Мб (изменения затронули 11577 файлов, добавлено 610012 строк кода, удалено 294828 строк). Около 45% всех представленных в 5.6 изменений связаны с драйверами устройств, примерно 15% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 4% — файловыми системами и 3% c внутренними подсистемами ядра.

Основные новшества:

  • Сетевая подсистема
    • Добавлена реализация VPN-интерфейса WireGuard, который реализован на основе современных методов шифрования (ChaCha20, Poly1305, Curve25519, BLAKE2s), обеспечивает очень высокую производительность (в 3.9 опережает OpenVPN по пропускной способности) прост в использовании, лишён усложнений и хорошо зарекомендовал себя в ряде крупных внедрений. В WireGuard применяется концепция маршрутизации по ключам шифрования, которая подразумевает привязку к каждому сетевому интерфейсу закрытого ключа и применение для связывания открытых ключей. Обмен открытыми ключами для установки соединения производится по аналогии с SSH. Необходимые для работы WireGuard криптографические примитивы были перенесены из библиотеки Zinc в состав штатного Crypto API и включены в состав ядра 5.5.
    • Началась интеграция компонентов, необходимых для поддержки MPTCP (MultiPath TCP), расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. Для сетевых приложений подобное агрегированное соединение выглядит как обычное TCP-соединение, вся логика разделения потоков выполняется силами MPTCP. Multipath TCP может использоваться как для расширения пропускной способности, так и для увеличения надёжности. Например, MPTCP можно применять для организации передачи данных на смартфоне с использованием одновременно линков WiFi и 3G, или для сокращения расходов за счёт подключения сервера с использованием нескольких дешёвых линков вместо одного дорогого.
    • Добавлена поддержка дисциплины обработки сетевых очередей sch_ets (Enhanced Transmission Selection, IEEE 802.1Qaz), предоставляющей возможность распределения пропускной способности между разными классами трафика. Если нагрузка на определённый класс трафика ниже предоставленной пропускной способности, то ETS позволяет другим классам трафика использовать доступную пропускную способность. Qdisc sch_ets настраивается как дисциплина PRIO и использует классы трафика для определения строгих и совместно используемых между классами ограничений пропускной способности. Работает ETS как комбинация PRIO и DRR — при наличии жёстко ограниченных классов трафика используется PRIO, но если в очереди трафика нет, работает как DRR.
    • Добавлен новый тип BPF-программ BPF_PROG_TYPE_STRUCT_OPS, позволяющий реализовывать через BPF обработчики функций ядра. В настоящее время указанную возможность уже можно использовать для реализации алгоритмов контроля перегрузки TCP в виде BPF-программ. В качестве примера предложена BPF-программа с реализацией алгоритма DCTCP.
    • В ядро приняты изменения, переводящие инструментарий ethtool с ioctl () на использование интерфейса netlink. Новый интерфейс упрощает добавление расширений, улучшает обработку ошибок, позволяет отправлять уведомления при изменении состояния, упрощает взаимодействие между ядром и пространством пользователя и сокращает число синхронизируемых именованных списков.
    • Добавлена реализация алгоритма управления сетевыми очередями FQ-PIE (Flow Queue PIE), нацеленная на снижение негативного влияния промежуточной буферизации пакетов на граничном сетевом оборудовании (bufferbloat). FQ-PIE демонстрирует высокую эффективность при использовании в системах с кабельными модемами.
  • Дисковая подсистема, ввод/вывод и файловые системы
    • Для файловой системы Btrfs добавлена асинхронная реализация операции DISCARD (пометка освобождённых блоков, которые уже можно не хранить физически). Изначально операции DISCARD выполнялись синхронно, что могло приводить к проседанию производительности из-за необходимости ожидать завершения соответствующих команд накопителями. Асинхронная реализация позволяет не ждать завершения DISCARD накопителем и выполнять данную операцию в фоне.
    • В XFS проведена чистка кода, в котором использовались старые 32-разрядные счётчики времени (тип time_t заменён на time64_t), приводящие к проблеме 2038 года. Устранены ошибки и повреждения памяти, всплывавшие на 32-разрядых платформах. Переработан код для работы с расширенными атрибутами.
    • В файловую систему ext4 внескены оптимизации производительности, связанные c обработкой блокировки inode при операциях чтения и записи. Повышена производительность перезаписи в режиме прямого ввода/вывода (Direct I/O). Для упрощение диагностики проблем обеспечено сохранение в суперблоке первого и последнего кодов ошибок.
    • В файловой системе F2FS реализована возможность хранения данных в сжатом виде. Для отдельного файла или каталога сжатие может быть включено при помощи команды «chattr +c file» или «chattr +c dir; touch dir/file». Для сжатия всего раздела в утилите mount можно использовать опцию »-o compress_extension=ext».
    • В состав ядра принята файловая система ZoneFS, упрощающая низкоуровневую работу с зонированными устройствами хранения. ФС Zonefs разработана компанией Western Digital и связывает каждую зону в накопителе с отдельным файлом, который можно использовать для хранения данных в raw-режиме без манипуляции на уровне секторов и блоков, т.е. позволяет приложениям использовать файловый API вместо прямого обращения к блочному устройству при помощи ioctl. Под зонированными накопителями подразумеваются устройства на жёстких магнитных дисках или NVMe SSD, пространство для хранения в которых разбито на зоны, составляющие группы блоков или секторов, в которые допускается лишь последовательное добавление данных с обновлением целиком всей группы блоков.
    • В NFS отключено по умолчанию монтирование разделов поверх UDP. Добавлена поддержка определённой в спецификации NFS 4.2 возможности прямого копирования файлов между серверами. Добавлена новая опция монтирования «softreval», в случае отказа сервера допускающая использование прокэшированных значений атрибутов. Например, при указании данной опции после недоступности сервера сохраняется возможность перемещения по путям в NFS-разделе и обращения к информации, которая осела в кэше.
  • Виртуализация и безопасность
    • Объявлена устаревшей возможность отключения модуля SELinux во время работы, а в будущем выгрузка уже активированного SELinux будет запрещена. Для отключения SELinux потребуется передать параметр «selinux=0» в командной строке ядра.
    • Добавлена поддержка пространств имён для времени (time namespaces), позволяющих привязать к контейнеру состояние системных часов (CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_BOOTTIME), использовать в контейнере своё время и при миграции контейнера на другой хост обеспечить неизменность показаний CLOCK_MONOTONIC и CLOCK_BOOTTIME (учесть время время после загрузки с учётом или без учёта нахождения в спящем режиме).
    • Удалён блокируемый пул /dev/random. Поведение /dev/random приближено к /dev/urandom в плане предотвращения блокирования энтропии после инициализации пула.
    • В основной состав ядра включён драйвер, позволяющий гостевым системам, работающим под управлением VirtualBox, монтировать каталоги, экспортируемые хост-окружением.
    • В подсистему BPF добавлен набор патчей (BPF dispatcher), позволяющий повысить эффективность вызова BPF-программ при наступлении привязанных к ним событий (например, вызов XDP-обработчиков при поступлении сетевого пакета) в условиях применения механизма Retpoline для защиты от атак класса Spectre V2.
  • Память и системные сервисы
    • В BPF добавлена поддержка глобальных функций, который реализованы как часть инициативы по добавлению поддержи библиотек функций, которые можно подключать в программах BPF. Следующим шагом станет поддержка динамических расширений, позволяющих загружать глобальные функции, в том числе замены существующих глобальных функций во время их использования. В подсистеме BPF также добавлена поддержка варианта операции map (используется для сохранения постоянных данных), поддерживающего выполнение в пакетном режиме.
    • Добавлено устройство cpu_cooling, позволяющее охлаждать перегретый CPU путём перевода его в состояние idle на короткие промежутки времени.
    • Добавлен системный вызов openat2(), предлагающий набор дополнительных флагов для ограничения разрешения файлового пути (запрет пересечения точек монтирования, символических ссылок, magic-ссылок (/proc/PID/fd), компонентов »…/»)
    • Для разнородных систем на базе архитектуры big.LITTLE, комбинирующих в одном чипе мощные и менее производительные энергоэффективные ядра CPU, при выполнении задач реального времени обеспечено выставление параметра uclamp_min (появившийся в ядре 5.3 механизм закрепления нагрузки) для гарантирования того, что задача будет размещена планировщиком на ядре CPU, имеющем достаточно производительности.
    • Ядро полностью избавлено от проблемы 2038 года. Заменены последние остающиеся обработчики, в которых для счётчика эпохального времени использовался 32-разрядный (signed int) тип time_t, который с учётом отчёта от 1970 года должен переполниться в 2038 году.
    • Продолжено усовершенствование интерфейса асинхронного ввода/вывода io_uring, в котором обеспечена поддержка новых операций: IORING_OP_FALLOCATE (резервирование пустых областей), IORING_OP_OPENAT, IORING_OP_OPENAT2, IORING_OP_CLOSE (открытие и закрытие файлов), IORING_OP_FILES_UPDATE (добавление и удаление файлов из списка быстрого доступа), IORING_OP_STATX (запрос информации о файле), IORING_OP_READ, IORING_OP_WRITE (упрощённые аналоги IORING_OP_READV и IORING_OP_WRITEV), IORING_OP_FADVISE, IORING_OP_MADVISE (асинхронные варианты вызовов posix_fadvise и madvise), IORING_OP_SEND, IORING_OP_RECV (отправка и приём сетевых данных), IORING_OP_EPOLL_CTL (выбоолнение операций над файловыми дескрипторами epoll).
    • Добавлен системный вызов pidfd_getfd (), дающий возможность процессу извлечь из другого процесса файловый дескриптор открытого файла.
    • Реализован механизм «bootconfig», позволяющий помимо опций командной строки определять параметры через файл с настройками. Для добавления подобных файлов в образ initramfs предложена утилита bootconfig. Указанная возможность может применяться, например, для настройки kprobes во время загрузки.
    • Переработан механизм ожидания записи и чтения данных в неименованных каналах (pipe). Изменение позволило ускорить выполнение таких задач, как распараллеленная сборка ядра. При этом оптмизация может привести к состоянию гонки в GNU make из-за ошибки в выпуске 4.2.1, которая устранена в версии 4.3.
    • В prctl () добавлен флаг PR_SET_IO_FLUSHER, который может применяться для пометки процессов, выполняющихся высвобождением памяти, для которых не следует применять ограничения в ситуации нехватки памяти в системе.
    • На основе применяемой в Android системы распределения памяти ION реализована подсистема dma-buf heaps, позволяющая управлять выделением DMA-буферов для совместного использования областей памяти драйверами, приложениями и различными подсистемами.
  • Аппаратные архитектуры
    • Добавлена поддержка расширения E0PD, появившегося в ARMv8.5 и позволяющего реализовать защиту от атак, связанных со спекулятивным выполнением инструкций в CPU, требующую меньших накладных расходов, чем защита KPTI (Kernel Page Table Isolation).
    • Для систем на базе архитектуры ARMv8.5 добавлена поддержка инструкции RNG, предоставляющей доступ к аппаратному генератору псевдослучайных чисел. В ядре инструкция RNG задействована для формирования энтропии при инициализации предоставляемого ядром генератора псевдослучайных чисел.
    • Удалена поддержка расширений MPX (Memory Protection Extensions), добавленная в ядре 3.19 и позволяющая организовать проверку указателей на соблюдение границ областей памяти. Указанная технология не получила распространения в компиляторах и была удалена из GCC.
    • Для архитектуры RISC-V реализована реализована поддержка отладочного инструмента KASan (Kernel address sanitizer), обеспечивающего выявление ошибок при работе с памятью.
  • Оборудование
    • Реализована поддержка спецификации USB 4.0, которая основана на протоколе Thunderbolt 3 и обеспечивает пропускную способность до 40 Гбит/с, сохраняя обратную совместимость с USB 2.0 и USB 3.2. По аналогии с Thunderbolt интерфейс USB 4.0 позволяет туннелировать различные протоколы поверх одного кабеля с разъёмом Type-C, включая PCIe, Display Port и USB 3.x, а также программные реализации протоколов, например, для организации сетевых линков между хостами. Реализация основана на уже входящем в ядро Linux драйвере Thunderbolt, но добавляют поддержку устройств Thunderbolt 3 в программную реализацию менеджера соединений (Connection Manager, отвечает за создание туннелей для подключения нескольких устройств через один разъём) и адаптирует его для работы с хостами и устройствами, совместимыми с USB4.
    • В драйвере amdgpu добавлена начальная поддепржка технологии защиты от копирования HDCP 2.x (High-bandwidth Digital Content Protection).
    • В DRM-драйвер для видеокарт Intel добавлена поддержка DSI VDSC для чипов на базе микроархитектуры Ice Lake и Tiger Lake, реализован LMEM mmap (device local memory), улучшен парсинг VBT (Video BIOS Table), реализована поддержка HDCP 2.2 для чипов Coffee Lake.
    • Продолжена работа по унификации кода драйвера amdkfd (для дискретных GPU, таких как Fiji, Tonga, Polaris) с драйвером amdgpu.
    • В драйвере nouveau переработана поддержка режима безопасной загрузки ACR для карт GPU NVIDIA на базе микроархитектуры Turing. Добавлена поддержка графического движка TU10x. HD audio
    • Добавлена поддержка сжатия данных при передаче через DisplayPort MST (Multi-Stream Transport).
    • Внесены существенные изменение в звуковую систему ALSA, нацеленные на избавление кода от проблемы 2038 года. Добавлена поддержка новых звуковых кодеков Qualcomm WCD9340/WCD9341, Realtek RT700, RT711, RT715, RT1308, Ingenic JZ4770.
    • Добавлены драйверы для LCD-панелей Logic PD 28, Jimax8729d MIPI-DSI, igenic JZ4770, Sony acx424AKP, Leadtek LTK500HD1829, Xinpeng XPP055C272, AUO B116XAK01, GiantPlus GPM940B0, BOE NV140FHM-N49, Satoz SAT050AT40H12R2, Sharp LS020B1DD01D.
    • Добавлена поддержка ARM-плат и платформ Gen1 Amazon Echo (OMAP3630-based), Samsung Galaxy S III mini (GT-I8190), Allwinner Emlid Neutis, Libre Computer ALL-H3-IT, PineH64 Model B, Aibretech Amlogic GX PC, Armada SolidRun Clearfog GTR, NXPGateworks GW59xx, Tolino Shine 3 eBook reader, Embedded Artists COM (i.MX7ULP), SolidRun CLearfog CX/ITX и HoneyComb (LX2160A), Google Coral Edge TPU (i.MX8MQ), Rockchip Radxa Dalang Carrier, Radxa Rock Pi N10, VMARC RK3399Pro SOM ST Ericsson HREF520, Inforce 6640, SC7180 IDP, Atmel/Microchip AM9×60 (ARM926 SoC, Kizboxmini), ST stm32mp15, AM3703/AM3715/DM3725, ST Ericsson ab8505, Unisoc SC9863A, Qualcomm SC7180.

Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 5.6 — Linux-libre 5.6-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах для AMD TEE, ATH11K и Mediatek SCP. Обновлён код чистки блобов в драйверах и подсистемах AMD PSP, amdgpu и nouveau.

Источник: http://www.opennet.ru/opennews/art.shtml? num=52632

© OpenNet