Релиз ядра 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