Релиз ядра Linux 6.8
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.8. Среди наиболее заметных изменений: драйвер Xe для GPU Intel, режим защиты блочных устройств с примонтированными ФС, механизм планировщика задач Deadline server, автоматическая оптимизация слияния идентичных страниц памяти, первый драйвер на языке Rust, системные вызовы listmount и statmount, удаление bpfilter и SLAB, механизм guest_memfd в KVM, профилирование обращения к данным.
В новую версию принято 15641 исправлений от 2018 разработчиков, размер патча — 44 МБ (изменения затронули 12212 файлов, добавлено 663864 строк кода, удалено 339094 строк). В прошлом выпуске было 18405 исправлений от 2066 разработчиков, размер патча — 72 МБ. Около 42% всех представленных в 6.8 изменений связаны с драйверами устройств, примерно 15% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 6% — с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 6.8:
- Дисковая подсистема, ввод/вывод и файловые системы
Добавлен режим блокирования прямой записи на блочные устройства, на которых имеются примонтированные файловые системы (после включения режима, пользователь root не сможет внести изменения в ФС через манипуляции на уровне блочного устройства). По умолчанию режим отключён и требует указания параметра BLK_DEV_WRITE_MOUNTED при сборке. Для разделов с Btrfs блокировка пока не работает, так как в код Btrfs ещё не приняты необходимые изменения.
Добавлены системные вызовы listmount () и statmount (), позволяющие из пространства пользователя получить детальную информацию о примонтированных файловых системах.
В файловой системе XFS продолжена работа над реализацией возможности применения утилиты fsck для проверки и исправления выявленных проблем в online-режиме, без отмонтирования файловой системы.
В Ext4 для блоков размером меньше страницы памяти задействован вызов dioread_nolock, позволяющий повысить производительность, благодаря избавлению от лишних блокировок. Некоторые функции переведены на использование фолиантов страниц памяти (page folios).
В Btrfs добавлена поддержка флага монтирования «nospace_cache» для отключения кэша свободных блоков.
- Для ФС SMB реализована возможность создания блочных и символьных файлов устройств.
В Bcachefs добавлена частичная поддержка проверки и восстановления целостности примонтированных ФС.
В подсистеме device-mapper прекращена поддержка обработчиков MD_LINEAR, MD_MULTIPATH и MD_FAULTY, объявленных устаревшими в 2021 году.
- Память и системные сервисы
В подсистему Zswap добавлена активируемая при нехватке оперативной памяти возможность принудительной выгрузки в реальный раздел подкачки «холодных» страниц памяти, к которым не было обращения и которые скорее всего останутся невостребованными. Zswap выполняет кэширование вытесняемых в раздел подкачки страниц, храня их в оперативной памяти в сжатом виде по возможности без сброса в реальный несжатый раздел подкачки на диске. Внесённые изменения при нехватке памяти позволяют уменьшить размер хранимого в ОЗУ пула Zswap и высвободить память системе.
В Zswap предложен новый режим, который полностью отключает отложенную запись (writeback) в реальный раздел подкачки, если попытка записи не увенчалась успехом, и не сбрасывает уже имеющиеся в пуле zswap страницы в раздел подкачки.
В планировщик задач добавлен механизм SCHED_DEADLINE server, решающий проблему с недополучением ресурсов CPU обычными задачами в условиях монополизации CPU высокоприоритетными (realtime) задачами. Для предотвращения монополизации CPU в ядре ранее использовался механизм Realtime throttling, который пытался резервировать 5% для низкоприоритетных задач, оставляя 95% времени realtime-задачам. Данный механизм оставлял желать лучшего так как обычные задачи во многих ситуациях недополучали процессорное время. SCHED_DEADLINE server реализует более эффективный механизм резервирования ресурсов.
В подсистему DAMON (Data Access MONitor), позволяющую отслеживать доступ процесса к данным в оперативной памяти (например, можно узнать к каким областям памяти обращался процесс, а какие области памяти остались невостребованными), добавлен механизм автоматической настройки агрессивности потребления памяти на основе заданных квот.
Добавлена поддержка многоразмерных больших страниц памяти (mTHP — multi-size Transparent Huge Pages), позволяющая выделать память в блоках, размером больше базовой страницы, но меньше традиционной THP-страницы.
Добавлена поддержка крупных фолиантов (page folios, объединённые страницы памяти) для анонимной памяти (не привязанной к ФС, например, выделенной через malloc). Изменение нацелено на повышение производительности за счёт выделения больших кусков памяти во время обращения к невыделенным страницам памяти (page faults). Например, использование крупных фолиантов позволило на 5% сократить время пересборки ядра (при сокращении времени проводимого на уровне ядра на 40%).
В файл конфигурации ядра добавлен параметр TRANSPARENT_HUGEPAGE_NEVER, дающий возможность отключить использование больших страниц памяти (Transparent Huge Pages).
В системный вызов userfaultfd (), дающий возможность создавать обработчики обращений к невыделенным страницам памяти (page faults) в пространстве пользователя, добавлена операция UFFDIO_MOVE, позволяющая при упаковке кучи (heap compaction) перемещать страницы памяти в виртуальном адресном пространстве без выполнения операции выделения страницы памяти. В проведённых тестах применение UFFDIO_MOVE позволило на 40% снизить время упаковки по сравнению с использованием операции UFFDIO_COPY.
Добавлен механизм «KSM advisor», позволяющий автоматически оптимизировать параметры подсистемы слияния идентичных страниц памяти (KSM — Kernel Samepage Merging).
Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). В новой версии включены изменения, добавляющие Rust-обвязку над уровнем абстракции phylib и использующий данную обвязку драйвер ax88796b_rust, обеспечивающий поддержку PHY-интерфейса Ethernet-контроллера Asix AX88772A (100MBit). По функциональности драйвер на Rust полностью эквивалентен старому драйверу ax88796b, написанному на языке Си, и может быть использован с сетевыми картами X-Surf 100, оснащёнными чипом AX88796B. Для архитектуры LoongArch предоставлена возможность написания модулей на языке Rust. Осуществлён переход на использование выпуска Rust 1.74.1.
Добавлен механизм BPF token, позволяющий выборочно делегировать обработку отдельных возможностей BPF, таких как загрузка программы BPF или создание BPF map, непривилегированным процессам в пространстве пользователя, достоверность которых подтверждена специальным токеном.
Расширена функциональность верификатора BPF-программ.
В утилиту perf добавлена поддержка профилирования данных, позволяющая отслеживать чтение и запись в структуры данных, например, с целью выявления наиболее активно модифицируемых полей в структурах. На системах с процессорами, поддерживающими сбор информации об операциях с памятью (Intel, AMD, ARM), для накопления статистики следует использовать команду «perf mem record», а для вывода отчёта об обращениях к структурам данных — «perf annotate --data-type».
Предоставлена возможность изменения размера буферов трассировки, применяемых для буферизации информации о событиях трассировки, передаваемых в пространство пользователя.
Удалён ранее объявленный устаревшим механизм распределения памяти SLAB, вместо которого в ядре теперь используется только SLUB. В качестве причины называются проблемы с сопровождением, наличие проблем в коде и дублирование функциональности с более совершенным аллокатором SLUB.
При сборке ядра включён флаг »-Wmissing-prototypes», генерирующий предупреждения для вызовов глобальных функций, которые не имеют определения прототипа.
Для архитектуры RISC-V на системах с поддержкой расширения SUSP SBI реализована поддержка перехода в ждущий режим с сохранением состояния в ОЗУ. Предоставлена возможность использования системного вызова riscv_hwprobe () для получения информации о поддерживаемых расширениях архитектуры набора команд RISC-V.
- Виртуализация и безопасность
Добавлены новые системные вызовы lsm_list_modules (), lsm_get_self_attr () и lsm_set_self_attr () для вывода списка загруженных LSM-модулей (Linux Security Modules) и получения/выставления атрибутов LSM-модуля. Добавлена новая структура lsm_ctx для коммуникации в контексте LSM между пространством пользователя и ядром.
Подсистема AppArmor переведена на использование для верификации правил алгоритма SHA-256, вместо хэшей SHA-1.
Из ядра удалена реализация функции strlcpy (), которая летом была включена в состав Си-библиотеки Glibc 3.38. Strlcpy является альтернативой функции strncpy (), содержащей защиту от переполнения буфера и обязательно выставляющей замыкающий строку нулевой байт.
В гипервизор KVM добавлена поддержка подсистемы guest_memfd (guest-first memory), предоставляющая функции управления памятью, позволяющие реализовать возможности и оптимизации, недостижимые при использование общей подсистемы управления памятью. Например, guest_memfd даёт возможность выделить и отразить на гостевую систему область память, недостижимую для хост-окружения, что может использоваться для организации конфиденциальных вычислений.
В гипервизор KVM для систем на базе архитектуры ARM64 добавлена поддержка 52-разрядных (LPA2) физических адресов. Для систем с архитектурой x86 предоставлена возможность сборки без эмуляции гипервызовов Hyper-V, позволяющая сократить размер ядра.
На стороне хост-окружения реализована поддержка механизма Intel TDX (Trusted Domain Extensions), позволяющего при использовании гипервизора KVM создавать защищённые гостевые окружения, в которых используется шифрование памяти виртуальных машин.
В SELinux добавлен SID-идентификатор «init», позволяющий выделить запускаемые на начальном этапе загрузки процессы, запущенные до применения политик SELinux. Усовершенствован интерфейс /sys/fs/selinux для управления SELinux.
- Сетевая подсистема
Проведена низкоуровневая реорганизация базовых сетевых структур данных, выполненная для повышения эффективности кэширования. Ранее поля в структурах сетевого стека socks, netdev, netns и mibs располагались по мере добавления, что ограничивало использование процессорного кэша. Пересмотр размещения переменных в структурах привёл к заметному увеличению скорости работы TCP, благодаря минимизации использование строк кэша на стадии передачи данных и оптимизации доступа к переменным. В случаях обработки множества параллельных TCP-соединений ускорение может достигать 40%.
Удалена подсистема bpfilter, использующая BPF для фильтрации пакетов. Bpfilter поставлялся начиная с выпуска 4.18, но так и не был доведён до уровня, пригодного для широкого использования. В последние годы код bpfilter в ядре не развивался, а разработка продолжалась компанией Facebook в отельном репозитории.
- Оборудование
В состав включён новый drm-драйвер (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. Драйвер Xe позиционируется как основа для обеспечения работы новых чипов, не привязанная к коду для поддержки старых платформ. Драйвер построен с использованием новой архитектуры, в которой более активно используются уже существующие компоненты подсистемы DRM, а также типовые компоненты драйвера i915, не привязанные к конкретным GPU, например, код для взаимодействия с экранами, модель памяти и реализация execbuf. В Mesa работа OpenGL и Vulkan поверх драйвера Xe реализована на уровне изменений, внесённых в существующие Mesa-драйверы Iris и ANV.
В драйвере i915 продолжена работа по реализации поддержки чипов Intel LunarLake (Xe 2). Улучшена поддержка чипов Intel Meteor Lake.
В драйвере Nouveau реализована настройка для использования по умолчанию функций прошивки GSP для работы с GPU NVIDIA на базе микроархитектур Turing и Ampere, в которых операции инициализации и управления GPU выполняются отдельным микроконтроллером GSP (GPU System Processor). При включении настройки драйвер будет работать через обращение к прошивке, вместо прямого программирования операций взаимодействия с оборудованием.
В драйвере AMDGPU реализована поддержка ACPI WBRF и VPE DPM, изменена обработка скорости канала PCIe, в применяемых для синхронизации очередях задействованы 64-разрядные порядковые номера, добавлена поддержка специфичных для AMD механизмов управления цветом, решена проблемы с переходом в спящий режим.
Добавлена начальная реализация драйвера для GPU Broadcom VideoCore 7.1, используемого в платах Raspberry Pi 5.
Добавлен драйвер для GPU серии PowerVR 6 на базе микроархитектуры Rogue от компании Imagination Technologies.
Добавлены драйверы для камер на базе чипов Starfive, GalaxyCore GC2145/GC0308, Chips&Media Wave и THine THP7312.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.8 — Linux-libre 6.8-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.8 обновлён код чистки блобов в различных драйверах и подсистемах. Проведена чистка драйверов Intel qat_420xx, Imagination PowerVR, Intel Xe, Chips&Media Wave5, Intel VSC, Aquantia PHY и Realtek rtw8922a. В связи с удалением из ядра прекращена чистка драйверов atmel, hermes, orinoco_usb, libertas_cs и zd1201. Проведена чистка имён блобов в dts-файлах (devicetree) для архитектур ARM и Aarch64. Устранены проблемы с чисткой драйвера i915.
Источник: http://www.opennet.ru/opennews/art.shtml? num=60768
© OpenNet