Реліз ядра Linux 6.2

Після двох місяців розробки Лінус Торвальдс подав реліз ядра 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. Доданий map-тип 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.
  • Дискова підсистема, введення/виведення та файлові системи
    • В 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-системах, незалежно від підтримки в них інструкцій для автентифікації покажчиків. Увімкнення програмної реалізації здійснюється через заміну під час завантаження необхідних інструкцій у коді.
    • Додано підтримку використання на процесорах Intel механізму асинхронного повідомлення про вихід (asynchronous exit notification), що дозволяє виявляти single-step атаки на код, що виконується в анклавах SGX.
    • Запропоновано набір операцій, що дозволяють гіпервізору підтримувати запити із гостьових систем Intel TDX (Trusted Domain Extensions).
    • Видалено складальні налаштування ядра RANDOM_TRUST_BOOTLOADER та RANDOM_TRUST_CPU, замість яких слід використовувати відповідні опції командного рядка random.trust_bootloader та random.trust_cpu.
    • У механізм Landlock, що дозволяє обмежити взаємодію групи процесів із зовнішнім оточенням, додано підтримку прапора LANDLOCK_ACCESS_FS_TRUNCATE, що дозволяє контролювати виконання операцій усічення файлів.
  • Мережева підсистема
    • Для IPv6 додано підтримку PLB (Protective Load Balancing), механізму балансування навантаження між мережевими лінками, націленого на скорочення точок навантаження на комутаторах датацентрів. Через зміну IPv6 Flow Label, PLB випадково змінює шляхи пакетів для вирівнювання навантаження на портах комутатора. Для зниження переупорядкування пакетів дана операція по можливості проводиться після періодів простою (idle). Застосування 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, а також Ether.
    • Додано підтримку ASoC (ALSA System on Chip) для вбудованих звукових чіпів HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14, i.MX2022, Armada 93x, RK38. Додано підтримку звукового інтерфейсу Focusrite Saffire Pro 3588. Додано звуковий кодек Realtek RT40.
    • Додано підтримку смартфонів і планшетів 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, Odro

Одночасно латиноамериканський Фонд вільного програмного забезпечення сформував варіант повністю вільного ядра 6.2 — Linux-libre 6.2-gnu, очищеного від елементів прошивок та драйверів, що містять невільні компоненти або ділянки коду, сфера застосування яких обмежена виробником. У новому випуску проведено чищення нових блобів у драйвері nouveau. Відключено завантаження блобів у драйверах mt7622, ​​mt7996 wifi та bcm4377 bluetooth. Проведено чищення імен блобів у dts-файлах для архітектури Aarch64. Оновлено код чищення блобів у різних драйверах та підсистемах. Припинено чищення драйвера s5k4ecgx, оскільки його було видалено з ядра.

Джерело: opennet.ru

Додати коментар або відгук