- Что лучше deb или rpm
- Основы
- RPM (Red Hat Package Manager)
- Deb (Debian Package Manager)
- Аналоги команд
- Что такое .deb и .rpm и как они отличаются от .msi?
- дистрибутивы
- Что особенного в них?
- Что относительно MSI-файлов?
- Рекомендации
- Linux многоликий: как работать на любом дистрибутиве
- Пакетные менеджеры. .deb vs .rpm
- Проблема зависимостей
- Альтернатива пакетным менеджерам
- Проблема обновлений
- Разнообразие аппаратных платформ
- Статическая и/или динамическая линковка
- Сборка С/С++ приложений
- Open Build Service
- kernel ABI
- Патчи и бэкпорты
- Подпись модулей ядра
- EFI на виртуальных машинах
- Экспериментальные дистрибутивы
Что лучше deb или rpm
Установка программного обеспечения — очень важный момент в работе с операционной системой. Сейчас есть две самые распространенные системы установки программного обеспечения. Это используемая в Debian и всех ее производных, в том числе и в Ubuntu — deb, а также разработанная в RedHat и используемая в Red Hat и всех основанных на ней дистрибутивов — rpm.
Обе системы и deb и rpm полнофункциональные, легкие в использовании и имеют очень большое количество программного обеспечения. Многих пользователей интересует в чем разница между этими двумя системами. Но в интернете мы находим только общие сведения вроде того что уже выше написано. В этой статье мы попытаемся разобраться что лучше deb или rpm. Также попытаемся вникнуть в суть их различий.
Основы
С точки зрения пользователя, эти два варианта установки пакетов не имеют очень больших различий. Оба файла и Deb и Rpm — это всего лишь архивы, созданные с помощью утилиты ar. Эти архивы включают в себя файлы программ, исполняемые файлы, библиотеки, или файлы конфигурации. Кроме этого, в каждый пакет входят метаданные системы управления пакетами, именно этим и отличаются rpm и deb. Собственно файлы пакетов отличаются в основном только этим, но еще есть система управления пакетами. А там уже различий в базе данных намного больше.
Давайте рассмотрим каждую систему управления пакетами подробнее, а затем сравним что же в них особенного, и что лучше rpm или deb.
RPM (Red Hat Package Manager)
Как мы уже говорили, RPM — это менеджер пакетов, используемый в операционных системах, основанных на Red Hat, это вся ветка дистрибутивов: Fedora, OpenSUSE, Red Hat, CentOS и т д. Изначально этот пакетный менеджер был разработан в компании Red Hat еще в 1997 году и только для их дистрибутива, но затем он распространился и в другие операционные системы. Вместо обычного сжатия здесь используется сжатие gzip по алгоритму cpio и особый формат файла архива, его мы рассмотрим ниже. Здесь в сравнении rpm или deb, первый кажется лучше, но не все так просто, если в системе нет нужных утилит, то вы не сможете распаковать такой пакет. Кроме cpio могут использоваться и другие алгоритмы сжатия, например, lzma или xz. В последнее время все программное обеспечение подписывается ключами для удостоверения подлинности, вот и RPM поддерживает подпись с помощью GPG и MD5. Технология PatchRPMs или DeltaRPMs позволяет грамотно обновлять RPM пакеты без больших затрат трафика.
Хоть и сказано, что файл rpm — это обычный архив, это не совсем так. Вначале файла находится заголовок, который идентифицирует файл как rpm архив, затем идет подпись, для проверки целостности и подлинности файла. Дальше идет заголовок, в котором содержаться данные о самом пакете, версия, архитектура, список файлов и т д. И только после всего этого идет сам архив с файлами пакета.
Для работы с RPM могут использоваться несколько различных пакетных менеджеров, это универсальная утилита rpm, пакетный менеджер zypper в OpenSUSE, dnf в Fedora, urpmi в Mageia, yum — во многих дистрибутивах, основанных на Fedora.
Рассмотрим основные особенности RPM:
- Автоматическое разрешение зависимостей в большинстве случаев корректно
- Файл архива имеет специальный формат
- Не поддерживается реализация зависимостей с выбором завистимости от пакет1 или пакет2.
- Не поддерживаются рекомендованные пакеты
- Позволяет настроить зависимость от файла, а не пакета
- Все данные об установленных пакетах хранятся в базе данных поэтому при надобности можно проверить контрольные суммы
- Поддерживаются сценарии как до, так и после установки программ
- Поддерживается формат SRPM, который содержит в себе исходники программы все патчи с инструкции по сборке, позволяющие собрать программу из исходников на локальной машине.
- Отличная поддержка Multilib пакетов
Deb (Debian Package Manager)
Файлы deb — это архивы, созданные с помощью утилиты ar. Они могут быть сжаты с помощью GZIP, Bzip2, lzma, или XZ. Чаще всего для управления пакетами deb в терминале используется утилита dpkg, Но могут и другие, например, gdebi, apt, aptitude и т д. Deb пакеты используются для установки программного обеспечения во многих операционных системах, основанных на Debian, это ветка Ubuntu со многими основанными на ней дистрибутивами и так далее. Поскольку Ubuntu в последнее время набирает популярность среди новичков, то пакетов для нее становится больше.
Из особенностей системы управления пакетами DEB можно назвать использование приоритетов для классификации пакетов по важности, а также поддержку рекомендованных пакетов. Это пакеты, которые не находятся в зависимостях программы, но желательны для установки вместе с ней. Рекомендованные утилиты устанавливаются автоматически в таком инструменте, как apt. Чтобы сравнить rpm vs deb рассмотрим особенности deb:
- Файл пакета — обычный архив
- Поддержка приоритетов для пакетов различной важности
- Поддержка рекомендованных пакетов
- Не поддерживаются файловые зависимости
- Не поддерживается технология Delta для экономии трафика
Аналоги команд
Давайте рассмотрим аналоги команд для выполнения одних и тех же действий в этих системах управления пакетами с помощью утилит rpm и dpkg:
Источник
Что такое .deb и .rpm и как они отличаются от .msi?
Каковы эти форматы файлов и как они отличаются от формата .msi в Windows? И каковы плюсы и минусы этих схем управления пакетами?
Файлы, такие как .deb и .rpm , больше похожи на файл .zip . Это дерево каталогов файлов и подкаталогов, содержащих файлы, относящиеся к определенному приложению и / или библиотеке файлов.
дистрибутивы
Файлы .deb предназначены для дистрибутивов Linux, которые производятся от Debian (Ubuntu, Linux Mint и т. Д.). Файлы .rpm используются в основном дистрибутивами, основанными на дистрибутивах Redhat (Fedora, CentOS, RHEL), а также дистрибутивом openSuSE.
Что особенного в них?
Эти файлы имеют еще одну особенность, которая отличает их от .zip файлов, поскольку они могут включать спецификацию, содержащую правила, которые сообщают программному менеджеру пакетов, запущенному в системе, которая устанавливает один из этих файлов для выполнения дополнительных задач. Эти задачи включают такие вещи, как:
- создание учетных записей пользователей в системе
- создание / изменение файлов конфигурации, которые фактически не содержатся в файле .deb или .rpm
- установить права собственности / разрешения на файлы после установки
- запускать команды как root в системе, устанавливающей пакет
- зависимости, оба формата могут включать имена или пакеты и / или имена служб, которые они должны присутствовать в системе, перед установкой.
Что относительно MSI-файлов?
.msi файлы похожи на файлы .deb и .rpm но, вероятно, еще более сложные. Файлы .msi используются установщиком Windows и предлагают дополнительные функции, такие как:
- Графический интерфейс
- создание последовательностей удаления
- Рамка внутри себя – для использования сторонними установщиками
- Rollbacks
- Реклама
- Пользовательский интерфейс
- и т.п.
Я бы предложил взглянуть на различные страницы Википедии по этим темам, если вы хотите получить более подробное объяснение.
Рекомендации
- Установщик Windows – .msi
- Формат файла RPM
- Формат файла DEB
Другие ответы касаются качеств .deb и .rpm , которые похожи на .msi . Все они содержат программное обеспечение в сжатом формате, что может сделать некоторые дополнительные вещи. Эти дополнительные вещи, о которых уже упоминалось, включали добавление пользователей, задачи до и после установки, регистрацию программы в системе (например, реестр Windows, xdg-dirs, OpenRC / systemd init и т. Д.).
Что отличает форматы (и является огромным профи) – это зависимости. Оба файла .deb и .rpm могут содержать имена и версии других программ, которые должны быть установлены в качестве необходимого программного обеспечения. Сами по себе это просто информационное, но …
Обычно вы не напрямую взаимодействуете с файлами .deb и .rpm так же, как и с .msi файлами. На самом деле, как упоминалось ранее, .deb обычно представляет собой только архив (ar или tar), сжатый с помощью xz, с содержащимися файлами в определенном макете каталога. Вместо этого вы используете такие инструменты, как dpkg и rpm для управления этими файлами.
dpkg и rpm будут устанавливать содержимое файлов .deb и .rpm и проверять все необходимое программное обеспечение. Выполнение этих программ аналогично щелчку на файле .msi . Однако пользователи обычно не взаимодействуют с dpkg или rpm но вместо этого используют apt-get и yum для установки пакетов. Эти инструменты не имеют точных аналогов в окнах.
Оба apt-get и yum могут извлекать файлы из удаленных (или локальных) репозиториев и использовать информацию о зависимостях, хранящуюся в файлах .deb и .rpm для извлечения и установки любых предварительных условий, которые не были выполнены. С помощью этих инструментов мне не нужно знать или беспокоиться о том, какое другое программное обеспечение мне нужно, я могу просто указать apt-get install chromium и знаю, что apt-get будет уверен, что у меня есть gtk +, alsa, некоторые библиотеки X и т. Д. чтобы вручную найти и установить эти файлы .deb и .rpm .
apt-get и yum – это два больших менеджера пакетов, вы также найдете emerge и pacman , которые выполняют те же задания, но с разными базовыми механизмами.
Он имеет те же функции, что и файл MSI под Windows:
- он регистрирует программное обеспечение в реестре,
- он регистрирует, какие файлы были установлены с этим пакетом.
В Linux они также управляют зависимостями между другими пакетами.
Эти форматы управления пакетами делают многое другое, но это основные функции.
.rpm – это RPM-пакеты, которые относятся к типу пакета, используемому для дистрибутивов Red Hat и Red Hat (например, Fedora, RHEL, CentOS). Файлы .deb представляют собой пакеты DEB, которые являются типом пакета, используемым Debian и Debian-производными (например, Debian, Ubuntu).
При загрузке они обычно устанавливаются через команды rpm и dpkg соответственно на соответствующие дистрибутивы. Другими словами, это файлы, которые устанавливаются с помощью rpm и dpkg а не файлов .msi или .exe которые являются исполняемыми файлами, которые сами устанавливают.
Пакеты RPM и DEB отличаются от MSI несколькими способами.
- Как и выше, это файлы, для которых требуются другие инструменты (например, rpm и dpkg ) для установки.
- Когда они установлены, они добавляются в базу данных, что не относится к файлам MSI. Файлы MSI перечисляют программу в реестре, но удаление с помощью панели управления вряд ли полностью удалит все установленные файлы с диска. Таким образом, когда пакеты RPM и DEB удаляются, все файлы удаляются чисто.
- Обычно они не загружаются и не устанавливаются напрямую, а через менеджеров пакетов, таких как yum и aptitude соответственно, есть так называемые репозитории, которые предлагают пакеты, скомпилированные для соответствующей системы, и менеджер пакетов автоматически устанавливает все зависимости из данных в репозиториях.
- Установленные пакеты обычно запускают несколько инструментов настройки, например, если вы устанавливаете GDM в систему, уже установленную с LightDM, инструменты спрашивают, предпочитаете ли вы использовать GDM LightDM.
- При установке пакетов, за исключением зависимостей, предлагаются некоторые пакеты, которые показывают, что пакеты не требуются, но могут быть полезны для пользователя.
Оба .deb и .rpm – это пакеты программного обеспечения для GNU / Linux Distributions, содержащие программное обеспечение (программы, приложения (приложения) и т. Д.) И информацию для программного обеспечения «* installer *» о самом программном обеспечении и инструкции о том, как установить, что и где правильно.
- .deb → Debian Software Package , в дистрибутивах Debian (на основе). Установлен через apt / aptitude (Командная строка) или графически через, например, « Synaptic » « Центр программного обеспечения Ubuntu », « Gdebi », …
- .rpm → Менеджер пакетов Red Hat : в Fedora / Red Hat (на основе) дистрибутивов Linux. Устанавливается через eg yum (командная строка) или графически через, например, » yumex «
- .msi → Microsoft Installer : Совсем так же, как и выше, для ОС Microsoft Windows
Сами установки также могут обрабатывать обслуживание, обновление и / или удаление пакетов. Также: здесь « установщик » означает программное обеспечение для правильного выполнения этих задач – он также предоставляет указанную информацию самому пользователю, конечно, для выполнения таких задач вручную.
.deb : пакет Debian, используемый для дистрибутивов Linux на базе Debian, таких как Ubuntu, Linux Mint и т. д.
.rpm : установка rpm для дистрибутивов Linux на базе Red Hat, таких как RHEL, Fedora и CentOS
.msi : Двоичный установщик для платформы Windows
Источник
Linux многоликий: как работать на любом дистрибутиве
Создать приложение для резервного копирования, работающее на любом дистрибутиве — задачка непростая. Чтобы обеспечить работу Veeam Agent for Linux на дистрибутивах от RHEL 6 и Debian 6, до openSUSE Leap 15.1 и Ubuntu 19.04 приходится решать спектр проблем, особенно если учесть, что в состав программного продукта входит модуль ядра.
Статья создана по материалам выступления на конференции LinuxPiter 2019.
Linux — это не просто одна из самых популярных ОС. По сути, это платформа, на базе которой можно сделать что-то уникальное, что-то своё. Благодаря этому у Linux множество дистрибутивов, которые отличаются набором программных компонентов. И тут возникает проблема: чтобы программный продукт функционировал на любом дистрибутиве, приходится учитывать особенности каждого.
Пакетные менеджеры. .deb vs .rpm
Начнём с очевидной проблемы распространения продукта для разных дистрибутивов.
Самый типичный способ распространения программных продуктов — это выложить пакет на репозиторий, чтобы встроенный в систему пакетный менеджер смог его оттуда установить.
Однако популярных форматов пакетов у нас два: rpm и deb. Значит, придётся поддержать каждый.
В мире deb-пакетов уровень совместимости поразителен. Один и тот же пакет одинаково хорошо ставится и работает как на Debian 6, так и на Ubuntu 19.04. Стандарты процесса построения пакетов и работы с ними, заложенные в старых Debian дистрибутивах, остаются актуальными и в новомодных Linux Mint и elementary OS. Поэтому в случае Veeam Agent for Linux достаточно одного deb-пакета для каждой аппаратной платформы.
А вот в мире rpm-пакетов различия велики. Во-первых, из-за того, что есть два совершенно независимых дистрибьютера Red Hat и SUSE, для которых совершенно не нужна совместимость. Во-вторых, у этих дистрибьютеров есть дистрибутивы с тех. поддержкой и экспериментальные. Между ними совместимость тоже не нужна. У нас получилось, что для el6, el7 и el8 свои пакеты. Отдельно пакет для Fedora. Пакеты для SLES11 и 12 и отдельный для openSUSE. Основная проблема — в зависимостях и именах пакетов.
Проблема зависимостей
Для EL7: | Для SLES 12: |
---|---|
|
|
В результате список зависимостей оказывается уникальным для дистрибутива.
Хуже бывает, когда под старым именем пакета начинает прятаться обновлённая версия.
В Fedora 24 обновился пакет ncurses c версии 5 до версии 6. Наш продукт собирался именно с 5-той версией, для обеспечения совместимости со старыми дистрибутивами. Чтобы воспользоваться старой 5-той версией библиотеки на Fedora 24, пришлось использовать пакет ncurses-compat-libs.
В результате для Fedora появляется два пакета, с разными зависимостями.
Дальше интереснее. После очередного обновления дистрибутива пакет ncurses-compat-libs с 5-той версией библиотеки оказывается недоступным. Для дистрибьютера накладно тянуть старые библиотеки в новую версию дистрибутива. Спустя некоторое время проблема повторилась и в дистрибутивах SUSE.
В результате для некоторых дистрибутивов пришлось отказаться от явной зависимости от ncurses-libs, а продукт поправить так, чтобы он мог работать с любой версией библиотеки.
Кстати, в 8-й версии Red Hat больше нет мета-пакета python, который ссылался на старый добрый python 2.7. Есть python2 и python3.
Альтернатива пакетным менеджерам
Проблема с зависимостями стара и давно очевидна. Вспомнить хотя бы Dependency hell.
Объединить разнообразные библиотеки и приложения так, чтобы все они стабильно работали и не конфликтовали — собственно, эту задачу и пытается решать любой дистрибьютор Linux.
Совсем иначе пытается решать эту проблему пакетный менеджер Snappy от Canonical. Основная идея: приложение выполняется в изолированной и защищённой от основной системы песочнице. Если приложению нужны библиотеки, то они поставляются вместе с самим приложением.
Flatpak также позволяет запускать приложения в песочнице, используя Linux Containers. Есть ещё AppImage, который позволяет создавать портативные образы программ.
Эти решения позволяют создавать один пакет для любых дистрибутивов. В случае с Flatpak и AppImage установка и запуск приложения возможна даже без ведома администратора.
Основная проблема в том, что не все приложения могут работать в песочнице и без root привилегий. Некоторым нужно прямое обращение к платформе. Я уж не говорю про модули ядра, которые жёстко зависят от ядра и никак не вписываются в концепцию песочницы.
Вторая проблема – популярные в enterprise-среде дистрибутивы от Red Hat и SUSE ещё не содержат поддержку Snappy и Flatpak.
В связи с этим Veeam Agent for Linux нет ни на snapcraft.io ни на flathub.org.
В завершение вопроса о пакетных менеджерах замечу, что есть вариант отказаться вовсе от пакетных менеджеров, объединив в один пакет бинарные файлы и скрипт для их установки.
Такой bundle позволяет создать один общий пакет для разных дистрибутивов и платформ, производить интерактивный процесс установки, осуществляя необходимую кастомизацию. Я сталкивался с такими пакетами для Linux только от VMware.
Проблема обновлений
Даже если все проблемы с зависимостями решены, программа может работать по-разному на одном и том же дистрибутиве. Дело в обновлениях.
Есть 3 стратегии обновления:
- Самая простая – не обновлять никогда. Настроил сервер и забыл. Зачем обновления, если всё работает? Проблемы начинаются при первом же обращении в службу поддержки. Создатель дистрибутива поддерживает только обновлённый релиз.
- Можно довериться дистрибьютеру и настроить автоматическое обновление. В этом случае звонок в службу поддержки вероятен сразу после неудачного обновления.
- Вариант ручного обновления только после его обкатки на тестовой инфраструктуре – самый верный, но дорогой и трудоёмкий. Далеко не все способны его себе позволить.
Так как разные пользователи применяют разные стратегии обновления, то и поддерживать нужно и самый свежий релиз, и все ранее выпущенные. Это усложняет и процесс разработки, и процесс тестирования, добавляет головной боли службе поддержки.
Разнообразие аппаратных платформ
Различные аппаратные платформы – это проблема, в значительной степени специфичная именно для native-кода. Как минимум, приходится собирать бинарники для каждой поддерживаемой платформы.
В проекте Veeam Agent for Linux мы всё никак не можем поддержать хоть что-нибудь такое RISC-овое.
Подробно останавливаться на этом вопросе не буду. Обозначу лишь основные проблемы: платформозависимые типы, такие как size_t , выравнивание структур и byte order.
Статическая и/или динамическая линковка
А вот вопрос «Как линковаться с библиотеками — динамически или статически?» стоит обсудить.
Как правило, С/С++ приложения под Linux используют динамическую линковку. Это отлично работает в том случае, если приложение собрано специально под конкретный дистрибутив.
Если же стоит задача охватить разнообразные дистрибутивы одним бинарным файлом, то приходится ориентироваться на самый старый поддерживаемый дистрибутив. Для нас это Red Hat 6. Он содержит gcc 4.4, который даже стандарт С++11 поддерживает не полностью.
Мы собираем наш проект с помощью gcc 6.3, который полностью поддерживает C++14. Естественно, в таком случае на Red Hat 6 библиотеку libstdc++ и boost приходится тащить с собой. Проще всего линковаться с ними статически.
Но увы, не со всеми библиотеками можно линковаться статически.
Во-первых, системные библиотеки, такие как libfuse, libblkid необходимо линковать динамически, чтобы быть уверенным в совместимости их с ядром и его модулями.
Во-вторых, есть тонкость с лицензиями.
Линцензия GPL в принципе разрешает линковать библиотеки только с opensource кодом. MIT и BSD разрешают статическую линковку и позволяют включать библиотеки в проект. А вот LGPL вроде как не противоречит статической линковке, но требует предоставить в общий доступ файлы, необходимые для связывания.
В общем случае использование динамической линковки обезопасит от необходимости что-то предоставлять.
Сборка С/С++ приложений
Для сборки С/С++ приложений для разных платформ и дистрибутивов достаточно подобрать или собрать gcc подходящей версии и воспользоваться кросс-компиляторами для специфичных архитектур, собрать весь набор библиотек. Работа эта вполне реализуемая, но довольно хлопотная. И нет никаких гарантий, что выбранный компилятор и библиотеки обеспечат работоспособный вариант.
Очевидный плюс: сильно упрощается инфраструктура, так как весь процесс сборки можно выполнить на одной машине. Кроме того, достаточно собрать один набор бинарных файлов для одной архитектуры и можно паковать их в пакеты для разных дистрибутивов. Именно так собираются пакеты veeam для Veeam Agent for Linux.
В противовес этому варианту можно просто подготовить build ферму, то есть несколько машин для сборки. Каждая такая машина будет обеспечивать компиляцию приложения и сборку пакета для конкретного дистрибутива и определённой архитектуры. В таком случае компиляция производится теми средствами, которые подготовил дистрибьютер. То есть этап подготовки компилятора и подбор библиотек отпадает. Кроме того, процесс сборки может быть легко распараллелен.
Есть, правда, и минус у такого подхода: для каждого дистрибутива в рамках одной архитектуры придётся собирать свой набор бинарных файлов. Также минусом является то, что такое множество машин нужно обслуживать, выделять большое количество дискового пространства и оперативной памяти.
Таким образом собираются KMOD пакеты модуля ядра veeamsnap под дистрибутивы Red Hat.
Open Build Service
Коллеги из SUSE попробовали реализовать некоторую золотую середину в виде специального сервиса для компиляции приложений и сборки пакетов — openbuildservice.
По сути, это гипервизор, который создаёт виртуальную машину, устанавливает в ней все необходимые пакеты, выполняет компиляцию приложения и сборку пакета в этой изолированной среде, после чего такая виртуальная машина освобождается.
Реализованный в OpenBuildService планировщик сам определит, сколько виртуальных машин он может запустить для оптимальной скорости сборки пакетов. Встроенный механизм подписи сам подпишет пакеты и выложит их на встроенный репозиторий. Встроенная система версионного контроля сохранит историю изменений и сборок. Остаётся просто добавить в эту систему свои исходники. Даже сервер самому поднимать не обязательно, а можно воспользоваться открытым.
Тут, правда, есть проблема: такой комбайн трудно вписывается в существующую инфраструктуру. Например, версионный контроль не нужен, у нас уже есть свой для исходников. Механизм подписи у нас отличается: используется специальный сервер. Репозиторий тоже не нужен.
Кроме того, поддержка других дистрибутивов — к примеру, Red Hat — реализована довольно скудно, что вполне объяснимо.
Достоинством такого сервиса является быстрая поддержка очередной версии дистрибутива SUSE. До официального объявления о релизе необходимые для сборки пакеты выкладываются на публичный репозиторий. В списке доступных дистрибутивов на OpenBuildService появляется новый. Выставляем галочку, и он добавляется в план сборки. Таким образом, добавление новой версии дистрибутива выполняется практически в один клик.
В нашей инфраструктуре с использованием OpenBuildService собирается всё многообразие KMP пакетов модуля ядра veeamsnap для дистрибутивов SUSE.
Далее я хотел бы остановиться на вопросах, специфичных именно для модулей ядра.
kernel ABI
Модули ядра Linux исторически распространялись в виде исходных текстов. Дело в том, что создатели ядра не обременяют себя заботой о поддержке стабильного API для модулей ядра, а тем более на бинарном уровне, далее kABI.
Чтобы собрать модуль для ванильного ядра, обязательно нужны header-ы именно этого ядра, и работать он будет только на этом ядре.
DKMS позволяет автоматизировать процесс сборки модулей при обновлении ядра. В результате пользователи репозитория Debian (и его многочисленных родственников) используют модули ядра либо из репозитория дистрибьютера, либо собираемые из исходников с помощью DKMS.
Однако такая ситуация не особо устраивает Enterprise-сегмент. Распространители проприетарного кода хотят распространять продукт в виде собранных бинарников.
Администраторы не хотят держать средства разработки на production-серверах из соображений безопасности. Дистрибьютеры Enterprise Linux — такие, как Red Hat и SUSE — решили, что для своих пользователей стабильное kABI они смогут поддержать. В результате появились KMOD пакеты для Red Hat и KMP пакеты для SUSE.
Суть такого решения довольно проста. Для конкретной версии дистрибутива API ядра freeze-ится. Дистрибьютор заявляет, что он использует именно ядро, например, 3.10, и вносит только исправления и улучшения, которые никак не затрагивают интерфейсы ядра, а собранные для самого первого ядра модули могут быть использованы для всех последующих без перекомпиляции.
Red Hat заявляют о kABI совместимости для дистрибутива на протяжении всего жизненного цикла. То есть собранный модуль для rhel 6.0 (релиз ноября 2010) должен также работать и на версии 6.10 (релиз июня 2018). А это почти 8 лет. Естественно, задача это довольно сложная.
Мы зафиксировали несколько случаев, когда из-за проблем с kABI совместимостью модуль veeamsnap переставал работать.
После того, как модуль veeamsnap, собранный для RHEL 7.0, оказался несовместим с ядром из RHEL 7.5, но при этом загружался и гарантированно ронял сервер, мы отказались от использования kABI совместимости для RHEL 7 вообще.
В настоящий момент KMOD пакет для RHEL 7 содержит сборку для каждой версии релиза и скрипт, который обеспечивает загрузку модуля.
SUSE к задаче kABI совместимости подошли более осторожно. Они обеспечивают kABI совместимость только в рамках одного service pack.
Например, релиз SLES 12 состоялся в сентябре 2014. А SLES 12 SP1 уже в декабре 2015, то есть прошло чуть больше года. Несмотря на то, что оба релиза используют ядро 3.12, они kABI несовместимы. Очевидно, что поддерживать kABI совместимость в течение всего лишь года значительно проще. Годовой цикл обновления модуля ядра не должен вызывать проблем у создателей модулей.
В результате такой политики SUSE мы не зафиксировали ни одной проблемы с kABI совместимостью у нашего модуля veeamsnap. Правда, и число пакетов для SUSE почти на порядок больше.
Патчи и бэкпорты
Несмотря на то, что дистрибьютеры стараются обеспечить kABI совместимость и стабильность ядра, они ещё и стараются улучшить производительность и устранить дефекты этого стабильного ядра.
При этом кроме собственной «работы над ошибками» разработчики ядра enterprise linux отслеживают изменения в ванильном ядре и переносят их в своё «стабильное».
Иногда это приводит к новым ошибкам.
В последнем релизе Red Hat 6 в одном из минорных обновлений была допущена ошибка. Она приводила к тому, что модуль veeamsnap гарантированно валил систему при освобождении снапшота. Сравнив исходники ядра до и после обновления, мы выяснили, что виной всему был backport. Аналогичный фикс был произведён в ванильном ядре версии 4.19. Вот только в ванильном ядре этот фикс работал нормально, а при переносе его в «стабильное» 2.6.32 возникла проблема со спин-блокировкой.
Конечно, ошибки встречаются у всех и всегда, но стоило ли тащить код из 4.19 в 2.6.32, рискуя стабильностью. Я не уверен…
Хуже всего, когда к перетягиванию каната «стабильность» «модернизация» подключается маркетинг. Отделу маркетинга нужно, чтобы ядро обновлённого дистрибутива был стабильным, с одной стороны, и в тоже время было лучше по производительности и имело новые функции. Это приводит к странным компромиссам.
Когда я попробовал собрать модуль на ядре 4.4 от SLES 12 SP3, я с удивлением обнаружил в нём функционал из ванильного 4.8. На мой взгляд, реализация блочного ввода/вывода ядра 4.4 от SLES 12 SP3 больше походит на ядро 4.8, чем на предыдущий релиз стабильного 4.4 ядра от SLES12 SP2. Каков был процент перенесённого кода из ядра 4.8 в SLES-овский 4.4 для SP3 я судить не берусь, однако назвать ядро всё тем же стабильным 4.4 у меня язык не поворачивается.
Самое неприятное в этом то, что при написании модуля, который бы одинаково хорошо работал на разных ядрах, более нельзя опираться на версию ядра. Приходится ещё и учитывать дистрибутив. Хорошо, что иногда можно завязаться на дефайн, который появляется вместе с новым функционалом, однако такая возможность появляется не всегда.
В результате код обрастает причудливыми директивами условной компиляции.
Встречаются ещё и патчи, которые меняют задокументированное API ядра.
Наткнулся на дистрибутив KDE neon 5.16 и был очень удивлён, увидев что вызов lookup_bdev в этой версии ядра изменил перечень входных параметров.
Чтобы собраться, пришлось в makefile добавлять скрипт, который проверяет, есть ли параметр mask у функции lookup_bdev.
Подпись модулей ядра
Но вернёмся к вопросу распространения пакетов.
Одно из достоинств стабильного kABI в том, что модули ядра в виде бинарного файла можно подписать. В этом случае разработчик может быть уверен, что модуль не был случайно повреждён или намеренно изменён. Проверить это можно командой modinfo.
Дистрибутивы Red Hat и SUSE позволяют проверять подпись модуля и загружать его, только если в системе зарегистрирован соответствующий сертификат. Сертификат представляет собой публичный ключ, которым подписывается модуль. Мы распространяем его в виде отдельного пакета.
Проблема тут в том, что сертификаты могут быть либо встроенные в ядро (их используют дистрибьютеры), либо должны быть записаны в энергонезависимую память EFI с помощью утилиты mokutil. Утилита mokutil при установке сертификата требует перезагрузить систему и ещё до загрузки ядра операционной системы предлагает администратору разрешить загрузку нового сертификата.
Таким образом, добавление сертификата требует физического доступа администратора к системе. Если машина располагается где-то в облаке либо просто в удалённой серверной и доступ есть только по сети (например, по ssh), то добавить сертификат будет невозможно.
EFI на виртуальных машинах
Несмотря на то, что уже давно EFI поддерживается практически всеми создателями материнских плат, при установке системы администратор может не задуматься о необходимости EFI, и он может быть отключён.
Не все гипервизоры поддерживают EFI. VMWare vSphere поддерживает EFI, начиная с версии 5.
Microsoft Hyper-V также получил поддержку EFI, начиная с Hyper-V for Windows Server 2012R2.
Однако в дефолтной конфигурации этот функционал для Linux машин выключен, а значит, сертификат установить нельзя.
В vSphere 6.5 выставить опцию Secure Boot можно только в старой версии веб-интерфейса, который работает через Flash. Web UI на HTML-5 пока сильно отстаёт.
Экспериментальные дистрибутивы
Ну и напоследок рассмотрим вопрос экспериментальных дистрибутивов и дистрибутивов без официальной поддержки. С одной стороны, такие дистрибутивы навряд ли встретишь на серверах серьёзных организаций. Официальной поддержки у таких дистрибутивов нет. Поэтому и обеспечивать тех. поддержку продукта на таком дистрибутиве нельзя.
Однако такие дистрибутивы становятся удобной площадкой для пробы новых экспериментальных решений. Например, Fedora, OpenSUSE Tumbleweed или Unstable версии Debian. Они довольно стабильны. В них всегда новые версии программ и всегда новое ядро. Через год этот экспериментальный функционал может оказаться в обновлённом RHEL, SLES или Ubuntu.
Так что если что-то не работает на экспериментальном дистрибутиве — это повод разобраться в проблеме и решить её. Нужно быть готовым к тому, что этот функционал скоро появится на production-серверах пользователей.
Существующий на текущий момент список официально поддерживаемых дистрибутивов для версии 3.0 вы можете изучить здесь. Но реальный список дистрибутивов, на которых наш продукт способен работать, намного шире.
Лично мне был интересен эксперимент с ОС «Эльбрус». После доработки пакета veeam наш продукт установился и заработал. Про этот эксперимент я писал на Хабре в статье.
Ну а поддержка новых дистрибутивов продолжается. Ожидаем появления на свет версии 4.0. Вот-вот должна появиться бэта, так что следите за whats-new!
Источник