Anaconda
Содержание
Введение и терминология
Anaconda — это программа для установки операционной системы (далее — ОС) с загрузочного образа на диск компьютера (далее — программа установки, инсталлятор).
Статья описывает использование Anaconda в дистрибутивах на платформах rosa2019.1 (ROSA Fresh >= R12, ROSA Enterprise Desktop >= X5) и rosa2019.05.
Оператор — человек, взаимодействующий с компьютером с целью установки ОС.
LiveCD — операционная система, загруженная со сменного носителя (CD, DVD, USB-накопитель и т.д.), не требующая для своего функционирования установки на жёсткий диск.
cmdline — параметры запуска initrd/ядра на системе, где производится установка ОС, устанавливаемые загрузчиком ОС (в LiveCD это Grub2 на UEFI и syslinux на legacy)
Anaconda позволяет устанавливать ОС в пяти режимах:
- интерактивный графический интерфейс программы установки непосредственно на компьютере
- интерактивный графический интерфейс программы установки по VNC
- автоматизированный графический интерфейс программы установки непосредственно на компьютере
- интерактивный консольный интерфейс программы установки
- автоматизированный консольный интерфейс программы установки
В интерактивном режиме оператор, выполняющий установку ОС, отвечает на вопросы установщика, вносит и изменяет настройки, а в автоматизированном режиме программа установки самостоятельно запускается, выполняет все настройки и установку ОС, не требуя никакого взаимодействия с оператором, что может быть полезно для автоматизированного развертывания рабочих станций и серверов.
Минималистичный образ rosa2019.1 для тестирования инсталлятора: rosa2019.1_LXQt_mini_alpha_mn
Принцип работы
Порядок работы программы установки в любом из режимов можно разделить на следующие этапы:
- чтение cmdline ядра dracut-модулем anaconda внутри initrd (https://anaconda-installer.readthedocs.io/en/latest/boot-options.html) на ранних этапах запуска ОС в LiveCD
- запуск программы установки (автоматизированно исходя из параметров в cmdline или оператором вручную с помощью ярлыка на рабочем столе в запущенной графической оболочке)
- применение настроек (либо из файла настроек автоматизированной установки, либо путем интерактивного взаимодействия с оператором)
- подготовка дисковых устройств (автоматическая или ручная разметка диска)
- копирование LiveCD на подготовленные дисковые разделы через rsync(1) (этот этап называется "Установка программного обеспечения", а копирование производится из исходного LiveCD без учета внесенных в Live-сеансе правок)
- установка загрузчика ОС (Grub2)
- пересборка initramfs (в initramfs LiveCD есть не требуемые в установленной ОС модули, например, модуль Anaconda)
- выполнение пост-установочных скриптов (на данный момент выполняется этот скрипт: https://abf.io/import/anaconda/blob/master/90-rosa1-postinstall.sh, основная задача которого — очистить скопированную с LiveCD систему от более ненужных пакетов, в т.ч. самой программы установки)
Графическая программа установки Anaconda
Графическая программа установки запускается командой liveinst. Как правило, запуск производится внутри запущенной в LiveCD графической оболочки. /usr/bin/liveinst является символической ссылкой на consolehelper, что позволяет запускать /usr/sbin/liveinst от не-root в LiveCD без пароля. liveinst — это bash-скрипт, запускающий /usr/sbin/anaconda (на Python).
Модель построения интерактивного графического интерфейса такова:
- каждая группа настроек вынесена в отдельную группу ("spoke")
- на главном экране есть прямоугольные области для вызова каждой группы
- кнопка "Готово" внутри группы возвращает на главный экран
- если настройки неоптимальные, но допустимые (например, слабый пароль), то по первому нажатию кнопки "Готово" будет показано предупреждение, а второе нажатие применит текущие настройки несмотря на их неоптимальность
- если в установленных внутри группы настройках обнаружены критические ошибки, не позволяющие установить ОС, группа помечается красным цветом шрифта и восклицательным знаком; нужно нажать на нее и исправить настройки
- группа может быть как обязательной к настройке, так и не обязательной
- можно разрабатывать плагины, добавляющие свои группы настроек
- когда необходимый минимум настроек выполнен, можно запустить установку ОС, в процессе которой не будет задано никаких дополнительных вопросов
- по окончанию появится кнопка для закрытия программы установки
- при запуске внутри графической оболочки выключение или перезагрузка компьютера выполяется оператором самостоятельно средствами запущенной графической оболочки
При запуске в неинтерактивном режиме пропускается этап настройки, сразу запускается установка ОС.
Консольная программа установки Anaconda
Консольная программа реализует тот же принцип работы, что и описанная выше графическая программа, однако интерактивное взаимодействие выполняется не с помощью мыши и клавиатуры, а только с помощью клавиатуры. Оператору предлагается выбрать один из нескольких вариантов (например, в какую группу настроек войти) путем ввода цифры или буквы с клавиатуры.
Для запуска консольной программы установки необходимо добавить в cmdline ядра:
systemd.unit=anaconda.target inst.text
Запустится мультиплексор терминалов tmux, на первой вкладке которого будет запущена консольная программа установки Anaconda.
! В настоящее время консольная программа установки хочет отдельный репозиторий для установки, установка прямо с LiveCD не работает, ведутся работы по исправлению.
Графическая установка по VNC
Установка по VNC позволяет запустить графическую программу установки на другом компьютере (машине оператора). Полезно, если целевой компьютер находится далеко или не имеет монитора, мыши, клавиатуры. Можно управлять установкой с другого компьютера.
Важно! Запускается VNC-сервер с паролем или без пароля, подключение к которому доступно всем, без фильтрации сетевого трафика. Будьте осторожны при запуске VNC в незащищенной сети!
Для установки по сети понадобится клиентский компьютер с TigerVNC. Для установки в ОС ROSA выполните:
sudo dnf install /usr/bin/vncviewer
На компьютере оператора (далее — клиент) запустите VNC-клиент в режиме ожидания входящего подключения:
vncviewer -listen 4444
где 4444 — сетевой порт, любой свободный.
Узнайте IP-адрес компьютера оператора установки:
/sbin/ip a
В cmdline ядра при запуске LiveCD (в т.ч. при PXE-загрузке) на компьютере, куда устанавливаем ОС, добавьте:
systemd.unit=anaconda.target inst.vnc inst.vncconnect=192.168.1.173:4444
где 192.168.1.173 — адрес компьютера оператора установки, а 4444 — порт.
Сеть будет настроена автоматически по DHCP. Должна быть обеспечена двусторонняя сетевая доступность клиента (оператора) и сервера (компьютера, на который производится установка ОС).
Подождите. Через какое-то время на машине оператора откроется окно с графической программой установки, пример на скриншоте ниже.
Подробная документация по опциями в cmdline: https://anaconda-installer.readthedocs.io/en/latest/boot-options.html
Автоматизированная установка
Автоматизированная установка позволяет выполнить полностью автоматическую установку в соответствии с преднастройками. Может применяться для автоматического развертывания множества компьютеров одинаковой конфигурации.
Создается файл с настройками — kickstart-сценарий — сценарий быстрого развертывания. Затем в cmdline ядра записывается путь к этому файлу, по DHCP автоматически настраивается сеть, а модуль anaconda-dracut в initramfs загружает этот kickstart-сценарий и сохраняет в /run/install/ks.cfg.
При установке в любом из режимов, в т.ч. интерактивном графическом, в установленной системе по адресу /root/anaconda-ks.cfg сохраняется kickstart-сценарий, описывающий произведенную установку, который можно взять за основу для своего сценария.
Создадим сценарий автоматизированного развертывания со следующим содержимым:
cmdline # https://bugzilla.redhat.com/show_bug.cgi?id=1874434 liveimg --url=file:///dev/mapper/live-base # Keyboard layouts keyboard --xlayouts='us','ru' --switch='grp:alt_shift_toggle' # System language lang ru_RU.UTF-8 # Network information network --hostname=localhost.localdomain # SELinux configuration #selinux --disabled # System services services --enabled="chronyd" autopart # Partition clearing information clearpart --all --initlabel # System timezone timezone Europe/Moscow --utc # Root password # python3 -c "import crypt; print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))" # Password: 123456 rootpw --iscrypted $6$BHWkSXIw6TgPrdvJ$V1ARg/yAP.kRe5mo5FawOOvf7SRm/GDM.Ly6RGGmSBR3Zc81/XzYlpoDnYKFMMPZodKBIVyBvjJ9evM1sey0E/ user --groups=wheel --name=user --password=$6$BHWkSXIw6TgPrdvJ$V1ARg/yAP.kRe5mo5FawOOvf7SRm/GDM.Ly6RGGmSBR3Zc81/XzYlpoDnYKFMMPZodKBIVyBvjJ9evM1sey0E/ --iscrypted %anaconda pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty %end reboot
Скопируйте текст выше в отдельный файл, пусть он называется:
a.ks
Документация по kickstart-сценариям: https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html
Разберем, что написано в приведенном выше простом сценарии.
cmdline
Выполняем полностью автоматизированную установку. Запускается X-сервер, автоматически запускается установка, настройка не требуется. Возможны варианты без X-сервера и установка по VNC.
liveimg --url=file:///dev/mapper/live-base
Копируем на диск систему из LiveCD (также возможна установка из сетевого репозитория).
keyboard --xlayouts='us','ru' --switch='grp:alt_shift_toggle'
Добавляем в систему 2 раскладки клавиатуры: us и ru, а переключение раскладок настариваем на комбинацию alt+shift.
lang ru_RU.UTF-8
Установим язык системы ru_RU.UTF-8 (/etc/locale.conf).
services --enabled="chronyd"
Включим службу systemd chronyd, можно перечислить несколько служб через запятые без пробелов.
clearpart --all --initlabel
Выполним полностью автоматизированную разметку диска, удалив все, что на нем уже есть. Можно прописать детализированные инструкции по разметке диска.
timezone Europe/Moscow --utc
Установим часовой пояс Европа/Москва, а аппаратные часы (BIOS) будем считать выставленными по Гринвичу (рекомендуется их ставить по Гринвичу).
rootpw --iscrypted $6$BHWkSXIw6TgPrdvJ$V1ARg/yAP.kRe5mo5FawOOvf7SRm/GDM.Ly6RGGmSBR3Zc81/XzYlpoDnYKFMMPZodKBIVyBvjJ9evM1sey0E/
Установим пароль пользователю root. Хеш выше является результатом выполнения команды:
python3 -c "import crypt; print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
которая позволяет получить хеш введенного с клавиатуры пароля. Таким образом избегаем хранения пароля в открытом виде. Приведен хеш пароля "123456".
user --groups=wheel --name=user --password=$6$BHWkSXIw6TgPrdvJ$V1ARg/yAP.kRe5mo5FawOOvf7SRm/GDM.Ly6RGGmSBR3Zc81/XzYlpoDnYKFMMPZodKBIVyBvjJ9evM1sey0E/ --iscrypted
Создаем пользователя "user", которого добавляем в группу "wheel". Пароль аналогично root.
reboot
Перезагрузим компьютер по завершению установки.
Параметры в cmline ядра и в kickstart-сценарии дополняют друг друга и могут использоваться в различных комбинациях.
Узнаем IP-адрес компьютера оператора, выполнив команду:
/sbin/ip a
На компьютере оператора откроем терминал в папке, где лежит kickstart-сценарий a.ks, и выполним команду:
python3 -m http.server
которая запустит простой HTTP-сервер на порту 8000. Вместо него можно настроить и запустить иной веб-сервер: nginx, Apache httpd и др.
В cmdline запускаемого LiveCD добавим:
systemd.unit=anaconda.target inst.ks=http://192.168.1.173:8000/a.ks
где 192.168.1.173 — адрес компьютера оператора, 8000 — порт HTTP-сервера. В консоли, где был запущен веб-сервер, будет отражена попытка скачать kickstart-сценарий.
Добавьте также
inst.text
чтобы вместо графической программы установки запустилась консольная программа установки (в обоих случаях установка будет произведена автоматически без участия оператора).
Ниже скриншот с примером редактирования cmdline в UEFI-режиме.
Ниже скриншот автоматизированной консольной установки.
Запустится программа установки, скачает kickstart-сценарий, автоматически установит ОС и перезагрузит компьютер.
Ссылки на дополнительную документацию:
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/performing_an_advanced_rhel_installation/kickstart-commands-and-options-reference_installing-rhel-as-an-experienced-user
- https://anaconda-installer.readthedocs.io/en/latest/boot-options.html#kickstart
- https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html
PXE-загрузка
Описание процесса PXE-загрузки
PXE-загрузка происходит следующим образом:
- встроенный в BIOS компьютера загрузчик PXE получает IP-адрес по протоколу BOOTP (родственный DHCP протокол)
- он же скачивает по протоколу TFTP с сервера TFTP: файлы загрузчика, в т.ч. сам загрузчик и конфигурационный файл с описанием меню загрузки, vmlinuz и initrd — урезанную версию операционной системы
- он же запускает скачанный загрузчик
- загрузчик запускает скачанную урезанную версию операционной системы (далее — initrd)
- встроенные в initrd программные компоненты скачивают переданные в параметрах запуска initrd образ файловой системы и дополнительные компоненты полной версии операционной системы, сохраняя их в оперативную память
- встроенные в initrd программные компоненты запускают ранее скачанную полную версию ОС
Таким образом, запускается тот же LiveCD, что и при загрузке с USB-накопителя или DVD-диска, однако в оперативной памяти требуется достаточное количество места для хранения скачанной полной версии ОС, которая при запуске с дискового накопителя хранится на дисковом накопителе.
Для настройки сервера PXE-загрузки необходимо выполнить описанные ниже наши, при необходимости адаптируя предлагаемые настройки под конкретную локальную сеть.
Настройка сервера TFTP
Установите необходимые пакеты, выполнив от root:
dnf install tftp-server xinetd syslinux