Поиск по сайту:

Живое исправление ядра Linux в Ubuntu 20.04 LTS


Что случилось с обещанием оперативного исправления ядер Linux? В этой статье рассматривается его история, проблемы, а также самые дешевые и простые способы сделать это в Ubuntu Focal Fossa (20.04 LTS).

Вступление

«Живое исправление» — это акт обновления программы без остановки системы, в которой она работает. Сначала это было сделано припоем и проволокой, позже ножницами и клеем — в этом нет ничего нового. Сегодня оперативное исправление ядер Linux гораздо менее затруднительно.

В этой статье я объясню, что это такое, как оно работает (в нетехнических терминах) и откуда оно берется. В завершение я покажу, как автоматизировать обновления безопасности ядра в Ubuntu 20.04 LTS (Focal Fossa) с помощью KernelCare.

Что такое живое исправление?

В программном обеспечении патч — это небольшой фрагмент исправляющего кода. Исправление — это исправление или улучшение небольшой части программы без нарушения работы или спецификаций в целом. Оперативное (или горячее) исправление означает изменение работающей программы без ее остановки.

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

Это похоже на то, что живые исправления пытаются сделать с ядром Linux. Это попытка починить части чего-то в движении, не изменяя и не ломая его, но самое главное, не останавливая его. Ядро — единственная часть системы Linux, которую необходимо выключить и перезапустить, чтобы применить обновление. Когда поставщик выпускает обновление ядра, у системных администраторов нет другого выбора, кроме как запланировать перезагрузку сервера.

Что плохого в перезагрузке?

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

  • веб-серверы с занятыми активными пользователями во многих часовых поясах
  • многопользовательские онлайн-игры
  • потоковое видео с оплатой за просмотр в прямом эфире или в записи
  • майнинг криптовалюты
  • удаленное круглосуточное видеонаблюдение и запись

Для меня наиболее значимая причина — это страх, что система после этого не будет прежней, и не запустятся критичные (приносящие деньги) приложения. Думаю, именно это, а не видения буйствующих пользователей, заставляет многих системных администраторов откладывать обновления ядра, даже самые важные, обновления безопасности.

(Здесь я говорю только об обновлениях. обновления ядра — это что-то другое. Обновления — это совершенно новые ядра. Патчи — это обновления частей ядра, обычно исправления ошибок, которые не могу ждать, потому что они имеют последствия для безопасности или другие широкомасштабные последствия.)

Когда поставщик Linux выпускает патч для ядра, обычно он устраняет проблему безопасности. В соответствующем примечании будет сказано что-то вроде: «Установите при первой же возможности». о. Хорошего дня.'

Такие грубо написанные заметки подчеркивают дилемму, стоящую за появлением живых исправлений: должны ли вы держать пользователей «больными, но безопасными» или «сочиненными, но незащищенными»? Live patching обещает стать райским островом между Rock и Hard Place. Оперативное исправление обещает помочь сохранить ваши серверы в безопасности и на самых последних уровнях безопасности, не влияя на время простоя и не затрагивая службы.

Райский остров? В чем подвох?

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

Хотя технически возможно создавать свои собственные патчи, это требует много работы и большого количества специальных знаний. И это рискованно — плохо написанный патч может привести к краху системы. (Это сообщение на странице kpatch на github выглядит как что-то из руководства по эксплуатации парового молота: «ВНИМАНИЕ: используйте с осторожностью! Возможны сбои ядра, самопроизвольные перезагрузки и потеря данных!»)

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

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

Как работает исправление в реальном времени

Все еще в ловушке воображаемой машины, которая теперь с грохотом несется вниз к воображаемой груде (надеюсь) пустых картонных коробок, как бы вы починили тормоза? Соорудить временный домкрат для выполнения работ? Наклониться на три колеса, дождаться остановки одного, снять его, повторить до конца?

Программисты ядра Linux, должно быть, думали так же, решая проблему оперативных исправлений. Я чувствую, что в их решениях работает такой же концептуальный аппарат (подвешивание, замена, использование временных поддерживающих структур). Моя грубая аналогия с заменой тормозов, приведенная выше, иллюстрирует две противоположные стратегии, реализованные поставщиками программного обеспечения для установки исправлений в реальном времени.

  • Остановить все и исправить все сразу.
  • Подождите, пока отдельные компоненты остановятся, а затем замените их. Повторяйте, пока не закончите.

Это разделение объясняет, почему каждый поставщик предлагает разные подходы к решению одной и той же проблемы. Однако то, что они разделяют, — это использование загружаемой структуры модулей ядра Linux. Программное обеспечение, которое организует и реализует процесс установки исправлений, представляет собой модуль ядра Linux. Это означает, что в совместимые ядра легко добавить функцию исправления и так же легко удалить ее.

Прежде чем мы увлечемся, я должен упомянуть о предостережениях.

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

Эти недостатки не помешали Ksplice стать первым в области оперативного исправления Linux. Он работает путем сравнения старого и нового исходного кода, из которого создается двоичный патч. Он замораживает систему, выясняет, какие функции нужно изменить, и редактирует их заголовки. При вызове функции переключаются на новые версии. Если патч хорошо написан, управление продолжается как ни в чем не бывало.

Сейсмическое событие (описанное в следующем разделе) привело к тому, что Kgraft из Red Hat присоединился к сцене со своими собственными интерпретациями основных проблем оперативного исправления.

Kpatch сравнивает старый и новый исходный код для создания исправлений. Как и Ksplice, он работает, перенаправляя вызовы функций, используя структуру ядра ftrace, чтобы переключать измененные функции за один раз.

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

Истоки живого исправления

Как идея исправления программного обеспечения незаметно для всех проникла в этот постоянно меняющийся монолит человеческих усилий — ядро Linux?

Хотя концепция восходит к самым ранним дням программируемых вычислений, для наших целей след начинается в 2001 году, когда Microsoft представила идею непрерывного обновления системы (Windows).

Ни один из них не упоминает Linux, но приложения обширны, каждое из которых описывает, как исправить проблемы с программным обеспечением или оборудованием на компьютере без нарушения работы процессов, работающих на нем. (Если эта идея не покажется вам особенно полезной, возможно, два слова заставят вас снова задуматься: «Призрак».)

В 2008 году Джефф Арнольд объявляет о Ksplice, программном обеспечении для исправления ядер Linux без их перезапуска. Это первый в своем роде для Linux. И мы должны благодарить за это неизвестного, неназванного хакера.

Чтобы понять почему, позвольте мне вернуть вас в студенческие годы Джеффа в Массачусетском технологическом институте. Он является членом группы добровольцев, которая занимается администрированием серверов для студенческого сообщества. Один из серверов нуждается в исправлении безопасности. Он не хочет отталкивать своих пользователей, поэтому откладывает это на несколько дней.

В эти несколько дней, прежде чем он успевает обновить, кто-то взламывает систему. Единственный способ вернуть его в онлайн — это полностью переустановить его с нуля. Предположим, его коллеги заметили. Даже если предположить, что они не пострадают, я представляю, как Джефф проведет остаток семестра, медленно поджаривая пепел студенческих насмешек.

Если эта история апокрифична, то считайте ее басней, напоминанием о том, что оперативное исправление — это дитя безопасности, а не удобства. И, как и во всех хороших баснях, есть счастливый конец.

Инцидент вдохновляет Джеффа изучить, как устанавливать исправления ядра Linux без промедления и без перерыва. Он делает эту проблему темой своей магистерской диссертации 2006 года. Решение приходит в виде программного обеспечения под названием Ksplice. Вместе с коллегой он пишет статью, описывающую это, под названием «Ksplice: автоматическое обновление ядра без перезагрузки».

Джефф и трое его коллег-студентов создают компанию и в мае 2009 года выигрывают приз в конкурсе предпринимателей Массачусетского технологического института с призовым фондом 100 000 долларов. Они запускают коммерческую услугу в 2010 году. Еще через год, в виде кармического завершения, о котором мечтает каждый разработчик программного обеспечения, Oracle покупает Ksplice Inc.

Karma далека от понимания пользователей и клиентов этой удивительно полезной новой утилиты. Для них это начало длинной и изнурительной череды ночных кошмаров. Oracle полностью ассимилирует Ksplice, делая его бесплатным только для клиентов их собственных версий Linux, финансируемых за плату за поддержку.

Этот сейсмический толчок подталкивает SUSE и Red Hat к разработке собственных решений, не сообщая друг другу о своих намерениях или архитектуре решения. Они работают изолированно с 2011 по 2014 год, выпуская свои собственные подходы с разницей в несколько недель. А в мае 2014 года KernelCare.

В то же время живая прошивка Livepatch. В октябре 2016 года Canonical, создатели Ubuntu, используют его в качестве основы для коммерческого сервиса под беззастенчиво присвоенным названием «Canonical Livepatch Service». Canonical выпускает его сначала для версии 16.04 LTS, а затем для версии 14.04 LTS, обе из которых требуют настройки в командной строке. В версии 18.04 LTS он стал более заметным, простым в использовании и лучше интегрированным в рабочий стол Ubuntu, а теперь он доступен для версии 20.04 LTS.

Как это сделать: автоматические обновления безопасности ядра в Ubuntu 20.04 LTS

Теперь пришло время увидеть его в действии. Существует два решения для установки исправлений в реальном времени для Ubuntu, которые рассматриваются в следующих двух разделах.

Установка службы Canonical Livepatch (CLS)

CLS бесплатен для некоммерческих лиц на трех машинах. Для этого требуется регистрация, но вы можете использовать учетную запись Ubuntu One, если она у вас есть. Если вы хотите установить его более чем на три машины, вам придется купить соглашение о поддержке в корпоративном стиле.

Прежде чем ты начнешь

  • Убедитесь, что ваша система обновлена и создана резервная копия.
  • Зарегистрируйте учетную запись Ubuntu One.
  • Для сервера 20.04 LTS получите ключ и запишите его. (Это не требуется в настольной версии.)

Установка Livepatch на рабочий стол Ubuntu 20.04 LTS

Ubuntu 20.04 LTS Desktop имеет настройку графического интерфейса для активации CLS. Вы можете сделать это либо во время настройки после установки, либо позже, открыв Программное обеспечение и обновления и перейдя на вкладку Livepatch.

На новой установке Ubuntu

После первой перезагрузки новой установки обратите внимание на второй экран диалогового окна «Что нового в Ubuntu». Это позволяет вам настроить Livepatch.

  1. Нажмите «Настроить Livepatch…»
  2. На экране «Учетная запись единого входа Ubuntu» войдите в свою учетную запись Livepatch или Ubuntu One.
  3. Если вы используете текстовый графический интерфейс установки, в разделе «Избранные снимки сервера» выберите canonical-livepatch.

В существующей установке Ubuntu

  1. Откройте «Программное обеспечение и обновления» и перейдите на вкладку «Livepatch».
  2. Войти.
  3. После входа в систему нажмите «Продолжить», когда появится всплывающее окно, подтверждающее, что вы вошли в систему.
  4. Вот и все. Livepatch установлен на вашем рабочем столе Ubuntu 20.04.


Ошибки в Ubuntu 20.04 с Livepatch

Вы можете столкнуться со следующей ошибкой при включении Livepatch в Ubuntu 20.04 Focal Fossa:

Failed to enable Livepatch: cannot enable machine: this machine ID is already enabled with a different key or is non-unique. Either "sudo canonical-livepatch disable" on the other machine, or regenerate a unique /etc/machine-id on this machine with "sudo rm /etc/machine-id /var/lib/dbus/machine-id && sudo systemd-machine-id-setup" server response: Conflicting machine-id

Чтобы исправить ошибку, введите в терминале следующие команды:

cp /etc/machine-id /etc/machine-id.original 
cp /var/lib/dbus/machine-id /var/lib/dbus/machine-id.original
nano /etc/machine-id (to remove the existing value)
systemd-machine-id-setup
> Initializing machine ID from D-Bus machine ID.
cat /etc/machine-id

Установка Livepatch на сервер Ubuntu 20.04 LTS

Это подход командной строки для стандартных версий сервера без установленной оконной системы. Он также работает с версиями 16.04 LTS, 14.04 LTS и 18.04 LTS.

Откройте терминал и введите эти две команды:

sudo snap install canonical-livepatch
sudo canonical-livepatch enable <your key>
Советы

  • Вторая команда возвращает токен компьютера. Это бесполезно, и нет необходимости записывать это.
  • Отслеживайте машины, которые вы регистрируете. Если вы потеряете след или избавитесь от машины или виртуальной машины до отмены регистрации, вы фактически выбросите одну из своих трех бесплатных лицензий. (Здесь есть помощь.)
  • Чтобы отменить регистрацию сервера, используйте следующую команду:

sudo canonical-livepatch disable <your key>

  • Чтобы проверить статус службы, используйте эту команду:

sudo canonical-livepatch status --verbose

Установка ядра

KernelCare использует настройку из командной строки; нет графического интерфейса. Он поддерживает более широкий спектр операционных систем, включая CentOS, RHEL, Oracle Linux, Debian, Ubuntu и другие. Он также поддерживает старую линейку ядра 2.6.32.

В отличие от CLS, он полностью автоматизирован и проверяет наличие исправлений каждые четыре часа, устанавливая их без присмотра, если они доступны. Если вам нужно переопределить эту возможность или привязать серверы к исправлениям с фиксированной датой, существует утилита командной строки (kcarectl), которая позволяет вам делать это и другие вещи.

KernelCare бесплатен для некоммерческих организаций, а для остальных есть бесплатная 30-дневная пробная версия. (Если вы являетесь пользователем Ksplice, вы можете попробовать двухэтапный сценарий миграции Ksplice-to-KernelCare.)

Прежде чем ты начнешь

  • Убедитесь, что ваша система обновлена и создана резервная копия.
  • Получите бесплатный пробный ключ здесь.

Установка KernelCare на рабочий стол и сервер Ubuntu 20.04 LTS

Откройте терминал и введите эти две команды:

sudo wget -qq -O - https://repo.cloudlinux.com/kernelcare/kernelcare_install.sh | bash
sudo /usr/bin/kcarectl --register KEY

Эти команды также работают в версиях 16.04 LTS, 14.04 LTS и 18.04 LTS.

Советы

  • Чтобы отменить регистрацию сервера, используйте следующую команду:

sudo kcarectl --unregister

  • Чтобы проверить статус службы, используйте эту команду:

sudo kcarectl --info

Заключение

Оперативное исправление в Linux было слишком полезным, чтобы оставаться бесплатным долгое время.

С выпуском Ubuntu 20.04 LTS стало проще пользоваться преимуществами оперативного исправления безопасности ядер Linux, и это бесплатно для трех хостов. После этого взимаются ежегодные сборы за каждый сервер.

Если вы работаете со многими разновидностями Linux, но не хотите изучать разные продукты или подписываться на разные контракты на поддержку, взгляните на KernelCare. Это примерно в пять раз дешевле при годовой подписке, и они предлагают гибкие ежемесячные подписки.