След две месеца разработка, Линус Торвалдс представи версия на ядрото Linux 6.2. Сред най-забележителните промени: разрешен е приемът на код под лицензия Copyleft-Next, подобрена е реализацията на RAID5/6 в Btrfs, продължава интеграцията на поддръжка за езика Rust, намалени са разходите при защита от атаки Retbleed, добавена е възможността за регулиране на потреблението на памет при обратно записване, за TCP е добавен механизъм за натоварване PLB (Protective Load Balancing), добавен е хибриден механизъм за защита на потока на изпълнение на команди (FineIBT), в BPF е добавена възможността за определяне на собствени обекти и структури от данни, включена е утилитата rv (Runtime Verification), намалено е енергопотреблението в реализацията на заключвания RCU.
В новата версия са приети 16843 корекции от 2178 разработчици, размерът на пача е 62 МБ (промените засягат 14108 файла, добавени са 730195 реда код, изтрити са 409485 реда). Около 42% от всички предложени в 6.2 промени са свързани с драйвери на устройства, около 16% от измененията са свързани с обновление на код, специфичен за хардуерни архитектури, 12% е свързано с мрежовия стек, 4% — с файловите системи и 3% с вътрешните подсистеми на ядрото.
Основните нововъведения в ядрото 6.2:
- Памет и системни услуги
- Разрешено е включването в ядрото на код и изменения, предоставяни под лицензия Copyleft-Next 0.3.1. Лицензията Copyleft-Next е създадена от един от авторите на GPLv3 и е напълно съвместима с лицензията GPLv2, което е потвърдено от юристите на компании SUSE и Red Hat. В сравнение с GPLv2, лицензията Copyleft-Next е значително по-компактна и проста за разбиране (отстранени са въвеждащи части и споменавания на остарели компромиси), определя сроковете и реда за отстраняване на нарушения, автоматично отменя изискванията за копилефт за остарели, които са над 15 години.
Copyleft-Next също съдържа клаузи за предоставяне на права върху патентовани технологии, което, в отличие от GPLv2, прави тази лицензия съвместима с лицензия Apache 2.0. За да се осигури пълна съвместимост с GPLv2, в текста на Copyleft-Next изрично е посочено, че производната работа може да бъде предоставяна не само под оригиналната лицензия Copyleft-Next, но и под лицензия GPL.
- Включена утилита «rv», предоставляющая интерфейс за взаимодействие от потребителската страна с обработчиците на подструктурата RV (Runtime Verification), предназначена за проверка на коректността на работата на системи с висока надеждност, гарантиращи отсъствие на сривове. Проверката се извършва по време на изпълнение, чрез прикрепване на обработчици към точките на трасировка, които сверяват фактическото протичане на изпълнението с предварително определена еталонна детерминирана модел на автомата, определяща очакваното поведение на системата.
- В устройството zRAM, позволяващо съхранение на своп модул в паметта в компресиран вид (в паметта се създава блочно устройство, на което се извършва свопинг със компресия), е реализирана възможност за повторно опаковане на страниците с използване на алтернативен алгоритъм, за постигане на по-високо ниво на компресия. Основната идея е да се предостави избор между няколко алгоритъма (lzo, lzo-rle, lz4, lz4hc, zstd), предлагащи свои компромиси между скорост на компресия/разкомпресия и ниво на компресия или оптимални в особени ситуации (например, за компресиране на големи паметни страници).
- Добавен е API «iommufd» за управление от потребителската страна с системата за управление на паметта за вход-изход — IOMMU (I/O Memory-Management Unit). Новият API предоставя възможност за управление на таблиците на паметта за вход-изход, използвайки файлови дескриптори.
- В BPF е предоставена възможност за създаване на типове, определяне на собствени обекти, изграждане на своя йерархия от обекти и гъвкаво формулиране на собствени структури от данни, като свързани списъци. За BPF-програмите, които преминават в режим на сън (BPF_F_SLEEPABLE), е добавена поддръжка за блокировки bpf_rcu_read_{,un}lock(). Реализирана е поддръжка за запазване на обектите task_struct. Добавен е тип карта BPF_MAP_TYPE_CGRP_STORAGE, предоставящ локално хранилище за cgroups.
- За механизма на блокировките RCU (Read-copy-update) е реализиран опционален механизъм за «лениви» callback извиквания, при който по таймер в пакетен режим се обработват накуп няколко callback извиквания. Прилагането на предложената оптимизация позволява да се намали енергопотреблението с 5-10% на устройствата Android и ChromeOS, чрез отлагане на RCU заявки по време на неактивност или ниско натоварване на системата.
- Добавен е sysctl split_lock_mitigate за управление на реакцията на системата при откриване на разделени блокировки («split lock»), които възникват при достъп до неравномерни данни в паметта, когато при изпълнение на атомарна инструкция данните пресичат две кеш линии на CPU. Тези блокировки водят до значителен спад в производителността. При задаване на split_lock_mitigate на 0 се извежда само предупреждение за наличие на проблем, а когато е зададено на 1, освен предупреждението, също така се забавя изпълнението на процеса, предизвикал блокировката, за да се запази производителността на останалата част от системата.
- За архитектурата PowerPC е предложена нова реализация на блокировките qspinlock, демонстрираща по-висока производителност и решаваща някои проблеми с блокировки, възникващи в изключителни случаи.
- Преработен е кодът за обработка на прекъсванията MSI (Message-Signaled Interrupts), в който са отстранени натрупаните архитектурни проблеми и е добавена поддръжка за свързване на отделни обработчици с различни устройства.
- За системи, базирани на архитектурата LoongArch, използвана в процесорите Loongson 3 5000 и реализираща нов RISC ISA, подобен на MIPS и RISC-V, е реализирана поддръжка за ftrace, защита на стека, спящи и чакащи режими.
- Предоставена е възможност за присвояване на имена на области от споделена анонимна памет (по-рано имената можеха да се назначават само на частна анонимна памет, привързана към конкретен процес).
- Добавен е нов параметър в командния ред на ядрото «trace_trigger», предназначен за активиране на триггер за трасировка, използван за свързване на условни команди, предизвиквани при задействане на контролна проверка (например, trace_trigger=»sched_switch.stacktrace if prev_state == 2″).
- Повишени са изискванията към версията на пакета binutils. За компилация на ядрото сега е необходим минимум binutils 2.25.
- При извикване на exec() е добавена възможността за поставяне на процеса в пространство на времето (time namespace), в което времето се различава от системното.
- Започна миграция на клон Rust-for-Linux на допълнителна функционалност, свързана с използването на Rust като втори език за разработка на драйвери и модули на ядрото. Поддръжката на Rust е неактивна по подразбиране и не води до включване на Rust сред задължителните зависимости за изграждане на ядрото. Основната функционалност, предложена в предишно издание, е разширена с възможности за поддръжка на нискоуровнев код, като тип Vec и макроси pr_debug!(), pr_cont!() и pr_alert!(), както и процедурен макрос „#[vtable]“, който опростява работата с таблици на указатели към функции. Добавянето на висококачествени Rust обвивки за подсистеми на ядрото, което ще позволи създаването на пълноценни драйвери на Rust, се очаква в следващите издания.
- Използваният тип „char“ в ядрото вече по подразбиране е обявен за беззнаков за всички архитектури.
- Обявен за остарял механизма за разпределение на памет slab — SLOB (slab allocator), който е проектиран за системи с малко количество памет. Вместо SLOB, в стандартни условия се препоръчва използването на SLUB или SLAB. За системи с малко количество памет се препоръчва да се използва SLUB в режим SLUB_TINY.
- Разрешено е включването в ядрото на код и изменения, предоставяни под лицензия Copyleft-Next 0.3.1. Лицензията Copyleft-Next е създадена от един от авторите на GPLv3 и е напълно съвместима с лицензията GPLv2, което е потвърдено от юристите на компании SUSE и Red Hat. В сравнение с GPLv2, лицензията Copyleft-Next е значително по-компактна и проста за разбиране (отстранени са въвеждащи части и споменавания на остарели компромиси), определя сроковете и реда за отстраняване на нарушения, автоматично отменя изискванията за копилефт за остарели, които са над 15 години.
- Дискова подсистема, вход/изход и файлови системи
- В Btrfs са направени подобрения, насочени към решаване на проблема с „write hole“ в реализацията на RAID 5/6 (опит за възстановяване на RAID, когато срив е настъпил по време на запис и не е възможно да се определи кой блок на кое от RAID устройствата е записан коректно, което може да доведе до разрушаване на блоковете, съответстващи на недозаписани блокове). Освен това, за SSD по възможност автоматично се активира по подразбиране асинхронното изпълнение на операцията „discard“, което осигурява по-висока производителност чрез ефективно групиране на операциите „discard“ в опашка и обработка на опашката от фонов обработчик. Повишена е производителността на операциите send и lseek, както и ioctl FIEMAP.
- Разширени са функциите за управление на отложеното записване (writeback, фоново запазване на променени данни) за блокови устройства. В някои ситуации, например при използване на мрежови блокови устройства или USB флаш памети, отложеното записване може да доведе до висока консумация на оперативна памет. За да се управлява поведението на отложеното записване и да се поддържа размерът на страницовия кеш в определени рамки в sysfs (\/sys\/class\/bdi\/), са предложени новите параметри strict_limit, min_bytes, max_bytes, min_ratio_fine и max_ratio_fine.
- В файловата система F2FS е реализирана ioctl операция за атомарна подмяна, която позволява записването на данни във файл в рамките на една атомарна операция. В F2FS също е добавен блоков кеш на екстентите, който помага за определяне на активно използваните данни или данните, до които отдавна не е имало достъп.
- В файловата система ext4 е извършено само коригиране на грешки.
- В файловата система ntfs3 са предложени няколко нови опции за монтиране: „nocase“ за управление на чувствителността към регистъра на символите в имената на файлове и директории; windows_name за забрана на създаването на имена на файлове, съдържащи символи, недопустими за ОС Windows; hide_dot_files за управление на назначаването на етикет за скрити файлове за файлове, започващи с точка.
- В файловата система Squashfs е реализирана опция за монтиране „threads=“, с помощта на която може да се определи броят на потоковете за паралелизиране на операциите по разархивиране. В Squashfs също така се появи възможност за мапване на идентификаторите на потребителите на присъединените файлови системи, което се използва за съпоставяне на файлове на определен потребител в присъединен чужд дял с друг потребител в текущата система.
- Преработена е реализацията на списъците за контрол на достъпа POSIX (POSIX ACL). В новата реализация са отстранени архитектурни проблеми, опростено е поддържането на кодовата база и са използвани по-сигурни типове данни.
- В подсистемата fscrypt, която се използва за прозрачно криптиране на файлове и директории, е добавена поддръжка на алгоритъма за криптиране SM4 (китайски стандарт GB\/T 32907-2016).
- Предоставена е възможност за компилация на ядрото без поддръжка на NFSv2 (в бъдеще се планира напълно да се прекрати поддръжката на NFSv2).
- Променена е организацията на проверката на правата за достъп до устройства NVMe. Предоставена е възможност за четене и запис на устройството NVMe, ако записващият процес има достъп до специален файл на устройството (предишно, процесът трябваше да има правото CAP_SYS_ADMIN).
- Пакетният драйвер за CD/DVD, който бе обявен за остарял през 2016 година, е премахнат.
- Виртуализация и безопасност
- Въведен е нов метод за защита от уязвимостта Retbleed в CPU Intel и AMD, използващ проследяване на дълбочината на извикванията, което не забавя работата толкова, колкото предишната защита от Retbleed. За активиране на новия режим е предложен параметърът на командния ред на ядрото „retbleed=stuff“.
- Добавен е хибриден механизъм за защита на потока на изпълнение на командите FineIBT, съчетаващ прилагането на хардуерни инструкции на Intel IBT (Indirect Branch Tracking) и софтуерна защита kCFI (kernel Control Flow Integrity) за блокиране на нарушаването на нормалния ред на изпълнение (control flow) в резултат на експлойти, които променят указателите на функции в паметта. FineIBT разрешава изпълнението по косвен преход само при преход към инструкция ENDBR, която се поставя в самото начало на функцията. Допълнително, по аналогия с механизма kCFI, след това се извършва проверка на хешове, гарантиращи непроменяемостта на указателите.
- Добавени са ограничения за блокиране на атаки, манипулиращи генерирането на състояния „oops“, след които проблемните задачи се завършват и състоянието се възстановява без спиране на работата на системата. При изключително голям брой извиквания на състоянието „oops“ възниква преливане на брояча на референциите (refcount), което позволява експлоатирането на уязвимости, причинени от разыменоване на NULL указатели. За защита от подобни атаки в ядрото е добавен лимит на максималния брой сработвания на „oops“, след чийто предел ядрото ще инициира преминаване в състояние „panic“ с последващо рестартиране, което няма да позволи достигането на необходимия брой итерации за преливане на refcount. По подразбиране лимитът е зададен на 10 хиляди „oops“, но по желание може да бъде променен чрез параметъра oops_limit.
- Добавен параметър за конфигурация LEGACY_TIOCSTI и sysctl legacy_tiocsti за деактивиране на възможността за въвеждане на данни в терминала чрез ioctl TIOCSTI, тъй като тази функционалност може да се използва за подмяна на произволни символи в буфера за вход и симулиране на потребителски вход.
- Предложен е нов тип вътрешни структури encoded_page, в който долните битове на указателя се използват за запазване на допълнителна информация, използвана за защита от случайно разименуване на указателя (при реална необходимост от разименуване, първо трябва да се изчистят тези допълнителни битове).
- На платформата ARM64, по време на зареждане, е предоставена възможност за включване и изключване на софтуерната реализация на механизма Shadow Stack, който се използва за защита от презаписване на адреса на връщане от функция в случай на преливане на буфер в стека (същността на защитата е в запазването на адреса на връщане в отделен „сенчест“ стек и извличането му преди изхода от функцията). Поддръжката на апаратна и софтуерна реализация на Shadow Stack в една версия на ядрото позволява използването на едно ядро на различни ARM системи, независимо от поддръжката на инструкции за удостоверяване на указатели. Включването на софтуерната реализация се извършва чрез подмяна на необходимите инструкции в кода по време на зареждане.
- Добавена е поддръжка за използване на механизма за асинхронно уведомление за изход (asynchronous exit notification) на процесори Intel, позволяваща идентифицирането на атаки с единична стъпка върху код, изпълняван в SGX анклави.
- Предложен е набор от операции, позволяващи на хипервизора да поддържа заявки от гостуващи системи Intel TDX (Trusted Domain Extensions).
- Премахнати са конфигурационни опции на ядрото RANDOM_TRUST_BOOTLOADER и RANDOM_TRUST_CPU, вместо които следва да се използват съответните опции на командния ред random.trust_bootloader и random.trust_cpu.
- В механизма Landlock, който позволява ограничаване на взаимодействието на група процеси с външната среда, е добавена поддръжка на флага LANDLOCK_ACCESS_FS_TRUNCATE, даващ възможност за контрол на изпълнението на операции за съкращаване на файлове.
- Мрежовата подсистема
- Добавена поддръжка на PLB (Protective Load Balancing) за IPv6, механизъм за балансиране на натоварването между мрежовите връзки, който цели да намали точките на пренатоварване на комутаторите в датацентровете. Чрез промяна на IPv6 Flow Label, PLB случайно променя маршрутите на пакетите за равномерно разпределение на натоварването по портовете на комутатора. За да се намали пренареждането на пакетите, операцията се извършва, когато е възможно, след периоди на простои. Използването на PLB в датацентровете на Google е довело до намаляване на дисбаланса в натоварването на портовете на комутаторите с около 60%, намаляване на загубата на пакети с 33% и намаляване на закъсненията с 20%.
- Добавен е драйвер за устройства MediaTek с поддръжка на Wi-Fi 7 (802.11be).
- Добавена е поддръжка на 800-гигабитни връзки.
- Добавена е възможност за преименуване на мрежовите интерфейси в реално време, без спиране на работата.
- В логовите съобщения за SYN-флуд е добавено споменаване на IP адреса, на който е получен пакета.
- За UDP е реализирана възможност за използване на отделни хеш-таблици за различни мрежови пространства.
- За мрежови мостове е реализирана поддръжка на метода за удостоверяване MAB (MAC Authentication Bypass).
- За протокола CAN (CAN_RAW) е реализирана поддръжка на режим на сокети SO_MARK за прилагане на филтри за трафик на база fwmark.
- В ipset е реализирана нова опция bitmask, позволяваща задаване на маска на основата на произволни битове в IP адреса (например, 'ipset create set1 hash:ip bitmask 255.128.255.0').
- В nf_tables е добавена поддръжка за обработка на вътрешни (inner) заглавия, идващи в тунелираните пакети.
- Оборудване
- Добавена е подсистема 'accel' с реализация на фреймворк за ускорители на изчисления, които могат да бъдат предоставени както в форма на отделни ASIC, така и под формата на IP блокове в SoC и GPU. По своята същност, тези ускорители са насочени към ускоряване на решаването на задачи за машинно обучение.
- В драйвера amdgpu е включена поддръжка на IP компонентите GC, PSP, SMU и NBIO. За ARM64 системи е реализирана поддръжка на DCN (Display Core Next). Реализацията на защитеното извеждане на екран е прехвърлена от DCN10 на DCN21 и сега може да се използва при свързване на множество екрани.
- В драйвера i915 (Intel) е стабилизирана поддръжката на дискретни видеокарти Intel Arc (DG2/Alchemist).
- В драйвера Nouveau е реализирана поддръжка на GPU NVIDIA GA102 (RTX 30) на базата на архитектурата Ampere. За картите nva3 (GT215) е добавена възможност за управление на фоновата подсветка.
- Добавена поддръжка на безжични адаптери на базата на чипове Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) и MediaTek MT7996, Bluetooth интерфейси Broadcom BCM4377/4378/4387, а също и Ethernet контролери Motorcomm yt8521, NVIDIA Tegra GE.
- Добавена поддръжка на ASoC (ALSA System on Chip) за вградени звукови чипове HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Добавена е поддръжка за звуковия интерфейс Focusrite Saffire Pro 40. Добавен е звуковият кодек Realtek RT1318.
- Добавена поддръжка на смартфони и таблети Sony (Xperia 10 IV, 5 IV, X и X compact), OnePlus One, 3, 3T и Nord N100, Xiaomi Poco F1 и Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
- Добавена поддръжка на ARM SoC и платки Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695), SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.
В същото време, Латинска Америка Фонд за свободен софтуер разработи версия на напълно свободното ядро 6.2 — Linux-libre 6.2-gnu, отстранена от елементите на фърмуера и драйверите, които съдържат несвободни компоненти или участъци от код, чиято употреба е ограничена от производителя. В новото издание са предприети действия за почистване на нови блобове в драйвера nouveau. Изключена е зареждането на блобове в драйверите mt7622, mt7996 wifi и bcm4377 bluetooth. Извършено е почистване на имената на блобове в dts файловете за архитектура Aarch64. Обновен е кодът за почистване на блобове в различни драйвери и подсистеми. Прекратено е почистването на драйвера s5k4ecgx, тъй като той е изтрит от ядрото.
Източник: opennet.ru
