Компания Intel открыла инструментарий, позволяющий создавать собственные приложения для обработки пакетов в программируемых Ethernet-коммутаторах серии Tofino. Под лицензией Apache 2.0 открыт исходный код бэкеда к компилятору p4c и компонентов среды разработки Intel P4 Studio, таких как драйверы, модель симуляции коммуатора, сервер и клиент для протокола BF Runtime. Для создания приложений применяется предметно-ориентированный язык программирования P4 (Programming Protocol-independent Packet Processors), предназначенный для определения логики обработки пакетов в сетевых устройствах, таких как сетевые карты, коммутаторы, маршрутизаторы и межсетевые экраны.
Опубликованный бэкенд позволяет транслировать программы на языке P4 в представление, пригодное для установки на коммутаторах серии Intel Tofino. Благодаря этому пользователи коммутаторов могут создавать приложения, расширяющие штатную функциональность, изменяющие логику работы или адаптирующие устройство к специфике своих сетей.
Программы на языке P4 компилируются в представления для целевых платформ, которые могут быть как аппаратными (FPGA, программируемые ASIC), так и программными (x86, BPF). Вместе с кодом для установки на целевые системы компилятор генерирует runtime для управления приложением с использованием протоколов Protobuf/gRPC и API P4Runtime.
Типовая логика работы программ сводится к классификации пакетов по их заголовкам и выполнению действий над входящими пакетами, таких как перенаправление, отбрасывание, изменение TTL и замена полей. Язык не привязан к сетевым протоколам и вместо вшитой поддержки типовых протоколов, таких как IP, Ethernet, TCP и VxLAN, предоставляет разработчикам возможность определения любых протоколов в привязке к компилируемым приложениям (разработчик прикрепляет описание форматов заголовков и полей протокола).
Кроме опубликованного бэкенда для коммутаторов Intel Tofino проектом P4 предоставляется бэкенд для компиляции P4-приложений в код на языке Си, который затем может быть скомпилирован в формат, пригодный для исполнения в виртуальной машине eBPF внутри ядра Linux. Проектом также развивается открытый симулятор коммутатора, который можно использовать для проведения экспериментов в виртуальной сети Mininet, и бэкенд для компиляции P4-программ для симулятора.
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.13. Среди наиболее заметных изменений: режим ленивого вытеснения в планировщике задач, поддержка атомарной записи в XFS и Ext4, механизм "multigrain timestamps", адаптивный режим включения полинга в сетевой подсистеме, возможность сборки с оптимизациями AutoFDO, поддержка механизма защиты ARM65 Guarded Control Stack, изоляция виртуальных машин при помощи расширения ARM CCA, раздельные стеки в BPF, удаление ReiserFS, драйвер virtual-cpufreq, netlink API net-shaper, режим монтирования tmpfs учёта регистра символов, поддержка POSIX-расширений в SMB3, драйвер AMD Cache Optimizer.
В новую версию принято 14172 исправлений от 2086 разработчиков,
размер патча - 46 МБ (изменения затронули 15375 файлов, добавлено 598707 строк кода, удалено 406294 строк). В прошлом выпуске было 14607 исправлений от 2167 разработчиков, размер патча - 37 МБ. Около 52% всех представленных в 6.13
изменений связаны с драйверами устройств, примерно 13% изменений имеют
отношение к обновлению кода, специфичного для аппаратных архитектур, 11%
связано с сетевым стеком, 4% - с файловыми системами и 3% c внутренними
подсистемами ядра.
Дисковая подсистема, ввод/вывод и файловые системы
Добавлен механизм "multigrain timestamps", позволяющий получать информацию о времени изменения или доступа к файлам c более чем с миллисекундой точностью, но без негативного влияния на производительность. Повышение точности меток приводит к дополнительным накладным расходам из-за увеличения интенсивности записи метаданных на диск, поэтому в предложенной реализации более точные метки создаются не для всех файлов, а только для тех, для которых процессы запрашивают подобные метки через вызов getattr().
Добавлена поддержка атомарных операций записи, при которых запись данных, размер которых превышает размер сектора, осуществляется атомарно на устройствах хранения, предоставляющих подобную возможность. В настоящее время атомарная запись реализована для XFS, Ext4 в режиме O_DIRECT (Direct I/O) и md RAID 0/1/10.
Предложен новый механизм подсчёта ссылок для файлов, обеспечивающий прирост производительности на 3-5% в рабочих нагрузках, имеющих более 255 потоков.
Удаленареализация файловой системы ReiserFS, которая в позапрошлом году была объявлена устаревшей.
Добавлен sysctl-параметр "fs.dentry-negative" для выставления в VFS политики очистки записей "dentry" (внутреннее представление элементов каталогов) после удаления связанных с ними файлов. Для каких-то видов нагрузки оптимальнее оставлять подобные записи об удалённых файлах, а для каких-то - удалять, поэтому в ядре предоставлена возможность выбора (по умолчанию "dentry" автоматически не удаляются).
В системный вызов statmount() добавлен флаг STATMOUNT_OPT_ARRAY для возвращения списка опций файловой системы в виде массива из строк, завершающихся нулевым символом и не использующих экранирование "\000". Добавлена поддержка возвращения подтипа ФС (fs_subtype, для определения использования FUSE), опций безопасного монтирования и исходного суперблока (sb_source).
В OverlayFS предоставлена возможность указания слоёв через файловые дескрипторы, а не имена файловых путей.
В файловую систему tmpfs добавлена опция монтирования "casefold" для работы без учёта регистра символов и опция "strict_encoding" для блокирования создания файлов с именами, содержащими некорректные символы UTF-8.
Предложен новый набор системных вызовов для управления расширенными атрибутами файлов: setxattrat(), getxattrat(), listxattrat() и removexattrat(). В отличие от системных вызовов setxattr(), getxattr(), listxattr() и removexattr() новые варианты требуют указания файлового дескриптора каталога, относительно которого осуществляется поиск файлового пути.
В Btrfs добавлена ioctl-операция BTRFS_IOC_SUBVOL_SYNC_WAIT, включающая ожидание завершения очистки подразделов, что позволяет выполнить команду "btrfs subvolume sync" непривилегированным пользователем, не имеющим доступа к ioctl SEARCH_TREE (полезно в приложениях резервного копирования, очищающих подразделы). Добавлена ioctl-операция ENCODED_READ для чтения через io_uring закодированных данных, например, для чтения напрямую сжатых экстентов без распаковки. Продолжена работа по переходу на использование фолиантов страниц памяти (page folios). Сокращено возникновение конкурирующих блокировок ("lock contention") при поиске встроенных обратных ссылок и при переборе буферов экстентов. Повышена эффективность сжатия карты экстентов.
В файловой системе EROFS (Extendable Read-Only File System), предназначенной для использования на разделах, доступных в режиме только для чтения, реализована возможность использования в системном вызове lseek() опций SEEK_HOLE и SEEK_DATA.
В F2FS добавлена поддержка отражения устройств ("device aliasing"), позволяющая временно зарезервировать область в F2FS для использования части блочного устройства в другой ФС. После завершения внешней операции зарезервированную область можно вернуть в F2FS. Например, можно создать ФС командой "mkfs.f2fs -c /dev/[email protected] /dev/vdb", после чего содержимое устройства /dev/vdc будет зарезервировано и отражено в файл vdc.file и раздел /dev/vdc можно использовать для своих нужд, например, отформатировать под другую ФС. Для возвращения зарезервированного содержимого достаточно удалить файл vdc.file.
В XFS включена поддержка квот для realtime-устройств. Добавлена поддержка директории с метаданными (metadata directory), в которой размещаются все inode с метаданными.
В механизме FUSE включена возможность динамического изменения максимального числа страниц (FUSE_MAX_MAX_PAGES), используя "sysctl fs.fuse.max_pages_limit". В работе задействованы фолианты страниц памяти (page folios).
В SMB реализована поддержка POSIX-расширений для SMB3, необходимых для хранения специальных типов файлов, таких как fifo, файлы устройства и символические ссылки. Добавлена возможность монтирования раздела с альтернативным паролем, применяемым при ротации паролей. Добавлена новая опция монтирования "cifs.upcall" для определения пространства имён. Обеспечено распознавание файлов символьных и блочных устройств, созданных в Windows NFS
Server. Добавлена поддержка символических ссылок в стиле WSL (Windows Subsystem for Linux).
Файловые системы UBIFS, ADFS, BEFS, HFS, HFSPLUS, HPFS, JFS и ECRYPTFS переведены на использование нового API монтирования разделов.
Файловые системы и ECRYPTFS, UFS и NILFS2 переведены на использование фолиантов страниц памяти (page folios).
Память и системные сервисы
В планировщике реализована модель ленивого вытеснения задач (PREEMPT_LAZY, lazy preemption), которая соответствует модели полного вытеснения ("full preemption") для realtime-задач (RR/FIFO/DEADLINE), но задерживает вытеснение обычных задач (SCHED_NORMAL) до границы тика. Указанная задержка приводит к сокращению случаев вытеснения держателей блокировок, что позволяет приблизить производительность к конфигурациям, использующим модель добровольного вытеснения (voluntary preemption). Таким образом, новая модель позволяет сохранить возможности полного вытеснения в отношении realtime-задач, но сводит к минимуму проседание производительности для обычных задач. Кроме того, новая модель упрощает логику операций вытеснения задач в ядре, благодаря исключению из процесса планирования обработчиков, находящихся в других компонентах ядра (вне планировщика задач).
При сборке компилятором Clang предоставлена возможность использования оптимизаций AutoFDO и добавлена конфигурация для инструментария Propeller. Оптимизация AutoFDO (Auto-Feedback-Directed Optimization) использует результаты профилирования c информацией о частоте выполнения различных участков кода для повышения производительности часто выполняемых операций. Propeller используется для накопления статистики о выполнении кода для её дальнейшего использования компилятором при принятии решений, связанных с оптимизацией. Проведённое тестирование показало снижение задержек на 10% при сборке с AutoFDO.
В системный вызов madvise(), предоставляющий средства для оптимизации управления памятью процесса, добавлен флаг MADV_GUARD_INSTALL для подстановки в указанный диапазон адресов сторожевых страниц памяти (guard page), обращение к которым вызывает исключение и аварийное завершение процесса (SIGSEGV). По сравнению с маппингом в режиме PROT_NONE сторожевые страницы позволяют более эффективно блокировать выполнение кода за пределами выделенной области памяти, так как их создание не требует выделения новой области виртуальной памяти.
Новые возможности подсистемы асинхронного ввода/вывода io_uring: поддержка изменения размера уже созданного кольцевого буфера; отправка в синхронном режиме сообщений в другой кольцевой буфер; частичное клонирование буфера; фиксированные области ожидания; гибридный полинг ввода/вывода; расширенный API для регистрации кольцевых буферов и областей памяти.
На системах с CPU AMD реализована возможность выявления расщеплённых блокировок ("split-lock"), возникающих при доступе к невыровненным данным в памяти, когда при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности (на 1000 циклов медленнее, чем атомарная операция с данными, попадающими в одну линию кеша).
Добавлен драйвер AMD Cache Optimizer, позволяющий использовать технологию AMD 3D V-Cache для повышения производительности отдельных ядер CPU за счёт увеличения размера доступного им L3-кэша (режим Cache) или повышения частоты (режим Frequency).
Для архитектуры MIPS добавлена поддержка систем с многокластерными (multi-cluster) контроллерами прерываний (для каждого кластера в CPU предусмотрен отдельный контроллер прерываний).
Добавлена новая ioctl-операция PIDFD_GET_INFO, позволяющая получить сведения о процессе по его идентификатору PIDFD. Идентификатор PIDFD связывается с конкретным процессом и не меняется, в то время как PID может быть привязан к другому процессу после завершения процесса с используемым PID.
В планировщик задач добавлены компоненты, необходимые для реализации механизма Proxy Execution, решающего проблему с инверсией приоритетов (ситуация, когда низкоприоритетная задача удерживает ресурс, необходимый высокоприоритетной (realtime) задаче, и тем самым блокирует её). Осуществлено разделение контекстов планировщика и исполнения процессов.
Добавлен API, основанный на netlink, для выставления ограничений температуры в привязке к устройствам. При превышении выставленных ограничений в обработчик в пространстве пользователей передаются уведомления.
Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Добавлены обвязки над структурами данных и интерфейсами VFS, необходимые для работы драйвера Binder, переписанного на Rust. Добавлена поддержка событий трассировки в коде на Rust. Добавлены дополнительные обвязки для написания драйверов. Добавлены обвязки для pid_namespace.
Предложен модуль 'alloc' с системой выделения памяти и специфичная для ядра реализация типажа Allocator, не привязанная к внешнему модулю Alloc и в отличие от последнего не использующая нестабильные возможности языка. На базе Allocator подготовлены реализации Kmalloc, Vmalloc и KVmalloc, а также созданы типы Vec и Box.
В подсистеме BPF предоставлена возможность использования в BPF-программах отдельного стека с целью снижения риска переполнений при обработке больших цепочек вызовов.
Реализован итератор kmem_cache для получения из BPF-программы данных о состоянии механизма распределения памяти slab (slab allocator). Добавлена функция bpf_send_signal_task(), позволяющая BPF-программам отправлять сигналы другим процессам. Добавлен механизм разделяемой памяти BPF map, который можно использовать, например, для передачи сведений о нагрузке обработчикам планировщика задач sched_ext.
В систему трассировки добавлена возможность генерации исключения (page fault) при срабатывании точек трассировки на входе или выходе из системного вызова, что может использоваться для чтения параметров, передаваемых из пространства пользователя.
Добавлен параметр командной строки ядра "transparent_hugepage_shmem" для управления использованием больших страниц памяти в ФС tmpfs и shmem.
Реализована поддержка работы в режиме реального времени на системах с архитектурой Loongarch.
Для систем RISC-V реализована поддержка расширений "Smmpm", "Smnpm" и "Ssnpm" для маскирования указателей в пространстве пользователя (использования части битов указателей для хранения не связанных с адресацией метаданных).
Для сжатия образов ядра по умолчанию вместо lz4c задействован алгоритм lz4.
Виртуализация и безопасность
Для систем на базе архитектуры ARM64 добавлена поддержка запуска Linux в виртуальных машинах, изолированных при помощи технологии ARM CCA (Confidential Compute Architecture). ARM CCA предоставляет гарантии целостности памяти виртуальных машин и защищает их от модификации и анализа со стороны администратора хост-системы, способного выполнить код на уровне гипервизора.
Добавлена поддержка расширения ARM64 GCS (Guarded Control Stack) для аппаратной защиты адресов возврата из функций и блокирования эксплоитов, использующих методы возвратно-ориентированного программирования (ROP - Return-Oriented Programming, эксплоит формируется из уже имеющихся кусков машинных инструкций, завершающихся инструкцией возврата управления). ARM64 GCS позволяет использовать для защиты процессов в пространстве пользователя технику теневого стека (shadow stack) - после передачи управления функции, адреса возврата сохраняются процессором не только в обычном стеке, но и в отдельном теневом стеке, который не может быть изменён напрямую. Перед выходом из функции адрес возврата извлекается из теневого стека и сверяется с адресом возврата из основного стека.
В SELinux реализована поддержка управления политиками безопасности в привязке к отдельным операциям Netlink. Объявлен устаревшим и будет удалён одном из будущих выпусков конфигурационный интерфейс /sys/fs/selinux/user, который до 2020 года использовался в библиотеке libselinux.
В криптоподсистему ядра добавлен внутренний API Asymmetric Signature для генерации цифровых подписей по открытым ключам.
В подсистеме "iommufd", позволяющей управлять таблицами страниц памяти ввода/вывода IOMMU (I/O Memory-Management Unit) через файловые дескрипторы из пространства пользователя, реализованы операции IOMMU_IOAS_MAP_FILE, IOMMU_IOAS_CHANGE_PROCESS, IOMMU_VIOMMU_ALLOC и IOMMU_VDEVICE_ALLOC. Добавлена возможность использования ARM SMMuv3 (System Memory Management Unit) для вложенной трансляции адресов.
Добавлен виртуализированный драйвер virtual-cpufreq для ядер, запускаемых в гостевых системах. Драйвер позволяет отправлять хосту запросы на изменение частоты виртуального CPU (vCPU), которые могут использоваться на стороне хоста при планировании изменения частоты реального CPU.
В драйвер vfio-virtio добавлена поддержка Live-миграции (при использовании VFIO поверх virtio-net).
Сетевая подсистема
Добавлен новый режим доставки пакетов, в зависимости от периодов активности приложения адаптивно переключающийся между активным полингом (NAPI/busy polling, периодический опрос устройства ядром) и генерацией прерываний. Когда приложение находится в состоянии простоя (idle) используется обработка прерываний, а когда фиксируется высокая нагрузка - используется полинг.
Добавлен netlink API для управления полингом (NAPI) в сетевых драйверах, позволяющий настраивать отдельные экземпляры NAPI вместо настройки всего сетевого интерфейса.
Добавлен netlink API net-shaper для настройки аппаратно ускоренного ограничения интенсивности отправки пакетов (TX H/W shaping) с поддержкой интроспекции аппаратных возможностей сетевой карты для шейпинга.
В сетевом стеке проведена работа по избавлению от конкурирующих блокировок - глобальная блокировка RTNL (rtnl_lock) преобразована в блокировку, привязываемую к отдельным пространствам сетевых имён, что позволило сократить конкуренцию между блокировками в системах, активно использующих пространства имён, например, в конфигурациях с изолированными контейнерами. Оптимизация пока объявлена экспериментальной и отключена по умолчанию. Для включения следует использовать при сборке параметр DEBUG_NET_SMALL_RTNL.
Для UDP-сокетов задействована новая хэш-таблица, позволяющая заметно ускорить поиск подключённых сокетов.
Оборудование
Продолжена работа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. добавлена начальная поддержка GPU Intel на базе архитектуры Xe3, задействованной в процессорах Panther Lake.
В драйвер i915 добавлены идентификаторы новых GPU на базе микроархитектуры Arrow Lake.
В драйвере Nouveau реализована поддержка механизма drm_panic (отображает при сбоях подобие "синего экрана смерти") для GPU начиная с nv50.
В драйвере AMDGPU реализована возможность сброса очередей SDMA. Добавлена поддержка SMU 13.0.6 и JPEG 4.0.3.
В DRM-драйвер msm (GPU Qualcomm Adreno) добавлена поддержка GPU
Adreno A663, чипсетов MSM8917, MSM8937, MSM8953 и MSM8996, а также платформы Qualcomm SA8775P.
В звуковой подсистеме ALSA предложен новый режим обращения к аппаратным устройствам, предоставляющим функции для ускорения вычислений, связанных с обработкой звука (например, аппаратные ускорители для преобразования частоты дискретизации, распаковки и декодирования звуковых потоков).
Для управления энергопотреблением некоторых серверных процессоров AMD EPYC, например, AMD EPYC 9005 Turin, вместо драйвера acpi-cpufreq по умолчанию задействован драйвер amd-pstate. Драйвер amd-pstate динамически изменяет частоту CPU для достижения оптимальной производительности, используя механизм CPPC (Collaborative Processor Performance Control), который в отличие от acpi-cpufreq не ограничен тремя уровнями производительности и позволяет более оперативно реагировать на изменение состояния.
Добавлена поддержка карт хранения SDUC (Ultra Capacity SD), которые могут иметь размер более 2 ТБ (максимальный размер до 128ТБ).
Добавлена поддержка жёстких дисков с интерфейсом NVMe. В драйвере NVMe Target заявлена полная поддержка спецификации NVMe 2.1.
Добавлена поддержка звуковых систем устройств Samsung Galaxy Book3 360, ASUS Zenbook UM5606WA, ASUS Zen AIO 27 и Ayaneo System CS35L41. Добавлена поддержка звуковых кодеков Realtek RT721 SDCA, Everest Semi ES8323, NXP UDA1342, Cirrus Logic CS42L84. Добавлена поддержка усилителей NeoFidelity NTP8918/NTP8835/NTP8835C, Awinic aw88081 и Iron Device SMA1307.
Прекращена поддержка платформы PowerPC Maple, которая давно не используется на практике.
Представлен релиз отладчика GDB 16.1 (первый выпуск серии 16.x, ветка 16.0 использовалась для разработки). GDB поддерживает отладку на уровне исходных текстов для широкого спектра языков программирования (Ada, C, C++, D, Fortran, Go, Objective-C, Modula-2, Pascal, Rust и т.д.) на различных аппаратных (i386, amd64, ARM, Power, Sparc, RISC-V, LoongArch и т.д.) и программных платформах (GNU/Linux, *BSD, Unix, Windows, macOS).
Для Linux-окружений на системах с архитектурой LoongArch реализована поддержка записи и повторного выполнения (record/replay).
Для теггированных указателей, часть битов в которых используется для хранения дополнительных данных, реализована поддержка точек останова, срабатывающих при изменении данных (watchpoint).
На системах с архитектурой AArch64 реализована поддержка отладки механизма защиты MTE (Memory Tagging Extension). MTE даёт возможность привязать теги к областям в памяти и организовать проверку корректности использования указателей для блокирования эксплуатации уязвимостей, вызванных некорректной работой с памятью.
Для точек остановка в состоянии ожидания (pending) ключевые слова 'thread' и 'task' теперь разбираются во время создания точки останова, а не после выхода из состояния ожидания.
Обеспечена подстановка точек останова, привязанных к потокам, только в ту область программы, в которой выполняется необходимый поток.
Расширены возможности трассировки на процессорах Intel: при пошаговой отладке, а также в командах "record instruction-history" и "record function-call-history" реализован вывод асинхронных событий и данных, сохраняемых при использовании инструкции ptwrite.
В Python API добавлены: модуль gdb.missing_objfile, событие gdb.tui_enabled, атрибут gdb.Symbol.is_artificial и функция gdb.record.clear.
Расширены возможности протокола DAP (Debugger Adapter Protocol), связанные с обработкой запросов "scopes", "launch" и "attach".
В протокол удалённой отладки добавлена поддержка пакетов "vFile:stat" и "x addr,length".
Прекращена поддержка QNX Neutrino, Nios II и Intel MPX.
Компания TIOBE Software опубликовала январский рейтинг популярности языков программирования. Языком года назван Python, который сохранил 1 место и обогнал другие языки по росту популярности за год (+9.3%). По сравнению с январём 2024 года выделяется смещение языка Си со 2 на 4 место, при этом язык С++ поднялся с 3 на 2 место, а язык Java с 4 на 3 место.
Значительный рост популярности зафиксирован для языка Go, который переместился с 11 на 7 место. Язык PHP при этом опустился с 7 места на 13. Рост популярности отмечен для языков: Rust (19 → 14), R (23 → 18), SQL (9 → 8), Fortran (12 → 10), Delphi/Object Pascal (13 → 11), Ruby (18 → 16). Снижение популярности наблюдается для языков: Visual Basic (8 → 9), Scratch (10 → 12), MATLAB (14 → 15), Ассемблер (15 → 17), Swift (16 → 19).
Индекс популярности TIOBE строит свои выводы на основе анализа статистики поисковых запросов в таких системах, как Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube и Baidu.
В январском рейтинге PYPL, в котором используется Google Trends, лидеры за год не изменились: первое место занимает язык Python, далее следуют Java, JavaScript, С/C++ и C#. По сравнению с январём прошлого года выросла популярность языка Rust, который переместился с 11 на 9 место, а также языков Ada (16 → 15), PowerShell (18 → 17), Abap (23 → 22) и Cobol (28 → 26). Снизилась популярность Swift (9 → 11), Dart (15 → 16), Ruby (17 → 18), Visual Basic (22 → 23), Perl (26 → 27) и Haskell (27 → 28).
По данным рейтинга IEEE Spectrum лидерами остаются языки Python и Java. С 5 на 3 место поднялся язык JavaScript, с 9 на 5 язык TypeScript, с 18 на 11 язык Rust. Язык С++ сместился с 3 на 4 место, а Си - с 4 на 9 место. Рейтинг IEEE Spectrum подготовлен Институтом инженеров электротехники и электроники (IEEE) и учитывает сочетание 12 метрик, полученных от 10 различных источников (в основе метода заложена оценка результатов поиска по запросу "{название_языка} programming", анализ упоминаний в Twitter, число новых и активных репозиториев в GitHub, число вопросов в Stack Overflow, число публикаций на сайтах Reddit и Hacker News, вакансии на CareerBuilder и EEE Job Site, упоминания в цифровом архиве журнальных статей и докладов с конференций).
В рейтинге RedMonk, построенном на основе оценки популярности на GitHub и активности обсуждений на Stack Overflow, двадцатка лидеров выглядит следующим образом: JavaScript, Python, Java, PHP, C#, TypeScript, CSS, C++, Ruby, C, Swift, R, Shell, Kotlin, Scala, Objective-C, PowerShell, Rust и Dart.
Александр фон Глюк (Alexander von Gluck), входящий в совет директоров некоммерческой компании Haiku Inc, курирующей разработку операционной системы Haiku, сообщил о намерении до 16 марта заблокировать доступ пользователей из Великобритании к форуму проекта и другим платформам, на которых осуществляется взаимодействие с сообществом. Решение объясняется юридическими и финансовыми рисками, возникшими из-за принятого в Великобритании закона Online Safety Act, вступающего в силу 16 марта.
Отмечается, что у проекта нет ресурсов для юридического анализа и приведения инфраструктуры к требованиям закона. Выполнение требований усложняет необходимость выполнения большого объёма бюрократических процедур, связанных с подготовкой документации, описывающей процессы и оценивающей имеющиеся риски (перечень рисков занимает 84 страницы с запутанными и неоднозначными формулировками).
Компания Haiku Inc зарегистрирована в США, а закон Online Safety Act принят в Великобритании, но является экстерриториальным, т.е. под его действие подпадают сайты, работающие за пределами Великобритании,
если считается, что они "связаны с Великобританией", т.е. ими пользуются жители Великобритании. Предполагается, что без привлечения юристов сложно корректно заполнить все документы и выполнить требования закона. Игнорирование же закона создаёт существенные риски, например, размер штрафа за нарушение закона достигает 22 млн долларов.
Для вывода проекта Haiku из области действия закона Online Safety Act решено полностью заблокировать доступ из Великобритании к площадкам для взаимодействия с сообществом, по крайней мере до тех пор, пока не будет найдено другое решение. Кроме форума блокировка вероятно будет распространена на сервисы Gerrit и Haiku Depot, в которых допускается оставление комментариев. Сайт Haiku и репозитории проекта блокироваться не будут.
Требования закона Online Safety Act связаны с модерацией контента, отправляемого пользователями, удалением содержимого, нарушающего законы Великобритании, и ограничением доступа детей к контенту для взрослых. Сайты, насчитывающие более 700 тысяч пользователей, обязаны на этапе публикации отслеживать, фильтровать и сканировать отправляемое пользователями содержимое (ссылки, тексты, изображения). Требования к остальным ограничивается необходимостью реагировать на жалобы, но дополнительно может потребоваться проведение анализа рисков, назначение ответственных и создание регламента рассмотрения жалоб.
Закон касается сайтов, имеющих значительное количество пользователей из Великобритании (что считается значительным не детализируется) или предоставляющих услуги для граждан Великобритании, при наличии рисков причинения вреда таким гражданам.
Исключение предусмотрено для сервисов, допускающих публикацию комментариев к авторским статьям и собственному контенту, но при этом не уточняется, подпадают ли под исключение площадки, допускающие публикацию ответов на другие комментарии.
Разработчики проекта openSUSE выявилиуязвимость (CVE-2025-23013) в PAM-модуле pam-u2f, применяемом при аутентификации через токены YubiKey,
Yubico Security Key, YubiHSM и другие FIDO-устройства, поддерживающие протокол U2F (Universal 2nd Factor). Уязвимость позволяет пользователю, имеющему непривилегированный локальный доступ к системе, в определённых конфигурациях PAM пройти аутентификацию без вставки аппаратного токена. На практике модуль pam-u2f как правило подключается для двухфакторной или беспарольной аутентификации с использованием токенов (например, для подтверждения полномочий выполнения команд через утилиты su и sudo).
Уязвимость вызвана некорректным возвращением функцией pam_sm_authenticate() значения PAM_IGNORE. Данное значение возвращается в случае ошибки выполнения вызовов gethostname(), pam_modutil_drop_priv(), pam_modutil_regain_priv() или resolve_authfile_path(), а также при проблемах выделения памяти в strdup() или calloc(). Проблема в том, что библиотека libpam, получив от PAM-модуля результат с кодом PAM_IGNORE, вернёт итоговый код PAM_SUCCESS, обозначающий успешное прохождение аутентификации, если в цепочке проверок какой-то другой PAM-модуль вернул успешный результат аутентификации.
При использовании модуля pam-u2f в связке с pam_unix для двухфакторной аутентификации, уязвимость позволяет успешно пройти аутентификацию в случае успешной проверки пароля, без подтверждения второго фактора. При выполнении беспарольной аутентификации по аппаратному токену pam-u2f может применяться в связке с PAM-модулем pam_faillock, ограничивающим число попыток аутентификации и возвращающим PAM_SUCCESS, если лимит не исчерпан.
В качестве примера атаки называется обход проверки токена при выполнении локальным пользователем привилегированных команд, используя утилиты sudo и su. Во время запуска этих команд атакующий может создать условия для возвращения модулем pam-u2f значения PAM_IGNORE, например, через исчерпание доступной памяти. Проблема устранена в версии pam-u2f 1.3.1.
Один из сопровождающих пакеты в NixOS представил технику атаки, позволяющую получить доступ к данным на зашифрованных дисковых разделах, в конфигурациях, не требующих ввода пароля разблокировки при загрузке, благодаря размещению в TPM2 (Trusted Platform Module) информации для расшифровки. Такие конфигурации часто используются на серверах или многопользовательских рабочих станциях, на которых проблематично после каждой перезагрузки вручную вводить пароль.
При применении подобного метода шифрования дисков расшифровка выполняется с использованием дополнительного ключа, хранимого в TPM и выдаваемого только при подтверждении исходного состояния системы. Состояние системы сохраняется в виде хэшей в регистрах PCR (Platform Configuration Register) и привязывается к цифровой подписи, которой заверен загрузчик, а также к контрольным суммам загрузчика и начального загрузочного окружения (initrd). Доступ к ключу в TPM предоставляется только когда все привязанные к нему регистры PCR находятся в том же состоянии, что и при сохранении ключа.
Подразумевается, что цепочка загрузки операционной системы верифицируется при помощи UEFI Secure Boot и доступ к ключам можно получить только из немодифицированного образа initrd. При успешной проверке диск автоматически разблокируется, но доступ к расшифрованным данным можно получить только через вход в свою учётную запись в системе. При обращении без верифицированной загрузки или при попытке замены или внесения изменений в initrd с целью перехвата ключей цепочка доверия будет нарушена, состояние регистров PCR
изменится и TPM2 не отдаст сведения, необходимые для расшифровки.
Опубликованный метод атаки позволяет обойтись без изменения содержимого initrd в конфигурациях, не идентифицирующих шифрованные разделы LUKS. Отмечается, что включение подобной проверки разделов не описывается во всех найденных инструкциях по настройке дискового шифрования, так как идентификация раздела заметно усложняет конфигурацию (требуется привлечение дополнительного регистра PCR для проверки ключа раздела и генерация initrd с учётом его значения).
Примеры совершения атаки продемонстрированы для Fedora Linux в связке с инструментарием clevis и для NixOS в связке с systemd-cryptenroll. Для совершения атаки необходим физический доступ к компьютеру и возможность извлечения накопителя.
Метод основывается на том, что атакующий может заменить существующий корневой шифрованный раздел на собственный зашифрованный раздел, созданный с тем же UUID-идентификатором и заданными атакующим ключами расшифровки. Окружение initrd передаст управление init-процессу в разделе атакующего. Так как содержимое initrd не было изменено, состояние TPM не будет нарушено, и атакующий, получив управление в своём окружении, cможет использовать TPM для расшифровки ключа исходного дискового раздела.
Атака сводится к следующим шагам:
Извлечение диска и проведение на другом компьютере анализа незашифрованных данных в разделе /boot. Определение информации о зашифрованном разделе и его UUID-идентификаторе из initrd-образа, находящегося в разделе /boot.
Создание резервной копии первых 64МБ зашифрованного LUKS-раздела.
Замена указанных 64МБ на образ с собственным корневым разделом, зашифрованным с использованием ключа атакующего и имеющим UUID-идентификатор как у старого раздела.
Возвращение диска в исходный компьютер и загрузка с подменённым корневым разделом. Так как автоматическая разблокировка по ключу из TPM для подменённого раздела завершается неудачей, initrd выводит запрос для ручного ввода пароля.
Получение из TPM исходного ключа, используя метаданные о TPM и зашифрованный токен из LUKS-заголовка старого раздела.
Перестановка диска на компьютер атакующего, восстановление перезаписанной части LUKS-раздела из резервной копии и использование полученного исходного ключа для доступа к данным.
Представлен релиз дистрибутива Linux Mint 22.1, продолжающий развитие ветки на пакетной базе Ubuntu 24.04 LTS. Дистрибутив полностью совместим с Ubuntu, но существенно отличается подходом к организации интерфейса пользователя и подбором используемых по умолчанию приложений. Разработчики Linux Mint предоставляют десктоп-окружение, соответствующее классическим канонам организации рабочего стола, которое является более привычным для пользователей, не принимающих новые методы построения интерфейса GNOME 3. Для загрузки доступны DVD-сборки на базе оболочек MATE (3 ГБ), Cinnamon (3 ГБ) и Xfce (3 ГБ). Ветка Linux Mint 22 отнесена к выпускам с длительным сроком поддержки (LTS), обновления для которых будут формироваться до 2029 года.
Модернизирован стек управления пакетами, связанный с пакетным менеджером APT. Вместо инструментария aptdaemon задействован собственный сервис Aptkit, также реализующий фоновый процесс и DBus-интерфейс для выполнения непривилегированными пользователями операций управления пакетами. Вместо приложений, использующих aptdaemon, таких как GDebi, synaptic и apturl, реализован новый интерфейс установки пакетов Captain, который можно вызвать из других приложений при попытке открытия файлов с расширением deb или задействовать в качестве обработчика URL "apt://pkgname".
Отмечается, что основанный на aptdaemon инструментарий устарел, не развивается основным проектом и сопровождается через накопление отдельной коллекции патчей в дистрибутивах. Замена aptdaemon позволила решить проблемы с локализацией и переводом в средствах управления пакетами; избавила дистрибутив от компонентов, оставшихся без сопровождения; упростила архитектуру; сократила трудозатраты разработчиков. Переход на Aptkit позволил реализовать в приложении Software Sources графический режим для отката на прошлые версии для пакетов, отсутствующих в репозиториях Ubuntu. В приложении Update Manager удалось улучшить поддержку Wayland и обновить код для многопоточного и многопроцессного выполнения операций.
Реализована поддержка профилей энергопотребления, позволяющих пользователю выбрать приемлемый для себя баланс между энергопотреблением и производительностью. Доступно три режима: экономия энергии, высокая производительность и сбалансированный. В среде рабочего стола Cinnamon режим можно выбрать в секции конфигуратора "Preferences → Power Management" или через апплет в панели. В Xfce и MATE выбор режима осуществляется командой "powerprofilesctl set power-saver|performance|balanced".
Среда рабочего стола Cinnamon обновлена до выпуска 6.4.
Интегрирован режим ночной подсветки ("Night Light"), который меняет цветовую температуру в зависимости от времени суток и может использоваться в окружениях на базе X11 и Wayland. При работе в ночное время автоматически уменьшается интенсивность синего цвета на экране, что делает цветовую гамму более тёплой для снижения напряжения глаз и сокращения факторов возникновения бессонницы при работе перед сном.
Предложена новая тема оформления, которая отличается использованием более тёмных цветов, выраженным контрастом, скруглением элементов интерфейса и увеличенными отступами между апплетами и панелью.
Изменено оформление диалоговых окон. Добавлена возможность использования цветных кнопок в диалогах. Для отрисовки ключевых всплывающих диалоговых окон задействована библиотека Clutter. Переделан диалог для принудительного завершения работы приложений, показываемый в случае зависания программы и прекращения её реагирования на действия пользователя.
Переработан внешний вид экранных индикаторов (OSD), используемых при изменении яркости и громкости медиа-кнопками, а также при переключении виртуальных рабочих столов.
Улучшен интерфейс смены задач по Alt-tab. Добавлена опция для показа только окон, размещённых на текущем мониторе. Переделана работа со свёрнутыми окнами.
Обновлён стиль и увеличены отступы в основном меню. Добавлена поддержка навигации по меню с использованием клавиш управления курсором на цифровой клавиатуре. Упрощена анимация при работе с меню.
Улучшена совместимость с Wayland. Добавлена опциональная возможность установки сессионных файлов для Wayland. На собственные диалоги заменён устаревший пакет policykit-1-gnome, что позволило при использовании Wayland наладить в Cinnamon корректную работу приложений, запрашивающих права администратора.
В менеджере приложений (Software Manager) ускорены операции установки и навигации по пакетам.
В файловый менеджер Bulky добавлена функция удаления диакритических знаков из имён группы файлов (например, "résumé.pdf" может заменить на "resume.pdf").
Включена генерация миниатюр для файлов с расширением ".ora" (OpenRaster).
Компания Google опубликовала релиз web-браузера Chrome 132. Одновременно доступен стабильный выпуск свободного проекта Chromium, выступающего основой Chrome. Браузер Chrome отличается от Chromium использованием логотипов Google, наличием системы отправки уведомлений в случае краха, модулями для воспроизведения защищённого от копирования видеоконтента (DRM), системой автоматической установки обновлений, постоянным включением Sandbox-изоляции, поставкой ключей к Google API и передачей RLZ-параметров при поиске. Для тех, кому необходимо больше времени на обновление, отдельно поддерживается ветка Extended Stable, сопровождаемая 8 недель. Следующий выпуск Chrome 133 запланирован на 4 февраля.
Добавлена эвристика, автоматически включающая функцию "HTTPS-First", перенаправляющую HTTP-запросы на HTTPS, для пользователей, которые в своей практике обычно используют HTTPS. Если пользователь не согласен с включением "HTTPS-First", он может принудительно отключить данный режим в настройках. При активном "HTTPS-First" работа с сайтами, не поддерживающими HTTPS, выполняется через откат на HTTP, если после перенаправления не удаётся выполнить запрос по HTTPS или возникают проблемы с сертификатами. При недоступности варианта с HTTPS перед открытием сайта по HTTP выводится специальное предупреждение.
Расширены возможности поиска при помощи сервиса Google Lens ("Поиск с объективом"), вызываемого через контекстное меню. Помимо поиска по изображениям и выделенному тексту добавлена поддержка задания вопросов на естественном языке, связанных с содержимым web-страниц и PDF-документов. Для отправки вопроса следует вызвать интерфейс поиска через Google Lens через меню и ввести вопрос в верхней части появившейся боковой панели. Расширено число языков, доступное в функции наложения перевода (переведённый текст показывается поверх исходного текста на изображении).
Для платформы Windows предоставлена поддержка sandbox-изоляции процесса, обеспечивающего работу сетевого сервиса. Для включения изоляции добавлена опция "--enable-features=NetworkServiceSandbox". Проверить режимы изоляции можно на странице "chrome://sandbox/".
В настройки добавлена возможность выборочной загрузки паролей и адресов, ранее сохранённых на локальной системе, в облачное хранилище, привязанное к учётной записи Google.
В десктоп-сборках вместо настройки синхронизации между устройствами с использованием отдельной учётной записи, предоставлена возможность привязи браузеров пользователя к учётной записи Google, применяемой в таких сервисах как Gmail и Google Docs. Например, при входе на сайт Gmail теперь будет предлагаться войти с этой учётной записью в Chrome для сохранения и синхронизации открытых вкладок, настроек, истории, закладок, паролей, адресов, дополнений, тем и PWA-приложений.
Добавлена настройка "chrome://flags/#enable-user-link-capturing-pwa", при активации которой переход по ссылкам, связанным с установленным Web-приложением (PWA), приводит к открытию обычного сайта и появлению в адресной строке индикатора для переключения на использование web-приложения. До этого открытие подобных ссылок сразу приводило к переходу к web-приложению, без возможности работы со страницей как с обычным сайтом.
Для элемента <dialog> реализованы события "beforetoggle" и "toggle" (ToggleEvent), позволяющее определять моменты открытия и закрытия диалога, и вызывать свои обработчики на стадии до начала показа/закрытия диалога или когда диалог уже показан или закрыт. При вызове метода showModal или show события ToggleEvent генерируются со значением "open" в параметре newState, а при закрытии диалога со значением "closed".
Обеспечена генерация исключения InvalidStateError при вызове методов showPopover() и showModal() для элементов c атрибутом "popover" или элементов "dialog", находящихся в неактивном документе. Ранее подобный вызов молча игнорировался.
В дополнение к возможности захвата видео и произвольной области во вкладке, добавлен API Element Capture для захвата отдельных HTML-элементов. Возможность может быть полезной в ситуации, когда нужно захватить элементы, перекрывающие друг друга. Например, в web-приложении для проведения видеоконференций, позволяющем встраивать другие web-приложения через iframe, новый API может потребоваться для захвата содержимого iframe в форме видео и передачи его другим участникам.
Добавлен метод getAllScreensMedia() для захвата содержимого всех экранов, подключённых к устройству.
В версии для Android и компонентах на базе WebView разрешено использовать API File System Access, позволяющий web-приложениям читать и записывать данные напрямую в файлы и каталоги на устройстве пользователя. Ранее данный API был доступен только в desktop-сборках. Для вызова диалогов выбора файлов можно использовать методы showOpenFilePicker() и showSaveFilePicker().
В CSS-свойстве "a href="https://developer.mozilla.org/docs/Web/CSS/writing-mode">writing-mode", позволяющем настроить позиционирование текста в формах, реализована поддержка ключевых слов sideways-rl и sideways-lr, полезных для организации вертикального вывода традиционного текста, в котором не используются иероглифы.
В CSS-свойствах "inset" и "margin" разрешено использование значения anchor-size().
Возвращена возможность активации областей прокрутки при навигации с использованием клавиатуры, позволяющая пользователям без мыши вначале переключиться в нужную область клавишей Tab, а затем прокрутить её содержимое стрелками управления курсором. Ранее данная возможность была отключена из-за регрессий в средствах для людей с ограниченными возможностями, которые удалось устранить в этой версии.
Добавлены методы Request.bytes() и Response.bytes(), возвращающие promise для чтения с использованием объекта Uint8Array.
Обеспечено игнорирование HTTP-заголовка Strict-Transport-Security в ответах с сервера, размещённого на локальной системе и принимающего запросы через localhost.
В API WebGPU реализована возможность смешивания текстур с представлением цвета в 32-разрядных форматах с плавающей точкой (r32float, rg32float и rgba32float). В объект GPUDevice добавлен атрибут adapterInfo.
Расширены возможности инструментов для web-разработчиков. Добавлена поддержка использования AI-ассистента Gemini для упрощения отладки и уточнения вопросов, связанных с сетевыми запросами, исходными файлами и трассировкой производительности. Реализовано сохранение истории чата с
AI-ассистентом.
В панели Sensors реализована симуляция различной интенсивности нагрузки на CPU (Nominal, Fair, Serious, Critical). В панели для оценки потребления памяти добавлена поддержка группировки JavaScript-объектов по имени. Изменено оформление конфигуратора. Во вкладке Computed обеспечено обновление вычисляемых значений в режиме реального времени (полезно для отслеживания изменений значений в процессе анимации). В секции "Application > Storage" добавлена возможность инспектирования хранилищ браузерных дополнений.
Кроме нововведений и исправления ошибок в новой версии устранены 16 уязвимостей. Многие из уязвимостей выявлены в результате автоматизированного тестирования инструментами AddressSanitizer, MemorySanitizer, Control Flow Integrity, LibFuzzer и AFL. Пяти проблемам присвоен высокий уровень опасности. Критических проблем, которые позволяют обойти все уровни защиты браузера и выполнить код в системе за пределами sandbox-окружения, не выявлено. В рамках программы по выплате денежного вознаграждения за обнаружение уязвимостей для текущего релиза компания Google выплатила 13 премий на сумму 37 тысяч долларов США (по две премии в $7000 и $5000, одна премия $3000, три премии $2000 и четыре премии $1000). Размер одного вознаграждения пока не определён.
Опубликован релиз утилиты для синхронизации файлов Rsync 3.4.0, в котором устранено шесть уязвимостей. Комбинация уязвимостей CVE-2024-12084 и CVE-2024-12085 позволяет клиенту добиться выполнения своего кода на сервере. Для совершения атаки достаточно анонимного подключения к серверу Rsync с доступом на чтение. Например, атака может быть совершена на зеркала различных дистрибутивов и проектов, предоставляющих возможность загрузки сборок через Rsync. Проблема также затрагивает различные приложения для синхронизации файлов и резервного копирования, использующие Rsync в качестве бэкенда, такие как BackupPC, DeltaCopy и ChronoSync.
Более того, эксплуатировав уязвимость на сервере атакующий может организовать атаку на подключающихся к серверу клиентов и добиться чтения или записи любых файлов в их системе, насколько это позволяют права доступа процесса rsync. Например, через создание вредоносных rsynс-серверов можно организовать загрузку SSH-ключей или добиться выполнения кода, перезаписав такие файлы, как ~/.bashrc и ~/.popt.
Для упрощения проверки обновления серверов до новой версии Rsync номер протокола в выпуске Rsync 3.4.0 повышен до 32. Проследить за появлением обновлений в дистрибутивах можно на следующих страницах: Debian, Ubuntu, RHEL, SUSE/openSUSE, Fedora, Arch, FreeBSD.
Выявленные уязвимости:
CVE-2024-12084 - запись за пределы выделенного буфера через передачу некорректной контрольной суммы, размер которой превышает 16 байт.
CVE-2024-12085 - утечка содержимого неинициализированных данных из стека (по одному байту за раз) при выполнении операций сравнения контрольных сумм некорректного размера.
CVE-2024-12086 - получение доступа сервера к содержимому произвольных файлов из системы клиента через генерацию сервером некорректных коммуникационных токенов и контрольных сумм в процессе копирования файлов от клиента на сервер (определение содержимого байт за байтом через подбор контрольной суммы).
CVE-2024-12087 - выход за пределы базового каталога при использовании опции "--inc-recursive" (включается по умолчанию для многих флагов). Уязвимость вызвана отсутствуем должной проверки символических ссылок и позволяет записать файлы за пределами указанного клиентом целевого каталога. Подконтрольный атакующему сервер может использовать уязвимость для атаки на систему подключившегося клиента.
CVE-2024-12088 - некорректная проверка символических ссылок, указывающих на другие символические ссылки, при использовании опции "--safe-links". Проблема даёт возможность выйти за пределы базового каталога и записать данные в любой файл в системе, насколько это позволяют права доступа.
CVE-2024-12747 - состояние гонки при работе с символическими ссылками, позволяющее пользователю повысить свои привилегии и получить доступ к привилегированным файлам на сервере.
Опубликован выпуск инструментария Emscripten 4.0, позволяющего компилировать код на C/C++ и других языках, для которых имеются фронтэнды на базе LLVM, в универсальный низкоуровневый промежуточный код WebAssembly. Полученный результат можно использовать для интеграции с JavaScript-проектами, запуска в web-браузере, использования в Node.js или создания обособленных многоплатформенных приложений, запускаемых при помощи wasm runtime. Код проекта распространяется под лицензией MIT. В компиляторе используются наработки проекта LLVM, а для генерации WebAssembly и оптимизации задействована библиотека Binaryen.
Основной целью Emscripten заявлено создание инструмента, позволяющего выполнять в Web код независимо от языка программирования, на котором этот код изначально написан. В компилируемых приложениях могут использоваться вызовы стандартных библиотек C и С++ (libc, libcxx), расширения C++, многопоточность на базе pthreads, API POSIX и многие мультимедийные библиотеки. Отдельно предоставляются API для интеграции с Web API и кодом на JavaScript.
Emscripten поддерживает трансляцию вывода библиотеки SDL2 через Canvas, а также реализует поддержку OpenGL и EGL через API WebGL, что позволяет преобразовывать в WebAssembly графические приложения и игры (например, имеется порт тулкита Qt, поддерживаются игровые движки Unreal Engine и Unit, а также движок симуляции физических процессов Bullet).
Помимо компиляции кода на C/C++ отдельно развиваются проекты для запуска в браузерах интерпретаторов и виртуальных машин для языков Lua, C#, Python, Ruby и Perl. Кроме того, возможно применение фронтэндов к LLVM, отличных от Clang, например, фронтэндов для языков, как Swift, Rust, D и Fortran.
Присвоение номера версии 4.0 связано с внесением изменений, нарушающих совместимость на уровне ABI (при пересборке проекта в Emscripten 4.0 потребуется пересборка объектных файлов и библиотек, собранных прошлыми версиями Emscripten). Основные изменения в Emscripten 4.0:
Добавлена опция "-sWASM_LEGACY_EXCEPTIONS" для выбора между старым и новым механизмами обработки исключений. По умолчанию продолжает использоваться старый механизм, так как не все браузеры реализовали возможности WebAssembly для работы новых обработчиков исключений.
Компоненты compiler-rt, libcxx, libcxxabi и libunwind обновлены до ветки LLVM 19.
Минимально поддерживаемая в сборках версия браузера Safari (настройка MIN_SAFARI_VERSION) повышена с 14.1 до 15.0, что позволило по умолчанию задействовать несколько расширенных возможностей WebAssembly:
Включено использование новых инструкций для преобразования типа float в int (nontrapping-fptoint), которые вместо генерации исключения при переполнении результата возвращают минимально или максимально возможное значение (необходимо для SIMD).
Включена опция WASM_BIGINT, при которой для обмена целочисленными 64-разрядными значениями между WebAssembly и кодом на JavaScript применяется тип BigInt.
Включена опция BULK_MEMORY, при которой для реализации Си-функций memcpy и memset применяются WebAssembly-инструкции memory.copy и memory.fill.
В функции PATH.basename() отключена нормализация путей (PATH.normalize()), т.е. вызов 'PATH.basename("a/.")' теперь вернёт "." вместо "a", а 'PATH.basename("a/b/..")' вернёт ".." вместо "a".
При использовании опции "-sMODULARIZE" factory-функции, которые создают и возвращают экземпляры WebAssembly-модулей и объектов для JavaScript, теперь помечены признаком "async" при компиляции в режиме WASM_ASYNC_COMPILATION, применяемом по умолчанию.
Добавлена возможность указания JavaScript-библиотек, используя опцию "-lfoo.js". В отличие от опции "--js-library" поиск библиотеки выполняется во всех путях, указанных через опцию "-L".
При компоновке в отладочном режиме (-O0 или -sASSERTIONS) по умолчанию задействован отладочный вариант функции malloc со включёнными assert-проверками, выявляющими такие ошибки, как двойной вызов функции free().
После более года разработки опубликован релиз проекта OpenZFS 2.3.0, развивающего реализацию файловой системы ZFS для Linux и FreeBSD. Проект получил известность как "ZFS on Linux" и ранее ограничивался разработкой модуля для ядра Linux, но после слияния с кодом из FreeBSD был признан основной реализацией OpenZFS и переименован.
Работа OpenZFS проверена с ядрами Linux c 4.18 по 6.12 и всеми ветками FreeBSD, начиная с 13.3. Код распространяется под свободной лицензией CDDL. OpenZFS уже используется во FreeBSD и входит в состав дистрибутивов Debian, Ubuntu, Gentoo, NixOS и ALT Linux. Пакеты с новой версией в ближайшее время будут подготовлены для основных дистрибутивов Linux, включая Debian, Ubuntu, Fedora, RHEL/CentOS.
OpenZFS предоставляет реализацию компонентов ZFS, связанных как с работой файловой системы, так и с функционированием менеджера томов. Реализованы компоненты: SPA (Storage Pool Allocator), DMU (Data Management Unit), ZVOL (ZFS Emulated Volume) и ZPL (ZFS POSIX Layer). Проект также позволяет использовать ZFS в качестве бэкенда для кластерной файловой системы Lustre. Наработки OpenZFS основаны на оригинальном коде ZFS, импортированном из проекта OpenSolaris и расширенном улучшениями и исправлениями от сообщества Illumos. Проект развивается при участии сотрудников Ливерморской национальной лаборатории по контракту с Министерством энергетики США.
Код распространяется под свободной лицензией CDDL, которая несовместима с GPLv2, что не позволяет добиться интеграции OpenZFS в состав основной ветки ядра Linux, так как смешивание кода под лицензиями GPLv2 и CDDL недопустимо. Для обхода лицензионной несовместимости было решено распространять продукт для Linux целиком под лицензией CDDL в виде отдельно загружаемого модуля, поставляемого отдельно от ядра. Стабильность кодовой базы OpenZFS оценивается как сопоставимая с другими ФС для Linux.
Основные изменения:
Реализована возможность добавления на лету новых дисков в существующий массив RAIDZ для увеличения размера хранилища без остановки работы и без необходимости создания новой группы накопителей. Перераспределение избыточных данных с учётом новых дисков осуществляется автоматически. Для добавления диска к существующей группе можно использовать команду "zpool attach POOL raidzP-N NEW_DEVICE", а для отслеживания окончания фонового процесса расширения массива - "zpool status".
Значительно ускорено выполнение операций, связанных с дедупликацией блоков данных. Оптимизации среди прочего затронули формат таблиц дедупликации, поэтому для задействования предложенных оптимизаций в уже существующих пулах необходимо включить опцию "fast_dedup", после чего будет созданы новые таблицы дедупликации, которые будут использованы параллельно со старыми таблицами.
Добавлен режим прямого ввода/вывода (Direct IO), позволяющий совершать операции чтения и записи в обход кэша ARC (Adaptive Replacement Cache). Режим позволяет повысить эффективность работы в ситуациях, когда кэширование может негативно влиять на производительность из-за дополнительных операций копирования в памяти, например, при использовании устройств NVMe.
В большинство команд (zfs list|get|mount|version, zpool status|list|get|version) добавлена опция "-j" для вывода в формате JSON.
Допустимый размер имён файлов и каталогов увеличен c 255 до 1023 символов (новый размер выбран с расчётом размещения 255 4-байтовых символов).
Внесены оптимизации производительности, охватывающие различные части кодовой базы.
Опубликован релиз языка программирования общего назначения Rust 1.84, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
В пакетном менеджере Cargo стабилизирован механизм обработки зависимостей, выбирающий версии зависимых компонентов с учётом совместимости с версиями компилятора Rust, заявленными как минимально поддерживаемые проектом (MSRV, Minimum Supported Rust Version). Новая возможность позволяет избавить сопровождающих от необходимости ручного выбора старых версий каждой зависимости в проектах, сохраняющих совместимость со старыми версиями инструментария Rust. Новый режим определения зависимостей будет активирован по умолчанию в выпуске Rust 1.85, а пока доступен в формате опции, для включения которой в секции "[resolver]" в файле ".cargo/config.toml" следует указать 'incompatible-rust-versions = "fallback"'.
Начат перевод компилятора на новый обработчик типов (trait solver), предназначенный для проверки границ применимости типажей, нормализации типов и оценки совместимости типов.
В версии 1.84 новый обработчик задействован для проверки согласованности реализаций типажей, т.е. оценки существования не более одного типажа для рассматриваемого типа с учётом кода из других crate-пакетов. Указанная проверка позволила избавиться от проблем в старой реализации обработчика типов, потенциально способных привести к появлению конфликтов из-за пересечения разных реализаций типажей.
Предложен новый API "Strict Provenance", который можно использовать для приведения указателя к целому числу и обратно с учётом прикреплённых к указателю метаданных с информацией о его происхождении и области использования (помимо адреса к указателю прикрепляется значение "provenance" с информацией о связи с другими указателями, позволяющей определить где и когда указатель может обращаться к памяти). При приведении указателя к целому числу и обратно возникает неопределённое поведение из-за проблематичности отследить происхождение результирующего указателя. Новый API позволяет выполнять низкоуровневые операции с указателями, такие как сохранение дополнительной информации в младших битах указателя, без приведения указателя к целому числу.
В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
Реализован второй уровень поддержки платформы wasm32v1-none. Второй уровень поддержки подразумевает гарантию сборки.
Дополнительно можно отметить несколько проектов, связанных с Rust:
Опубликован релиз операционной системы Tock 2.2, написанной на языке Rust и ориентированного на использование в микроконтроллерах. Система позволяет организовать одновременное выполнение нескольких не заслуживающих доверия приложений на встраиваемых устройствах, имеющих ограниченный размер ОЗУ, таких как датчики, TPM (Trusted Platform Module), брелоки аутентификации и носимые устройства. Поддерживаются платформы с микроконтроллерами на базе архитектур ARM Cortex-M и RISC-V. Ключевой особенностью Tock является изоляция уровней приложений, ядра и слоя с драйверами, а также изоляция каждого приложения и драйвера по отдельности. Для изоляции используются как возможности языка Rust, так и разделение на уровне защиты памяти.
Проект VEKOS (Verified Experimental Kernel OS) развивает ядро операционной системы на языке Rust, обеспечивающее верификацию выполняемых компонентов. При каждой операции с файловой системой, создании процесса и выделении памяти формируется криптографическое подтверждение, позволяющее верифицировать операцию во время выполнения (реализация сравнивается с применением блокчейна для верификации действий в операционной системе). В файловой системе VKFS для обеспечения целостности и защиты от искажения задним числом задействована структура "дерево Меркла" (Merkle Tree), каждая ветка в котором верифицирует все нижележащие ветки и узлы, благодаря древовидному хешированию. Выделение памяти производится в режиме COW (Copy-On-Write).
Группа исследователей из Microsoft и Inria развивает подмножество языка Си - Mini-C, предназначенное для автоматической трансляции программ на языке Си в представление на языке Rust. В отличие от компилятора c2rust, новый проект позволяет генерировать Rust-код без использования unsafe, но нацелен главным образом на преобразование Си-проектов, имеющих формальное доказательство надёжности. Подразумевается, что будет проще вначале перевести Си-проект в представление на Mini-C, в котором не допускаются арифметические операции с указателями, чем переписывание unsafe-блоков после прямой компиляции из Си в Rust.
Реализация компилятора базируется на инструментарии KaRaMeL. Mini-C разработан и опробован в рамках проекта по переписыванию на Rust криптографической библиотеки HACL*, для которой предоставлено формальное доказательство надёжности. Подобное доказательство было использовано для демонстрации возможности генерировать из Mini-C безопасный код на Rust.
Дэниел Cтенберг (Daniel Stenberg), автор утилиты curl, объявил о прекращении разработки и поддержки проектом Curl альтернативного HTTP-бэкенда, написанного на Rust с использованием библиотеки Hyper. В качестве причины указано отсутствие интереса со стороны разработчиков и пользователей.
Анонсирован бета-выпуск командной оболочки Fish 4.0, переписанный на языке Rust. Отмечается, что после двух лет разработки кодовая база Fish была полностью переведена с С++ на Rust.
Переход на Rust позволил решить проблемы с многопоточностью, получить современный инструментарий, выявляющий ошибки на этапе компиляции, повысить безопасность работы с памятью и сделать проект более привлекательным для новых разработчиков.
Проект Tor опубликовал выпуск Arti 1.3.2, альтернативной реализации Tor-клиента на языке Rust.
Arti предоставляет встраиваемую библиотеку, которую могут использовать различные приложения. При создании Arti учтён прошлый опыт разработки Tor для того, чтобы избежать известных архитектурных проблем, сделать проект более модульным и эффективным. Ветка 1.x отмечена как пригодная для использования обычными пользователями и обеспечивающая тот же уровень конфиденциальности, юзабилити и стабильности, что и основная реализация на языке Си. В новой версии продолжена разработка RPC, проведена подготовка к реализации поддержки релеев и добавлена защита от DoS-атак на Onion-сервисы.
Опубликован выпуск игрового движка Bevy 0.15, написанного на Rust. В движке применяется датацентричная модель (Data Driven) определения игровой логики, построенная поверх набора готовых компонентов Bevy ECS (Entity Component System), которые могут выполняться параллельно. Поддерживается 2D и 3D рендеринг, скелетная анимация, определение графа рендеринга, система формирования сцен, фреймворк для построения интерфейса пользователя, внесение изменений в сцены и ресурсы без необходимости перезапуска.
Опубликован консольный текстовый редактор Helix 25.01, написанный на Rust и расширяющий идеи, заложенные в vim и neovim. Поддерживается интеграция с LSP-серверами и с Tree-sitter, одновременное выделение нескольких блоков, использование нескольких курсоров при редактировании, темы оформления, отладочный протокол DAP (Debug Adapter Protocol).
В браузерный движок Servo, написанный на Rust, добавлена поддержка тёмного режима оформления. На 20% сокращён размер браузера ServoShell. Поддержка web-спецификаций доведена до возможности входа и чтения сообщений в Discord (отправка сообщений пока невозможна).
Проведено тестирование производительности кодировщиков изображений в формате PNG. Декодировщики на Rust (png, zune-png, wuffs) оказались быстрее декодировщиков на Си (libpng, spng, stb_image). Например, crate-пакет png (image-rs) обогнал libpng в 1.8 раза на системе x86 и в 1.5 раза на системе ARM.
После года разработки состоялся релиз пользовательского окружения Enlightenment 0.27, которое базируется на наборе библиотек EFL (Enlightenment Foundation Library) и виджетах Elementary. Выпуск доступен в исходных текстах без публикации готовых сборок. Список изменений для выпуска 0.27 не сформирован, доступен лишь перечень коммитов, в котором в основном перечислены исправления ошибок и незначительные улучшения в виджетах.
Рабочий стол в Enlightenment формируют такие компоненты, как файловый менеджер, набор виджетов, панель запуска приложений и графические конфигураторы. Графические конфигураторы предоставляют как высокоуровневые средства настройки (изменение оформления, настройка виртуальных рабочих столов, управление шрифтами, разрешением экрана, раскладкой клавиатуры, локализацией и т.п.), так и возможности по низкоуровневому тюнингу (например, можно настроить параметры кэширования, графического ускорения, потребления энергии, изменить логику работы оконного менеджера).
Для расширения функциональности предлагается использовать модули (гаджеты), а для переработки внешнего вида - темы оформления. Доступны модули для отображения на десктопе календаря-планировщика, прогноза погоды, данных мониторинга, регулятора громкости, виджета для оценки заряда аккумулятора. Составляющие Enlightenment компоненты жёстко не привязаны друг к другу и могут использоваться в других проектах или для создания специализированных окружений, таких как оболочки для мобильных устройств.
Из обязательных зависимостей заявлены EFL, libexif и libpam (только в Linux). Среди рекомендованных зависимостей, необходимых для достижения полноценной функциональности: connman для настройки сети; bluez5 для работы с Bluetooth; bc для встроенного калькулятора; pulseaudio для управления звуковыми устройствами; acpid для обработки различных аппаратных событий; packagekit для отслеживания системных обновлений;
udisks2 для монтирования внешних дисков; ddcutil для управления подсветкой экрана; gdb для трассировки аварийных завершений.
Одновременно проект Enlightenment опубликовал набор библиотек EFL 1.28 (Enlightenment Foundation Library), позволяющих создавать визуально привлекательные графические интерфейсы, отличающиеся компактностью, низким потреблением ресурсов и высокой производительностью. Несмотря на изначальное развитие в качестве базиса для окружения Enlightenment, компоненты EFL часто используются для построения интерфейсов потребительской электроники и мобильных устройств. Например, EFL является составной частью мобильной платформы Tizen, используются в бытовой технике Electrolux, продуктах Samsung, ProFUSION, Free.fr и Calaos.
Eina - библиотека с реализацией типов данных (массив, хэш, список, дерево) и вспомогательных инструментов (работа с логами, оценка производительности, преобразование форматов и т.д.).
Eet - библиотека для записи произвольного набора блоков данных в файл для последующего быстрого чтения в произвольном порядке.
Evas - система рендеринга для организации вывода на экран. Evas оперирует содержимым экрана как сценой с объектами, состояние которых можно отслеживать. Над сценой можно проделывать такие операции как масштабирование, вращение и 3D-трансформации. Подобный подход, абстрагированный от размещения экранных элементов, позволяет разрабатывать интерфейс пользователя с точки зрения дизайнера, а не программиста (в коде достаточно определить только логику и не думать о прорисовке и выводе на экран). Evas также абстрагирует метод вывода, что позволяет использовать один и тот же код в сочетании с программным и аппаратно ускоренным рендерингом.
Ecore - библиотека для организации цикла обработки событий, предлагающая набор модулей для упрощения связанных с обработкой событий задач, таких как работа с Evas, нитями, сетевыми соединениями и т.п.
Embryo - встраиваемый интерпретатор языка Pawn (ранее известного как Small).
Edje - графическая библиотека, отделяющая внешний вид от кода (оформление задаётся в виде загружаемого из файла шаблона). Edje занимает нишу между HTML+CSS и SVG. При помощи данной библиотеки можно сформировать пользовательский интерфейс, снабжённый анимированными визуальными эффектами и поддерживающий динамическое оформление (внешний вид можно полностью поменять, просто сменив EDJ-шаблон и не трогая код, при этом, в отличие от визуальных тем, порядок расположения элементов может быть произвольно изменён).
Efreet - библиотека, позволяющая использовать в приложениях спецификации Freedesktop.org для работы с пиктограммами, Desktop-файлами и меню.
Eeze - библиотека для организации взаимодействия с внешними устройствами через udev, HAL и другие механизмы.
Expedite - инструментарий для измерения производительности, который может тестировать различные движки Evas, такие как X11, XRender, OpenGL, SDL и DirectFB.
Evil - реализация уровня совместимости для работы на платформе Windows.
Eio - абстрактный интерфейс для доступа к файловой системе и реализации асинхронного ввода/вывода.
Emotion - библиотека для интеграции в приложения обработчиков для проигрывания звука и видео. Воспроизведение видео может осуществляться с использованием Gstreamer, Xine или других внешних плагинов (например, VLC), при этом видео отображается как стандартный объект в Evas.
Ethumb - библиотека для формирования эскизов изображений, соответствующих стандартам freedesktop.org. Ethumb реализован в виде сервиса dbus и клиентской библиотеки, взаимодействующей с данным сервисом.
Elementary - набор виджетов с готовой реализацией разнообразных графических элементов (от кнопок и элементов управления, до календаря и модуля редактирования текста).
Ephysics - предоставляет средства для использования движка симуляции физических процессов Bullet в приложениях на базе EFL. Ephysics обеспечивает связку Bullet с библиотеками Ecore и Evas.
Мэтт Мулленвег, основатель WordPress и владелец компании Automattic, заблокировал в каталоге WordPress.org учётные записи пятерых участников (Joost, Karim, Se Reed, Heather Burns и Morten Rand-Hendriksen, - в основном маркетологи и SEO-специалисты), продвигавшихидеи создания форка WordPress и смены модели управления в сообществе. Мэтт написал, что приветствует создание форка, и заблокировал учётные записи, чтобы дать необходимый толчок для старта и стимулировать переход от слов к делу.
По словам Мэтта, создание форков полезно для открытых проектов, так как даже один участник, гребущий в неправильном направлении, может нарушить слаженную совместную работу. Форки же позволяют экспериментировать с новыми подходами к разработке, моделями управления и формами лидерства. Мэтт отмечает, что в обсуждавшемся заблокированными участниками форке есть смелые и интересные идеи, и ему любопытно посмотреть, что из этого получится. Форк будет полезен для сообщества, так как даст возможность попробовать что-то другое.
Мэтт также написал, что достоинство открытого кода в возможности взять WordPress и реализовать в новом проекте своё видение. Просто взять и сделать, без необходимости получения разрешения на это. Если в новом проекте удастся реализовать что-то стоящее, сообщество сможет перенести улучшения обратно в WordPress, ведь именно возможность перетекания идей между проектами делает открытый код двигателем инноваций. Через год Мэтт предлагает провести совместный саммит разработчиков WordPress и форка, на котором оценить, что сделано и чему удалось научиться.
Мэтт также иронично высказался про идею создания децентрализованного и немодерируемого каталога плагинов и тем оформления, авторам которых предоставлена полная свобода, в том числе свобода размещать рекламные баннеры в интерфейсе администратора и собирать данные о пользователях.