Реліз ядра Linux 5.15

Після двох місяців розробки Лінус Торвальдс презентував реліз ядра Linux 5.15. Серед найбільш помітних змін: новий драйвер NTFS з підтримкою запису, модуль ksmbd з реалізацією SMB-сервера, підсистема DAMON для моніторингу доступу до пам'яті, примітиви блокувань для режиму реального часу, підтримка fs-verity у Btrfs, системний виклик process_mrelease для систем реагування пам'яті, модуль дистанційної атестації dm-ima.

У нову версію прийнято 13499 виправлень від 1888 розробників, розмір патчу - 42 МБ (зміни торкнулися 10895 файлів, додано 632522 рядків коду, видалено 299966 рядків). Близько 45% всіх представлених у 5.15 змін пов'язані з драйверами пристроїв, приблизно 14% змін стосуються оновлення коду, специфічного для апаратних архітектур, 14% пов'язано з мережевим стеком, 6% — з файловими системами і 3% з внутрішніми підсистемами ядра.

Основні нововведення:

  • Дискова підсистема, введення/виведення та файлові системи
    • У ядро ​​прийнято нову реалізацію файлової системи NTFS, відкриту компанією Paragon Software. Новий драйвер може працювати в режимі запису та підтримує всі можливості актуальної версії NTFS 3.1, включаючи розширені атрибути файлів, списки доступу (ACL), режим стиснення даних, ефективну роботу з порожнечами у файлах (sparse) та відтворення змін із журналу для відновлення цілісності після збоїв .
    • У файловій системі Btrfs реалізована підтримка механізму fs-verity, що застосовується для прозорого контролю цілісності та справжності окремих файлів за асоційованими з файлами криптографічних хеш або ключів, що зберігаються в області метаданих. Раніше fs-verity був доступний лише для ФС Ext4 та F2fs.

      В Btrfs також додана підтримка мапінг ідентифікаторів користувачів для змонтованих файлових систем (раніше підтримувався для ФС FAT, ext4 і XFS). Вказана можливість дозволяє зіставити файли певного користувача на чужому розділі з іншим користувачем в поточній системі.

      Серед інших змін у Btrfs: прискорення додавання ключів до індексу каталогу для підвищення продуктивності створення файлів; можливість роботи raid0 з одним пристроєм, а raid10 з двома (наприклад, у процесі переконфігурування масиву); опція "rescue = ibadroots" для ігнорування некоректного дерева екстентів; прискорення операції "send"; зниження конфліктів блокувань під час операцій перейменування; можливість використання секторів 4K на системах із розміром сторінки пам'яті 64K.

    • У XFS стабілізовано можливість використання у ФС дат після 2038 року. Реалізовано механізм відкладеної деактивації inode та підтримка відкладеної установки та видалення атрибутів файлів. З метою виключення проблем прибрано можливість відключення дискових квот для вже примонтованих розділів (примусово квоти можна відключити, але пов'язаний з ними підрахунок буде продовжений, тому для повноцінного відключення потрібно перемонтування).
    • У EXT4 проведена робота зі збільшення продуктивності запису delalloc-буферів та обробки осиротілих (orphan) файлів, що продовжують існувати через те, що вони залишаються відкритими, але опинилися без прив'язки до директорії. Обробка операцій discard винесена з jbd2-потоку kthread для виключення блокувань операцій з метаданими.
    • У F2FS додано опцію "discard_unit=block|segment|section" для прив'язки операцій discard (позначка звільнених блоків, які вже можна не зберігати фізично) до вирівнювання щодо блоку, сектора, сегмента або секції. Додано підтримку відстеження зміни затримок під час введення/виведення.
    • У файловій системі EROFS (Extendable Read-Only File System) додана підтримка прямого вводу/виводу для файлів, збережених без стиснення, а також підтримка fiemap.
    • В OverlayFS реалізована коректна обробка прапорів монтування "immutable", "append-only", "sync" та "noatime".
    • У NFS покращено обробку ситуацій, коли NFS-сервер перестав відповідати на запити. Додана можливість монтування з сервера, що вже використовується, але доступного через іншу мережеву адресу.
    • Почалася підготовка до переписування підсистеми FSCACHE.
    • Додано підтримку EFI-розділів з нестандартним розміщенням таблиць GPT.
    • У механізмі fanotify реалізований новий прапор FAN_REPORT_PIDFD, що призводить до вказівки pidfd у числі метаданих, що повертаються. Pidfd допомагає обробляти ситуації з повторним використанням PID для більш точної ідентифікації процесів, що звертаються до файлів, що відстежуються (pidfd зв'язується з конкретним процесом і не змінюється, в той час як PID може бути прив'язаний до іншого процесу після завершення поточного процесу, асоційованого з цим PID).
    • У системний виклик move_mount() додано можливість додавання точок монтування в існуючі спільні групи, що вирішує проблеми зі збереженням та відновленням стану процесів в інструментарії CRIU за наявності кількох просторів монтування, які спільно використовуються в ізольованих контейнерах.
    • Додано захист від прихованих станів гонки, які потенційно могли призводити до пошкодження файлів при виконанні читання з кешу під час обробки порожнин у файлі.
    • Припинено підтримку обов'язкових (mandatory) блокувань файлів, що реалізуються через блокування системних викликів, що призводять до зміни файлу. Через можливі стани гонки ці блокування вважалися ненадійними і багато років тому були оголошені застарілими.
    • Видалена підсистема LightNVM, що дозволяла отримати прямий доступ до SSD-накопичувача, минаючи прошарок емуляції. LightNVM втратив сенс після появи стандартів NVMe, які передбачають можливість зонування (ZNS, Zoned Namespace).
  • Пам'ять та системні сервіси
    • Реалізовано підсистему DAMON (Data Access MONitor), що дозволяє відстежувати активність, пов'язану з доступом до даних в оперативній пам'яті, у прив'язці до обраного процесу, що працює у просторі користувача. Підсистема дозволяє проаналізувати до яких саме областей пам'яті звертався процес за весь час своєї роботи, а які сфери пам'яті залишилися незатребуваними. З особливостей DAMON відзначається низьке навантаження на CPU, невелике витрати пам'яті, висока точність і передбачувані постійні накладні витрати, що не залежать від розміру. Підсистема може використовуватися як ядром для оптимізації управління пам'яттю, так і утилітами у просторі користувача для розуміння того, що саме робить процес та оптимізації використання пам'яті, наприклад, вивільнення зайвої пам'яті системі.
    • Реалізовано системний виклик process_mrelease, що дозволяє прискорити процес звільнення пам'яті процесу, що завершує виконання. У звичайних умовах звільнення ресурсів і завершення процесу виконується не миттєво і з різних причин може затримуватися, що заважає роботі систем раннього реагування, що функціонують в просторі користувача, на брак пам'яті, таких як oomd (надається в systemd) і lmkd (використовується в Android). За допомогою виклику process_mrelease подібні системи можуть більш передбачувано ініціювати повернення пам'яті від процесів, що примусово завершуються.
    • З гілки ядра PREEMPT_RT, в якій розвивається підтримка роботи в режимі реального часу, перенесені варіанти примітивів для організації блокувань mutex, ww_mutex, rw_semaphore, spinlock та rwlock, що базуються на підсистемі RT-Mutex. У SLUB slab allocator додано зміни, що покращують роботу в режимі PREEMPT_RT та знижують вплив на переривання.
    • У cgroup додано підтримку атрибута планувальника завдань SCHED_IDLE, що дозволяє забезпечити цією ознакою відразу всі процеси групи, що входять до певної cgroup. Тобто. ці процеси будуть запущені тільки коли в системі немає інших завдань, що чекають на виконання. На відміну від встановлення атрибуту SCHED_IDLE кожному процесу окремо, при прив'язці SCHED_IDLE до cgroup при виборі завдання для виконання враховується відносна вага задач усередині групи.
    • Механізм обліку споживання пам'яті cgroup розширений можливістю відстеження додаткових структур даних ядра, зокрема створюваних для poll-инга, обробки сигналів і просторів імен.
    • Додано підтримку асиметричного планування прив'язки задач до процесорних ядрів на архітектурах, в яких деякі CPU допускають виконання 32-розрядних завдань, а деякі працюють тільки в 64-розрядному режимі (наприклад, ARM). Новий режим дозволяє при плануванні виконання 32-розрядних завдань враховувати лише CPU, що підтримують 32-розрядні завдання.
    • В інтерфейсі асинхронного вводу/виводу io_uring з'явилася підтримка відкриття файлів відразу в індексній таблиці fixed-file, не використовуючи файловий дескриптор, що дає можливість суттєво прискорити деякі типи операцій, але йде в розріз із традиційним для Unix процесом використання файлових дескрипторів для відкриття файлів.

      У io_uring для підсистеми BIO (Block I/O Layer) реалізовано новий механізм повторної переробки («BIO recycling»), що дозволяє знизити накладні витрати в процесі управління внутрішньою пам'яттю і приблизно на 10% збільшити кількість операцій вводу/виводу, що обробляються в секунду. У io_uring також додано підтримку системних викликів mkdirat(), symlinkat() та linkat().

    • Для BPF-програм реалізована можливість запиту та обробки подій таймера. Доданий ітератор для UNIX-сокетів, а також реалізована можливість отримувати та встановлювати опції сокетів для setsockopt. У BTF dumper додано підтримку типизованих даних.
    • На NUMA-системах з різними типами пам'яті, що відрізняються за продуктивністю, в ситуації вичерпання вільного простору реалізовано перенесення сторінок пам'яті з динамічної пам'яті (DRAM), що витісняються, в більш повільну постійну пам'ять (Persistent Memory) замість видалення цих сторінок. Проведення тестів показало, що така тактика, як правило, покращує продуктивність на подібних системах. Для NUMA також реалізовано можливість виділення сторінок пам'яті для процесу з вибраного набору вузлів NUMA.
    • Для архітектури ARC реалізована підтримка трьох- і чотирирівневих таблиць сторінок пам'яті, що дозволить реалізувати підтримку 64-розрядних процесорів ARC.
    • Для архітектури s390 реалізовано можливість застосування механізму KFENCE для виявлення помилок при роботі з пам'яттю, а також додано підтримку детектора станів гонки KCSAN.
    • Додана підтримка індексування списку повідомлень, що виводяться через printk(), що дозволяє разом вилучити всі подібні повідомлення та відстежувати зміни у просторі користувача.
    • У mmap() припинена підтримка опції VM_DENYWRITE, а код ядра позбавлений використання режиму MAP_DENYWRITE, що скоротило кількість ситуацій, що призводять до блокування запису в файл з помилкою ETXTBSY.
    • У підсистему трасування додано новий тип перевірок «Event probes», які можна прикріплювати до подій трасування, визначаючи власний формат виведення.
    • При складанні ядра з використанням компілятора Clang за замовчуванням тепер задіяно вбудований асемблер від проекту LLVM.
    • У рамках проекту з позбавлення ядра коду, що призводить до виведення попереджень компілятором, проведений експеримент із включенням за умовчанням режиму -Werror, при якому попередження компілятора обробляються як помилки. У процесі підготовки випуску 5.15 Лінус почав приймати лише зміни, що не призводять до попереджень при складанні ядра і активував збірку з "-Werror", але потім погодився з думкою про передчасність такого рішення і відклав включення "-Werror" за умовчанням. Управління включенням прапора "-Werror" при складанні здійснюється за допомогою параметра WERROR, який за умовчанням виставлений значення COMPILE_TEST, тобто. поки що включається тільки при тестових зборках.
  • Віртуалізація та безпека
    • У Device Mapper (DM) додано новий обробник dm-ima з реалізацією механізму віддаленої атестації на основі підсистеми IMA (Integrity Measurement Architecture), що дозволяє зовнішньому сервісу верифікувати стан підсистем ядра для того, щоб переконатися в їхній справжності. На практиці dm-ima дозволяє створювати за допомогою Device Mapper сховища, прив'язані до зовнішніх хмарних систем, в яких за допомогою IMA перевіряється достовірність конфігурації DM target, що запускається.
    • prctl() реалізована нова опція PR_SPEC_L1D_FLUSH, при включенні якої ядро ​​починає скидати вміст кешу першого рівня (L1D) щоразу при перемиканні контексту. Даний режим дозволяє вибірково для найбільш важливих процесів реалізувати додатковий захист від використання атак по сторонніх каналах, що проводяться для визначення даних, що осіли в кеші внаслідок уразливостей, викликаних спекулятивним виконанням інструкцій CPU. Ціною включення PR_SPEC_L1D_FLUSH (за замовчуванням не активовано) є суттєве зниження продуктивності.
    • Реалізовано можливість складання ядра з додаванням у GCC прапора "-fzero-call-used-regs=used-gpr", що забезпечує обнулення всіх регістрів перед поверненням управління з функції. Зазначена опція дозволяє захиститися від витоку інформації з функцій та на 20% скоротити кількість блоків, придатних для побудови ROP-гаджетів (Return-Oriented Programming) в експлоїтах.
    • Реалізовано можливість збирання ядер для архітектури ARM64 у формі клієнтів для гіпервізора Hyper-V.
    • Запропоновано новий фреймворк для розробки драйверів VDUSE, що дозволяє реалізовувати віртуальні блокові пристрої в просторі користувача та застосовувати Virtio як транспорт для доступу з гостьових систем.
    • Доданий Virtio-драйвер для шини I2C, що дозволяє емулювати контролери I2C в режимі паравіртуалізації з використанням окремих бекендів.
    • Доданий Virtio-драйвер gpio-virtio, що дозволяє гостьовим системам отримати доступ до ліній GPIO, що надаються хост-системою.
    • Додано можливість обмеження доступу до сторінок пам'яті для драйверів пристроїв з підтримкою DMA на системах без I/O MMU (memory-management unit).
    • У гіпервізорі KVM реалізовано можливість виведення статистики у формі лінійних та логарифмічних гістограм.
  • Мережева підсистема
    • До складу ядра додано модуль ksmbd з реалізацією файлового сервера, який використовує протокол SMB3. Модуль доповнює раніше доступну в ядрі реалізацію клієнта SMB і на відміну від SMB-сервера, що працює у просторі користувача, більш ефективний з точки зору продуктивності, споживання пам'яті та інтеграції з розширеними можливостями ядра. Ksmbd подається як високопродуктивне та готове для застосування на вбудовуваних пристроях розширення до Samba, що при необхідності інтегрується з інструментами та бібліотеками Samba. З можливостей ksmbd виділяється покращена підтримка технології розподіленого кешування файлів (SMB leases) на локальних системах, що дозволяє суттєво скоротити трафік. Надалі планують додати підтримку RDMA («smbdirect») та розширень протоколу, пов'язаних із посиленням надійності шифрування та верифікацією за цифровими підписами.
    • У клієнті CIFS припинено підтримку NTLM і менш надійних алгоритмів автентифікації, заснованих на алгоритмі DES та використовуваних у протоколі SMB1.
    • У реалізації мережевих мостів для vlan реалізовано підтримку multicast.
    • У драйвер bonding, застосовуваний для агрегування мережевих інтерфейсів, додано підтримку підсистеми XDP (eXpress Data Path), що дозволяє маніпулювати мережевими пакетами на стадії до обробки мережевим стеком ядра Linux.
    • У бездротовому стеку mac80211 реалізована підтримка 6GHZ STA (Special Temporary Authorization) у режимах LPI, SP та VLP, а також можливість встановлення окремих TWT (Target Wake Time) у режимі точки доступу.
    • Додано підтримку протоколу MCTP (Management Component Transport Protocol), що застосовується для взаємодії управляючих контролерів та пов'язаних з ними пристроїв (хост-процесори, периферійні пристрої тощо).
    • Продовжено інтеграцію в ядро ​​MPTCP (MultiPath TCP), розширення протоколу TCP для організації роботи TCP-з'єднання з доставкою пакетів одночасно по кількох маршрутах через різні мережеві інтерфейси, прив'язані до різних IP-адрес. У новому випуску додано підтримку адрес у режимі fullmesh.
    • У netfilter додані обробники мережевих потоків, інкапсульованих у протокол SRv6 (Segment Routing IPv6).
    • Додано підтримку sockmap для потокових Unix-сокетів.
  • Обладнання
    • У драйвері amdgpu реалізовано підтримку APU Cyan Skillfish (оснащені GPU Navi 1x). Для APU Yellow Carp реалізовано підтримку відеокодеків. Поліпшено підтримку GPU Aldebaran. Додані нові ідентифікатори карток на базі GPU Navi 24 «Beige Goby» та RDNA2. Запропоновано покращену реалізацію віртуальних екранів (VKMS). Реалізовано підтримку відстеження температури чіпів AMD Zen 3.
    • У драйвері amdkfd (для дискретних GPU, таких як Polaris) реалізований менеджер віртуальної пам'яті (SVM, shared virtual memory), що розділяється, на базі підсистеми HMM (Heterogeneous memory management), що дозволяє використовувати пристрої з власними блоками управління пам'яттю (MMU, memory management які можуть мати доступ до основної пам'яті. У тому числі, за допомогою HMM можна організувати спільний адресний простір між GPU і CPU, в якому GPU може отримати доступ до основної пам'яті процесу.
    • У драйвері i915 для відеокарт Intel розширено застосування менеджера управління відеопам'яттю TTM та включено можливість управління енергоспоживанням на базі GuC (Graphics micro Controller). Почалася підготовка до реалізації підтримки графічної карти Intel ARC Alchemist та GPU Intel Xe-HP.
    • У драйвері nouveau реалізовано управління підсвічуванням панелей eDP за допомогою DPCD (DisplayPort Configuration Data).
    • У драйвер msm додана підтримка GPU Adreno 7c Gen 3 та Adreno 680.
    • Для чіпа Apple M1 реалізовано драйвер IOMMU.
    • Додано звуковий драйвер для систем на базі APU AMD Van Gogh.
    • У гілку staging додано драйвер Realtek R8188EU, який замінив собою старий варіант драйвера (rtl8188eu) для бездротових чіпів Realtek RTL8188EU 802.11 b/g/n.
    • До складу прийнятий драйвер ocp_pt для компанією Meta (Facebook) PCIe-плати, що розвивається, з реалізацією мініатюрних атомних годинників і GNSS-ресивера, які можуть застосовуватися для організації роботи відокремлених серверів синхронізації точного часу.
    • Додано підтримку смартфонів Sony Xperia 10II (Snapdragon 665), Xiaomi Redmi 2 (Snapdragon MSM8916), Samsung Galaxy S3 (Snapdragon MSM8226), Samsung Gavini/Codina/Kyle.
    • Добавлена ​​поддержка ARM SoС и плат NVIDIA Jetson TX2 NX Developer Kit, Sancloud BBE Lite, PicoITX, DRC02, SolidRun SolidSense, SKOV i.MX6, Nitrogen8, Traverse Ten64, GW7902, Microchip SAMA7, ualcomm Snapdragon SDM636/SM8150, Renesas R-Car H3e -2G/M3e-2G, Marvell CN913x, ASpeed ​​AST2600 (серверні плати Facebook Cloudripper, Elbert та Fuji), 4KOpen STiH418-b2264.
    • Додана підтримка LCD-панелей Gopher 2b, EDT ETM0350G0DH6/ETMV570G2DHU, LOGIC Technologies LTTD800480070-L6WH-RT, Multi-Innotechnology MI1010AIT-1CP1, Innolux EJ030 -KCA, Samsung ATNA3.0XC9341, Samsung DB3300, WideChips WS33.
    • Доданий драйвер LiteETH з підтримкою Ethernet-контролерів, що використовуються у програмних SoC LiteX (для FPGA).
    • У драйвер usb-audio додано опцію lowlatency для керування включенням роботи в режимі мінімальних затримок. Також додано опцію quirk_flags для передачі специфічних для пристрою налаштувань.

Одночасно латиноамериканський Фонд вільного програмного забезпечення сформував варіант повністю вільного ядра 5.15 - Linux-libre 5.15-gnu, очищеного від елементів прошивок і драйверів, що містять невільні компоненти або ділянки коду, область застосування яких обмежена виробником. У новому випуску реалізовано виведення повідомлення в балку про завершення чищення. Усунено проблеми при формуванні пакетів з використанням mkspec, покращено підтримку пакетів snap. Прибрано деякі попередження, що виводяться при обробці заголовного файлу firmware.h. Дозволено виведення деяких видів попереджень («format-extra-args», коментарі, функції та змінні, що не використовуються) при складанні в режимі «-Werror». Додане чищення драйвера gehc-achc. Оновлено код чищення блобів у драйверах та підсистемах adreno, btusb, btintel, brcmfmac, aarch64 qcom. Припинено чищення драйверів prism54 (віддалено) та rtl8188eu (замінено на r8188eu).

Джерело: opennet.ru

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