Реліз ядра 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 (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 (Flexible Return and Event Delivery), створеного для підвищення ефективності та надійності доставки інформації про низькорівневі події, порівняно з механізмом IDT (Interrupt Descriptor Table), що застосовується нині. Підвищення продуктивності та скорочення затримок забезпечується завдяки поверненню подій процесорною інструкцією 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, що дозволяє організувати роботу циклів, які можуть бути перервані верифікатором. Додано можливість генерації з BPF-програм довільних TCP SYN cookie та створення 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 SEVSec. У KVM необхідні для використання SNP зміни плануються додати у гілці 6.10.
    • Модулі з реалізацією технологій IMA (Integrity Measurement Architecture) і ЕVM (Extended Verification Module) переведені на використання фреймворку LSM (Linux Security Modules), що без втрати функціональності дозволило помітно спростити код, об'єднати функціональність, що дублюється, і задіяти доступні через LSM тип. Модуль IMA призначений для перевірки цілісності компонентів операційної системи за цифровими підписами та хешами. Модуль EVM дозволяє захистити розширені атрибути файлів (xattrs) від атак, спрямованих на порушення їхньої цілісності (EVM не дозволить здійснити offline-атаку, при якій зловмисник може змінити метадані, наприклад, завантажившись зі свого накопичувача).
    • Перероблені для більшої сумісності з 32-розрядними оточеннями системні виклики lsm_list_modules(), lsm_get_self_attr() та lsm_set_self_attr(), призначені для виведення списку завантажених LSM-модулів (Linux Security Modules) та отримання/виставлення атрибутів. Зміна порушує зворотну сумісність, але оскільки нові системні виклики були додані в минулому випуску ядра і доки не використовуються в додатках, Лінус Торвальдс вважав, що зміна допустима.
    • Зроблено спробу відновлення використання механізму UBSAN (Undefined Behavior Sanitizer). Суть проблеми в тому, що компілятори по-різному обробляють цілочисленні переповнення знакових та беззнакових типів. Знакові переповнення та переповнення покажчиків відносяться до категорії невизначеної поведінки, а беззнакові переповнення відсікаються за модулем 2n із збереженням лише молодших бітів результату («wrap-around») і не підпадають під невизначену поведінку. Щоб виключити ситуацію з виникненням невизначеної поведінки, ядро ​​збирається з опцією «-fno-strict-overflow», яка призводить до використання «wrap-around» для всіх цілих переповнень. GCC і Clang не можуть нормально діагностувати деякі проблеми при використанні прапора "-fno-strict-overflow" і включення UBSAN націлене на проведення спільної з розробниками компіляторів роботи з усунення хибних спрацювань, що виникають, і виявлення цілочисельних переповнень у місцях, в яких відсутні явні перевірки.

      Для перевірки можливих переповнень в ядрі використовуються конструкції виду "var + offset < var" (наприклад, "if (pgoff + (size > 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. 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)
    • Додано підтримку ARM-плат і пристроїв: Android-телефони на базі чіпа Tegra30, моделі Chromebook на базі Mediatek MT8186, NAS, планшети та ігрові консолі на базі Rockchips RK35xx, плати White Hawk на базі SoC Renesas, плати на базі Qualcomm SM8550 Gen 8), Apalis Evaluation Board, Sielaff i.MX2 Solo Board, Samsung Galaxy Tab 6 4 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

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