Торвальдс выпустил ядро 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% — c файловыми системами и 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 и 4G или для сокращения расходов за счёт подключения сервера с использованием нескольких дешёвых линков вместо одного дорогого.
    • Добавлена поддержка дисциплины обработки сетевых очередей 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, упрощающая низкоуровневую работу с зонированными устройствами хранения. Под зонированными накопителями подразумеваются устройства на жёстких магнитных дисках или NVMe SSD, пространство для хранения в которых разбито на зоны, составляющие группы блоков или секторов, в которые допускается лишь последовательное добавление данных с обновлением целиком всей группы блоков. ФС ZoneFS разработана компанией Western Digital и связывает каждую зону в накопителе с отдельным файлом, который можно использовать для хранения данных в raw-режиме без манипуляции на уровне секторов и блоков, т.е. позволяет приложениям использовать файловый API вместо прямого обращения к блочному устройству при помощи ioctl.
    • В NFS отключено по умолчанию монтирование разделов поверх UDP. Добавлена поддержка определённой в спецификации NFS 4.2 возможности прямого копирования файлов между серверами. Добавлена новая опция монтирования «softreval», в случае отказа сервера допускающая использование прокэшированных значений атрибутов. Например, при указании данной опции после недоступности сервера сохраняется возможность перемещения по путям в NFS-разделе и обращения к информации, которая осела в кэше.
    • Проведена оптимизация производительности механизма fs-verity, применяемого для контроля целостности и проверки подлинности отдельных файлов. Повышена скорость последовательного чтения, благодаря применению хеш-дерева Меркла. Оптимизирована производительнлсть FS_IOC_ENABLE_VERITY в условиях отсутствия данных в кэше (применено упреждающее чтение страниц с данными).
  • Виртуализация и безопасность
    • Объявлена устаревшей возможность отключения модуля SELinux во время работы, а в будущем выгрузка уже активированного SELinux будет запрещена. Для отключения SELinux потребуется передать параметр «selinux=0» в командной строке ядра.
    • Добавлена поддержка пространств имён для времени (time namespaces), позволяющих привязать к контейнеру состояние системных часов (CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_BOOTTIME), использовать в контейнере своё время и при миграции контейнера на другой хост обеспечить неизменность показаний CLOCK_MONOTONIC и CLOCK_BOOTTIME (учесть время после загрузки с учётом или без учёта нахождения в спящем режиме).
    • Удалён блокируемый пул /dev/random. Поведение /dev/random приближено к /dev/urandom в плане предотвращения блокирования энтропии после инициализации пула.
    • В основной состав ядра включён драйвер, позволяющий гостевым системам, работающим под управлением VirtualBox, монтировать каталоги, экспортируемые хост-окружением (VirtualBox Shared Folder).
    • В подсистему BPF добавлен набор патчей (BPF dispatcher), в условиях применения механизма Retpoline для защиты от атак класса Spectre V2 позволяющий повысить эффективность вызова BPF-программ при наступлении привязанных к ним событий (например, даёт возможнось ускорить вызов XDP-обработчиков при поступлении сетевого пакета).
    • Добавлен драйвер для поддержки встроенных в APU AMD окружений TEE (Trusted Execution Environment).
  • Память и системные сервисы
    • В 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. Защита на базе E0PD приводит к меньшим накладным расходам, чем защита 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 и адаптирует его для работы с хостами и устройствами, совместимыми с USB4. Изменения также добавляют поддержку устройств Thunderbolt 3 в программную реализацию менеджера соединений (Connection Manager), который отвечает за создание туннелей для подключения нескольких устройств через один разъём.
    • В драйвер amdgpu добавлена начальная поддержка технологии защиты от копирования HDCP 2.x (High-bandwidth Digital Content Protection). Добавлена поддержка ASIC-чипа AMD Pollock, основанного на Raven 2. Реализована возможность сброса GPU для семейств Renoir и Navi.
    • В 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.
    • Переработан драйвер k10temp, в котором появилась поддержка вывода параметров напряжения и силы тока для CPU AMD Zen, а также расширенных сведений c датчиков температуры, применяемых в CPU Zen и Zen 2.
    • В драйвере nouveau добавлена поддержка режима верифицированной загрузки прошивки для GPU NVIDIA на базе микроархитектуры Turing (GeForce RTX 2000), что позволило включить поддержку 3D-ускорения для данных карт (требуется загрузка официальных прошивок с цифровой подписью NVIDIA). Добавлена поддержка графического движка TU10x. Решены проблемы с HD Audio.
    • Добавлена поддержка сжатия данных при передаче через DisplayPort MST (Multi-Stream Transport).
    • Добавлен новый драйвер «ath11k» для беспроводных чипов Qualcomm с поддержкой 802.11ax. Драйвер основан на стеке mac80211 и поддерживает режимы точки доступа, рабочей станции и узла Mesh-сети.
    • Через sysfs предоставлен доступ к читаемым показаниям датчиков температуры, используемых на современных жёстких дисках и SSD.
    • Внесены существенные изменения в звуковую систему ALSA, нацеленные на избавление кода от проблемы 2038 года (уход от использования 32-разрядного типа time_t в интерфейсах snd_pcm_mmap_status и snd_pcm_mmap_control). Добавлена поддержка новых звуковых кодеков 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 AM9X60 (ARM926 SoC, Kizboxmini), ST stm32mp15, AM3703/AM3715/DM3725, ST Ericsson ab8505, Unisoc SC9863A, Qualcomm SC7180. Добавлена поддержка PCIe-контроллера, применяемого в Raspberry Pi 4.

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

По материалам opennet.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *