Релиз ядра Linux 6.6

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.6. Среди наиболее заметных изменений: новый планировщик задач EEVDF; механизм теневого стека для защиты от эксплоитов; поддержка fs-verity в OverlayFS; реализация квот и xattr в tmpfs; подготовка online fsck в XFS; усилено отслеживание экспорта символов «GPL-only»; поддержка сетевых сокетов в io_uring; рандомизация памяти в kmalloc (); объявлена устаревшей ReiserFS; в Nouveau добавлены примитивы для Vulkan-драйвера NVK.

В новую версию принято 15291 исправлений от 2058 разработчиков, размер патча — 39 МБ (изменения затронули 14844 файлов, добавлено 553359 строк кода, удалено 284012 строк). В прошлом выпуске было 14674 исправлений от 2016 разработчиков, размер патча — 78 МБ. Около 44% всех представленных в 6.6 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 4% — с файловыми системами и 3% c внутренними подсистемами ядра.

Основные новшества в ядре 6.6:

  • Память и системные сервисы
    • Реализован новый планировщик задач EEVDF (Earliest Eligible Virtual Deadline First), который пришёл на смену планировщику CFS (Completely Fair Scheduler), поставлявшемуся начиная с ядра 2.6.23. Новый планировщик при выборе следующего процесса для передачи выполнения учитывает процессы, которые недополучили процессорных ресурсов или получили незаслуженно много процессорного времени. В первом случае форсируется передача управления процессу, а во втором, наоборот, откладывается. Старый планировщик CFS использовал для определения процессов, требующих отдельного внимания, эвристику и тонкие настройки, в то время как новый планировщик отслеживает их более явно и не требует тонкой настройки. Предполагается, что EEVDF позволит снизить задержки при выполнении задач, с которыми у CFS возникали проблемы с планированием.

    • Внесены изменения в обработку внутренних символов категории «GPL-only», нацеленные на усложнение использования проприетарными модулями GPL-прослоек для обхода ограничений доступа к подсистемам ядра, допускающим обращение только кода под лицензией GPL. В функции symbol_get () для проприетарных модулей запрещён поиск символов, помеченных как GPL-only, и наоборот, GPL-модули не смогут находить символы, экспортируемые проприетарными модулями.

    • Добавлены дополнительные настройки рабочих очередей (unbound workqueue) для повышения эффективности повторного использования процессорного кэша на крупных системах, имеющих несколько кэшей третьего уровня (L3). В состав ядра также включена утилита tools/workqueue/wq_dump.py для проверки текущей конфигурации рабочих очередей.

    • В подсистему io_uring добавлена начальная поддержка сетевых операций и сетевых сокетов. Добавлен sysctl io_uring_disabled для отключения io_uring на уровне всей системы. В io_uring также значительно ускорен прямой ввод/вывод (Direct I/O) в асинхронном режиме. Прирост пропускной способности и снижение задержек при выполнении операций ввода-вывода после внесения изменений достигает 37%.

    • Для архитектуры PA-RISC реализован JIT-компилятор для BPF.

    • В настройку /sys/devices/system/cpu/smt/control добавлена поддержка числовых параметров, определяющих число потоков, доступных для каждого ядра CPU (ранее поддерживались только значения «on» и «off» для включения и выключения поддержки симметричной многопоточности). Новую возможность можно применять на некоторых процессорах PowerPC, поддерживающих режим горячего включения симметричной многопоточности («hotplug SMT»), для выборочного включения SMT на определённых ядрах во время работы.

    • Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Осуществлён переход на использование выпусков Rust 1.71.1 и bindgen 0.65.1. Реализован типаж 'Zeroable'. Добавлены процедурные макросы 'paste!' и '#[derive (Zeroable)]'. Обеспечена совместимость с '#[pin_data]'. Добавлены функции инициализации '{, pin_}init_array_from_fn ()' и метод '{, pin_}chain'. Расширены возможности модуля 'types'. Во фреймворк unit-тестирования kunit добавлена возможность запуска тестов из документации Rust.

    • Добавлена подсистема «eventfs», позволяющая существенно снизить потребление памяти в системе трассировки, за счёт избавления от хранения лишних структур, применяемых для представления точек трассировки в файловой системе. Ранее подобные структуры создавались для всех точек трассировки, независимо от использования трассировки. При помощи eventfs подобные структуры могут создаваться динамически, только во время необходимости в них.

    • Расширены возможности утилиты perf.

    • В файл /proc/pid/smaps добавлена информация для диагностики эффективности работы механизма слияния идентичных страниц памяти (KSM, Kernel Samepage Merging).

    • Удалён API Frontswap, позволяющий разместить раздел подкачки в памяти, которую невозможно напрямую адресовать и которая не предоставляет оперативной информации о наличии свободного места. Данный API использовался только в zswap, поэтому решено напрямую использовать данную функциональность в zswap, избавившись от лишних прослоек.

    • Для архитектуры RISC-V добавлена поддержка доступа к счётчикам производительности из пространства пользователя и возможность размещения дампа ядра после сбоя в области за границей 4GB.
    • Добавлена начальная поддержка инструкций ARM SME (Scalable Matrix Extension).

    • Реализована возможность использования отладочных инструментов KDB, KGDB, kcov, KFENCE и KASAN на системах с архитектурой LoongArch.

    • Добавлена поддержка файлов для тестирования ядра в системе непрерывной интеграции GitLab, которая применяется при разработке графических драйверов.

  • Дисковая подсистема, ввод/вывод и файловые системы
    • В файловую систему OverlayFS добавлена поддержка сохранения хэшей fs-verity в расширенном атрибуте (xattr) overlay.verity, что может использоваться для проверки целостности и подлинности файлов в нижних слоях OverlayFS при помощи криптографических хэшей и ключей. Таким образом, в OverlayFS теперь включены все изменения, необходимые проекту Composefs для работы в форме надстройки над ФС OverlayFS и EROFS.

    • В файловой системе XFS проведена подготовка к реализации возможности применения утилиты fsck для проверки и исправления выявленных проблем в online-режиме, без отмонтирования файловой системы. Кроме того, в XFS реализована возможность использования крупных фолиантов (folios) в страничном кэше и добавлены некоторые связанные с этим оптимизации, позволившие заметно поднять производительность для некоторых видов нагрузки.

    • В файловую систему tmpfs добавлена поддержка пользовательских расширенных атрибутов (user xattrs), прямого ввода/вывода и квот, привязанных к пользователю и группе. Стабилизированы смещения на каталоги, что решило проблемы с экспортом tmpfs через NFS.

    • В API управления монтированием для повышения безопасности добавлен флаг FSCONFIG_CMD_CREATE_EXCL, запрещающий совместное использование суперблока в нескольких точках монтирования (запрещает прикрепление одного раздела к нескольким точкам монтирования). В утилите mount для включения данного флага предложена опция »--exclusive».

    • В подсистему VFS добавлена поддержка оперативного изменения параметров c временем доступа и изменения (atime, mtime). Ранее данные о времени отражались с некоторой задержкой, что мешало отслеживанию актуальности данных в кэше в системах, подобных NFS (из-за задержки определения изменений в файле, система могла ошибочно посчитать, что данные в кэше актуальны). Новая возможность доступна для Btrfs, Ext4, tmpfs и XFS.

    • В Btrfs объявлен устаревшим встроенный механизм проверки целостности, включаемый на этапе сборки через параметр BTRFS_FS_CHECK_INTEGRITY. Указанный механизм остался без сопровождения, больше не тестируется и создаёт дополнительную нагрузку на CPU и память. Кроме того, в Btrfs проведена оптимизация производительности нового кода проверки ФС (scrub).

    • В файловой системе Ext4 добавлены периодические проверки обновления суперблока и ускорены операции выделения памяти при дозаписи в конец файла.

    • В подсистему FUSE добавлена поддержка атрибута btime («birth time»), определяющего время создания inode.

    • Запрещено изменение прав доступа для символических ссылок.

    • Добавлен системный вызов fchmodat2(), который отличается от системного вызова fchmodat () дополнительным аргументом для указания флагов. Из флагов пока поддерживаются только AT_SYMLINK_NOFOLLOW и AT_EMPTY_PATH, позволяющие без обходных путей реализовать в libc-функции fchmodat () запрет разыменования символических ссылок и возможность использования файлового дескриптора при указании пустого пути.

    • В файловой системе EROFS (Extendable Read-Only File System), предназначенной для использования на разделах, доступных в режиме только для чтения, добавлена поддержка алгоритма сжатия Deflate. Для ускорения поиска расширенных атрибутов задействована вероятностная структура bloom filter.

    • Добавлена настройка CONFIG_BUFFER_HEAD, позволяющая собрать ядро без использования структуры buffer_head. При сборке без buffer_head можно использовать блочные устройства, но становятся недоступны многие ФС, например, xfs, btrfs, cramfs, erofs и squashfs.

    • В драйвер блочных устройств ublk, позволяющий вынести специфичную логику на сторону процесса в пространстве пользователя, добавлена поддержка зонированных устройств хранения (разделение на зоны групп блоков или секторов, в которые допускается лишь последовательное добавление данных с обновлением целиком всей группы блоков).

    • Реализация файловой системы ReiserFS переведена из категории поддерживаемых в разряд устаревших (Obsolete). Прекращение поддержки ReiserFS намечено на 2025 год. В качестве причины перевода ReiserFS в разряд устаревших упоминается стагнация в сопровождении данной ФС, нерешённая проблема 2038 года, отсутствие возможностей по обеспечению отказоустойчивости и желание снизить трудозатраты на сопровождение общих для файловых систем изменений, связанных с поддержкой нового API для монтирования, iomap и фолиантов (folios).

    • В NFS-сервере реализован механизм делегирования операций записи для NFSv4, повышающий эффективность кэширования записи файлов для сокращения трафика. Включена поддержка операции READ_PLUS, определённой в NFS 4.2.

    • В файловую систему Ceph добавлена поддержка fscrypt.

  • Виртуализация и безопасность
    • Добавлена реализация механизма Shadow Stack, которая позволяет блокировать работу многих эксплоитов, используя аппаратные возможности процессоров Intel для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в том, что после передачи управления функции, адреса возврата сохраняется процессором не только в обычном стеке, но и в отдельном «теневом» стеке, который не может быть изменён напрямую. Перед выходом из функции адрес возврата извлекается из теневого стека и сверяется с адресом возврата из основного стека. Несовпадение адресов приводит к генерации исключения, блокирующего ситуации, когда эксплоиту удалось перезаписать адрес в основном стеке. Аппаратный теневой стек поддерживается только в 64-разрядных сборках, а в 32-разрядных сборках применяется его программная эмуляция.

    • Добавлена поддержка сборки компилятором Clang с включённым режимом защиты CFI (Control Flow Integrity), блокирующим нарушения нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции.

    • Для архитектуры RISC-V включена рандомизация размещения ядра в памяти при загрузке.

    • В системный вызов seccomp () добавлен флаг SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP, позволяющий обрабатывать события из отслеживаемых процессов в синхронном режиме для более эффективной работы планировщика задач.

    • В функции kmalloc () обеспечена рандомизация выделяемой памяти, усложняющая эксплуатацию уязвимостей в ядре.

    • Из опций, связанных с включением системы принудительного контроля доступа SELinux, убрано упоминание Агентства национальной безопасности США. Так как проект уже 20 лет развивается под крылом сообщества и сопровождается независимыми мэйнтейнерами решено перейти на использование имени «SELinux» вместо «NSA SELinux» в комментариях и документации в Kconfig (например, пояснение к сборочному параметру SECURITY_SELINUX изменено с «NSA SELinux Support» на «SELinux Support»).

    • В системный вызов userfaultfd () добавлена операция UFFDIO_POISON, позволяющая пометить страницы памяти «отравленными» (poisoned), что может быть использовано для переноса повреждённых страниц памяти при миграции виртуальных машин с одной системы на другую.

    • В подсистему VFIO добавлен новый символьный интерфейс (/dev/vfio/devices/vfioX) для управления устройствами VFIO, позволяющий пользователю напрямую открыть файл с устройством, без обращения к устаревшему групповому интерфейсу /dev/vfio/$groupID.

    • В сервере NFS прекращена поддержка устаревших типов шифрования Kerberos, использующих алгоритмы DES и 3DES.

    • При запуске в окружении гипервизора Hyper-V добавлена поддержка гостевых систем, защищённых при помощи технологии AMD SEV-SNP (Secure Nested Paging) и Intel TDX (Trusted Domain Extensions).

    • При сборке ядра в режиме «W=1» в компиляторе по умолчанию включены предупреждения »-Wformat-overflow»,»-Wformat-truncation»,»-Wstringop-overflow» и »-Wrestrict». Для любых сборок включено предупреждение »-Wenum-conversion».

  • Сетевая подсистема
    • Реализация семейства адресов AF_XDP (eXpress Data Path) расширена возможностью работы с пакетами, хранимыми в нескольких буферах (например, в одном буфере может находиться заголовок пакета, а во втором данные, или в цепочке из нескольких буферов могут размещаться большие jumbo-кадры Ethernet). Программы, использующие сокеты AF_XDP, теперь могут принимать и передавать пакеты сразу из нескольких буферов.

    • В подсистему BPF добавлена поддержка дефрагментации пакетов IPv4 и IPv6, а также возможность фильтрации фрагментированных пакетов.

    • В BPF добавлен новый обработчик update_socket_protocol, позволяющий BPF-программам изменять запрошенный протокол для новых сокетов. Например, BPF программа может прозрачно заменить протокол TCP на MPTCP (multipath TCP) для оптимизации трафика приложения. В BPF также добавлена поддержка управления маршрутизацией пакетов через разные потоки в MPTCP.

    • Снят признак экспериментальной разработки с модуля ksmbd, предлагающего работающую на уровне ядра реализацию файлового сервера на базе протокола SMB3. Добавлена поддержка объединения операций чтения (запросы «read compound»).

  • Оборудование
    • В DRM-подсистему (Direct Rendering Manager) внесены изменения, необходимые для эффективной работы открытого драйвера NVK с реализацией графического API Vulkan для видеокарт NVIDIA. Изначально DRM-драйвер Nouveau был рассчитан на реализацию OpenGL, поэтому в нём не хватает примитивов, необходимых для эффективной работы Vulkan-драйверов, например, поддержки синхронизированных объектов и управления виртуальным адресным пространством.

    • В драйвере AMDGPU реализована поддержка SDMA 6.1.0, HDP 6.1, SMUIO 14.0, PSP 14.0, IH 6.1 и GFX 9.4.3. Переработан код загрузки прошивок PSP (Platform Security Processor). Расширена поддержка технологии адаптивной синхронизации FreeSync (добавлена поддержка Freesync Panel Replay V2).

    • В драйвере i915 продолжена реализация поддержки чипов Intel Meteor Lake. Улучшена поддержка технологии защиты от копирования HDCP (High-bandwidth Digital Content Protection). Переработан код для взаимодействия с дисплеем.

    • Из Kconfig убраны опции отключения загрузки микрокода на этапе сборки — MICROCODE_INTEL и MICROCODE_AMD. Ядро теперь всегда собирается с кодом загрузки микрокода для систем x86, но фактическую загрузку микрокода можно отключить указав параметр ядра 'dis_ucode_ldr'.

    • В звуковую подсистему добавлена возможность управления звуковыми устройствами, подключёнными через шину IIO (Industrial I/O).

    • Добавлена поддержка звуковых интерфейсов Intel Lunarlak и AMD ACP5x, кодеков Cirrus Logic CS42L43, Realtek RT1017 и TI TAS2781, а также усилителей Cirrus Logic CS35L56 и winic aw88261. Добавлена поддержка ASoC AMD Van Gogh.

    • Добавлена поддержка Ethernet-контроллеров Broadcom ASP 2.0 и Marvell 88Q2XXX.

    • Добавлена поддержка панелей Visionox R66451, TDO TL050HDV35, KD070FHFID015, Inanbo T28CP45TN89 и EDT ET028013DMA, дисплейных контроллеров Loongson и контроллеров сенсорных экранов Azoteq IQS7222D/IQS7210A/7211A.

    • Добавлена поддержка ARM SoC Qualcomm SM4450 (Snapdragon 4 Gen 2), TI AM62P5, Intel Agilex5, Qualcomm ipq5018, AN400 (Amlogic T7)
    • Добавлена поддержка ARM-плат Samsung Galaxy Tab 3 8.0, FriendlyElec NanoPC T6, Amlogic A311D2, Khadas Vim4, Xiaomi SM7125, Facebook Yosemite 4, Orange Pi Zero 3, Radxa ROCK 4SE.

Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.6 — Linux-libre 6.6-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.6 обновлён код чистки блобов в различных драйверах и подсистемах, например, в драйверах TI gigabit RU ethernet, MediaTek 792x wifi, Cirrus Logic cs42l43 mfd, cs35l56 HD-audio и aw88261 SoC. Проведена чистка имён блобов в dts-файлах для архитектуры Aarch64. Удалены блобы в новых драйверах ivpu, в bloetooth-драйверах, в драйвере к сенсорным экранам и в кодировщике/декодировщике Qualcomm Venus V4L2.



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

© OpenNet