Дата публикации:Mon, 01 Dec 2025 09:35:22 +0300
После двух месяцев разработки Линус Торвальдс представил релиз ядра 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/<device>/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/<pid>/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,
Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=64346
