Linux image что это

Обновлено: 07.07.2024

Что такое ядро ОС? Типы ядер

Как правило, большинство ядер ОС делятся на три типа:

Микроядро

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

небольшие требования к используемой памяти;

аппаратное обеспечение сильнее абстрагировано от системы;

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

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

Монолитное ядро

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

практически прямой доступ программ к оборудованию;

процессам проще взаимодействовать друг с другом;

если ваше устройство поддерживается ядром, никаких дополнительных установок ПО не потребуется;

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

большой размер ядра;

больший размер занимаемой памяти;

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

Гибридное ядро

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

разработчик может выбрать, какие программы будут работать в пользовательском пространстве, а какие — в пространстве ядра;

меньший размер в сравнении с монолитным ядром;

гибче в отличие от других ядер.

может страдать от пониженной производительности (как и микроядро);

работа драйверов устройств, как правило, сильнее зависит от производителей оборудования.

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

Где находится ядро Linux?

Каждый раз во время запуска (или перезапуска) системы первым компонентом, который загружается в память компьютера, является ядро Linux.

В системах Debian/Ubuntu файлы присутствующих в системе ядер расположены в каталоге /boot и именуются в виде vmlinuz-[версия_ядра] (выполнив в терминале команду uname-r , мы получим информацию о текущей версии установленного ядра):


В папке /boot вы также найдете и другие очень важные файлы:

img-[версия_ядра] — используется в качестве RAM-диска, в который распаковывается и с которого загружается ядро;

map-[версия_ядра] — используется для управления памятью до полной загрузки ядра;

config-[версия_ядра] — сообщает ядру, какие параметры и модули следует загрузить в образ ядра при его компиляции.

Примечание: Также для сжатия ядра часто применяются алгоритмы LZMA или bzip2, а сами ядра именуются zImage.

Модули ядра Linux

Модули обычно расширяют базовые возможности ядра, связанные с различной работой устройств, файловых систем и системных вызовов. Они, как правило, имеют расширение .ko и обычно хранятся в каталоге /lib/modules:


Версии ядра дистрибутивов Linux

Stable

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

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

Примечание: По данным компании Canonical, примерно 95% всех установок Ubuntu являются LTS-релизами.

Hardened

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

Zen — версия ядра Linux, ориентированная на повышение производительности и отзывчивости системы. Также говорят, что это лучшее ядро Linux для игр. Zen имеет низкую задержку и высокочастотный планировщик.

Установка/Обновление ядра Linux

Соответственно, из этого можно сделать следующие выводы:

Если вам нужно ядро Linux с правками под какой-то конкретный дистрибутив (например, Debian или Manjaro), то вам нужно скачать ядро из репозитория конкретного дистрибутива с помощью менеджера пакетов.

Есть 2 способа установки/обновления ядра Linux:

Обновление ядра Linux через менеджер пакетов.

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

Обновление ядра Linux через менеджер пакетов

Обычно, вместе с обновлением системы происходит и обновление ядра. Но если вы по каким-либо причинам хотите произвести установку/обновление непосредственно только ядра Linux, то ниже мы рассмотрим данный процесс для нескольких дистрибутивов Linux.

Linux Mint (Debian/Ubuntu)

Для начала сверим текущую установленную версию ядра:


Далее выполним поиск доступных для установки ядер (сгенерированный список может быть очень длинным, поэтому, чтобы хоть как-то ограничить вывод и сделать его постраничным, применим фильтр | more ):

$ sudo apt-cache search linux-image | more


Мой выбор пал на ядро linux-image-4.15.0-1004-oem. Чтобы его установить, нужно выполнить команду:

$ sudo apt-get install linux-image-4.15.0-1004-oem


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


Manjaro (Arch Linux)

В Manjaro используется свой менеджер пакетов — pacman, поэтому его команды будут немного отличаться от команд в других дистрибутивах. Чтобы вывести список доступных для установки ядер, необходимо выполнить:

$ sudo pacman –S linux


В рамке обведен список ядер, которые мы можем установить. Я выбрал пункт №5 (linux510), нажав соответствующую кнопку на цифровой клавиатуре. После этого запустился процесс скачивания необходимых пакетов. Когда всё будет готово, перезагружаем систему и радуемся новому ядру:



Установка ядра Zen (Liquorix)

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

Debian

Скачиваем скрипт, который добавит в систему нужные репозитории:


После чего выполняем всего одну команду, устанавливающую пакеты с новым ядром:

$ sudo apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64



Ubuntu

Установка в Ubuntu происходит практически аналогичным образом. Сначала добавляем репозитории zen-ядра (liquorix):

sudo add-apt-repository ppa:damentz/liquorix && sudo apt-get update

После чего выполняем уже знакомую по прошлому разу команду:

sudo apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64

И теперь перезагружаем систему. Готово!

Manjaro


Далее установим необходимые утилиты:

$ sudo pacman –S base-devel


Заходим в каталог yay и производим сборку пакета:

$ cd yay
$ makepkg -si


После этого переходим непосредственно к установке zen-ядра:

$ yay -S linux-zen-git


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

Please consider filing a bug or asking a question via Launchpad before contacting the maintainer directly.

Original Maintainer (usually from Debian):

It should generally not be necessary for users to contact the original maintainer.

Подобные пакеты:

Generic Linux kernel image

Другие пакеты, относящиеся к linux-image-generic

  • зависимости
  • рекомендации
  • предложения
  • enhances
  • dep: amd64-microcode [amd64] Processor microcode firmware for AMD CPUs
  • dep: intel-microcode [amd64] Processor microcode firmware for Intel CPUs
  • dep: linux-firmware [не s390x] Firmware for Linux kernel drivers
  • dep: linux-image-5.11.0-16-generic [не amd64] Signed kernel image generic
  • dep: linux-image-5.11.0-40-generic [amd64] Signed kernel image generic
  • dep: linux-modules-extra-5.11.0-16-generic [не amd64, armhf] Linux kernel extra modules for version 5.11.0 on 64 bit x86 SMP
  • dep: linux-modules-extra-5.11.0-40-generic [amd64] Linux kernel extra modules for version 5.11.0 on 64 bit x86 SMP
  • rec: thermald Thermal monitoring and controlling daemon

Загрузка linux-image-generic

Загрузить для всех доступных архитектур
Архитектура Версия Размер пакета В установленном виде Файлы
amd64 5.11.0.40.41 2,5 Кб19,0 Кб [список файлов]
arm64 5.11.0.16.17 2,5 Кб18,0 Кб [список файлов]
armhf 5.11.0.16.17 2,5 Кб18,0 Кб [список файлов]
ppc64el 5.11.0.16.17 2,5 Кб18,0 Кб [список файлов]
s390x 5.11.0.16.17 2,5 Кб18,0 Кб [список файлов]

This page is also available in the following languages:

Авторские права © 2021 Canonical Ltd.; См. условия лицензии. Ubuntu это торговый знак компании Canonical Ltd. Об этом сайте.

Что такое «неиспользуемые» ядра и почему они накапливаются в системе?

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

Но дело ещё и в том, что когда для системы выпускается новая версия Linux-ядра. То оно (новое ядро) будет установлено как отдельное независимое ядро. В процесс его установки также входит автоматическая настройка загрузчика GRUB. Для того, чтобы свежеустановленное ядро загружалось им по-умолчанию. При этом, как правило, старые ядра не удаляются. Это сделано для того, чтобы как можно в более полной степени следовать концепции «Unix Way». Которая, в частности, предполагает предотвращение всяческой самодеятельности, дабы не навредить системе. В случае с установкой новых версий ядер, старые не удаляются, чтобы дать возможность пользователю их использовать. Если с новым ядром возникнут какие-либо неполадки.

Стоит заметить, что в зависимости от «комплектности» ядер, они могут, занимать свыше 300 мегабайт дискового пространства. Нетрудно представить, какой объём в таком случае занимают несколько неиспользуемых старых ядер.

В данной статье будут рассмотрены способы очистки системы от неиспользуемых ядер на примере дистрибутивов Ubuntu. Так, например, для этих систем (как впрочем и для большинства других Linux-дистрибутивов) ядро представляет собой набор из следующих пакетов:

  • linux-headers-[версия] – заголовочные файлы ядра;
  • linux-image-[версия] – бинарный образ ядра;
  • linux-extra-[версия] – дополнительные внешние модули ядра для расширения функционала.

При установке и удалении перечисленных пакетов также выполняются и служебные скрипты для настройки системного загрузчика. Это необходимо для очистки его конфигурации (или для добавления в неё) в соответствии с установленными (или удаляемыми) в системе ядрами.

Удаление ядер с помощью системы управления пакетами

Для начала необходимо разобраться, есть ли в системе неиспользуемые ядра и сколько их. Также, первым делом, нужно определить, какое ядро является основным:

Как можно видеть, в качестве основного ядра (то, которое загружает загрузчик GRUB по-умолчанию) является версия 4.18.0-18.
Теперь можно выяснить, какие ещё ядра присутствуют в системе. На примере Ubuntu для этого используется команды менеджера пакетов dpkg:

Для первой команды вывод может быть примерно таким:

Похожий вывод даст вторая команда, но с тем лишь отличием, что в наименовании пакетов будет указано «linux-headers». Как можно видеть, кроме основного ядра версии 4.18.* в системе присутствуют также ядра из семейства версии 4.15 — 43, 46 и 47. От первых двух не мешало бы избавиться, высвободив таким образом значительный объём дискового пространства. А вот ядро 4.15.0-47 рекомендуется оставить как резервное. Это обычная практика в Linux-системах — иметь на борту альтернативное ядро предыдущей версии со стабильными проверенной конфигурацией и набором модулей.

Следует не забывать, выполнять вышеприведённые команды для пакетов linux-extra – они также могут присутствовать в системе. Но гораздо реже, поскольку данные пакеты чаще всего устанавливаются вручную.

Теперь, когда решено удалить неиспользуемые ядра версий 4.15.0-43 и 4.15.0-46, можно воспользоваться командами системы управления пакетами (СУП) для используемого дистрибутива. В данном случае, для Ubuntu, следует выполнить следующие команды:

Во время удаления этих пакетов конфигурация загрузчика GRUB будет автоматически перенастроена, ничего вручную для этого делать не нужно. Следует отметить, что в системе также могут присутствовать версии ядер без «generic» в наименовании пакетов. Если такие ядра не нужны, то и их также рекомендуется удалить. Изменения для GRUB можно заметить при следующей перезагрузке системы. В меню загрузчика (если в его конфигурации включен вывод меню выбора) будут отсутствовать пункты для соответствующих удалённых ядер.

Удаление сразу нескольких ядер

Нередко старых ядер накапливается довольно много. И при их удалении одной командой apt-get purge не совсем удобно перечислять наименования пакетов всех ядер. Чтобы сделать команду удаления ядер более удобочитаемой, а также сэкономить время на её составление. Можно воспользоваться некоторыми возможностями командной строки. Такими как регулярные выражения. В этом случае для удаления двух ядер версий 4.15.0-43 и 4.15.0-46. Включая их образы и заголовочные файлы запись соответствующих команд будет выглядеть следующим образом:

Следует отметить, что данный синтаксис возможен только при использовании командных интерпретаторов Bash, а также ему подобных.

Использование специализированных утилит — скрипт purge-old-kernels

Некоторые пользователи могут и не решиться на такие действия как удаления ядер в силу малоопытности. Для подобных ситуаций во многих дистрибутивах Linux в арсенале стандартного репозитория имеются специализированные утилиты, которые позволяют безопасно выполнять самые ответственные действия с системой. Одной из таких утилит является bikeshed, которую можно установить из одноимённого пакета:

В набор этой утилиты входит скрипт purge-old-kernels для безопасной очистки системы от неиспользуемых ядер. Скрипту можно передавать параметр, указывающий, сколько ядер самых свежих версий оставить в системе. Например, для того, чтобы оставить только два самых свежих ядра:

Как и в случае с удалением ядер с помощью СУП, беспокоиться о перенастройке GRUB не стоит, поскольку данный скрипт это также умеет делать. Но если вдруг конфигурация загрузчика не была обновлена, то можно это сделать вручную, выполнив команду:

В заключение следует отметить, что использование скрипта purge-old-kernels является наиболее предпочтительным способом очистить систему от старых ядер. Главным преимуществом данного способа является его надёжность и универсальность, поскольку этот скрипт корректно удаляет даже те ядра, которые устанавливались в систему вручную путём сборки из исходных кодов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Как то я уже писал о том, как обновить ядро в Debian, но, решил обновить данную статью. Да и не просто обновить, но и дополнить. Ядро системы играет важную роль в работе вашего компьютера, от ядра зависит так же поддержка оборудования. Чем новее ядро, тем больше вероятность, что ваше оборудования будет поддерживаться. В Debian используется версия ядра с длительной поддержкой, но, можно установить и другое, которое имеется в репозиториях самого Debian. Или собрать ядро из исходников, как это сделать, написано в данной статье . В этой статье, мы рассмотрим как можно обновить ядро из репозиториев backports и experimental. А так же как удалить не используемые ядра. Давайте приступим и первым делом сначала обновим ядро из репозиториев самого Debain 10

Смотрим доступные ядра Debian

Первым делом нужно узнать какая версия ядра у нас установлена, для этого можно воспользоваться командой “uname -r”, а так же можно ввести команду “uname -a”, она тоже покажет версию ядра. Какую из команд вести, решать вам, я же веду “uname -r”, перед этим рекомендую обновить систему до актуального состояния:

Как вы можете увидеть, у меня сейчас стоит ядро версии 4.19.0-10-amd64. Теперь давайте подключим репозитории backports и experimental, откуда мы и будем устанавливать более свежую версию ядра в Debian 10. Что бы подключить данный репозиторий, воспользуемся редактором nano, о котором вы можете прочитать в этой статье. Нам нужно отредактировать файл sources.list, куда и впишем репозиторий backports и experimental. Открываем файл sources.list введя команду в терминале:

sudo nano /etc/apt/sources.list

Вписываем в открывшийся файл адрес репозитория, вы можете вписать только backports и установить ядро из него. А можете сразу два репозитория подключить и выбрать самую свежую версию ядра, которая только доступна в репозиториях Debian:

После чего сохраняем файл sources.list и выходим из него, далее обновляем списки пакетов командой “apt update”. Теперь нужно посмотреть какие версии ядра имеются в данном репозитории, что бы в дальнейшем их установить. Что бы посмотреть, а затем и установить более свежее ядро, вводим команду:

sudo apt search linux-headers

В результате в терминале будет выведен список всех доступных ядер, которые вы можете установить. Например, я установлю “linux-headers-rt-amd64”

Обновляем ядро

Что бы установить выбранное ядро в Debian, необходимо ввести команду установки “apt install”, а затем вести выбранное имя ядра. В данном случае это linux-headers-rt-amd64. Замечу, что “header” это лишь заголовок само ядро обозначается как “linux-image”. Соответственно, нам необходимо установить их обоих. Подробней о пакетах:

  • linux-image-версия – само ядра
  • linux-image-extra-версия – модули ядра
  • linux-headers-версия – Заголовки

sudo apt install linux-headers-rt-amd64 linux-image-rt-amd64

После установки перезагружаем компьютер и проверяем какое ядро у нас используется. Для этого вводим команды либо “uname -r” либо “uname -a”. Если же вы устанавливали Debian на ноутбук, то вам так же необходимо обновить firmware из репозитория backports.

sudo apt -t stretch-backports install firmware-iwlwifi

Удаляем не используемые ядра

Со временем у вас может получится несколько ядер в вашей системе Debian. Это может быть в результате естественного обновления системы, так как во время обновления так же и обновляется периодически ядро, так и установка кастомных ядер. Все их хранить у себя на компьютере не обязательно. Что бы их удалить, можно воспользоваться простой командой “purge”. Но, для начала нужно узнать, какие ядра системы Debian у нас имеются, для этого вводим одну из команд, которая выведет все установленные ядра:

apt list --installed | egrep "linux-image|linux-headers"

dpkg --list | egrep "linux-image|linux-headers"

Теперь собственно переходим к удалению неиспользуемых ядер, например, я хочу удалить ядро “4.19.0-6”. Для этого вводим команду “purge –remove” далее версию ядра и заголовки “linux-headers”. То есть примерно так “sudo purge –remove linux-image-версия linux-headers-версия”. Теперь собственно переходим к удалению:

sudo purge linux-image-4.19.06-amd64 linux-headers-4.19.06-amd64

После удаления неиспользуемого ядра, можно обновить загрузчик GRUB, что бы он не выводил удаленное ядро. Для этого вводим команду:

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

Для удаления всех неиспользуемых ядер, можно ввести команду:

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

Заключение

А на этом сегодня все. Надеюсь данная статья будет вам полезна.
Журнал Cyber-X

VPC Image Building

В сервисе «Виртуальное приватное облако» имеется большой набор готовых образов операционных систем для создания виртуальных машин.

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

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

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

В качестве примера будет использован образ Ubuntu 16.04: подготовка рабочего окружения, настройка необходимых параметров, сборка и загрузка образа в облачный сервис.

Также будут рассмотрены необходимые шаги для подготовки образа с полной совместимостью со всеми дополнительными возможностями сервиса «Виртуальное приватное облако».

В качестве инструмента для сборки образа мы будем использовать diskimage-builder. Это набор компонентов для подготовки образов операционных систем, файловых систем, RAM-дисков с открытым исходным кодом, поддерживаемый сообществом OpenStack.

Инструмент поддерживает создание образов большинства распространенных дистрибутивов GNU/Linux:

По умолчанию diskimage-builder подготавливает образ cloud-версии операционной системы, поэтому в образе будут присутствовать пакеты cloud-init и cloud-utils, необходимые для автоматической настройки системы в облаке.

Создание образа Ubuntu 16.04

Мы будем готовить образ на машине с ОС Ubuntu 14.04.

Для начала установим необходимые зависимости:

Затем установим diskimage-builder:

Создадим базовые директории для работы:

Для настройки diskimage-builder нам необходимо указать несколько дополнительных параметров, значение которых хранится непосредственно в переменных окружения командной оболочки (таким образом, вы можете указывать их в командной строке):

Сборка образа осуществляется с помощью команды:

После ключа -t указываем нужный формат образа. Поддерживаются образы: qcow2, tar, vhd, docker, raw.

Перед непосредственной сборкой образа вам скорее всего понадобится внести дополнительные настройки в систему, например:

  • установить дополнительные пакеты в систему;
  • отключить механизм predictable_interface_naming, который переименовывает привычные имена интерфейсов eth0, eth1,… в имена вида enp0s3, ens3 и т.д;
  • отключить создание пользователя «ubuntu» и разрешить доступ пользователю «root» по протоколу SSH;
  • регенирировать SSH-ключи для каждой созданной из данного образа виртуальной машины;
  • изменить предустановленную временную зону.

Для этого нам потребуется создать дополнительный элемент в директории

/diskimage-builder/elements/ubuntu-16-custom создадим файл README.rst с описанием нового элемента:

/diskimage-builder/elements/ubuntu-16-custom/install.d создадим скрипт 50-install-additional-packages:

Скрипты в директории install.d выполняются при сборке образа во время установки основных пакетов. Созданный нами скрипт 50-install-additional-packages установит в систему python версии 2.7, который все еще необходим для работы многих приложений. По умолчанию в образе Ubuntu 16.04 присутствует только python версии 3.5.

Вы также можете дополнить этот список необходимыми вам пакетами, которые потребуется установить в образ.

Далее в директории

/diskimage-builder/elements/ubuntu-16-custom/post-install.d необходимо создать скрипт 50-configure-system для изменения конфигурации системы:

Скрипты в директории post-install.d выполняются сразу после скриптов в директории install.d.

Также нам потребуется изменить настройки GRUB для добавления параметра запуска «net.ifnames=0», который сохранит имена интерфейсов в привычном формате ethN.

Добавим скрипт 50-configure-grub в директории

Скрипты в директории finalise.d выполняются после всех основных этапов подготовки образа.

После создания описанных скриптов нам необходимо изменить их атрибуты, для этого выполним команду chmod:

Теперь перед созданием образа нам необходимо указать путь для нашего нового элемента. Это можно сделать при помощи параметра ELEMENTS_PATH.

Чтобы не указывать параметры каждый раз напрямую в командной строке, в директории

/diskimage-builder/ создадим скрипт build-ubuntu-16.04, который задаст параметры diskimage-builder и выполнит сборку образа:

Изменим атрибуты этого файла:

После этого должна получится вот такая иерархия файлов:

Запустим скрипт build-ubuntu-16.04:

Утилита sudo при вызове нужна для того, чтобы предложение ввести пароль не появилось посередине процесса подготовки образа. Данное поведение объясняется тем, что некоторые предустановленные элементы diskimage-builder содержат вызов sudo (например, скрипт 01-ccache от элемента base, который выполняется при сборке большинства дистрибутивов).

По окончании работы нашего скрипта новый образ будет находиться в директории

Вы можете использовать созданный образ в сервисе Selectel «Виртуальное приватное облако», загрузив его через веб-интерфейс панели VPC, либо через glance API.

Обратите внимание, что пароль для root был удален на этапе сборки образа, поэтому доступ к виртуальной машине по SSH изначально будет возможен только по ключу. Вы можете добавить ключ SSH при создании машины в панели VPC. Доступ к серверу возможен и через виртуальную консоль no-VNC в панели управления, в этом случае вам не потребуется вводить пароль root, если он не был установлен.
Пароль root устанавливается стандартным способом с помощью утилиты passwd.

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

  • установка исходного пароля, сгенерированного сервисом VPC;
  • смена пароля root из веб-панели VPC;
  • смена пароля root с помощью nova API;
  • смена интерфейса для маршрута по умолчанию из веб-панели VPC;
  • автоматическое изменение настроек сетевых интерфейсов внутри системы, в том случае, если они были изменены в панели управления сервером;

В следующем разделе мы покажем, как сделать полностью совместимый с VPC образ.

Создание образа для сервиса «Виртуальное приватное облако»

Чтобы создаваемый образ был полностью совместим с сервисом VPC, на этапе сборки потребуется добавить дополнительные свойства свойств для образа и установить в систему дополнительные пакеты.

Добавим еще один элемент ubuntu-16-selectel, для этого создадим директорию:

Внутри данной директории добавим описание элемента в файле README.rst:

Создадим требуемые директории для нового элемента:

Изменим список репозиториев скриптом

Добавим дополнительные пакеты скриптом

Будут установлены следующие утилиты:

    crontab-randomizer — простой скрипт, который рандомизирует временные интервалы в /etc/crontab, далее мы добавим вызов данного скрипта при первом запуске системы;

Также во время сборки образа пакет cloud-init будет автоматически обновлен на версию, которая находится в зеркале Selectel OpenStack. Эта версия содержит патчи, которые обеспечивают консистентность настроек сети между виртуальной машиной и сервисом VPC.

Автоматическое обновление пакетов при сборке образа происходит при помощи предустановленного скрипта 00-up-to-date, во время стадии install.d.

Далее нам понадобится добавить дополнительные конфигурационные файлы для cloud-init, создадим в директории

/diskimage-builder/elements/ubuntu-16-selectel/post-install.d скрипт 50-configure-cloud-init:

Также рекомендуется удалить предустановленный скрипт /etc/cron.weekly/fstrim в случае использования fstrim-blocks, так как предустановленный вариант не содержит параметров поблочного запуска, что повлечет дополнительную нагрузку на систему при запуске fstrim .

Удалим данный файл простым скриптом

Изменим атрибуты новых скриптов:

Добавим новый элемент ubuntu-16-selectel в скрипт

Иерархия файлов должна иметь такой вид:

Запустим сборку образа:

Команда для загрузки будет выглядеть так:

При загрузке будут добавлены свойства:

  • hw_qemu_guest_agent=yes — необходимо для поддержки механизма смены пароля сервера через панель VPC или через nova API; данное свойство будет работать только в том случае, если в образе присутствует утилита qemu-guest-agent не ниже версии 2.3 (в Ubuntu 16.04 используется версия 2.5);
  • x_sel_image_owner=Selectel — необходимо для поддержки отображения пароля в панели VPC;
  • hw_disk_bus=scsi, hw_scsi_model=virtio-scsi — данные свойства разрешат использование более современной и производительной шины virtio-scsi, одно из преимуществ которой это возможность использования TRIM.

После загрузки образ будет отображаться на вкладке «Образы» в вашем проекте VPC с именем Ubuntu-16.04-VPC.

При первом запуске сервера пароль для пользователя root будет сгенерирован и установлен автоматически. Он будет отображаться на вкладке «Консоль», там же при необходимости можно сгененировать новый пароль.

Помимо этого вам не придется производить настройки сетевых интерфейсов на сервере вручную, если вы изменили их в панели управления на вкладке «Порты». Чтобы cloud-init перенастроил сетевые интерфейсы, потребуется произвести перезагрузку сервера по питанию. После этого будут сгенерированы новые метаданные OpenStack c новыми настройками сети.

Вы можете запретить утилите cloud-init изменять настройки сети при каждой перезагрузке сервера. Для этого в установленной системе добавьте файл /etc/cloud/cloud.cfg.d/99_disable_network_config.cfg:

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

Заключение

В этой статье мы рассмотрели базовые возможности diskimage-builder, изучили способы добавления своих скриптов для изменения конфигурации образа, основные этапы сборки и пример загрузки готового образа в облачное окружение.

Если у вас остались вопросы по основным способам использования данного инструмента или же для вас непонятны какие-либо моменты в управлении образами и виртуальными машинами в сервисе VPC, пожалуйста, укажите об этом в комментариях.

Будем также рады, если вы поделитесь собственными способами использования diskimage-builder.

Читайте также: