После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.18. Среди наиболее заметных изменений: проведена большая чистка устаревшей функциональности, объявлена устаревшей ФС Reiserfs, реализованы события трассировки пользовательских процессов, добавлена поддержка механизма блокирования работы эксплоитов Intel IBT, включён режим выявления переполнения буферов при использовании функции memcpy(), добавлен механизм отслеживания вызовов функций fprobe, повышена производительность планировщика задач на CPU AMD Zen, в состав включён драйвер для управления функциональностью CPU Intel (SDS), интегрирована часть патчей для реструктуризации заголовочных файлов, одобрено применение стандарта C11.
В новую версию принято 16206 исправлений от 2127 разработчиков (в прошлом выпуске было 14203 исправления от 1995 разработчиков),
размер патча – 108 МБ (изменения затронули 14235 файлов, добавлено 1340982 строк кода, удалено 593836 строк). Около 44% всех представленных в 5.18 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 3% – с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 5.18:
- Дисковая подсистема, ввод/вывод и файловые системы
- В файловой системе Btrfs добавлена поддержка проброса сжатых данных при выполнении операций send и receive. Ранее при использовании send/receive отправляющая сторона распаковывала данные, хранимые в сжатом виде, а принимающая повторно сжимала перед записью. В ядре 5.18 приложениям в пространстве пользователя, использующим вызовы send/receive, предоставлена возможность передачи сжатых данных без переупаковки. Функциональность реализована благодаря новым ioctl-операциям BTRFS_IOC_ENCODED_READ и BTRFS_IOC_ENCODED_WRITE, позволяющим напрямую читать и записывать информацию в экстенты.
Кроме того, в Btrfs повышена производительность fsync. Добавлена возможность дедупликации и выполнения reflink (клонирование метаданных файла с созданием ссылки на уже имеющиеся данные без их фактического копирования) для всего хранилища, не ограничиваясь точками монтирования.
- В режиме прямого ввода/вывода (Direct I/O) обеспечена возможность доступа к зашифрованным файлам при использовании в fscrypt inline-шифрования, в котором операции шифрования и расшифровки выполняются силами контроллера накопителя, а не ядра. При обычном шифровании силами ядра доступ к зашифрованным файлам при помощи Direct I/O как и раньше невозможен, так как обращение к файлам осуществляется минуя механизм буферизации в ядре.
- В NFS-сервере по умолчанию включена поддержка протокола NFSv3, которая теперь не требует отдельного включения и доступна при общем включении NFS. NFSv3 рассматривается как основная и всегда поддерживаемая версия NFS, а поддержка NFSv2 возможно в будущем будет прекращена. Значительно повышена эффективность чтения содержимого каталогов.
- Файловая система ReiserFS переведена в разряд устаревших и ожидает удаления в 2025 году. Перевод ReiserFS в разряд устаревших позволит снизить трудозатраты на сопровождение общих для файловых систем изменений, связанных с поддержкой нового API для монтирования, iomap и фолиантов.
- Для ФС F2FS реализована возможность маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
- Переработан код для подсчёта статистики в обработчиках Device-mapper, что позволило заметно повысить точность аккаунтинга в таких обработчиках, как dm-crypt.
- Для устройств NVMe реализована поддержка 64-разрядных контрольных сумм для проверки целостности.
- Для файловой системы exfat предложена новая опция монтирования “keep_last_dots”, запрещающая очистку точек в конце имени файла (в Windows точки в конце имени по умолчанию удаляются).
- В EXT4 повышена производительность режима fast_commit и увеличена масштабируемость. Опция монтирования “mb_optimize_scan”, позволяющая повысить производительность в условиях большой фрагментации ФС, адаптирована для работы с файлами с экстентами.
- Прекращена поддержка потоков записи (write stream) в подсистеме, обеспечивающей работу блочных устройств. Указанная возможность была предложена для SSD, но не получила распространения и сейчас в обиходе отсутствуют устройства с поддержкой данного режима и маловероятно, что они появятся в будущем.
- В файловой системе Btrfs добавлена поддержка проброса сжатых данных при выполнении операций send и receive. Ранее при использовании send/receive отправляющая сторона распаковывала данные, хранимые в сжатом виде, а принимающая повторно сжимала перед записью. В ядре 5.18 приложениям в пространстве пользователя, использующим вызовы send/receive, предоставлена возможность передачи сжатых данных без переупаковки. Функциональность реализована благодаря новым ioctl-операциям BTRFS_IOC_ENCODED_READ и BTRFS_IOC_ENCODED_WRITE, позволяющим напрямую читать и записывать информацию в экстенты.
- Память и системные сервисы
- Началась интеграция набора патчей, позволяющего значительно сократить время пересборки ядра за счёт реструктуризации иерархии заголовочных файлов и сокращения числа перекрёстных зависимостей. В состав ядра 5.18 включены патчи, оптимизирующие структуру заголовочных файлов планировщика задач (kernel/sched). По сравнению с прошлым выпуском потребление процессорного времени при сборке кода kernel/sched/ сократилось на 61%, а фактическое время уменьшилось на 3.9% (с 2.95 до 2.84 сек).
- В коде ядра разрешено использование стандарта C11, опубликованного в 2011 году. Ранее добавляемый в ядро код должен был соответствовать спецификации ANSI C (С89), сформированной ещё в 1989 году.
В сборочных скриптах ядра 5.18 опция ‘–std=gnu89’ заменена на ‘–std=gnu11 -Wno-shift-negative-value’. Рассматривалась возможность использования стандарта C17, но в этом случае пришлось бы повышать минимально поддерживаемую версию GCC, включение же поддержки C11 укладывается в текущие требования к версии GCC (5.1). - Повышена производительность планирования задач на процессорах AMD с микроархитектурой Zen, в которых для каждого узла с локальными каналами памяти предоставляется несколько кэшей последнего уровня (LLC, Last Level Cache). В новой версии устранён дисбаланс LLC между узлами, что при некоторых видах нагрузки привело к существенному повышению производительности.
- Расширены средства для трассировки приложений в пространстве пользователя. В новой версии ядра добавлена возможность создания пользовательскими процессами событий трассировки (User events) и записи данных в буфер трассировки, которые могут быть просмотрены через типовые утилиты трассировки ядра, такие как ftrace и perf. События трассировки из пространства пользователя изолированны от событий трассировки ядра.
Состояние событий может быть просмотрено через файл /sys/kernel/debug/tracing/user_events_status, а регистрация события и запись данных через файл /sys/kernel/debug/tracing/user_events_data. - Добавлен механизм отслеживания (probe) вызовов функций – fprobe. API fprobe основан на ftrace, но ограничен только возможностью прикрепления callback-обработчиков к точкам входа в функцию и завершения работы функции. В отличие от kprobes и kretprobes, новый механизм позволяет использовать один обработчик сразу для нескольких функций.
- Прекращена поддержка старых процессоров ARM (ARMv4 и ARMv5), не оснащённых блоком управления памятью (MMU). Поддержка систем ARMv7-M без MMU сохранена.
- Прекращена поддержка RISC-подобной архитектуры NDS32, использовавшейся в процессорах компании Andes Technologies. Код удалён из-за отсутствия сопровождения и невостребованности поддержки NDS32 в основном ядре Linux (оставшиеся пользователи используют специализированные сборки ядра от производителей оборудования).
- По умолчанию отключена сборка ядра с поддержкой формата исполняемых файлов a.out для архитектур alpha и m68k, в которых данный формат продолжает использоваться. Вероятно, поддержка устаревшего формата a.out в скором времени будет полностью удалена из ядра. Планы по удалению формата a.out обсуждаются с 2019 года.
- Для архитектуры PA-RISC реализована минимальная поддержка механизма vDSO (virtual dynamic shared objects), предоставляющего ограниченный набор системных вызовов, доступный в пространстве пользователя без переключения контекста. Поддержка vDSO позволила реализовать возможность запуска с неисполняемым стеком.
- Добавлена поддержка механизма Intel HFI (Hardware Feedback Interface), позволяющего оборудованию передавать ядру сведения о текущей производительности и энергоэффективности каждого CPU.
- Добавлен драйвер для механизма Intel SDSi (Software-Defined Silicon), позволяющего управлять включением дополнительных возможностей в процессоре (например, специализированные инструкции и дополнительная кэш-память). Идея в том, что по более низкой цене могут поставляться чипы с заблокированными расширенными функциями, которые затем можно “докупить” и активировать дополнительные возможности без аппаратной замены чипа.
- Добавлен драйвер amd_hsmp для поддержки интерфейса AMD HSMP (Host System Management Port), предоставляющего доступ к функциям управления процессором через набор специальных регистров, появившихся в серверных процессорах AMD EPYC начиная с поколения Fam19h. Например, через HSMP можно получить данные об энергопотреблении и температуре, выставить ограничения на частоту, активировать различные режимы повышения производительности, управлять параметрами работы памяти.
- В интерфейсе асинхронного ввода/вывода io_uring реализована опция IORING_SETUP_SUBMIT_ALL для регистрации в кольцевом буфере набора файловых дескрипторов, а также операция IORING_OP_MSG_RING, позволяющая отправить сигнал из одного кольцевого буфера в другой кольцевой буфер.
- В механизме DAMOS (Data Access Monitoring-based Operation Schemes), позволяющем высвобождать память с учётом частоты обращения к памяти, расширены возможности по контролю за операциями с памятью из пространства пользователя.
- Интегрирована третья серия патчей с реализацией концепции фолиантов страниц памяти (page folios), которые напоминают объединённые страницы памяти (compound pages), но отличаются улучшенной семантикой и более понятной организацией работы. Использование фолиантов позволяет ускорить управление памятью в некоторых подсистемах ядра. В предложенных патчах осуществлён перевод на фолианты внутренних функций управления памятью, включая разновидности функции get_user_pages(). Предоставлена поддержка создания больших фолиантов в коде упреждающего чтения данных.
- В сборочной системе появилась поддержка переменных окружения USERCFLAGS и USERLDFLAGS, при помощи которых можно передать дополнительные флаги компилятору и компоновщику.
- В подсистеме eBPF в механизме BTF (BPF Type Format), предоставляющем информацию для проверки типов в псевдокоде BPF, реализована возможность добавления аннотаций к переменным, ссылающимся на области памяти в пространстве пользователя. Аннотации помогают системе верификации BPF-кода более качественно выявлять и проверять обращения к памяти.
- Преложен новый обработчик выделения памяти для хранения загруженных BPF-программ, который позволяет более эффективно использовать память в ситуациях загрузки большого числа BPF-программ.
- В системный вызов madvise(), предоставляющий средства для оптимизации управления памятью процесса, добавлен флаг MADV_DONTNEED_LOCKED, который дополняет уже имеющийся флаг MADV_DONTNEED, через который ядру можно заранее сообщить о готовящемся освобождении блока памяти, т.е. о том, что этот блок уже не нужен и может использоваться ядром. В отличие от MADV_DONTNEED использование флага MADV_DONTNEED_LOCKED допустимо для закреплённых в ОЗУ страниц памяти, которые при вызове madvise вытесняются без смены своего закреплённого статуса и в случае последующего обращения к блоку и генерации “page fault” возвращаются с сохранением привязки. Дополнительно добавлено изменение, позволяющее использовать флаг MADV_DONTNEED с большими страницами памяти в HugeTLB.
- Виртуализация и безопасность
- Для архитектуры x86 добавлена поддержка механизма защиты потока выполнения команд Intel IBT (Indirect Branch Tracking), мешающего применению техник построения эксплоитов с использованием приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming), при которых эксплоит формируется в форме цепочки вызовов уже имеющихся в памяти кусков машинных инструкций, завершающихся инструкцией возврата управления (как правило, это окончания функций). Суть реализованного метода защиты в блокировании косвенных переходов в тело функции через добавление вначале функции специальной инструкции ENDBR и разрешение выполнения по косвенному переходу только в случае перехода на эту инструкцию (косвенный вызов через JMP и CALL должен всегда попадать на инструкцию ENDBR, которая размещена в самом начале функции).
- Включена более строгая проверка границ буферов в функциях memcpy(), memmove() и memset(), выполняемая на этапе компиляции при включении режима CONFIG_FORTIFY_SOURCE. Добавленное изменение сводится к проверке выхода за границы элементов структур, размер которых известен. Отмечается, что реализованная возможность позволила бы блокировать все связанные с memcpy() переполнения буфера в ядре, выявленные по меньшей мере за последние три года.
- Добавлена вторая часть кода обновлённой реализации генератора псевдослучайных чисел RDRAND, отвечающего за работу устройств /dev/random и /dev/urandom. Новая реализация примечательна
унификацией работы /dev/random и /dev/urandom, добавлением защиты от появления дубликатов в потоке случайных чисел при запуске виртуальных машин и переходом на использование хеш-функции BLAKE2s вместо SHA1 для операций смешивания энтропии. Изменение позволило повысить безопасность генератора псевдослучайных чисел, благодаря избавлению от проблемного алгоритма SHA1 и исключению перезаписи вектора инициализации RNG. Так как алгоритм BLAKE2s опережает SHA1 по производительности, то его применение также положительно отразилось на производительности. - Для архитектуры ARM64 добавлена поддержка нового алгоритма аутентификации указателей – “QARMA3”, который быстрее алгоритма QARMA при сохранении должного уровня защиты. Технология позволяет использовать специализированные инструкции ARM64 для проверки адресов возврата при помощи цифровых подписей, которые хранятся в неиспользуемых верхних битах самого указателя.
- Для архитектуры ARM64 реализована поддержка сборки с включением в GCC 12 режима защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в сохранении после передачи управления функции адреса возврата в отдельном “теневом” стеке и извлечении данного адреса перед выходом из функции.
- Добавлено новое хранилище ключей (keyring) – “machine”, содержащее ключи владельца системы, поддерживаемые в shim-загрузчике. Указанные ключи могут использоваться для заверения цифровой подписью компонентов ядра, загружаемых на стадии после начальной загрузки (например, модулей ядра).
- Удалена поддержка асимметричных закрытых ключей для TPM, которые предложены в устаревшей версии TPM, имеют известные проблемы с безопасностью и не получили распространение на практике.
- Добавлена защита данных с типом size_t от целочисленных переполнений. В коде задействованы обработчики size_mul(), size_add() и size_sub(), позволяющие безопасно производить умножение, сложение и вычитание размеров с типом size_t.
- При сборке ядра включены флаги “-Warray-bounds” и “-Wzero-length-bounds”, выводящие предупреждения при выходе индекса за границу массива и использовании массивов нулевой длины.
- В устройство virtio-crypto добавлена поддержка шифрования с использованием алгоритма RSA.
- Сетевая подсистема
- В реализации сетевых мостов добавлена поддержка режима привязки портов (locked mode), при котором пользователь может отправлять трафик через порт только с разрешённого MAC-адреса. Также добавлена возможность использования нескольких структур для оценки состояния протокола STP (Spanning Tree Protocol). Ранее для VLAN могла производиться только прямая привязка к STP (1:1), при которой каждый VLAN управлялся независимо. В новой версии добавлен параметр mst_enable, при включении которого состояние VLAN-ов контролируется модулем MST (Multiple Spanning Trees) и привязка VLAN-ов может соответствовать модели M:N.
- Продолжена работа по интеграции в сетевой стек средств для отслеживания причин отбрасывания пакетов (коды reason). Код причины передаётся во время освобождения памяти, связанной с пакетом, и позволяет учитывать такие ситуации, как отбрасывание пакета из-за ошибок заполнения полей в заголовке, выявление спуфинга фильтром rp_filter, неверная контрольная сумма, нехватка памяти, срабатывание правил IPSec XFRM, неверный номер последовательности TCP и т.п.
- Предоставлена возможность передачи сетевых пакетов из BPF-программ, запущенных из пространства пользователя в режиме BPF_PROG_RUN при котором BPF-программы выполняются в ядре, но возвращают результат в пространство пользователя. Пакеты передаются с использованием подсистемы XDP (eXpress Data Path). Поддерживается live-режим обработки пакетов, при котором XDP-обработчик может на лету перенаправлять сетевые пакеты в сетевой стек или на другие устройства. Также возможно создание программных генераторов внешнего трафика или подстановка сетевых кадров в сетевой стек.
- Для BPF-программ, прикрепляемых к сетевым cgroups, предложены вспомогательные функции для явного выставления значения, возвращаемого системными вызовами, что позволяет передать более полную информацию о причинах блокировки системного вызова.
- В подсистему XDP (eXpress Data Path) добавлена поддержка фрагментированных пакетов, размещаемых в нескольких буферах, что позволяет обрабатывать в XDP Jumbo-кадры и применять TSO/GRO (TCP Segmentation Offload/Generic Receive Offload) для XDP_REDIRECT.
- Значительно ускорен процесс удаления сетевых пространств имён, что было востребовано на некоторых крупных системах с большим объёмом трафика.
- Оборудование
- В драйвере amdgpu по умолчанию включена технология адаптивной синхронизации FreeSync, которая позволяет корректировать частоту обновления информации на экране, обеспечивая плавность и отсутствие разрывов изображения во время игр и просмотра видео. Объявлена стабильной поддержка GPU Aldebaran.
- В драйвере i915 добавлена поддержка чипов Intel Alderlake N и дискретных видеокарт Intel DG2-G12 (Arc Alchemist).
- В драйвере nouveau обеспечена поддержка более высоких битрейтов для интерфейсов DP/eDP и поддержка удлинителей кабеля lttprs (Link-Training Tunable PHY Repeaters).
- В подсистеме drm (Direct Rendering Manager) в драйверах armada, exynos, gma500, hyperv, imx, ingenic, mcde, mediatek, msm, omap, rcar-du, rockchip, sprd, sti, tegra, tilcdc, xen и vc4 добавлена поддержка параметра nomodeset, позволяющего отключить переключение видеорежимов на уровне ядра и использование средств для аппаратного ускорения отрисовки, оставив только функциональность, связанную с системным фреймбуфером.
- Добавлена поддержка ARM SoС Qualcomm Snapdragon 625/632 (используется в смартфонах LG Nexus 5X и Fairphone FP3), Samsung Exynos 850, Samsung Exynos 7885 (используется в Samsung Galaxy A8), Airoha (Mediatek/EcoNet) EN7523, Mediatek mt6582 (планшет Prestigio PMT5008 3G), Microchip Lan966, Renesas RZ/G2LC, RZ/V2L, Tesla FSD,
TI K3/AM62 и i.MXRTxxxx. - Добавлена поддержка ARM-устройств и плат Broadcom (Raspberry Pi Zero 2 W), Qualcomm (Google Herobrine R1 Chromebook, SHIFT6mq, Samsung Galaxy Book2), Rockchip (Pine64 PineNote, Bananapi-R2-Pro, STM32 Emtrion emSBS, Samsung Galaxy Tab S, Prestigio PMT5008 3G tablet), Allwinner (A20-Marsboard), Amlogic (Amediatek X96-AIR, CYX A95XF3-AIR, Haochuangy H96-Max, Amlogic AQ222 и OSMC Vero 4K+), Aspeed (Quanta S6Q, ASRock ROMED8HM3), Marvell MVEBU/Armada (Ctera C200 V1 и V2 NAS), Mstar (DongShanPiOne, Miyoo Mini), NXP i.MX (Protonic PRT8MM, emCON-MX8M Mini, Toradex Verdin, Gateworks GW7903).
- Добавлена поддержка звуковых систем и кодеков AMD PDM, Atmel PDMC, Awinic AW8738, i.MX TLV320AIC31xx, Intel CS35L41, ESSX8336, Mediatek MT8181, nVidia Tegra234, Qualcomm SC7280, Renesas RZ/V2L, Texas Instruments TAS585M. Добавлена начальная реализация звукового драйвера для DSP-чипа Intel AVS. Обновлена поддержка драйверов для Intel ADL и Tegra234, а также внесены изменения для улучшения поддержки звука на устройствах Dell, HP, Lenovo, ASUS, Samsung и Clevo.
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 5.18 – Linux-libre 5.18-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске проведена чистка драйверов для панелей MIPI DBI, VPU Amphion, WiFi MediaTek MT7986 WMAC, Mediatek MT7921U (USB) и Realtek 8852a/8852c, звуковых чипов Intel AVS и Texas Instruments TAS5805M. Также проведена чистка DTS-файлов для разных SoC Qualcomm с процессорами на базе архитектуры AArch64. Обновлён код чистки блобов в драйверах и подсистемах AMD GPU, MediaTek MT7915, Silicon Labs WF200+ WiFi, Mellanox Spectru Ethernet, Realtek rtw8852c, Qualcomm Q6V5, Wolfson ADSP, MediaTek HCI UART.