След като са изминали два месеца на разработка, Линус Торвалдс представи версия 7.0 на ядрото Linux. Сред най-забележителните промени са: правилата за използване на AI асистенти, интеграцията на Rust в основните функции на ядрото, подобрения в производителността на свързаността, активирането на режима PREEMPT_LAZY по подразбиране, поддръжка на филтри за операции io_uring, нова файлова система Nullfs, инфраструктура fserror, средства за мониторинг на XFS, поддръжка на ремапиране в Btrfs, активиране на версия NFS 4.1 по подразбиране, интеграция на пост-квантовия криптоалгоритъм ML-DSA, активиране на AccECN в мрежовата подсистема и начална поддръжка на WiFi 8.
Номер 7.0 е присвоен, тъй като в клон 6.x се е натрупало достатъчно издания за смяна на първата цифра в номера на версията (в свое време версия 6.0 беше генерирана веднага след 5.19). Смяната на номерацията се извършва по естетически съображения и е формален ход, който премахва дискомфорта от натрупването на голям брой издания в серията.
В новата версия са включени 15624 поправки от 2477 разработчици, размерът на пача е 56 MB (промените засягат 18053 файла, добавени са 704060 реда код, изттеглени са 278132 реда). В предишното издание имаше 15657 поправки от 2237 разработчици, размерът на пача бе 52 MB. Около 51% от всички представени промени в 7.0 са свързани с драйвери на устройства, приблизително 11% от промените имат отношение към обновяване на код, специфичен за хардуерни архитектури, 14% са свързани с мрежовия стек, 5% — с файловите системи и 3% — с вътрешните подсистеми на ядрото.
Основните нововъведения в ядрото 7.0 (1, 2, 3):
- Дисковата подсистема, вход/изход и файловите системи
- Реализирана е инфраструктура fserror и е добавен API за получаване на информация за грешки при вход/изход и повреда на метаданни при работа с файлове. Предложената инфраструктура унифицира предаването на информация за грешки в потребителското пространство чрез механизма fsnotify в файловите системи.
- В XFS са добавени нови възможности за мониторинг на състоянието на файловата система от потребителското пространство. Въведена е ioctl-операцията XFS_IOC_HEALTH_MONITOR, която връща файлов дескриптор, чрез който може да се получават сведения за повреди, свързани с повреждане на метаданни или възникване на грешки при вход/изход, а също така да се следи промяната на състоянията на FS, като демонтаж и завършване на работа. Допълнително е предложен управляем чрез systemd фонов процес xfs_healer, който обработва събития за състоянието на FS от потребителското пространство и при необходимост автоматично стартира процедури за възстановяване.
- В файловата система Btrfs е добавена екпериментална поддръжка на структурата „дерево ремапиране“ (remap tree), която в бъдеще може да бъде използвана като междинен слой при изпълнение на операции с входно-изходни данни. Същността на добавената функция е, че след преместване на данни на носителя, вместо обновление на всички свързани с тези данни структури, в допълнителната структура „remap tree“ се запазват старите и новите адреси на данните, след което при достъп до данните адресите се заменят. Новият подход се представя като по-надежден и гъвкав, а също така опростява по-нататъшното разширение на възможностите на Btrfs.
- В Btrfs е реализирана поддръжка на директен вход/изход в ситуации, когато размерът на блока надвишава размера на страницата в паметта на системата.
- Включена е нова файловата система „Nullfs“, която може да се използва като запълваща за кореновата ФС. Файловата система Nullfs винаги е празна, не съдържа данни и не поддържа промени. Целта на Nullfs е да се използва като начална ФС за опростяване на процеса на зареждане на системата — поверх Nullfs след това се монтират други ФС и се използва системният вик pivot_root() за превключване на кореновата ФС вместо изчистване на съдържанието на initramfs и използване на свързаната с него коренова ФС.
- Реализирано е обновление на информацията за времето на модификация на файловете в неблокиращ режим. По-рано викът file_update_time_flags() с флага IOCB_NOWAIT връщаше грешка „-EAGAIN“, което не позволяваше използването на операции за директно запис в неблокиращ режим.
- В файловите системи в категорията на отделно включаемите опции е преведена подкрепа за уведомителни блокировки (lease). По подразбиране, подобен механизъм сега не е активиран поради проблеми с файловите системи, които първоначално не са били предназначени за неговото прилагане. Например, файловите системи 9p и cephfs не поддържат това.
- В файловата система EROFS (Разширяема само за четене файлова система), предназначена за използване на дялове, достъпни в режим само за четене, за компресия по подразбиране е използван алгоритъм LZMA. По избор са налични алгоритми DEFLATE и Zstandard, които вече не са обозначени като експериментални. Реализирано е съвместно ползване на записи в страничния кеш (page-cache) за идентични файлове в отделни файлови системи EROFS.
- Режимът laptop_mode, спестяващ енергия чрез отлагане и обединяване на операции за запис на твърдия диск с цел удължаване на времето, в което дискът остава в режим на сън и намаляване на броя на събужданията, е премахнат. Режимът е загубил актуалност, тъй като в съвременните мобилни устройства твърдите дискове са заменени от твердотелни устройства.
- Файловата система F2FS е преминала на използване на големи фолиа от страници в паметта (large folios).
- Работата по драйвера ntfs3, разработван от Paragon Software, е възобновена. Добавена е поддръжка за операции с файлове на базата на iomap, реализирани са опции llseek SEEK_DATA/SEEK_HOLE, добавен е режим delalloc за отложено разпределение на блокове. Междувременно, в списъка за бюлетин на разработчиците на ядрото беше одобрено включването на нова реализация на NTFS - ntfsplus, разработена за замяна на ntfs3 в една от бъдещите версии на ядрото.
- По подразбиране при компилиране е включена версия на протокола NFS 4.1 (CONFIG_NFS_V4_1). Обезпечена е блокировка на експорта чрез NFS на специализирани псевдо-файлови системи, като pidfs и nsfs. В NFSD е реализирана експериментална възможност за използване на POSIX ACL и е добавена поддержка за динамична промяна на пула на нишките (thread-pool) в зависимост от натоварването.
- Памет и системни услуги
- Одобрени са официални правила за използване на AI асистенти и включване на автоматично генерирано съдържание в ядрото. При предаване на генерирания код, се изисква той да бъде етикетиран с помощта на използвания AI асистент чрез таг "Assisted-by". AI асистентите нямат право да добавят тага "Signed-off-by" - човекът, предал патча, се счита за негов автор и носи отговорност за изпратената промяна и гарантира нейното качество. На разработчиците е предписано да провеждат ръчно рецензиране на кода, получен чрез AI, и да проверяват съответствието на резултата с лицензионните изисквания.
- Поддръжката на Rust е преместена от експерименталната фаза в основните функции на ядрото. Поддръжката на Rust не е активна по подразбиране и не води до включването му в задължителните зависимости на ядрото.
- Завършена е интеграцията на механизма "Swap Table" в ядрото, който позволява повишаване на производителността на размяната. Ускорението се постига благодарение на намаляване на конкуренцията за достъп до кеша за размяна, по-ефективно търсене в кеша и намаляване на фрагментацията. Бекендът, базиран на Swap Table, е активиран за кеширане на размяната вместо XArray и позволи в теста redis-benchmark с BGSAVE да увеличи броя на обработваните заявки с 22%.
- Добавена е поддръжка на новото разширение за анализ на безопасността на нишките от Clang 22, което позволява да се откриват потенциални състояния на гонка и грешки, причинени от неправилно задаване на заключвания, по време на компилация. Разширението предлага редица атрибути, като GUARDED_BY(…), REQUIRES(…), RELEASE(…) и ACQUIRE(…), които позволяват маркиране на функциите, обхванати от заключвания, и разделяне на обхвата на заключванията (определяне на контекста). По време на компилация се извършва проверка на коректността на използването на примитиви за синхронизация, като мютекси, на базата на оценка на активността или неактивността на свързания контекст.
- В системния повик open_tree е добавен флагът OPEN_TREE_NAMESPACE за улесняване на настройката на изолирани контейнери и ускоряване на стартирането на контейнери на системи с много точки на монтиране. Подобно на OPEN_TREE_CLONE, новият флаг копира само посоченото дърво точки на монтиране (mount tree), но вместо локален файлов дескриптор, връща файлов дескриптор в новото пространство на имената на точките на монтиране, в което копираното дърво се монтира върху копието на реалната коренова файлова система. Флагът OPEN_TREE_NAMESPACE е необходим за избягване на разделното изпълнение на операциите unshare(CLONE_NEWNS) и pivot_root(), прилагани при създаването на контейнери.
- В системния повик rseq е добавен механизъм за разширяване на времевите кванти (time slice), който позволява получаването на допълнително процесорно време за непрекъснато изпълнение на критичната секция. Идеята е да се избегне прекъсването на критичната секция с поставена блокировка от планировчика на задачи, което води до предаване на контрола на други потоци, използващи ресурси, за които остава поставена блокировка. Разширението на времевия квант се извършва без допълнителни разходи, но и без строги гаранции, предоставяни при пълно регулиране на приоритетите.
- За архитектурите arm64, loongarch, powerpc, riscv, s390 и x86 режимът на предварително прекъсване (preemption) в планировчика по подразбиране е променен от PREEMPT_NONE на PREEMPT_LAZY. Процесът на режимите е намален от четири на два — PREEMPT_FULL и PREEMPT_LAZY (режимите PREEMPT_NONE и PREEMPT_VOLUNTARY остават само за архитектури, които не поддържат PREEMPT_FULL и PREEMPT_LAZY). Режимът PREEMPT_LAZY прилага модела на пълно прекъсване (PREEMPT_FULL) за реални задачи (RR/FIFO/DEADLINE), но забавя прекъсването на обикновените задачи (SCHED_NORMAL) до границата на тикта. Внесеното забавяне води до намаляване на случаите на прекъсване на собствениците на блокировки, което позволява производителността да се доближи до конфигурациите, които използват модела на доброволно прекъсване (voluntary preemption), т.е. PREEMPT_LAZY позволява запазване на възможностите за пълно прекъсване по отношение на реалните задачи, но минимизира спадовете в производителността за обикновените задачи.
Активирането на PREEMPT_LAZY доведе до сериозен регрес, като намали производителността на PostgreSQL наполовина на системи ARM64. За отстраняване на спада в производителността на разработчиците на PostgreSQL беше предложено да се активира опцията PR_RSEQ_SLICE_EXTENSION, за да се намали вероятността от принудително изместване на носителя на блокировката.
- Продължава преносът на изменения от клона Rust-for-Linux, свързани с използването на езика Rust като втори език за разработване на драйвери и модули на ядрото. Благодарение на интегрираната библиотека "syn", която опростява писането на сложни макроси, е успяло да се намали размерът на Rust-кода в ядрото чрез опростяване на определенията на съществуващите процедурни макроси. Разширени са възможностите на библиотеките kernel, macros и pin-init.
- В системата за асинхронно вход/изход io_uring е добавена опция за използване на нециклични опашки (non-circular submission queue), които се кешират по-ефективно в ситуации, когато изпълнението на заявка завършва преди връщането от системен повик.
- В подсистемата eBPF в механизма BTF (BPF Type Format), който предоставя информация за проверка на типовете в псевдокода BPF, беше използван бинарен търсене за намиране на отладъчна информация, което увеличи ефективността на зареждане на BPF-програми. В eBPF е добавена поддръжка на неявни аргументи при извикването на kfunc (ядрени функции, достъпни за използване в BPF програми), определени с флага KF_IMPLICIT_ARGS.
- Премахнат е кодът за поддръжка на начален RAM-диск (initrd) на база linuxrc, обявен за остарял преди много време. Останалите реализации на initrd планират да бъдат премахнати през 2027 година. Вместо initrd следва да се използва initramfs (разликата е, че initrd разполага начален зареден околни условия в дисков образ, а initramfs — в файловата система).
- В блочното устройство zram, използвано за компресирано съхранение на раздела за разменяне в паметта, е променена логиката на работа със стиснатите страници памет при опционално преместване на данните в постоянно хранилище в случай на запълване на наличната оперативна памет. Преди страниците памет се разпаковаха преди запис на физическото носител, а сега се запазват в компресиран вид, което намалява натоварването на CPU и спестява енергия при автономна работа.
- В утилитата timerlat, предназначена за измерване на забавяния при работа на планировчика на задачи, е добавена опция "—bpf-action" за стартиране на BPF-програми в случай на превишаване на зададения праг.
- В системата за трасировка ftrace е добавена настройка "bitmask-list" за извеждане на битови маски в четим вид (под формата на списък с битове, а не шестнадцетично число). В tracefs са добавени възможности за одит на филтри и тригери. Добавена е команда "perf sched stats" за събиране и показване на статистика за работата на планировчика на задачи.
- Добавени са опции за сборка LOGO_LINUX_MONO_FILE, LOGO_LINUX_VGA16_FILE и LOGO_LINUX_CLUT224_FILE за определяне на файла с изображението на логото, което ще се показва при зареждане на ядрото вместо стандартното лого с пингвина Tux.
- Виртуализация и сигурност
- В системата за асинхронен вход/изход io_uring е реализирана възможността за прикрепяне на BPF програми с филтри, които контролират какво могат да правят конкретни операции на SQE (Submission Queue Entry) (подобие на системни повиквания в io_uring). Добавената възможност е аналог на филтри за системни повиквания. Филтрите могат да се свързват с определени задачи и се наследяват при създаване на нови процеси след извикване на fork(). При наличие на активни филтри, добавените горе филтри могат само да наложат допълнителни ограничения, но не да деактивират съществуващите. Реализираната възможност ще блокира методите за заобикаляне на филтрация на системни повиквания в sandbox среди, основани на изпълнение на подобни операции, предоставяни в io_uring.
- В SELinux е добавена възможността за управление на достъпа до BPF токени, което позволява на непривилегировани процеси да извършват някои привилегировани операции с BPF, например, да зареждат BPF програми в ядрото и да създават map структури.
- Добавена е поддръжка на алгоритъма за генериране на цифрови подписи ML-DSA (CRYSTALS-Dilithium), основан на теория на решетките и устойчив на атаки от квантови компютри. Предоставена е възможност за използване на ML-DSA за удостоверяване на модули в ядрото.
- Премахната е възможността за използване на схеми за генериране на цифрови подписи с алгоритъм SHA-1 за удостоверяване на модули в ядрото (поддръжката за зареждане на подписани модули остава).
- В записа на одита NETFILTER_PKT са добавени полета ‘sport’ и ‘dport’ за инспектиране на номерата на мрежовите портове, а не само IP адреса.
- За системи с архитектура RISC-V е реализирана поддръжка на разширения Zicfiss и Zicfilp, които предлагат хардуерни възможности за прилагане на защита CFI (Control Flow Integrity), блокираща нарушения на нормалната последователност на изпълнение на инструкциите (control flow) в резултат на експлояти, които променят запазените в паметта указатели на функции.
- В хипервизора KVM е реализирана възможност за предаване на хостовите системи информация за поддръжката от процесора на разширение ERAPS (Enhanced Return Address Predictor Security), позволяващо да се избегнат някои операции по нулиране на състоянието на CPU при връщане на контрола на хост от гостова система. Освен това е добавена поддръжка за закрепване на гостовите системи на оборудване за проследяване на производителността (PMU, Performance Monitoring Unit), което позволява повишаване на точността на профилирането в сравнение с използването на емулирани PMU.
- В драйвера за хипервизора Hyper-V е добавена поддръжка на интерфейса debugfs за преглед на статистическите данни за работата на хипервизора.
- Мрежова подсистема
- По подразбиране е включено разширението AccECN (Accurate Explicit Congestion Notification), реализиращо подобрена версия на разширението ECN, позволяващо на хостовете при претоварване да маркират IP пакети вместо да ги отхвърлят, което дава възможност за определяне на началната фаза на задръстване в комуникационните канали без загуба на пакети. Първоначалното разширение ECN има ограничение, допускащо да се изпрати само един сигнал за претоварване в рамките на един цикъл на приемане-предаване на TCP (RTT, Round-Trip Time, изпращане на запитване и получаване на отговор). AccECN премахва това ограничение и дава възможност на получателя да предаде на изпращача повече от една етикета за претоварване в заглавката на TCP пакета. Алгоритмите за управление на претоварването могат да използват получената информация за по-точно реагиране на претоварвания и да не прибягват до рязко намаляване на интензивността на изпращане на пакети при появата на незначително претоварване.
- В реализация на алгоритъма за управление на мрежови опашки Cake е добавена възможност за обработка на множество опашки за разпределение на натоварването на няколко ядра на CPU. Алгоритъмът CAKE се прилага за намаляване на негативното влияние на междинното буфериране на пакети върху граничното мрежово оборудване и е насочен към постигане на максимално възможна пропускливост и минимално ниво на закъснение дори на бавни комуникационни канали.
- В сокетите VSOCK, използвани за взаимодействие с виртуални машини, е добавена поддръжка на мрежови пространства с имена (network namespace).
- Добавена е начална реализация на бъдещия стандарт WiFi 8 (802.11bn, Ultra High Reliability WiFi).
- Добавени са оптимизации, които повишават производителността на обработка на входящи UDP пакети с 12% при провеждане на стрес тестове в 100-гигабитна мрежа.
- Оборудване
- В драйвера AMDGPU е реализирана поддръжка на IP блокове, използвани в новите GPU AMD, като SMUIO 15.x, PSP 15.x, IH 6.1.1/7.1, MMHUB 3.4/4.2, GC 11.5.4/12.1, SDMA 6.1.4/7.1/7.11.4 и JPEG 5.3.
- В драйвера Nouveau е подобрено управлението на честотата на системите Tegra 186+.
- В драйвера i915 е добавена начална поддръжка на дисплейния IP блок Xe3p_LPD, използван в процесорите Intel Nova Lake-P.
- Продължава работата върху drm драйвера (Direct Rendering Manager) Xe за GPU на базата на архитектурата Intel Xe, която се използва в видеокартите на Intel от семейството Arc и интегрираната графика, започвайки от процесорите Tiger Lake. Добавен е режим Multi Queue. Добавени са компоненти, необходими за диагностика на зависания на GPU в Mesa. Добавена е поддръжка на механизма MERT за управление на достъпа до паметта на GPU.
- Продължава интеграцията на компонентите на драйвера Nova за GPU NVIDIA, оборудвани с GSP фърмуер, използван от серията NVIDIA GeForce RTX 2000, базирана на микроархитектурата Turing. Драйверът е написан на езика Rust. В новата версия е проведена подготовка за реализиране на поддръжка на GPU на базата на микроархитектурата Turing и са направени различни вътрешни промени.
- Добавена е поддръжка на контролери и периферни устройства с многоканален интерфейс SPI (Serial Peripheral Interface), което позволява предаване на данни в няколко паралелни потока.
- Добавен е драйвер за комбинирани конектори Type-C, прилагани на устройства с чипове Apple Silicon и съчетаващи интерфейсите USB3, DP-AltMode и Thunderbolt/USB4.
- Добавена поддръжка на звукови подсистеми на чиповете Tegra238, Minisforum V3 SE, iBasso DC04U, Intel Nova Lake, Nova Lake S и Focusrite Forte.
- Добавена поддръжка на ARM платформи, SoC и устройства: Arduino UnoQ, OrangePi 6 Plus, OrangePi CM5, Anbernic RG-DS, Realtek Kent, Qualcomm Kaanapali, Mediatek Ezurio, Facebook Anacapa, Microchip LAN9668, Khadas VIM1S, QNAP TS133, i.MX952, i.MX93, i.MX94, VHIP4 EvalBoard, TQ-Systems MBLS1028A, Agilex5, Radxa CM3J, Glymur.
- Добавена е поддръжка на смартфони и таблети: Fairphone Gen 6 (SoC Qualcomm Milos/Snapdragon 7s Gen 3), Pixel 3/3 xl, Microsoft Surface Pro 11.
В същото време латиноамериканският Фонд за свободен софтуер разработи вариант на напълно свободното ядро 7.0 — Linux-libre 7.0-gnu, което е изчистено от елементи на фърмуера и драйвери, съдържащи несвободни компоненти или парчета код, чието използване е ограничено от производителя. В изданието 7.0 е направено почистване от блобовете на драйвера iwlwifi. Кодът за почистване е обновен в драйверите amdgpu, adreno, TI PRUeth, air_en8811h, ath12k, TI VPE, rtw8852b, rt1320, rt5575 SPI, tas2783, Intel catpt. Извършено е почистване на имената на блобовете в dts файловете (devicetree) за ARM чипове.
Източник: opennet.ru
