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
- автоматизированный графический интерфейс программы установки непосредственно на компьютере
- интерактивный консольный интерфейс программы установки
- автоматизированный консольный интерфейс программы установки
В интерактивном режиме оператор, выполняющий установку ОС, отвечает на вопросы установщика, вносит и изменяет настройки, а в автоматизированном режиме программа установки самостоятельно запускается, выполняет все настройки и установку ОС, не требуя никакого взаимодействия с оператором, что может быть полезно для автоматизированного развертывания рабочих станций и серверов.
Режим Nickel — особый режим работы программы установки, в котором:
- редактирование пунктов меню загрузчика Grub2 защищается паролем root
- установка пароля на root обязательна
- из автоматической разметки диска исключен своп (раздел подкачки)
Режим Nickel активируется добавлением "inst.nickel=1" в cmdline и включен по умолчанию на сертифицированных дистрибутивах (где может быть выключен добавлением "inst.nickel=0").
cmdline — аргументы запуска initrd. При запуске в legacy (не-UEFI) режиме редактируются нажатием Tab в загрузчике syslinux, а нажатие Enter загружает систему; при запуске в режиме UEFI редактируется нажатием e в загрузчике Grub2 и дописываются в строку "linuxefi", а нажатие F10 запускает систему.
Минималистичный образ 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.
Если не задан kickstart-файл, то выбирается kickstart-файл /usr/share/anaconda/anaconda-livecd-text.ks, см. rhbz#1883709.
! Установка в режиме Nickel интерактивной консольной программой установки не поддерживается. См. раздел "Errata" ниже.
Графическая установка по 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 # System language lang ru_RU.UTF-8 # Keyboard layouts keyboard --xlayouts=us,ru --switch=grp:alt_shift_toggle # 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 # Passwords rootpw 123456 user --groups=wheel,users --name=rosa --password=123456 %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 --eject
Скопируйте текст выше в отдельный файл, пусть он называется:
a.ks
Документация по kickstart-сценариям: https://pykickstart.readthedocs.io/en/latest/kickstart-docs.html
Разберем, что написано в приведенном выше простом сценарии.
cmdline
Выполняем полностью автоматизированную установку. Запускается X-сервер, автоматически запускается установка, настройка не требуется. Возможны варианты без X-сервера и установка по VNC.
liveimg --url=file:///dev/mapper/live-base
Копируем на диск систему из LiveCD (также возможна установка из сетевого репозитория).
lang ru_RU.UTF-8
Установим язык системы ru_RU.UTF-8 (/etc/locale.conf).
keyboard --xlayouts=us,ru --switch=grp:alt_shift_toggle
Добавляем в систему 2 раскладки клавиатуры: us и ru, а переключение раскладок настариваем на комбинацию alt+shift.
services --enabled="chronyd"
Включим службу systemd chronyd, можно перечислить несколько служб через запятые без пробелов.
clearpart --all --initlabel
Выполним полностью автоматизированную разметку диска, удалив все, что на нем уже есть. Можно прописать детализированные инструкции по разметке диска.
timezone Europe/Moscow --utc
Установим часовой пояс Европа/Москва, а аппаратные часы (BIOS) будем считать выставленными по Гринвичу (рекомендуется их ставить по Гринвичу).
rootpw 123456
Установим "123456" в качестве root-пароля
user --groups=wheel,users --name=rosa --password=123456
Создадим пользователя "rosa", добавив его в группы wheel и users и поставив пароль "123456"
Пароли можно записать в зашифрованном виде:
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,users --name=rosa --password=$6$BHWkSXIw6TgPrdvJ$V1ARg/yAP.kRe5mo5FawOOvf7SRm/GDM.Ly6RGGmSBR3Zc81/XzYlpoDnYKFMMPZodKBIVyBvjJ9evM1sey0E/ --iscrypted
Создаем пользователя "rosa", которого добавляем в группы wheel и users. Пароль аналогично root. ...однако при установке в режиме Nickel пароль root обязательно указать в не зашифрованном виде, т.к. иначе будет невозможно зайти в редактирование параметров загрузчика Grub2.
reboot --eject
Перезагрузим компьютер по завершению установки. Попытаемся извлечь установочный носитель (полезно, когда в виртуальную машину производится установка с ISO-образа, подключенного как DVD-диск, а гипервизор умеет отключать виртуальный привод по команде извлечения диска из гостевой системы: тогда после перезагрузки система загрузится не с образа, а с диска с установленной ОС).
Параметры в cmline ядра и в kickstart-сценарии дополняют друг друга и могут использоваться в различных комбинациях.
В kickstart-сценарий можно добавить выполнение произвольных действий после установки, выполняемые в интерпретаторе shell. В примере ниже в файл /var/log/installtime записываются дата и время установки:
%post LC_ALL=C date > /var/log/installtime
Приведенный выше скриптлет запустится внутри установленной системы (в chroot). Если нужно запустить скриптлет в LiveCD, то к %post необходимо добавить параметр --nochroot. Ниже приведен пример того же самого действия не из chroot:
%post --nochroot LC_ALL=C date > "${INSTALL_ROOT}/var/log/installtime"
При необходимости можно с поднятого по инструкции ниже веб-сервера что-либо скачать командами curl(1), wget(1) и др.
Узнаем 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-загрузки необходимо выполнить описанные ниже наши, при необходимости адаптируя предлагаемые настройки под конкретную локальную сеть. Все команды, елси не указано иное, выполняются от root.
Установка необходимых пакетов
Поскольку ниже описывается настройка сети, приводящая к временному отключению доступа в интернет на компьютере-сервере PXE-загрузки, необходимо заранее установить требуемые пакеты:
dnf install dhcp-server tftp-server xinetd syslinux
По ходу инструкции ниже команды установки необходимых компонентов будут повторены, однако их можно не выполнять, если установить пакеты заранее.
Настройка BOOTP-сервера
Настройка DHCP-сервера специфична для конкретной сети, рассмотрим пример для следующей лабораторной установки: 2 персональных компьютера соединены патч-кордом (Ethernet), первый — DHCP-сервер (далее — сервер), второй — DHCP-клиент, на котором будет загружаться образ. Соедините оба компьютера патч-кордом.
Пусть сервер является десктопной операционной системой, на которой сеть настраивается автоматически через NetworkManager. Откройте настройки сетевого соединения. Перейдите во вкладку "IPv4". Поставьте отметку "Для этого соединения требуется IPv4". Поставьте "Метод" = "Вручную". В появившейся таблице нажмите "Добавить", заполните поля: "Адрес" = "192.168.1.1", "Маска сети" = "255.255.255.0". Нажмите "ОК". Отключите и включите соединение.
При необходимости на сервере установите пакет dhcp-server (ISC DHCP):
dnf install dhcp-server
Открываем файл /etc/dhcpd.conf в консольном редакторе:
nano /etc/dhcpd.conf
Удалите все содержимое файла и вставьте следующее:
option domain-name "rosa.lan"; option domain-name-servers ns1.rosa.lan, ns2.rosa.lan; default-lease-time 3600; max-lease-time 7200; authoritative; allow booting; allow bootp; filename "pxelinux.0"; subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.1; option subnet-mask 255.255.255.0; option domain-search "rosa.lan"; option domain-name-servers 192.168.1.1; range 192.168.1.10 192.168.1.100; }
Для сохранения и выхода из редактора nano нажмите Ctrl+O, Ctrl+X.
Добавляем в автозагрузку и запускаем DHCP/BOOTP-сервер:
systemctl enable --now dhcpd
Смотрим лог:
systemctl status dhcpd
Должен быть статус "active" зеленым цветом, а не красный "failed", свидетельствующий об ошибке. Для выхода из лога нажмите q.
Переподключите сеть на клиенте (втором компьютере, загруженном в LiveCD). Посмотрите вывод команды:
/sbin/ip a
Должен быть IP-адрес 192.168.1.10. Если так, то значит DHCP/BOOTP-сервер настроен и работает. Для работы сети оба соединенных компьютера должны быть включены.
Запуск HTTP-сервера
При необходимости установите python3:
dnf install python3
Приведенные ниже в этом разделе команды выполняются от пользователя, а не root.
Приготовьте файл ISO-образа запускаемой по PXE ОС семейства ROSA. Создайте любую папку, например, "webserver" внутри домашнего каталога:
mkdir -p "$HOME/webserver"
Переведите терминал в созданную папку:
cd "$HOME/webserver"
Создайте папку, в которой станет доступно содержимое ISO-образа:
mkdir -p ISO
Примонтируйте ISO-образ в эту папку:
sudo mount -o loop "<путь к ISO-образу>" "$HOME/webserver/ISO"
Положите в папку "$HOME/webserver" файл kickstart-сценарий a.cfg, создание которого описано выше в разделе "Автоматизированная установка".
Узнайте IP-адрес компьютера-сервера командой:
/sbin/ip a
Запустите веб-сервер, который запустится на порту 8000 и будет отдавать файлы из текущей папки:
python3 -m http.server
Если порт 8000 занят или по иным причинам не подходит, укажите иной порт, например, 8001:
python3 -m http.server 8001
Проверьте работу веб-сервера, открыв в веб-браузере на этом же компьютере страницу по адресу:
http://127.0.0.1:8000
В браузере должны быть выведены файлы из директории веб-сервера, в том числе должны быть доступны папка ISO и ее содержимое и kickstart-сценарий a.cfg, а в консоли, где запущен веб-сервер, должен быть выведен лог запросов к веб-серверу.
Оставьте консоль с запущенным веб-сервером открытой и далее используйте новую консоль.
Настройка сервера TFTP
Установите необходимые пакеты, выполнив от root:
dnf install tftp-server xinetd syslinux
Копируем в папку сервера TFTP компоненты первоначального загрузчика:
( cd /usr/share/syslinux && cp -v menu.c32 pxelinux.0 ldlinux.c32 libutil.c32 /var/lib/tftpboot/ )
Убеждаемся в наличии файла /etc/xinetd.d/tftp:
cat /etc/xinetd.d/tftp
Проверяем, что директива disable имеет значение no, а не yes.
Копируем урезанную версию ОС из ISO-образа в папку TFTP-сервера (от пользователя, не root):
( cd "$HOME/webserver/ISO/isolinux" ; sudo cp -v initrd0.img vmlinuz0 /var/lib/tftpboot/ )
Создаем папку для дополнительных конфигов TFTP-сервера:
mkdir -p /var/lib/tftpboot/pxelinux.cfg
Открываем на редактирование файл /var/lib/tftpboot/pxelinux.cfg/default (изначально его нет, поэтому пустой в редакторе):
nano /var/lib/tftpboot/pxelinux.cfg/default
со следующим содержимым:
default menu.c32 prompt 0 timeout 300 ONTIME local menu title #================ PXE BOOT ===============# label 1 menu label ^1) Automatically install ROSA kernel /vmlinuz0 append initrd=/initrd0.img inst.repo=http://192.168.1.1:8000/ root=live:http://192.168.1.1:8000/ISO/LiveOS/squashfs.img inst.text inst.ks=http://192.168.1.1:8000/a.ks label 2 menu label ^2) Install ROSA kernel /vmlinuz0 append initrd=/initrd0.img inst.repo=http://192.168.1.1:8000/ root=live:http://192.168.1.1:8000/ISO/LiveOS/squashfs.img
"192.168.1.1" замените на IP-адрес компьютера с веб-сервером. В описанной выше лабораторной установке IP-адрес именно такой. "8000" при необходимости замените на другой порт.
Для сохранения и выхода из редактора nano нажмите Ctrl+O, Ctrl+X.
Выше в строках, начинающихся с "append", после слова "append" идут параметры cmdline ядра, описанные выше. В первом случае запускается автоматизированная консольная установка по kickstart-сценарию, а во втором случае запускается просто LiveCD. При отсутствии выбора какого-либо пункта меню в течение 300 секунд будет произведена загрузка первого пункта. Обратите внимание, что приведенный выше kickstart-сценарий автоматически стирает весь диск, т.е. в приведенной конфигурации, если не выбрать второй пункт меню, будет произведена автоматическая установка с затиранием диска. При запуске ОС по PXE можно выбрать нужный пункт меню. При необходимости адаптируйте меню выше под свои потребности (дополнительная информация: https://wiki.syslinux.org/wiki/index.php?title=PXELINUX).
Запускаем и добавляем в автозагрузку TFTP-сервер:
systemctl enable --now xinetd
Настроить BIOS на загрузку по сети (PXE). Произвести загрузку.
Errata
Ниже перечислены известные ошибки, баги и недоработки Anaconda в ROSA.
- индикатор прогресса rsync ("Установка ПО") может ошибочно показывать 100%, но на самом деле rsync еще идет, можно запустить htop и убидиться; достаточно подождать
- консольная программа установки (TUI) не запрашивает установку пароля root, в результате чего при установке в режиме Nickel пароль на загрузчик Grub2 не может быть установлен, возникает ошибка установки системы; решение — ставить ОС «Никель» в ином режиме: GUI, VNC, автоматизированном
- ручная разметка диска весьма неудобная и местами глючная