След два месеца разработка, Линус Торвалдс представи изданието на ядрото на 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% — с вътрешните подсистеми на ядрото.
Основни нововъведения в ядрото 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’. В рамките на фреймворка за единнично тестване 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 за проверка и коригиране на откритите проблеми в онлайн режим, без демонтиране на файловата система. Освен това, в XFS е реализирана възможността за използване на големи фолианти (folios) в страничната кеш памет и са добавени някои свързани оптимизации, които значително повишиха производителността за някои видове натоварвания.
- В файловата система tmpfs е добавена поддръжка за потребителски разширени атрибути (user xattrs), директно въвеждане/извеждане и квоти, свързани с потребителя и групата. Стабилизирани са позициите на каталозите, което разреши проблемите с експорта на tmpfs през NFS.
- В API за управление на монтиране за повишаване на сигурността е добавен флаг FSCONFIG_CMD_CREATE_EXCL, който забранява споделянето на суперблока на повече от една точка на монтиране (забранява прикрепянето на един дял към няколко точки на монтиране). В утилитата mount е предложена опция „—exclusive“ за включване на този флаг.
- В подсистемата VFS е добавена поддръжка за оперативно изменение на параметрите с време на достъп и промяна (atime, mtime). По-рано данните за времето се отразяваха с известно закъснение, което пречеше на проследяването на актуалността на данните в кеша в системи, подобни на NFS (поради закъснението при определяне на промените в файла, системата можеше погрешно да заключи, че данните в кеша са актуални). Новата функция е налична за Btrfs, Ext4, tmpfs и XFS.
- В Btrfs е обявен за остарял вграденият механизъм за проверка на целостта, включващ се на етапа на компилация чрез параметъра BTRFS_FS_CHECK_INTEGRITY. Указаният механизъм е без поддръжка, вече не се тества и създава допълнителна натовареност на CPU и памет. Освен това, в Btrfs е проведена оптимизация на производителността на новия код за проверка на файловата система (scrub).
- В файловата система Ext4 са добавени периодични проверки за обновяване на суперблока и са ускорени операциите по разпределение на памет при дописване в края на файла.
- В подсистемата FUSE е добавена поддръжка на атрибута btime („време на раждане“), който определя времето на създаване на inode.
- Промяната на правата на достъп за символични връзки е забранена.
- Добавен е системен вик fchmodat2(), който се различава от системния вик fchmodat() с допълнителен аргумент за указване на флагове. От флаговете засега се поддържат само AT_SYMLINK_NOFOLLOW и AT_EMPTY_PATH, което позволява без обходни пътища да се реализира в libc функцията fchmodat() забраната за разименуване на символични връзки и възможността за използване на файлов дескриптор при указване на пуст път.
- В файловата система EROFS (Разширяема файловата система само за четене), предназначена за използване на дялове, достъпни в режим само за четене, е добавена поддръжка на алгоритъма за компресия 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.
- В сървър Поддръжката на остарели типове криптиране Kerberos, използващи алгоритми DES и 3DES, е прекратена в NFS.
- При стартиране в среда на хипервизора 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). Кодът за взаимодействие с дисплея е преработен.
- Опциите за деактивиране на зареждането на микрокод на етапа на компилация — MICROCODE_INTEL и MICROCODE_AMD са премахнати от Kconfig. Ядро сега винаги се компилира с код за зареждане на микрокода за системи 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.
Източник: opennet.ru
