Реліз ядра Linux 7.2

Після двох місяців розробки Лінус Торвальдс представив реліз ядра Linux 7.2. Серед найбільш помітних змін: механізм потокової передачі даних USB4STREAM, оптимізації продуктивності btrfs, xfs та ext4, продовження видалення коду для підтримки CPU i486, можливість створення вкладених планувальників SCHED_EXT, знижено споживання пам'яті в підсистемі підкачки, прискорені неіменовані канали, підтримка розширень AppleTalk, початкова підтримка HDMI 2.1 FRL у драйвері AMDGPU.

Основні нововведення в ядрі 7.2 (1, 2, 3):

  • Дискова підсистема, введення/виведення та файлові системи
    • У механізмі iomap прибрано зайвий виклик функції memset для вже завершених ітерацій функції iomap_iter(), що при високій інтенсивності введення/виведення на швидких накопичувачах NVMe підвищило в проведених тестах кількість операцій введення/виведення в секунду (IOPS) на 5% при використанні ФС ext4 і xf.
    • У XFS оголошена стабільною підтримка зонованих пристроїв зберігання (розподіл на зони груп блоків або секторів, в які допускається лише послідовне додавання даних з оновленням цілої групи блоків).
    • У Btrfs включена за замовчуванням підтримка великих фоліантів сторінок пам'яті (large folios), що дозволяє знизити накладні витрати та підвищити продуктивність за інтенсивного послідовного введення/виведення. Додано експериментальну підтримку величезних фоліантів («huge folios»), розміром до 2 МБ. Додано новий ioctl GET_CSUMS для отримання інформації про контрольні суми в користувальницькому просторі, наприклад, для утиліти mkfs та оптимізації дедуплікації. Підвищена продуктивність послідовного запису даних на 15% та прямого введення/виводу на 59%.
    • У ФС Ext4 значно перероблено реалізацію механізму «fast commit» для виключення виникнення конкуруючих та взаємних блокувань. Додано експорт статистики про снапшоти inode через /proc/fs/ext4/*/fc_info. Оптимізовано продуктивність обчислення хешів директорій (для імен розміром 255 символів прискорення майже вдвічі, 64 символи 27%, 32 символи — 11%).
    • У F2FS додана підтримка повернення помилок fserror, що дозволяють з простору користувача відстежувати проблеми з ФС. Скорочено час, що проводиться в контексті обробки переривань.
    • У Device Mapper (DM) доданий новий обробник dm-inlinecrypt для організації прозорого шифрування та розшифрування блокових пристроїв, використовуючи апаратні пристрої з функцією inline-шифрування.
    • Запропоновано документацію щодо додавання в ядро ​​нових файлових систем.
    • У NFS розмір блоку за замовчуванням збільшено до 4 МБ на системах, що мають щонайменше 16 ГБ ОЗУ (для ручної зміни розміру блоку можна використовувати /proc/fs/nfsd/max_block_size). Додано підтримку делегування управління директорією клієнту (directory delegation), що дозволяє певний час виконувати операції з даною директорією без перевірки зміни стану на сервері.
    • У сервері SMB додано підтримку файлів, що зберігаються в стислому вигляді, а також стиснення даних при їх передачі по мережі.
    • У новій реалізації NTFS (ntfsplus) додано підтримку символічних посилань Windows та забезпечено коректне опрацювання багатьох видів ушкоджень метаданих.
    • Видалено бекенд fscache для кешування даних ФС EROFS (Enhanced Read-Only File System), який був оголошений застарілим два роки тому.
    • У ФС Ceph додано підтримку ручного скидання клієнтських сеансів.
    • У файлову систему 9P внесено оптимізацію, яка прискорила роботу в таких сценаріях, як складання проектів.
    • До системного виклику file_getattr() додані прапори для отримання інформації про облік регістру символів у файловій системі. Прапор FS_XFLAG_CASEFOLD свідчить, що перевірка імен файлів здійснюється без урахування регістру символів, а прапор FS_XFLAG_CASENONPRESERVING про те, що під час створення нових імен файлів не зберігається інформація про регістр символів. Зазначені прапори можуть застосовуватись у NFS-клієнтах, які працюють без урахування регістру символів.
    • У системний виклик openat2() доданий прапор O_EMPTYPATH, який дозволяє передачу порожнього файлового шляху. У цьому випадку шлях до файлу, що відкривається, визначається на підставі переданого файлового дескриптора.
    • У системний виклик openat2() додано прапор OPENAT2_REGULAR, що допускає відкриття лише звичайних файлів (при спробі відкриття спеціального файлу, наприклад, сокету, каналу або пристрою, буде повернена помилка EFTYPE).
  • Пам'ять та системні сервіси
    • Реалізовано механізм USB4STREAM для потокової передачі між комп'ютерами, з'єднаними кабелем через порти USB4. Додано пристрій /dev/tbstreamX, за допомогою якого можна читати та записувати дані, використовуючи штатні функції read() та write() за аналогією з читанням та записом у файли. Наприклад, на одному хості можна надіслати інформацію командою "echo hello > /dev/tbstream0", а на іншому прочитати командою "cat /dev/tbstream0". Механізм USB4STREAM може поєднуватися з можливістю встановлення мережевого з'єднання по кабелю USB4 (thunderbolt_net) або використовуватися окремо за необхідності передачі даних між програмами, що не підтримують мережеві сокети.
    • Включено другу серію змін для припинення підтримки процесорів i486. Видалено більше 13 рядків коду, пов'язаних з емуляцією блоку для обчислень з плаваючою комою для процесорів без FPU. Видалена підтримка процесорів i486 без апаратних операцій CX8 (порівняти та обміняти 8 байт) та TSC (лічильник циклів CPU, що використовується в планувальнику завдань), код для емуляції яких вилучений.
    • Оголошена підтримка процесорів AMD Geode, що використовуються в комп'ютері OLPC XO-1, що залишилася без супроводу (orphaned).
    • Додано підтримку оновлення реалізації механізму Intel TDX (Trusted Domain Extensions), що використовується для шифрування оперативної пам'яті гостьових систем. TDX реалізований у формі спеціального програмного runtime-модуля, який під час початкового завантаження переноситься BIOS із Flash-пам'яті до оперативної пам'яті. У ядро ​​додані можливості для керування цим модулем та заміни на нову версію на працюючій системі без необхідності виконання перезавантаження.
    • Реалізовано новий планувальник розподілу ресурсів GPU (Fair GPU scheduler), застосовуваний визначення порядку виконання на GPU робіт, що відправляються процесами, що використовують GPU. Замість застосування традиційної FIDO-черги запитів до GPU у новому планувальнику задіяні механізми справедливого розподілу ресурсів, реалізовані з огляду на планувальник задач CFS (Completely Fair Scheduler), який застосовує план запуску з часом переходу до виконання чергового процесу. Найбільш помітний ефект від використання нового планувальника спостерігається при паралельному виконанні інтерактивних завдань, які активно працюють з GPU. В останній момент перед релізом ядра 7.2 включення Fair GPU scheduler було скасовано і було повернено старий FIFO-планувальник через необхідність налагодження регресії, що призводить до зниження продуктивності та 100% навантаження на GPU під час запуску окремих ігор у Proton.
    • Зміни у підсистемі eBPF: Додано можливість прикріплення однієї BPF-програми кільком точкам трасування (tracepoint). BPF-програми, прив'язані до точок трасування, додано можливість доступу до пам'яті компонентів, що працюють в користувальницькому просторі, з коректною обробкою звернення до невиділених сторінок пам'яті (page fault). У системний виклик bpf() додано підтримку типових атрибутів (log_buf, log_size, log_level і log_true_size), яка дозволяє уніфікувати передачу метаданих у всіх командах BPF, не обмежуючись командами BPF_PROG_LOAD, BPF_BTF_LOAD і BPF. Прибрано обмеження на передачу не більше 5 параметрів функції BPF. Додана можливість безпечного доступу до пам'яті bpf_arena, що розділяється, без побоювання звернення до невиділених сторінок пам'яті (page fault). Реалізовано новий варіант структури BPF hash map, що дозволяє динамічну зміну розміру.
    • Оптимізовано формування виведення «/proc/interrupts» зі статистикою переривань, а також модернізовано структури для зберігання лічильників переривань та додано кешування.
    • Прискорено генерацію файлу /proc/filesystems, що використовується в libselinux.
    • У планувальнику завдань реалізована підтримка балансування навантаження між ядрами CPU, що враховує стан внутрішнього кешу процесора. Планувальник тепер намагається групувати процеси, що використовують загальні ресурси, наприклад, потоки одного процесу, для їх використання в контексті одного і того ж кешу верхнього рівня, що підвищує ефективність звернення до даних за рахунок підвищення ймовірності знаходження кешу необхідних даних.
    • У механізмі SCHED_EXT, що дозволяє використовувати BPF для створення планувальників CPU, продовжена реалізація можливості створення вкладених планувальників (sub-scheduler), за допомогою яких для кожного cgroup можна задіяти власний планувальник завдань.
    • Продовжено перенесення змін з гілки Rust-for-Linux, пов'язаних з використанням мови Rust як другої мови для розробки драйверів та модулів ядра (підтримка Rust не активна за замовчуванням, і не призводить до включення Rust до обов'язкових складальних залежностей до ядра). Можливість використання Rust у ядрі реалізована для архітектури s390. До складу включено пакет "zerocopy" зі швидкими примітивами роботи з пам'яттю для коду в режимі "unsafe".
    • Мінімальна версія інструментарію LLVM, необхідна для збирання ядра, підвищена до 17.0.1.
    • У мінімалістичній Сі-бібліотеці nolibc, яка постачається у складі вихідних текстів ядра Linux та надає обв'язку над базовими системними викликами, реалізовано підтримку архітектур OpenRISC та 32-bit PA-RISC.
    • У підсистему підкачки (swap) внесені оптимізації, що підвищують продуктивність і знижують споживання пам'яті в самій підсистемі за рахунок виключення накладних витрат при зберіганні статичних метаданих та уніфікації роботи з анонімною пам'яттю і під час використання фоліантів. Зниження споживання пам'яті досить суттєво, наприклад, при монтуванні розділу підкачування розміром 1 ТБ спостерігається зниження споживання пам'яті приблизно 512 МБ.
    • Підвищена ефективність механізму витіснення пам'яті, що видаляє чи переносить розділ підкачки області пам'яті для вивільнення пам'яті за її нестачі у системі. У деяких видах навантаження, наприклад при тестуванні MongoDB за допомогою YCSB (Yahoo! Cloud Serving Benchmark), спостерігається приріст продуктивності до 30%.
    • До збірної системи додано команду «make sbom» для генерації списків SBOM (Software Bill Of Materials), що відображають задіяні в поточному складанні ядра компоненти, бібліотеки та залежності, а також інформацію про їх ліцензії, отриману із заголовків SPDX у файлах з кодом.
    • У реалізації неіменованих каналів (pipe) проведено оптимізацію роботи з блокуваннями (операції виділення пам'яті винесено за область дії блокування), що на 21-48% підвищило пропускну спроможність неіменованих каналів і на 17-33% знизило затримки.
  • Віртуалізація та безпека
    • У механізм розподілу пам'яті slab (slab allocator) додано можливість використання токенів виділення пам'яті (Allocation Token), реалізованих у компіляторі Clang 22. Токени дозволяють маркувати унікальними ідентифікаторами операції виділення пам'яті та організувати роздільне розміщення різних типів об'єктів для ускладнення експлуатації вразливостей не так просто використовуватиме пошкодження інших типів об'єктів).
    • Механізм AF_ALG, що експлуатується у вразливості Copy Fail для модифікації даних у сторінковому кеші, оголошений застарілим та наміченим для видалення в одному з майбутніх випусків. AF_ALG дозволяє використовувати апаратні прискорювачі для криптографічних обчислень в Crypto API ядра, але застосовується в досить специфічних ситуаціях. У ядрі 7.2 в AF_ALG видалена підтримка асинхронного вводу/виводу, старих драйверів та механізму zero-copy у реалізації skcipher та aead. Залишено лише програмні реалізації криптоалгоритмів, а підтримка апаратних криптоприскорювачів у crypto API ядра видалена, оскільки AF_ALG істотно розширює поверхню атаки, але не дає виграшу у продуктивності, порівняно з реалізацією криптографії в просторі користувача. AF_ALG використовувався в інструментарі Cryptsetup, але його підтримка була видалена в недавньому випуску 2.8.7.
    • У механізм IMA (Integrity Measurement Architecture), що дозволяє зовнішньому сервісу верифікувати стан підсистем ядра для того щоб переконатися в їхній справжності, додана підтримка експорту внутрішніх таблиць з результатами вимірювань в простір користувача з видаленням з буферів ядра для економії пам'яті.
    • У модуль Landlock, що надає непривілейованим програмам кошти обмеження використання об'єктів ядра Linux (ієрархії файлів, мережеві сокети, ioctl тощо), додано підтримку управління доступом до UDP-сокетів, а також можливість вибіркового відключення виведення в лог відомостей про блокування об'єктів для запобігання захаращенню лога несуттєвою інформацією.
    • Ядро позбавлене використання функції strncpy(), що копіює задане число байт з вхідного рядка. Застосування strncpy() створювало небезпеку виникнення помилок через пропуск нульового символу в кінці рядка або додаткове заповнення нулями. Замість strncpy() рекомендовано використовувати функції strscpy() та strscpy_pad() для копіювання рядків, що завершуються нульовим символом, а також strtomem_pad(), memcpy_and_pad() та memcpy() для копіювання рядків відомого фіксованого розміру. Робота з позбавлення ядра використання strncpy() розпочато 2020 року і зажадала прийняття 362 змін від 70 розробників.
    • У гіпервізор KVM додано підтримку розширень Intel MBEC (Mode-Based Execution Control) та AMD GMET (Guest-Mode Execution Trap), що дозволяють в таблицях трансляції пам'яті окремо обробляти права виконання коду для ядра і простору користувача в гостьових системах. Раніше розширення апаратної віртуалізації Intel та AMD дозволяли позначити сторінки пам'яті доступними для виконання лише одним бітом із програмним поділом прав для ядра та простору користувача на рівні гіпервізора. Використання MBEC та GMET дає можливість виключити перевірки повноважень на стороні гіпервізора та значно скоротити інтенсивність ресурсомісткої передачі керування від гостьової системи до гіпервізора VMexit.
  • Мережева підсистема
    • Реалізація розширення TCP-AO (TCP Authentication Option, RFC 5925) переведено використання нової криптографічної бібліотеки libcrypto, що дозволило спростити код і підвищити ефективність роботи. TCP-AO дає можливість верифікувати TCP-заголовки за MAC-кодами (Message Authentication Code), використовуючи більш сучасні алгоритми HMAC-SHA-1-96 та AES-128-CMAC-96 замість раніше доступної опції TCP-MD5 на базі застарілого алгоритму MD5.
    • Число субпотоків, що підтримуються для з'єднань Multipath TCP (MPTCP), збільшено з 8 до 64.
    • Продовжено роботу зі скорочення використання в мережевому стеку ядра глобального блокування rtnl_lock.
    • З ядра видалено реалізацію стека протоколів AppleTalk, який використовувався в комп'ютерах Apple з 1985 року і в 1990-і роки був замінений на TCP/IP. Крім цього видалені компоненти технології передач даних ATM, не пов'язані з PPPoATM, а також мережні інтерфейси ARCnet на базі шин ISA і PCMCIA, Bluetooth-адаптери з інтерфейсом PCMCIA, TLS-прискорювачі Chelsea, код для інтеграції TLS з sockmap та підтримка діапазонів частот 5/10 Hz cfg80211/mac80211. Через наявність нерозв'язних проблем із блокуваннями та відсутності супроводжуючих видалено специфічну реалізацію прискорення обробки TLS на базі TCP Offload Engine (більш поширена реалізація TLS offload збережена). Вимкнено та заплановано для видалення код сумісності з 32-розрядними x_tables на 64-розрядних системах.
    • У драйвер pppoe додано підтримку механізмів GRO (Generic Receive Offload) та GSO (Generic Segmentation Offload) для апаратного прискорення перескладання та сегментації пакетів. Використання GRO та GSO дозволяє суттєво підвищити пропускну здатність для вхідного трафіку, наприклад, на пристроях MediaTek MT7621 у конфігурації з транслятором адрес максимальна пропускна здатність підвищилася з 130 Mbit/s до 630 Mbit/s.
  • Обладнання
    • У драйвері AMDGPU з'явилася початкова підтримка технології HDMI 2.1 FRL (Fixed Rate Link), що дозволяє передавати стиснуті відео з якістю 4K/120Hz та 8K/60Hz. Раніше підтримку HDMI 2.1 довгий час не вдавалося реалізувати у відкритих драйверах через ліцензійні вимоги HDMI Forum, але зараз AMD вдалося погодити подібну реалізацію.
    • До драйвера i915 додано підтримку налаштування відображення дисплейним контролером фонового кольору. Реалізовано параметр pin_params.needs_low_address.
    • Продовжено роботу над drm-драйвером (Direct Rendering Manager) Xe для GPU на базі архітектури Intel Xe, яка використовується у відеокартах Intel сімейства Arc та інтегрованої графіки, починаючи з процесорів Tiger Lake. Додано початкову підтримку платформи CRI (Crescent Island). Для dGPU-платформ Xe3p реалізовано системний контролер.
    • У драйвері Nouveau вирішено проблеми з GPU NVIDIA GA100.
    • У драйвер v3d додано можливість керування енергоспоживанням v3D GPU на платах Raspberry Pi.
    • Продовжено інтеграцію компонентів драйвера Nova для GPU NVIDIA, оснащених GSP-прошивками, що використовуються починаючи з серії NVIDIA GeForce RTX 2000 на базі мікроархітектури Turing. Драйвер написано мовою Rust. Додана підтримка GPU NVIDIA GA100 та серій Hopper та Blackwell.
    • Додана підтримка ARM-плат, SoC та пристроїв: Apple t8122 (M3), Motorola Edge 30, Nothing Phone 3a, Pixel 3a XL, Qualcomm Dragonwing IPQ9650, Huawei Hawi, ZTE zx297520v3, Renesas R-Car M3, Renesas R-Car M3 NXP i.MX6/8/9, NXP LX2160A, TI K27 AM62x.

Одночасно латиноамериканський Фонд вільного програмного забезпечення сформував варіант повністю вільного ядра 7.2 — Linux-libre 7.2-gnu, очищеного від елементів прошивок та драйверів, що містять невільні компоненти або ділянки коду, сфера застосування яких обмежена виробником. У випуску 7.2 проведено чищення від блобів нових драйверів rt722-sdca та tac5xx2. Оновлено код чищення в драйверах amdgpu, nova core, qcom iris, q6v5, iwlwifi, amdxnda, adreno, r8152 та mt792x. Проведено коригування інтерфейсів для завантаження прошивок. Чищення імен blob-ів в dts-файлах (devicetree) для ARM-чіпів.

Джерело: opennet.ru

Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери 🔥 Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери | ProHoster