Реліз ядра Linux 5.1

Після двох місяців розробки Лінус Торвальдс представив реліз ядра Linux 5.1. Серед найбільш помітних змін: новий інтерфейс для асинхронного введення/виведення io_uring, можливість використання NVDIMM як ОЗУ, підтримка в Nouveau віртуальної пам'яті, що розділяється, підтримка масштабованого моніторингу дуже великих ФС через fanotify, можливість налаштування рівнів стиснення Zstd в Btrfs, новий обробіток реалізація системних викликів для вирішення проблеми 2038, можливість завантаження з пристроїв device-mapper без initramfs, LSM-модуль SafeSetID, підтримка комбінованих live-патчів.

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

  • Дискова підсистема, введення/виведення та файлові системи
    • Реалізовано новий інтерфейс для асинхронного введення/виведення io_uring, який примітний підтримкою поллінга введення/виводу та можливістю роботи як з буферизацією, так і без буферизації. Нагадаємо, що запропонований раніше механізм асинхронного введення/виведення «aio» не підтримував буферизований введення/виведення, міг працювати тільки в режимі O_DIRECT (без буферизації та в обхід кешу), мав проблеми з виникненням блокувань через очікування доступності метаданих і демонстрував великі накладні витрати через копіювання даних у пам'яті.

      В рамках API
      io_uring розробники спробували усунути недоліки старого інтерфейсу aio. за продуктивності io_uring дуже близький до SPDK і суттєво випереджає libaio при роботі з увімкненим поллінгом. Для використання io_uring у кінцевих додатках, що працюють у просторі користувача, підготовлено бібліотеку liburing, Що надає високорівневу обв'язку над інтерфейсом ядра;

    • У механізм відстеження подій у ФС fanotify() додано підтримка відстеження ситуацій зміни суперблоку та структури дирент (Події створення, видалення та переміщення каталогів). Представлені можливості допомагають вирішити проблеми з масштабованістю, що виникають при створенні рекурсивних відстеження змін у дуже великих ФС за допомогою механізму inotify (зміни dirent раніше можна було відстежити тільки через inotify, але
      ефективність за умов рекурсивного відстеження великих вкладених каталогів залишала бажати кращого). Тепер подібний моніторинг можна ефективно проводити через fanotify;

    • У файловій системі Btrfs додано можливість налаштування рівня стиснення для алгоритму zstd, який може розглядатися як оптимальний компроміс, між швидким але неефективним lz4 і повільним xz, що добре стискає. За аналогією з тим, як раніше можна було встановлювати рівень стиснення при застосуванні zlib для zstd, додано підтримку опції монтування «-o compress=zstd:level». При тестуванні мінімальний перший рівень забезпечив стиснення даних у 2.658 разів при швидкості стиснення 438.47 MB/s, швидкості розпакування 910.51 MB/s та споживанні пам'яті 780 MB, а максимальний рівень 15 — у 3.126 разів, але при швидкості стиснення в 37.30 MB/s. розпакування 878.84 MB/s та споживанні пам'яті 2547 MB;
    • Додана можливість завантаження з файлової системи, розміщеної на пристрої device-mapper, без застосування initramfs. Починаючи з поточного випуску ядра пристрою device-mapper, можна безпосередньо використовувати в процесі завантаження, наприклад, як розділ з кореневою ФС. Налаштування розділу здійснюється за допомогою параметра завантаження «dm-mod.create». Серед дозволених для завантаження модулів device-mapper: "crypt", "delay", "linear", "snapshot-origin" і "verity";
    • У орієнтовану на Flash-накопичувачі файлову систему F2FS додано прапор F2FS_NOCOW_FL, що дозволяє вимкнути режим copy-on-write для заданого файлу;
    • З ядра видалено файлову систему Exofs, Що являє собою варіант ext2, адаптований для роботи зі сховищами об'єктів OSD (Object-based Storage Device). Також видалено підтримку SCSI-протоколу для подібних пристроїв зберігання об'єктів;
  • Віртуалізація та безпека
    • prctl() додана опція PR_SPEC_DISABLE_NOEXEC для управління спекулятивним виконанням інструкцій для обраного процесу. Нова опція дозволяє вибірково відключати спекулятивне виконання процесів, які потенційно можуть бути атаковані за допомогою атаки типу Spectre. Блокування діє до першого виклику exec();
    • Реалізовано LSM-модуль SafeSetID, що дозволяє системним сервісам безпечно керувати користувачами без підвищення привілеїв (CAP_SETUID) та без отримання повноважень користувача root. Призначення привілеїв здійснюється через визначення в securityfs правил на основі білого списку допустимих прив'язок (у формі «UID1:UID2»);
    • Додано низькорівневі зміни, необхідні для стікової організації завантаження модулів безпеки (LSM). Наведено параметр завантаження ядра «lsm», що дозволяє керувати тим, які модулі завантажуються і в якому порядку;
    • У підсистему аудиту додано підтримку просторів імен файлів;
    • Розширено можливості GCC-плагіна structleak, що дозволяє блокувати потенційні витоку вмісту пам'яті Забезпечена ініціалізація будь-яких змінних, які використовуються в коді через звернення за посиланням у стеку;
  • Мережева підсистема
    • Для сокетів реалізована нова опція «SO_BINDTOIFINDEX», схожа на
      "SO_BINDTODEVICE", але приймає як аргумент індексний номер мережного інтерфейсу замість імені інтерфейсу;

    • У стек mac80211 додано можливість призначення одному пристрою кількох BSSID (MAC-адрес). В рамках проекту з оптимізації продуктивності WiFi в стек mac80211 додано облік розподілу ефірного часу та можливість розподіляти ефірний час між декількома станціями (при роботі в режимі точки доступу виділення меншого часу на передачу повільним бездротовим станціям замість рівномірного розподілу часу між усіма станціями);
    • Доданий механізм «devlink health«, що надає повідомлення при виникненні проблем з мережевим інтерфейсом;
  • Пам'ять та системні сервіси
    • Реалізовано безпечна доставка сигналів, що враховує можливість повторного використання PID. Наприклад, при виконанні виклику kill раніше могла виникнути ситуація, коли після відправки сигналу цільової PID міг бути звільнений через завершення роботи процесу і зайнятий іншим процесом, і в результаті сигнал передавався іншому процесу. Для виключення подібних ситуацій додано новий системний виклик pidfd_send_signal, який використовує файлові дескриптори із /proc/pid для забезпечення стабільної прив'язки до процесу. Навіть якщо PID буде повторно задіяний під час обробки системного виклику, файловий дескриптор не зміниться і можна безпечно використовувати для відправки сигналу процесу;
    • Додана можливість використання пристроїв постійної пам'яті (persistent-memory, наприклад NVDIMM) як ОЗУ. До цих пір в ядрі подібні пристрої підтримувалися як пристрої зберігання, але тепер їх можна також застосовувати як додаткову оперативну пам'ять. Можливість реалізована у відповідь на побажання користувачів, готових миритися з відставанням продуктивності та бажаючих використовувати штатний API управління пам'яттю ядра Linux замість застосування наявних систем розподілу пам'яті у просторі користувача, що працюють поверх mmap для dax-файлу;
    • Доданий новий обробник простою CPU (cpuidle, вирішує коли можна перевести CPU в глибокі режими економії енергії, чим глибший режим - тим більша економія, але й більше часу потрібно для виходу з режиму) - TEO (Timer Events Oriented Governor). Досі пропонувалося два обробники cpuidle — «menu» і «ladder», що відрізняються евристикою. Обробник «menu» має відомі проблеми з прийняттям евристичних рішень, для усунення яких було вирішено підготувати новий обробник. TEO позиціонується як альтернатива обробнику «menu», що дозволяє досягти більш високої продуктивності зі збереженням того ж рівня енергоспоживання.
      Активувати новий обробник можна за допомогою параметра завантаження «cpuidle.governor=teo»;

    • У рамках роботи з усунення проблеми 2038 року, Викликаної переповненням 32-розрядного типу time_t, до складу включені системні виклики, що пропонують для 32-розрядних архітектур 64-розрядні лічильники часу . У результаті 64-розрядну структуру time_t тепер можна застосовувати на всіх архітектурах. Аналогічні зміни також реалізовані у мережній підсистемі для опцій відмітка часу мережевих сокетів;
    • У систему гарячого накладання патчів на ядро ​​(live patching) додано можливість "Atomic Replace" для атомарного застосування серії змін до однієї функції. Зазначена можливість дозволяє поширювати зведені патчі, що охоплюють відразу кілька змін, замість досить складного для супроводу процесу поетапного накладання live-патчів у певному порядку. Якщо раніше кожна наступна зміна мала відштовхуватися від стану функції після минулого зміни, то тепер можливе поширення відразу декількох змін, прив'язаних до одного вихідного стану (тобто супроводжуючі можуть підтримувати один зведений патч щодо базового ядра замість ланцюжка із патчів, що залежать один від одного). );
    • Оголошено застаріла підтримка формату виконуваних файлів a.out і
      віддалений код для формування core-файлів у форматі a.out, що знаходиться в покинутому стані. Формат a.out давно не застосовується на системах з Linux, а генерація файлів a.out вже давно не підтримується сучасними інструментальними засобами в конфігураціях для Linux за умовчанням. Крім того, завантажувач для a.out файлів може бути реалізований цілком у просторі користувача;

    • У механізм верифікації BPF-програм додано можливість визначення та видалення коду, що не використовується. До складу ядра також включені патчі з підтримкою spinlock для підсистеми BPF, що надають додаткові можливості управління паралельним виконанням BPF-програм;
  • Обладнання
    • У драйвер Nouveau додано підтримка гетерогенного управління пам'яттю, що забезпечує можливість звернення CPU та GPU до загальних синхронізованих областей пам'яті. Система віртуальної пам'яті (SVM, shared virtual memory), що розділяється, реалізована на базі підсистеми HMM (Heterogeneous memory management), що дозволяє використовувати пристрої з власними блоками управління пам'яттю (MMU, memory management unit), які можуть отримувати доступ до основної пам'яті. У тому числі, за допомогою HMM можна організувати спільний адресний простір між GPU і CPU, в якому GPU може отримати доступ до основної пам'яті процесу. Підтримка SVM поки що включена лише для GPU сімейства Pascal, хоча підтримка забезпечена і для GPU Volta та Turing. Крім того, у Nouveau доданий новий ioctl для управління міграцією областей пам'яті процесів у пам'ять GPU;
    • У DRM-драйвері Intel для GPU Skylake та новіший (gen9+) включений за промовчанням режим fastboot, що виключає зайві зміни режимів під час завантаження. Додані нові ідентифікатори пристроїв на базі мікроархітектури Coffelake та Ice Lake. Для чіпів Coffelake додано підтримка GVT (віртуалізація GPU). Для віртуальних GPU реалізована Підтримка VFIO EDID. Для LCD панелей MIPI/DSI додано підтримка елементів ACPI/PMIC. Реалізовано нові TV-режими 1080p30/50/60 TV;
    • До драйвера amdgpu додано підтримку GPU Vega10/20 BACO. Реалізовано засоби керування живленням Vega 10/20 та таблиці керування кулером Vega 10. Додано нові PCI-ідентифікатори пристроїв для GPU Picasso. доданий інтерфейс управління запланованими залежностями для виключення взаємних блокувань;
    • доданий DRM/KMS-драйвер для прискорювачів екранних операцій ARM Komeda (Mali D71);
    • Додано підтримку екранних панелей Toppoly TPG110, Sitronix ST7701, PDA 91-00156-A0, LeMaker BL035-RGB-002 3.5 та Kingdisplay kd097d04;
    • Додано підтримку звукових кодеків Rockchip RK3328, Cirrus Logic CS4341 та CS35L36, MediaTek MT6358, Qualcomm WCD9335 та Ingenic JZ4725B, а також звукової платформи Mediatek MT8183;
    • Додано підтримку NAND-контролерів Flash STMicroelectronics FMC2, Amlogic Meson;
    • Додано підтримку прискорювачів для систем машинного забезпечення Habana AI;
    • Додана підтримка гігабітних Ethernet-контролерів NXP ENETC та бездротових інтерфейсів MediaTek MT7603E (PCIe) та MT76x8.

Одночасно Латиноамериканський Фонд вільного ПЗ сформував
варіант повністю вільного ядра 5.1 - Linux-libre 5.1-gnu, очищеного від елементів прошивок та драйверів, що містять невільні компоненти або ділянки коду, сфера застосування яких обмежена виробником. У новому випуску відключено завантаження блобів у драйверах mt7603 та goya. Оновлено код чищення блобів у драйверах та підсистемах wilc1000, iwlwifi, soc-acpi-intel, brcmfmac, mwifiex, btmrvl, btmtk та touchscreen_dmi. Припинено чищення блобів у завантажувачі прошивок lantiq xrx200 через його видалення з ядра.

Джерело: opennet.ru

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