После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.18. Среди наиболее заметных изменений: dm-pcache для дискового кэширования в энергонезависимой памяти (PMEM), удаление Bcachefs, online-режим проверки XFS, драйверы Binder (Android IPC) и Tyr (GPU Mali) на Rust, возможность создания USB-драйверов на Rust, оптимизация кэширования в аллокаторе памяти SLUB, адресация пространств имён по файловым дескрипторам, ускорение работы подкачки (swap), верификация BPF-программ по цифровой подписи, виртуализация Intel CET в KVM, сетевой протокол PSP (гибрид TLS и IPsec), поддержка IP-расширения AccECN, оптимизация UDP-стека.
В новую версию принято 15035 исправлений от 2217 разработчиков,
размер патча – 45 МБ (изменения затронули 13142 файлов, добавлено 601897 строк кода, удалено 355006 строк). В прошлом выпуске было
14334 исправлений от 2118 разработчиков, размер патча – 46 МБ. Около 40% всех представленных в 6.18 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 5% – с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 6.18 (1, 2, 3):
- Дисковая подсистема, ввод/вывод и файловые системы
- В Device Mapper добавлен обработчик dm-pcache для использования постоянной памяти (CXL-память, адресуемая через DAX-устройство) в качестве дополнительного высокопроизводительного кэша перед более медленными традиционными дисковыми или флэш накопителями. Dm-pcache обеспечивает сохранение содержимого кэша в случае аварий (crash-safe) за счёт использования энергонезависимой памяти, дублирования метаданных и проверки целостности данных и метаданных по контрольным суммам CRC32. В настоящее время поддерживается только кэширование в режиме отложенной записи (write-back).
- Из ядра удалён код файловой системы Bcachefs, которая теперь будет распространяться в форме внешнего модуля, собираемого с использованием инструментария DKMS (Dynamic Kernel Module Support). Код Bcachefs может быть возвращён в состав ядра после того как Кент Оверстрит на деле докажет возможность корректного взаимодействия с другими разработчиками ядра и способность следовать устоявшимся правилам разработки.
- В системный вызов pwritev2() добавлен флаг RWF_NOSIGNAL, отключающий отправку сигнала SIGPIPE при записи в разорванные неименованные каналы или сокеты.
- В Procfs добавлена опция монтирования “pidns” для указания пространств имён идентификаторов процессов (PID namespace). Например: “mount -t proc -o pidns=/proc/self/ns/pid proc /tmp/proc”.
- В XFS объявлена стабильной и включена по умолчанию возможность применения утилиты fsck для проверки и исправления выявленных проблем в online-режиме, без отмонтирования файловой системы. Добавлены системные вызовы file_getattr и file_setattr для изменения атрибутов специальных файлов (любых inode).
В KConfig по умолчанию отключены опции XFS_SUPPORT_V4 (4 версия XFS) и XFS_SUPPORT_ASCII_CI (режим без учёта регистра символов ASCII), объявленные устаревшими. Удалены устаревшие опции монтирования attr2, noattr2, ikeep и noikeep. - В MD RAID реализован новый тип битовых карт – llbitmap (lockless bitmap), работающих без блокировок и обеспечивающих более высокую производительность.
- Из общей структуры “inode” вынесена информация, связанная с шифрованием и верификацией (указатели i_crypt_info и i_verity_info). Изменение позволяет снизить потребление памяти в файловых системах, не поддерживающих шифрование и верификацию.
- В подсистему FUSE добавлена поддержка системного вызова copy_file_range() и прямого копирования диапазонов с использованием размера с 64-разрядным типом (ранее поддерживался только 32-разрядный размер). Добавлена поддержка инициализации в синхронном режиме во время монтирования (FUSE_DEV_IOC_SYNC_INIT).
- В ФС ext4 реализована возможность использования 32-разрядных идентификаторов пользователей (uid) и групп (gid) при доступе к зарезервированным блокам. Добавлены ioctl-операции для установки и чтения параметров суперблока примонтированных ФС (tune2fs сможет менять параметры в суперблоке без прав на запись в блочное устройство). Полностью удалены устаревшие настройки, специфичные для ext3.
- В f2fs добавлена опция монтирования “lookup_mode” для выбора режима поиска: perf – поиска по хэшу, compat – линейный поиск, auto – автоматический выбор. Изменение режима имеет смысл для конфигураций с директориями, в которых не учитывается регистр символов. Текущий режим поиска можно узнать через файл
“/sys/fs/f2fs//effective_lookup_mode”. Добавлена возможность резервирования inode, доступных только привилегированным пользователям. - В Overlayfs добавлен режим работы без учёта регистра символов, включаемый на уровне слоёв ФС (выставление для отдельных директорий пока не поддерживается).
- В BTRFS улучшено распараллеливание операций при высокой нагрузке на чтение и низкой нагрузке на запись, сокращено время фиксации транзакций, значительно сокращено время синхронизации (с минут до десятков секунд). Проведена подготовка к добавлению поддержки сжатия c ситуациях, когда размер блока (bs) больше размера страницы памяти (ps).
- В ksmbd (работающий на уровне ядра SMB-сервер) добавлен параметр для ограничения максимального числа соединений с одного IP-адреса. smbdirect, smbclient и smbserver переведены на использование типовых структур ядра.
- В SQUASHFS добавлена возможность использования в системном вызове lseek() опций SEEK_DATA и SEEK_HOLE для поиска данных и пустот в разреженных файлах.
- В EXFAT добавлена поддержка ioctl FS_IOC_GETFSLABEL и FS_IOC_SETFSLABEL для чтения и записи меток разделов. Предоставлена возможность изменения опций монтирования во время перемонтирования. Ускорена загрузка битовых карт.
- В NTFS3 добавлена поддержка ioctl FS_IOC_GETFSLABEL и FS_IOC_SETFSLABEL для чтения и установки меток разделов.
- В состав принята реализация механизма межпроцессного взаимодействия Binder, написанная на языке Rust. Binder используется в Android для организации взаимодействия между процессами и удалённого вызова методов (один процесс Android может вызвать метод или функцию в другом процессе Android, используя Binder для идентификации, вызова и передачи аргументов между процессами). Код Binder был переписан на языке Rust в рамках инициативы Google по усилению защищённости Android.
- В SLUB, аллокаторе памяти ядра, реализован опциональный слой кэширования “sheaves”, использующий несколько кэшей, каждый из которых привязан к отдельному ядру CPU, что позволяет локализовать одним ядром операции при выделении или освобождении памяти. Подобный кэш повысил производительность выделения и освобождения памяти в ядре, благодаря избавлению от излишних примитивов синхронизации, требуемых при вовлечении разных ядер CPU. В проведённых тестах прирост производительности составил от 6.3% до 31% в зависимости от вида нагрузки.
- Добавлена возможность создания файловых дескрипторов, отождествлённых с определённым пространством имён (namespace). В отличие от обращения к пространствам имён по идентификаторам (/proc//ns/), файловый дескриптор закрепляется за конкретным экземпляром пространства имён и исключает ситуацию, когда идентификатор повторно выделен и указывает уже на другой объект. По аналогии с использованием pidfds открытие файловых дескрипторов, ссылающихся на пространства имён, осуществляется через функции open_by_handle_at() и name_to_handle_at().
- Реализован механизм “Swap Table“, позволяющий повысить производительность подкачки. Ускорение достигается благодаря уменьшению конкуренции за доступ к кэшу подкачки, более эффективного поиска в кэше и снижения фрагментации. Бэкенд на базе Swap Table задействован для кэширования подкачки вместо бэкенда XArray и позволил в среднем на 5-20% повысить производительность. В тесте usemem пропускная способность возросла на 17-28%, в тесте на многопоточную пересборку ядра время сборки уменьшилось на 1.12-3.19%, тест redis-benchmark с BGSAVE показал увеличение числа обрабатываемых запросов на 6-7%.
- Подсистема Zswap переведена на прямое использование системы выделения памяти zsmalloc вместо слоя zpool, который больше нигде не используется и теперь удалён из ядра.
- Для управления поведением загрузчика микрокода на системах x86 реализована опция командной строки “microcode=список флагов”. В текущем виде новая опция пришла на смену “microcode.force_minrev” и также позволяет задать минимально допустимую для загрузки версию микрокода.
- Началась работа по реорганизации излишне раздутой структуры “page”, используемой для управления страницами оперативной памяти. Добавлен тип ‘memdesc_flags_t” для полей с универсальными флагами, которые смогут использоваться после ожидаемого в будущем выделения из структуры “page” отдельных структур для slab и фолиантов (folio).
- Для архитектуры nios2, применяемой в процессорах Altera Nios II (soft-процессор на базе FPGA), реализована поддержка системного вызова clone3().
- В конфигурацию ядра (KConfig) добавлен атрибут “transitional”, который можно использовать для пометки настроек, не отображаемых в пользовательских интерфейсах, таких как
“make menuconfig”, и не включаемых в сгенерированные файлы конфигурации. Основным назначением атрибута является упрощение переименования опций с сохранением обратной совместимости. - Минимальная версия компилятора Clang, которым может быть собрано ядро, повышена до инструментария LLVM 15. В Debian 12 и Ubuntu 22.04 поставляется LLVM 14.
- Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). В новой версии для кода на языке Rust реализованы атомарные операции с памятью, структура maple tree, возможность создания файлов DebugFS и функции для манипуляции битовыми картами. Расширен доступ к API для разработки драйверов. Добавлен полный набор абстракций для разработки драйверов USB-устройств (пример USB-драйвера). В утилиту perf добавлена поддержка отладочных символов, генерируемых компилятором rustc.
- Добавлена поддержка криптографической верификации загружаемых BPF-программ по цифровой подписи. В дальнейшем данная возможность будет расширена средствами для определения правил загрузки подписанных BPF-программ и предоставления непривилегированным пользователям возможности использования верифицированных BPF-программ.
- В гипервизоре KVM реализована поддержка виртуализации расширения Intel CET (Control-flow Enforcement Technology), применяемого для защиты от эксплоитов, использующих методы возвратно-ориентированного программирования (ROP – Return-Oriented Programming). Суть защиты в том, что после передачи управления функции, адрес возврата сохраняется процессором не только в обычном стеке, но и в отдельном теневом стеке, который не может быть изменён напрямую.
- Добавлена возможность использования более 255 CPU в гостевых системах, работающих под управлением гипервизора Bhyve на хостах с FreeBSD 15.
- Добавлена прослойка dibs (Direct Internal Buffer Sharing) для управляемого совместного использования буферов внутри изолированной среды, такой как гипервизор или экземпляр ядра Linux.
- В подсистему аудита добавлена поддержка работы c несколькими одновременно включёнными модулями LSM (Linux Security Module).
- Добавлен virtio-драйвер spi-virtio для доступа к SPI-устройству из виртуальных машин.
- В гипервизор KVM добавлена поддержка режима SEV-SNP CipherText Hiding, блокирующего чтение шифротекста памяти защищённых гостевых систем в неавторизированном CPU.
- Добавлена поддержка шифрования TCP-соединений, используя протокол PSP (PSP Security Protocol), разработанный компанией Google для шифрования трафика между датацентрами. PSP обеспечивает шифрование, криптографический контроль целостности и аутентификацию источника, реализуя своеобразную комбинацию возможностей протоколов TLS и IPsec. В PSP применяется шифрование на уровне отдельных сетевых соединений, а не всего канала связи. PSP использует отдельные ключи шифрования для разных туннелируемых TCP-соединений для строгой изоляции трафика от разных приложений и обработчиков. Для снижения нагрузки на CPU поддерживается вынос операций шифрования и расшифровки на сторону сетевых карт (offload). В качестве транспорта для передачи данных используется протокол UDP, поверх которого пробрасывается содержимое оригинального пакета TCP.
- Добавлена начальная поддержка расширения AccECN (Accurate Explicit Congestion Notification), представляющего собой улучшенный вариант расширения ECN, позволяющего хостам в случае перегрузки маркировать IP-пакеты вместо их отбрасывания, что даёт возможность определять возникновение начальной стадии затора в каналах связи без потери пакетов. Исходное расширение ECN имеет ограничение, допускающее выставление только одного сигнала о перегрузке в рамках одного цикла приёма-передачи TCP (RTT, Round-Trip Time, отправка запроса и получение ответа). AccECN снимает данное ограничение и даёт возможность получателю передавать отправителю более одной метки о перегрузке в заголовке TCP-пакета. Алгоритмы управления перегрузкой могут использовать полученную информацию для более точного реагирования на перегрузки и не прибегать к резкому снижению интенсивности отправки пакетов при появлении незначительной перегрузки.
- В UDP-стеке оптимизирована обработка входящих пакетов в условиях
DDoS-атак, приводящих к поступлению большого числа пакетов в один или несколько UDP-сокетов. Внесённые оптимизации, такие как снижение конкурирующих блокировок, оптимизация размещения структур данных в памяти и задействование блокировок, учитывающих архитектуру NUMA (Non-Uniform Memory Access), позволили повысить производительность при приёме UDP-пакетов на 47% и выше в экстремальных условиях. - Реализована возможность отключения кэширования ввода/вывода в NFS-сервере, что позволяет использовать NFS-сервер в системах с небольшим объёмом памяти (например, урезанных облачных окружениях). Отключение кэша также может быть полезно на нагруженных NFS-серверах для избежания вытеснения из кэша данных, связанных с локальными накопителями, из-за освобождении памяти для кэша NFS.
- Максимальный размер буферов поступающих и отправляемых пакетов для сетевых сокетов (net.core.rmem_max и net.core.wmem_max) увеличен с 2 МБ до 4 МБ. Выставляемый по умолчанию размер не изменился (net.core.rmem_default и net.core.wmem_default = 2 МБ).
- В состав ядра принят драйвер Tyr, написанный на языке Rust и обеспечивающий работу с GPU ARM Mali, в которых применяется технология CSF (Сommand Stream Frontend), таких как Mali G310, G510 и G710. Драйвер пока не готов для постоянного использования обычными пользователями и рассматривается как экспериментальный прототип для тестирования абстракций для разработки драйверов на языке Rust.
- В драйверы для устройств ввода с интерфейсом HID (Human interface device) добавлена поддержка тачпадов с тактильной связью и датчиками силы нажатия.
- Продолжена работа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. В новой версии добавлен интерфейс madvise, включена поддержка SR-IOV PF (Single Root I/O Virtualization Physical Function), добавлена поддержка режима Intel PSMI для валидации оборудования, обеспечена обработка передаваемой прошивками информации об ошибках, реализован профиль энергопотребления SLPC, добавлена поддержка загрузки вспомогательных прошивок (например, к контроллеру кулера и регулятору напряжения) во время проверки драйвера.
- В драйвер AMDGPU добавлена поддержка устройств с APU Cyan Skillfish, реализована совместимость с инструментарием criu, в sysfs добавлены метрики температуры, разрешены запросы ремапинга MMIO из пространства пользователя.
- В драйвере i915 включена поддержка чипов семейства Wildcat Lake и улучшена работа с GPU Jasper Lake, Elkhart Lake, Gen7 и Gen6.
- Продолжена интеграция компонентов драйвера Nova для GPU NVIDIA, оснащённых GSP-прошивками, используемыми начиная с серии NVIDIA GeForce RTX 2000 на базе микроархитектуры Turing. Драйвер написан на языке Rust. В новой версии расширена поддержка прошивок GSP, улучшена реализация макроса “register!”, добавлена поддержка классов PCI-устройств и идентификаторов производителей.
- Добавлен драйвер rocket для NPU ускорителей, применяемых в SoC Rockchip RK3588.
- Добавлен параметр ядра “boot_display” для выбора устройства вывода для отображения процесса загрузки на системах с несколькими GPU.
- В драйвере vesadrm реализована поддержка 8-разрядных палитр.
- В драйвер msm добавлена поддержка GPU Adreno 663 и реализована поддержка технологии снижения энергопотребления IFPC (Inter Frame Power Collapse).
- В драйвер panthor добавлена поддержка GPU Mali-G710, Mali-G510, Mali-G310, Mali-Gx15, Mali-Gx20 и Mali-Gx25.
- Добавлена поддержка звуковых систем ASoC Qualcomm Glymur и PM4125, Realtek RT1321, Shanghai FourSemi FS2104/5S, Texas Instruments PCM1754 и TAS2783A, qcs615, CS35L56 B2, tas2118, tas2x20, tas5825. Добавлена поддержка звуковых USB-карт Tascam US-144mkII и Presonus S1824c.
- Добавлена поддержка ARM CPU Cortex-A320/A520AE/A720AE и C1-Nano/Pro/Premium/Ultra.
- Добавлена поддержка ARM-плат, SoC и устройств: Apple M2 Pro, M2 Max и M2 Ultr, Sony Xperia SP, Samsung Galaxy S22, Samsung Galaxy S20 FE, ASUS Eee Pad Slider SL101, Lenovo ThinkBook 16, HP Omnibook X14 X1P42100, Dell Inspiron 7441 / Latitude 7455, Sige1, NanoPi Zero2, Axis Artpec8, NXP i.MX91, ROCK 2A/2F, Qualcomm Lemans Auto, Renesas RZ/T2H, RZ/N2H, RZ/T2H и RZ/N2H, Aspeed AST27xx, Meta Clemente BMC, Netcube Nagami som, Tqma91xx, Ultratronik i.MX8MP Ultra-MACH, i.MX8ULP EVK9, Buffalo WXR-1750DHP,
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 6.18 – Linux-libre 6.18-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.18 обновлён код чистки blob-ов в драйверах Nova-Core, Intel XE, TI PRUeth, Lantiq GSWIP, Marvell WiFi-Ex. Выполнена чистка имён blob-ов в dts-файлах (devicetree) для ARM-чипов Qualcomm, Mediatek и TI ARM64. Нейтрализована загрузка blob-ов в новых драйверах FourSemi fs2104/5s, TI TAS2783 и Qualcomm GENI.