Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #123, МАРТ 2009 г.

Ядерный таймлайн. Обзор нововведений в последних ядрах Linux

Евгений «j1m» Зобнин (zobnin@gmail.com)




Ядро Linux развивается стремительными темпами. Все больше энтузиастов и компаний используют его как площадку для своих экспериментальных наработок, многие из которых успешно перекочевывают в официальную ветку. Современный Linux - это неисчерпаемый кладезь идей, ежегодно пополняемый десятками новых интереснейших наработок. Не стали исключением и последние два года.

2007 год. Версии 2.6.20-2.6.23

Версия 2.6.20 получает базовую поддержку паравиртуализации, реализованную для процессоров семейства i386. Для версии 2.6.21 поверх этой системы добавляется реализация протокола WMI (Virtual Machine Interface), разработанного компанией VMWare и предназначенного для «общения» гостевых ОС с гипервизором. Linux теперь способен работать поверх VMWare в режиме паравиртуализации без каких-либо дополнительных патчей. В ядре 2.6.23 появляется поддержка работы поверх Xen и режим lguest (Linux внутри Linux).

В 2.6.20 интегрирована новая система виртуализации KVM (Kernel-based Virtual Machine). Она представляет собой драйвер для поддержки технологий SVM/AMD-V и Intel VT. Традиционные виртуальные машины, работающие в пространстве пользователя, могут использовать этот драйвер для исполнения кода гостевых ОС на реальном процессоре. Сами разработчики предлагают скачать слегка модифицированную версию qemu для использования в связке со своей разработкой.
В 2.6.21 функционал KVM расширяется и отныне включает поддержку паравиртуализации и функции заморозки/разморозки гостевых окружений. Релиз 2.6.23 принес KVM поддержку эмуляции многопроцессорных систем.

В руках разработчиков появляется новая система Fault injection, гененерирующая разнообразные фиктивные ошибки в подсистемах ядра. Новинку можно использовать, чтобы тестировать поведение кода в непредсказуемых ситуациях.

SGI разрабатывает и дарит мантейнерам Linux новый Slab allocator SLUB, оптимизированный для SMP-систем с очень большим количеством узлов. Slab allocator – очень важный компонент ядра, занимающийся выделением, кешированием и освобождением памяти для разнообразных объектов ядра. Его новая реализация становится стандартной в 2.6.23.

Дальше - больше. В ядро принимают патчи с реализацией нового беспроводного стека, разработанного компанией Devicescape, специализирующейся на WiFi-технологиях. Более гибкий, удобный в управлении, поддерживающий софтверную реализацию MAC, WEP, WPA, QoS, 802.11g и мосты канального уровня, он без лишних обсуждений заменяет прежнюю реализацию.

Замене подвергается и FireWire-стек. Свежеиспеченный вариант становится намного проще, удобнее в использовании, но сохраняет обратную совместимость.
В ядро интегрируется инновационный планировщик задач с полностью справедливым распределением ресурсов CFS (Completely Fair Scheduler). Вместо очередей процессов, ожидающих выполнения, в нем используется дерево rbtree, определяющее план с временем перехода к выполнению очередного процесса. Единица планирования времени в CFS фиксирована (наносекунда) и не привязана к частоте генерации прерываний таймера (HZ).

2.6.24 - 25 января

Объявляется механизм Control Groups и привязанная к нему файловая система cgroups. В совокупности они позволяют управлять процессами, памятью и другими ресурсами как обособленными объектами, не следующими общей семантике поведения операционной системы. Это первая ласточка нового механизма управления изолированными окружениями, и вокруг нее будет построена целая система виртуализации.

Также приняты патчи, уменьшающие фрагментацию при распределении страниц памяти (работы в этой области велись три года), и поддержка системы Task Control Groups, которая позволяет группировать процессы - этот подход используется планировщиком CFS и механизмом Cpusets (привязка группы процессов к конкретному процессорному ядру).

Разработчики продолжают пилить планировщик CFS. Он становится на 10% производительней и обзаводится специальным режимом Fair Group Scheduling, который позволяет оперировать группами задач вместо отдельных процессов. Открывается возможность лимитировать использование процессора для конкретного юзера или группы приложений (например, multimedia, net). Как этим пользоваться, описано в Documentation/sched-design-CFS.txt.

Появляется режим работы Tickless для архитектур x86-64, PPC, ARM, MIPS и UML (User Mode Linux). Теперь ядро может отключить таймер прерываний, что благоприятно сказывается на производительности и энергозатратах.

Подсистема MMC существенно переработана и теперь поддерживает механизм SDIO (Secure Digital I/O) и шину SPI. Благодаря этим нововведениям, девайсы, поддерживающие SDIO (КПК, смартфоны), могут использовать небольшие устройства, выполненные в форм-факторе SD (модемы, GPS-приемники, ТВ-тюнеры и т.п.).
Ведется подготовка к реализации Wireless USB, в рамках которой добавляется поддержка USB-авторизации. Она позволяет выбирать, какие USB-устройства могут использоваться, а какие - нет. Управлять доступом можно из юзерспейс, записывая «0» для запрета в /sys/bus/usb/devices/УСТРОЙСТВО/authorized.

Порог сбрасывания грязных буферов стал отдельным для каждого блочного устройства и высчитывается на основе скорости записи. Нововведение существенно повысит производительность в системах с очень медленными или очень быстрыми устройствами хранения.

Появляется поддержка Large Receive Offload (LRO). Серия TCP-пакетов объединяется в один, за счет чего производительность также растет.

2.6.25 - 17 апреля

Новый механизм Memory Resource Controller позволяет использовать независимые методики управления памятью для заданных групп процессов (Task Control Groups). Применять это можно для изолирования отдельных приложений в небольшую область памяти, размер которой они не смогут превысить. Патчи написаны разработчиками OpenVZ и задействованы в их решениях виртуализации.

В планировщик задач добавляют возможность планировки групп задач в реальном режиме. Теперь все процессы, требующие работы в реальном времени, могут быть помещены в отдельную группу или просто запущены от имени специального пользователя.

За каждым процессом в виртуальной файловой системе proc теперь закреплен специальный файл pagemaps, который в бинарном формате содержит позиции всех страниц памяти, используемых процессом.

В ядро включена новая система мандатного контроля доступа SMACK, выполненная в виде LSM-модуля. SMACK реализован через закрепление меток к процессам и сущностям (файлы, пакеты, сокеты и т.д.), – в реализации и конфигурировании он проще, чем SELinux.

Приняты патчи, реализующие поддержку утилиты LatencyTOP (www.latencytop.org) на уровне ядра. Благодаря LatencyTOP, разработчик может выявить в своей программе все узкие места и устранить их.

Ядро обзаводится более высоким уровнем защиты для приложений – за что скажем «спасибо» интеграции некоторых патчей, разработанных в рамках проекта Exec Shield (people.redhat.com/mingo/exec-shield)! Адресное пространство после системного вызова brk() теперь рандомизируется, что существенно усложняет некоторые типы атак.

Компания Volkswagen дарит код с реализацией стека протоколов CAN (Controller area network) – они используются во встраиваемой технике и предназначены для связывания в сеть различных устройств и датчиков.

Разработчики допиливают подсистему ACPI, в которой появился API для автоматического управления температурой (устройство программируется так, чтобы включить кулер или понизить частоту при достижении заданной температуры).

Ext4 продолжает стремительное развитие и обзаводится такими новшествами, как:

  1. Возможность задать размер блока вплоть до размера страницы виртуальной памяти, что для многих платформ означает 64 Кб.
  2. Увеличенные максимальные размеры файлов и всей ФС.
  3. Контрольные суммы журнала, которые не позволяют файловой системе навредить себе, если журнал не успел полностью записаться на диск или был поврежден.
  4. Версионирование inode для надежной работы NFS четвертой версии.
  5. ФС стала «Extent-based» (это означает существенный выигрыш в скорости при работе с большими файлами).
  6. Блоки распределяются целыми группами. На производительности это сказывается, опять же, положительно.

В списке поддерживаемых архитектур теперь значится MN10300/AM33, применяемая в cерверах NAS и одноплатных платформах Orion.

2.6.26 - 14 июля

Части файловых систем, монтируемых с помощью команды «mount --bind», с 14 июля можно сделать незаписываемыми. Такая особенность используеться для создания изолированных окружений, владелец которых имеет root-доступ, но не может изменить определенные каталоги.

Модуль KVM, предназначенный для создания виртуализированных окружений, отныне поддерживает архитектуры IA64, PPC и S390 – и обладает поддержкой паравиртуализации.

Новый стек беспроводных протоколов, интегрированный еще в 2.6.22, теперь поддерживает черновую версию стандарта 802.11s, разработанную проектом Open80211s (www.open80211s.org).

Новая технология под названием «Per-process securebits» позволяет привязать повышение привилегий с помощью setuid-бита только для конкретного процесса, игнорируя всех его потомков (в обычной ситуации они тоже бы получили повышенные права).

Контейнеры cgroups (Control Groups) могут быть ограничены в возможностях обращения к оборудованию через списки разрешенных устройств.

В ядре появляется собственный тестер памяти на ошибки, созданный по образу и подобию программы memtest (www.memtest.org), но более простой и не такой эффективный. Для тестирования памяти достаточно указать параметр memtest при загрузке.

Параметры порога сбрасывания грязных буферов на диск теперь можно настроить через /sys/class/bdi, а информация о точках монтирования доступна отдельно для каждого процесса в файле /proc/$PID/mountinfo.

Для устройств PCI Express добавлена поддержка технологии ASPM (Active State Power Management). С ней можно более эффективно управлять потреблением энергии через частичное обесточивание устройства во время бездействия.

Наконец, Линус Торвальдс нисходит с небес к обычному люду и позволяет включить в ядро отладчик KGDB, требующий отдельную машину для трассировки происходящих событий. Этого события многие ждали с момента выхода первой версии ядра!

2.6.27 - 9 октября

Linux обзаводится поддержкой файловой системы UBIFS, разработанной компанией Nokia и предназначенной для работы на flash-накопителях с ограниченным числом записи данных. UBIFS не требует эмуляции блочного устройства со стороны накопителя и превосходит JFFS2 по скорости монтирования, наличию журнала транзакций, поддержке отложенной записи и прозрачной компрессии данных.

Кроме UBIFS, ядро получает реализацию файловой системы OMFS (Sonicblue Optimized MPEG File System support), созданной специально для хранения MPEG-файлов и используемой в некоторых мультимедиа-плеерах.

Появляется поддержка Multiqueue networking, позволяющая создать несколько независимых очередей пакетов для одного устройства. Предполагается, что механизм будет работать в связке с технологией Wireless Multimedia Extension, поддерживаемой некоторыми беспроводными картами для параллельной передачи видео, голоса и данных.

Системные вызовы, оперирующие с файловыми дескрипторами, получают специальный флаг «close-on-exec». Файловый дескриптор будет закрыт во время вызова fork(). Это сведет на нет атаки, основанные на использовании дескрипторов, открытых родительским процессом.

Ядро получает новый механизм засыпания, основанный на системных вызовах kdump и kexec. Первый позволяет сделать «мгновенный снимок» состояния ядра, а второй - загрузить новое ядро в память и передать на него управление без перезагрузки. Перед выключением питания kdump сбрасывает снимок на диск, а после включения kexec восстанавливает его. Этот подход отнюдь не призван заменить традиционный, но может быть полезен в системах без поддержки ACPI.

Подсистема блочных устройств теперь умеет использовать такие нововведения SCSI- и SATA-протоколов, как «SBC Data Integrity Field» и «External Path Protection» для добавления контрольных сумм к записываемым данным.

Разработчики получают в распоряжение механизм mmiotrace, созданный для трассировки операций ввода/вывода, отраженных в память. Его можно использовать, например, для исследования и реверс инжиниринга бинарных драйверов.

Бинарные блоки firmware отныне не являются частью ядра или модулей. Вместо этого они копируются в каталог /lib/firmware во время исполнения команды «make modules_install» и загружаются драйверами по мере необходимости.

В Ext4 теперь есть механизм отложенного распределения информации. После системного вызова write() файловая система откладывает запись на диск не только самих данных, но и необходимых для их хранения структур (в основном, различные изменения в суперблоке). Это позволяет повысить производительность файловых операций и снизить фрагментацию данных. Похожим образом ведут себя ZFS, XFS, Btrfs и Reiser4.

В ядро принимаются патчи gprca (mxhaard.free.fr/download.html) с реализацией драйверов для более чем 230 USB-вебкамер. В списке поддерживаемых аппаратных платформ появляется строчка: одночиповые ПК Marvell Loki.

2.6.28 - 25 декабря

Ext4 перестает быть экспериментальной разработкой. Фаза всестороннего тестирования завершена, и новая файловая система получает статус стабильной и рекомендованной для использования всем желающим.

Добавлена новая подсистема GEM (Graphics Execution Manager), предназначенная для низкоуровнего доступа к памяти видеоадаптера. GEM разработан компанией Intel и по задумке должен стать универсальной точкой доступа к видеопамяти для всех драйверов. А также – принести такие вкусности, как переключение видеорежима на уровне ядра (то есть, никаких скачков во время переключения из «иксов» в консоль и обратно!) и совместный доступ нескольких приложений к видеокарте. Пока GEM работает только с драйвером i915, но уже показывает увеличение производительности 3D-приложений примерно на 50%.

Стек Wireless USB теперь работает благодаря интеграции в ядро поддержки технологии передачи данных UWB (Ultra Wide Band), использующей широкий спектр радио-частот (3.1-10.6 ГГц) и предназначенной для применения в домашних условиях (дальность до 10 метров). Кроме того, ядро теперь включает несколько драйверов для UWB-радиоконтроллеров, следующих спецификации Wireless USB 1.0.

Алгоритм замещения страниц оптимизирован для систем с очень большим объемом ОЗУ. Поиск кандидатов на место в своп-области производится не по всем страницам памяти (может отнять слишком много времени), а по специальному списку, учитывающему только страницы загруженных в память файлов и анонимные страницы (например, выделенные с помощью malloc()).

Контейнеры cgroup теперь могут быть «заморожены», – это можно использовать для решений виртуализации. Появляется возможность экстренной парковки головок дисков. Некоторые ноутбуки снабжены специальной технологией, работающей в паре с акселерометром. Она способна определить момент падения ноутбука и предупредить операционную систему о приближающемся конце своей жизни. Linux теперь в силах спасти жесткий диск от повреждений!

В netfilter появляется возможность прозрачного проксирования через указание цели TPROXY в iptables. Механизм Multiqueue networking стал способен помещать пакеты в очередь в соответствии с заданным приоритетом.

Итоги

Сжатая картина развития ядра Linux, обрисованная на четырех полосах, конечно, не может дать полного представления о гигантских изменениях, происходящих в ядерной кухне, но выводы позволяет сделать вполне конкретные:

  1. Принципы разработки ядра Linux даже не собираются сдвигаться в сторону правильного дизайна или конкретного пути развития. Изменения столь разрозненны, что, наверное, сам Линус Торвальдс не понимает, к чему все это в итоге приведет.
  2. Сегодняшний Linux есть не что иное, как огромный пирог, выпекаемый массой компаний-поваров, каждая из которых жаждет получить желаемый лакомый кусочек, приложив для этого минимум усилий. Как результат, один край пирога оказывается сладким, а другой - солоноватым.
  3. Общая картина изменений говорит о постепенном уходе ядра в мир смартфонов и планшетов, а также о развитии идей виртуализации (что, впрочем, вполне закономерно).
  4. Разработчики выдумывают множество самых разнообразных технологий отладки и трассировки, – это свидетельствует о все большем усложнении ядра.
  5. Даже основная ветка ядра не перестает быть площадкой для многочисленных экспериментов.
Содержание