След две месеца разработка, Линус Торвалдс представи версия на ядрото 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 (virtual data optimizer), позволяващ на базата на съществуващи блокови устройства да се реализира виртуално блоково устройство с възможности като дублиране на повтарящи се данни, компресиране на данни, изключване на празни блокове и увеличаване на размера на блоковото устройство при необходимост (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 за проверка и коригиране на идентифицираните проблеми в online режим, без демонтиране на файловата система.
- В системния повик 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 флуда.
- Продължава пренасянето на промените от клон 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 (Register File Data Sampling) в процесорите Intel Atom, позволяваща извличането на остатъчна информация от регистровите файлове (RF, Register File) на процесора, които се използват за съвместно съхранение на съдържанието на регистрите за всички задачи на същото ядро на CPU. За блокиране на уязвимостта е необходимо обновление на микрокода и използване на инструкцията VERW за изчистване на съдържанието на микроархитектурните буфери в момента на връщане от ядрото в пространството на потребителя. За активиране на защитата при стартиране на ядрото може да се зададе флагът 'reg_file_data_sampling=on'. Информацията за подвержеността на уязвимостта и наличието на необходимия микрокод за защита може да се оцени в файла '/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling'.
- Добавена основна поддръжка на защитата на гост системи чрез разширението AMD SEV-SNP (Secure Nested Paging), осигуряващо безопасна работа с вложени таблици за страниците на паметта и защитата от атаките 'undeSErVed' и 'SEVerity' върху процесорите AMD EPYC, които позволяват заобикаляне на механизма за защита AMD SEV (Secure Encrypted Virtualization). В KVM необходимите за ползване на SNP промени са планирани да бъдат добавени в клон 6.10.
- Модулите с реализация на технологиите IMA (Integrity Measurement Architecture) и EVM (Extended Verification Module) са преобразувани за използване на фреймуорка LSM (Linux Security Modules), което без загуба на функционалност позволява значително опростяване на кода, обединяване на дублиращи се функционалности и използване на наличните чрез LSM стандартни възможности. Модулът IMA е предназначен за проверка на целостта на компонентите на операционната система по цифрови подписи и хеш. Модулът EVM позволява защитата на разширените атрибути на файловете (xattrs) от атаки, насочени към нарушаване на тяхната целостта (EVM няма да позволи да се извърши офлайн атака, при която нападателят може да промени метаданните, например, зареждайки от свое устройство).
- Преобразувани за по-голяма съвместимост с 32-битни среди, системните повиквания lsm_list_modules(), lsm_get_self_attr() и lsm_set_self_attr(), предназначени за извеждане на списъка с натоварени LSM модули (Linux Security Modules) и получаване/установяване на атрибутите на 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 е ускорено добавянето на елементи в набори с комбинирани диапазони.
- Оборудване
- В драйвера 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
