Релиз на ядрото на Linux 6.9

След два месеца разработка, Линус Торвалдс представи версията на ядрото Linux 6.9. Сред най-забележителните промени: модулът dm-vdo за дедупликация и компресия на блочни устройства, режим на директен достъп до файлове в FUSE, поддръжка за създаване на pidfd за отделни нишки, механизъм за BPF токени, поддръжка на Rust в ARM64 системи, класифициране на файловата система Ext2 като остаряла, премахване на стария драйвер NTFS, и поддръжка на механизма Intel FRED.

В новата версия са включени 15680 поправки от 2106 разработчици, размерът на пача е 54 МБ (промените засегнаха 11825 файла, добавени са 687954 реда код, премахнати са 225344 реда). В предишното издание имаше 15641 поправка от 2018 разработчици, размерът на пача беше 44 МБ. Около 42% от всички изменения в 6.9 са свързани с драйвери на устройства, приблизително 17% от промените са свързани с обновления на код, специфичен за хардуерните архитектури, 13% са свързани с мрежовия стек, 7% — с файловите системи и 4% с вътрешните подсистеми на ядрото.

Основни новини в ядрото 6.9:

  • Дисковата подсистема, вход/изход и файловите системи
    • В Device Mapper (DM) е добавен нов обработчик dm-vdo (виртуален оптимизатор на данни), който позволява, на базата на съществуващите блочни устройства, да се реализира виртуално блочно устройство с функции като дедупликация на повтарящи се данни, компресия на данни, изключване на празни блокове и увеличаване на размерите на блочното устройство при необходимост (thin provisioning). Указаните възможности се реализират на ниво блочно устройство и не зависят от използваната файловата система (например, с помощта на dm-vdo може да се струва автоматично обединяване на дублиращи се данни и съхранение на информация в компресирана форма за всяка ФС). Поддържа се прилагането на dm-vdo за физически хранилища с размер до 256TB и създаването на логични томове с размер до 4PB. За управление на дяловете vdo се препоръчва да се използва lvm. Технологията VDO е разработена от компанията Permabit и е отворена след нейното придобиване от Red Hat през 2017 година.
    • В подсистемата FUSE, използвана за реализация на файлови системи в потребителското пространство, беше добавена начална реализация на режима „passthrough“, който позволява директен достъп на ниво ядро до данните на файловете, заобикаляйки процеса, работещ в потребителското пространство, което в някои случаи може значително да увеличи производителността. Например, FUSE реализациите на файловите системи, работещи в режим само за четене и ограничавещи достъпа до файловете, могат да предоставят съдържанието на файловете от оригиналната файловата система без да ги предават на процеса FUSE.
    • В категорията остарели (deprecated) беше включен драйверът с реализирана файловата система Ext2. Като причина се посочва поддръжката в драйвера само на 32-битови часовници в inode, които ще прелетят на 19 януари 2038 година. Вместо драйвера ext2 се предлага да се използва драйверът ext4, който поддържа работа с файловата система Ext2 и е напълно съвместим с нея, но може да използва в ext2 разделите времеви печати, неподвластни на проблема през 2038 година, ако файловата система е създадена с inode, с размер над 255 байта (в драйвера ext2 32-битовите часовници бяха използвани независимо от размера на inode).
    • Старият драйвер на файловата система NTFS беше премахнат, като на негово място от версия 5.15 влезе новият драйвер NTFS3. Наличието на два драйвера с реализация на NTFS в ядрото беше признато за нецелесъобразно, имайки предвид, че старият драйвер не е обновяван много години, в плачевно състояние е и може да работи само в режим на четене.
    • В файловите системи zonefs и hugetlbfs беше добавена поддръжка за картографиране на идентификаторите на потребителите на закачени файлови системи, използвана за съпоставяне на файлове на определен потребител на закачения чужд дял с друг потребител в текущата система.
    • В NFSv4 за администраторите беше предоставена възможност за изчистване на състоянията на отваряне и блокиране на файлове.
    • За файловата система Ext4 се отбелязва само корекция на грешки и обновление на kunit тестовете.
    • В Btrfs продължи трансфера на функции към използването на фолианти на страниците памет (page folios).
    • В файловата система XFS продължава работата по реализацията на възможността за използване на утилитата fsck за проверка и коригиране на откритите проблеми в онлайн режим, без демонтиране на файловата система.
    • В системния повик pwritev2() е добавен флаг RWF_NOAPPEND, който позволява да се укаже офсет за запис, дори когато файлът е отворен в режим само за добавяне на данни в края на файла.
    • Добавени са нови ioctl-команди: FS_IOC_GETUUID — връща UUID идентификатор на посочената файлова система, и FS_IOC_GETFSSYSFSPATH — определя местоположението в /sys/fs на зададената монтирана файловата система.
    • Файловите системи efs, qnx4 и coda са преминали на използване на нов API за монтиране на дялове.
    • Подобрена е реализацията на операциите с файлове, извършвани в режим без значение за регистър на символите. Повишена е производителността посредством първоначално извършване на сравнения с оглед на регистъра и отстъпление към търсене без значение за регистъра. Решени са проблемите при монтиране на overlayfs над директории, за които е активиран режим без значение за регистъра на символите.
  • Памет и системни услуги
    • Интегрирана е поддръжка на механизма Intel FRED (Гъвкава самомасова и доставка на събития), създаден за повишаване на ефективността и надеждността при доставката на информация за нискоуровневи събития, в сравнение с използвания в момента механизъм IDT (Таблица на дескрипторите за прекъсване). Повишаването на производителността и намаляването на закъсненията се осигуряват чрез връщане на събития с процесорната инструкция IRET вместо предаване на събития през таблицата IDT. Повишената надеждност се постига благодарение на отделната обработка на постъпването на събитие в контекста на ядрото и контекста на потребителя, защита от вложено изпълнение на NMI и запазване в разширен стеков кадър на всички свързани с изключението регистри на CPU.
    • Добавена е възможност за оптимизация на достъпа до данни на отделни ядра на CPU чрез използването в кода на ядрото на именувани адресни пространства (Named Address Spaces), реализирани в GCC като разширение на GNU C.
    • В функцията pidfd_open() е добавен флаг PIDFD_THREAD, който позволява създаване на pidfd за отделни потоци, а не само използването на pidfd в контекста на лидера на групата от потоци. Също така е предложена реализация на псевдо-файлова система за достъп до pidfd чрез виртуалната файлова система. В отличие от идентификацията на процеси с помощта на pid, идентификаторът pidfd е свързан с конкретен процес и не се променя, докато PID след завършването на текущия процес може да бъде свързан с друг процес.
    • В подусистемата BPF е добавен механизъм за BPF токени, който позволява селективно делегиране на програми правата за достъп до привилегировани BPF операции. Например, може да се предостави достъп на непривилегирована програма до отделни подусистеми на BPF без предоставяне на пълни права CAP_BPF.
    • В подусистемата BPF е добавен нов тип споделена памет bpf_arena, който дефинира област, достъпна за съвместна работа на BPF програми и процеси в потребителското пространство. Добавена е инструкцията may_goto, позволяваща организирането на цикли, които могат да бъдат прекратени от верификатора. Добавена е възможност за генериране на произволни TCP SYN cookie от BPF програми и създаване на BPF обработчици за борба с SYN флуд.
    • Продължава преносът на промените от клонa Rust-for-Linux, свързани с използването на езика Rust като втори език за разработка на драйвери и модули на ядрото (поддръжката на Rust не е активирана по подразбиране и не води до включването на Rust в задължителните зависимости за компилиране на ядрото). Добавена е поддръжка за работа с езика Rust на 64-битови ARM процесори. Осъществен е преход към версия Rust 1.76. Добавен е макрос ‘container_of!’. Вместо нестабилната функционалност ‘ptr_metadata’ е внедрен стабилен метод ‘byte_sub’. Добавен е модул ‘time’ с функцията за преобразуване на време ‘msecs_to_jiffies()’.
    • В подусистемата io_uring е добавена възможността за отрязване на файлове (ftruncate_file).
    • Добавен е нов тип работни опашки WQ_BH (workqueue Bottom Halves) за асинхронно изпълнение на код в контекста на софтуерни прекъсвания, насочен към използване вместо остарелите tasklet-и.
    • Съществено е преработена подусистемата за работа с таймери, в която е подобрена логиката за избор на активно CPU ядро за изпълнение на сработилия таймер, за да не се будят неактивни ядра.
    • Реализирана е възможността за актуализиране на модела за потребление на енергия на ядрото (EM, Energy Model) по време на работа, което може да се използва, например, за отчитане на влиянието на работната температура върху енергийната ефективност на CPU. Значително е увеличена производителността на функцията em_cpu_energy(), която сега се изпълнява 1.43 пъти по-бързо в тестове на стационарна система, а в тест на платка RockPi 4B — 1.69 пъти по-бързо.
    • Добавена е поддръжка за стартиране на системи, базирани на архитектура ARM64, в режим LPA2 с 52-битово виртуално адресно пространство.
    • За системи ARM64 е реализирана поддръжка на непрекъснати записи PTE (Page Table Entry), които повишават производителността чрез увеличаване на ефективността на използването на TLB (Translation Lookaside Buffer).
    • Приети са пачове за повишаване на производителността на подсистемата за управление на паметта чрез намаляване на възможността за конкуренция в vmalloc().
    • За архитектурата LoongArch е реализиран механизъм за горещо налагане на пачове на ядрото (live patching), позволяващ прилагането на корекции към ядрото без необходимост от рестартиране.
    • За системи RISC-V е реализирана поддръжка на системен повик membarrier(), осигуряващ инсталиране на бариери за паметта за работещите в системата потоци.
    • Повишени са изискванията към версията на LLVM/Clang, която може да се използва за компилиране на ядрото. За компилация вече е необходим минимум LLVM 13.0.1 (по-рано беше възможно компилиране с LLVM 11+).
    • В механизма „User trace events“, позволяващ създаване на събития за трасировка от потребителски процеси за проследяване на активността в потребителското пространство, е добавена поддръжка за експортиране на информация за събития в различни формати (USER_EVENT_REG_MULTI_FORMAT).
    • В механизма за трасировка на повиквания на функции е добавена възможност за проследяване на състоянието на входните аргументи на функцията при трасировка на изхода от функцията. Стойностите на оператора return сега могат да се сопоставят с аргументите, използвани при повикването на функцията.
    • В утилитата perf е добавена поддръжка на режим на агрегиране на извода „cluster“ („perf stat -a —per-cluster“) за обединяване на статистиката на споделените ресурси. Реализирана е възможност за използване на библиотеката libcapstone за дизасемблиране на процесорни инструкции („perf script -F disasm“). Проведени са оптимизации на потреблението на памет при изпълнение на командите perf report и perf annotate.
  • Виртуализация и сигурност
    • Добавена е защита от уязвимостта RFDS (Регистриране на данни от файлове на регистри) в процесорите Intel Atom, която позволява извличането на остатъчна информация от регистровите файлове (RF, Register File) на процесора, използвани за съвместно съхранение на съдържанието на регистрите за всички задачи на същото ядро на CPU. За блокиране на уязвимостта е необходимо обновление на микрокода и използване на инструкциите VERW за изчистване на съдържанието на микроархитектурните буфери в момента на връщане от ядрото в пространството на потребителя. За активиране на защитата при зареждане на ядрото може да се зададе флаг „reg_file_data_sampling=on“. Информация за уязвимостта и наличието на необходимия микрочип за защита може да се оценява в файла „/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling“.
    • Добавена е базова поддръжка за защита на хостваните системи чрез разширение AMD SEV-SNP (Сигурно вложено стратиране), осигуряващо безопасна работа с вложени таблици на страници в паметта и защита от атаки „undeSErVed“ и „SEVerity“ на процесорите AMD EPYC, позволяващи заобикаляне на защитния механизъм AMD SEV (Сигурно криптирано виртуализиране). В KVM необходимите за използване на SNP промени са планирани да бъдат добавени в клон 6.10.
    • Модулите с реализация на технологиите IMA (Архитектура за измерване на целостта) и EVM (Разширен модул за проверка) са пренасочени да използват рамката LSM (Модули за сигурност на Linux), което без загуба на функционалност предоставя значително опростяване на кода, обединяване на дублиращата функционалност и активиране на достъпните чрез LSM стандартни възможности. Модулът IMA е предназначен за проверка на целостта на компонентите на операционната система по цифрови подписи и хешове. Модулът EVM позволява защита на разширените атрибути на файловете (xattrs) от атаки, насочени към нарушаване на тяхната целостност (EVM няма да позволи извършването на офлайн атака, при която злоумышленик може да промени метаданните, например, стартирайки от своя носител).
    • Системните повиквания lsm_list_modules(), lsm_get_self_attr() и lsm_set_self_attr() са преустроени за по-добра съвместимост с 32-битови среди, предназначени за извеждане на списък с натоварените LSM модули (Модули за сигурност на Linux) и получаване/задание на атрибутите на LSM модула. Промените нарушават обратната съвместимост, но тъй като новите системни повиквания бяха добавени в предишната версия на ядрото и не се използват в приложения, Линус Торвалдс счита, че промяната е допустима.
    • Предприета е опит за възстановяване на използването на механизма UBSAN (Undefined Behavior Sanitizer). Същността на проблема е, че компилаторите обработват целочислените преливания на знакови и беззнакови типове по различен начин. Знаковите преливания и преливанията на указатели попадат в категорията на неопределеното поведение, докато беззнаковите преливания се отрязват по модул 2n, като се запазват само младшите битове на резултата (“wrap-around”) и не се класифицират като неопределено поведение. За да се избегнат ситуации с възникване на неопределено поведение, ядрото се компилира с опцията “-fno-strict-overflow”, която води до използването на “wrap-around” за всички целочислени преливания. GCC и Clang не могат да диагностицират правилно някои проблеми при използването на флага “-fno-strict-overflow”, а включването на UBSAN има за цел да осигури съвместна работа с разработчиците на компилатори за премахване на възникващите фалшиви сработвания и идентифициране на целочислени преливания на места, където няма явни проверки.

      За проверка на възможните преливания в ядрото се използват конструкции от типа “var + offset PAGE_SHIFT) < pgoff){..}”), които са свързани със събиране с флага “-fno-strict-overflow” и не обхващат целия код, в който потенциално може да възникне преливане. Проблемът е, че при използването на UBSAN подобни проверки водят до издаване на много фалшиви предупреждения, и поради това през 2021 година UBSAN е трябвало да бъде деактивиран. В обновената реализация е предложеното използване на специални анотации __signed_wrap и __unsigned_wrap, както и готови макроси с проверки add_would_overflow(a, b) и add_wrap(a, b), които позволяват да се отдели предвиденото от разработчиците използване на целочислени преливания от възникването на случайни преливания, които могат да доведат до уязвимости. Предложението за по-мащабна преработка на ядрото с въвеждане на допълнителни определения на типове е отхвърлено от Линус Торвалдс.

  • Мрежова подсистема
    • В мрежовата подсистема е проведена работа за намаляване на възникването на конкурентни блокировки (“lock contention”, опит да се получи блокировка, държана от друг поток). Намалено е използването на блокировки RTNL.
    • Добавена е възможността за активиране на поддръжка на активно полингване на сокети (busy polling) в контекста на отделни повиквания на epoll. Размерът на пула и параметрите на бюджета могат да се задават независимо от системните параметри по подразбиране.
    • Реализирана е структура net_hotdata за повишаване на ефективността на кеширането на най-често използваните променливи от мрежовата конфигурация.
    • В MPTCP е добавена поддръжка за настройка на опцията TCP_NOTSENT_LOWAT за сокетите, което позволява ограничаване на размера на буфера за изпращане. В API за сокетите MCTP е добавена поддръжка на идентификатори на мрежи („network ID“), което позволява използването на няколко несъвпадащи мрежи MCTP на един хост.
    • В IPSec е добавена поддръжка за пренасочване на ICMP-съобщения с информация за грешки (RFC 4301).
    • Процесът на сканиране на маршрути с изтекло време за живот е ускорен.
    • Работата на XDP е ускорена благодарение на по-строгото избягване на разпределение на големи блокове памет.
    • Добавена е възможността за прикрепяне на метаданни към съобщенията netconsole.
    • В Netfilter е разрешено определянето от потребителското пространство на таблици, които се свързват с управляващия фонов процес и не се изтриват автоматично след приключване на потребителското приложение.
    • В nftables е ускорено добавянето на елементи в set-набори с обединени диапазони.
  • Оборудване
    • В драйвера i915 е продължена работата по реализиране на поддръжка за Intel LunarLake (Xe 2) чипове. Добавени са нови PCI идентификатори за устройства, базирани на Intel Arrow Lake и Alder Lake N чипове. За Displayport е добавена поддръжка за тунелиране (DP tunneling) и разпределение на пропускна способност (bandwidth allocation). За всички платформи е включен режим fastboot. Добавена е поддръжка на отладъчен изход, свързан с отделни устройства.
    • В драйвера AMDGPU е проведена подготовка за реализиране на поддръжка на GPU AMD RDNA3.5 и RDNA4. Добавена е поддръжка на ATHUB 4.1, LSDMA 7.0, JPEG DPG, IH 7.0, HDP 7.0, VCN 5.0, SMU 13.0.6, NBIO 7.11, SDMA 6.1, MMHUB 3.3, DCN 3.5.1, NBIF 6.3.1, VPE 6.1.1 и фреймворк RAS ACA. В модула на ядрото е добавен параметър freesync_video за активиране на експерименталната поддръжка за оптимизация на превключването между видеорежимите с помощта на технологията за адаптивна синхронизация FreeSync.
    • В драйвера Nouveau кодът за управление на екрана е преместен на използването на функцията kmemdup().
    • Продължава работата по drm-драйвера (Direct Rendering Manager) Xe за GPU, базирани на архитектурата Intel Xe, която се използва в видеокартите на Intel от серия Arc и интегрираната графика, започвайки от процесорите Tiger Lake.
    • Добавен е DRM-драйвер за чиповете Mediatek MT8188 VDOSYS1.
    • Настройките на ядрото, свързани с видеоподсистемите, са преместени в секция CONFIG_VIDEO.
    • Добавена е поддръжка за ARM64 SoC: Mediatek MT7981B (Filogic 820), MT7988A (Filogic 880), NXP i.MX8DXP, Renesas R8A779G2 (R-Car V4H ES2.0), R8A779H0 (R-Car V4M), TI J722S.
    • Добавена е поддръжка за ARM платформи и устройства: Android телефони, базирани на чипа Tegra30, модели Chromebook на базата на Mediatek MT8186, NAS, таблети и игрови конзоли на базата на Rockchips RK35xx, платки White Hawk на базата на SoC Renesas, платки на базата на Qualcomm SM8550 (Snapdragon 8 Gen 2), Apalis Evaluation Board, Sielaff i.MX6 Solo Board, Samsung Galaxy Tab 4 10.1 LTE.
    • Извършен е рефакторинг на кода на звуковата подсистема ALSA. Добавена е поддръжка за звукови системи Microchip SAM9x7, NXP i.MX95 и Qualcomm WCD939x. В драйвера SoundWire е добавена поддръжка за ASoC със звукови сопроцесори AMD ACP 6.3, а за системите на Intel е реализиран режим DSPless. Добавена е поддръжка за допълнителни звукови кодеци Cirrus HD. В драйвера virtio е подобрено управлението на звуковите устройства.
    • Добавена е поддръжка за Ethernet контролери Marvell Octeon PCI Endpoint NIC VF и Intel E825-C 100G.

Междувременно латиноамериканският Фонд за свободен софтуер е създал вариант на напълно свободното ядро 6.9 — Linux-libre 6.9-gnu, изчистено от елементи на фърмуер и драйвери, съдържащи несвободни компоненти или части от код, чиято употреба е ограничена от производителя. В изданието 6.9 е обновен кодът за почистване на блобовете в драйверите amdgpu, ath12k, adreno, btusb и r8169. Извършено е почистване на новия драйвер ptp_fc3. Извършено е почистване на имената на блобовете в dts файловете (devicetree) за архитектурата Aarch64. Отстранени са проблеми с почистването на драйвера i915, които водеха до зависване по време на инициализацията. Направени са промени, свързани с обработката на блобове, доставяни под формата на шестнадесетични дампове.

Източник: opennet.ru

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster