Anaconda

Материал из Rosalab Wiki
Перейти к: навигация, поиск

Введение и терминология

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. Должна быть обеспечена двусторонняя сетевая доступность клиента (оператора) и сервера (компьютера, на который производится установка ОС).

Подождите. Через какое-то время на машине оператора откроется окно с графической программой установки, пример на скриншоте ниже.
Image.png

Подробная документация по опциями в 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-режиме.

DeepinScreenshot выберите-область 20200923060810.png

Ниже скриншот автоматизированной консольной установки.

DeepinScreenshot выберите-область 20200923043132.png

Запустится программа установки, скачает kickstart-сценарий, автоматически установит ОС и перезагрузит компьютер.


Ссылки на дополнительную документацию:

PXE-загрузка

Описание процесса PXE-загрузки

PXE-загрузка происходит следующим образом:

  • встроенный в BIOS компьютера загрузчик PXE получает IP-адрес по протоколу BOOTP (родственный DHCP протокол)
  • он же скачивает по протоколу TFTP с сервера TFTP: файлы загрузчика, в т.ч. сам загрузчик и конфигурационный файл с описанием меню загрузки, vmlinuz и initrd — урезанную версию операционной системы
  • он же запускает скачанный загрузчик
  • загрузчик запускает скачанную урезанную версию операционной системы (далее — initrd)
  • встроенные в initrd программные компоненты скачивают переданные в параметрах запуска initrd образ файловой системы и дополнительные компоненты полной версии операционной системы, сохраняя их в оперативную память
  • встроенные в initrd программные компоненты запускают ранее скачанную полную версию ОС

Таким образом, запускается тот же LiveCD, что и при загрузке с USB-накопителя или DVD-диска, однако в оперативной памяти требуется достаточное количество места для хранения скачанной полной версии ОС, которая при запуске с дискового накопителя хранится на дисковом накопителе.

Для настройки сервера PXE-загрузки необходимо выполнить описанные ниже наши, при необходимости адаптируя предлагаемые настройки под конкретную локальную сеть. ВСе команды, елси не указано иное, выполняются от root.

Настройка BOOTP-сервера

При необходимости установите пакет dhcp-server (ISC DHCP):

 dnf install dhcp-server

Открываем файл /etc/dhcpd.conf в консольном редакторе:

 nano /etc/dhcpd.conf

Либо правим содержимое по умолчанию, либо удаляем все содержимое и вставляем следующее (может потребоваться адаптация под вашу локальную сеть!):

subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;
  option domain-name-servers ns1.internal.example.org;
  option domain-name "internal.example.org";
  option routers 10.5.5.1;
  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
}
allow booting;
allow bootp;
next-server ip-address;
filename "pxelinux.0";

Добавляем в автозагрузку и запускаем DHCP/BOOTP-сервер:

 systemctl enable --now dhcpd

Смотрим лог:

 systemctl status dhcpd

Должен быть статус "active" зеленым цветом, а не красный "failed", свидетельствующий об ошибке.

Запуск HTTP-сервера

При необходимости установите python3:

 dnf install python3

Приготовьте файл 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/syslinux ; sudo cp -v initrd.img vmlinuz /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 ^2) Automatically install ROSA
  kernel /vmlinuz0
  append initrd=/initrd0.img inst.repo=http://ip-address:8000/ root=live:http://ip-address:8000/ISO/LiveOS/squashfs.img inst.text inst.ks=http://ip-address:8000/a.ks

  label 2
  menu label ^1) Install ROSA
  kernel /vmlinuz0
  append initrd=/initrd0.img inst.repo=http://ip-address:8000/ root=live:http://ip-address:8000/ISO/LiveOS/squashfs.img

"ip-address" замените на 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