Ядро 6.6
30.10.2023
После двух месяцев разработки Линус Торвальдс представил релиз ядра 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() обеспечена рандомизация slab-кешей, усложняющая эксплуатацию уязвимостей в ядре.
- Из опций, связанных с включением системы принудительного контроля доступа 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 LunarLake, Intel ArrowLake и AMD ACP5x, кодеков Cirrus Logic CS42L43, Realtek RT1017 и TI TAS2781, а также усилителей Cirrus Logic CS35L56 и winic aw88261. Добавлена поддержка ASoC AMD Van Gogh.
- Добавлен драйвер USB MIDI 2.0 Gadget, эмулирующий интерфейс USB MIDI 2.0, привязанный к устройству ALSA UMP rawmidi.
- Добавлена поддержка 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, в bluetooth-драйверах, в драйвере к сенсорным экранам и в кодировщике/декодировщике Qualcomm Venus V4L2.
|
|