Anaconda

Материал из Rosalab Wiki
Версия от 12:38, 27 августа 2021; Mikhailnov (обсуждение | вклад)

Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений.
Перейти к: навигация, поиск

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

Anaconda — это программа для установки операционной системы (далее ­— ОС) с загрузочного образа на диск компьютера (далее — программа установки, инсталлятор).

Статья описывает использование Anaconda в дистрибутивах на платформах rosa2021.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 запускает систему.

Минималистичный образ rosa2021.1 для тестирования инсталлятора: https://abf.io/platforms/rosa2021.1/products/279

Принцип работы

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

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

Подождите. Через какое-то время на машине оператора откроется окно с графической программой установки, пример на скриншоте ниже.
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

# 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, можно перечислить несколько служб через запятые без пробелов. Пример отключения sshd:

 services --disabled="sshd"
 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
%end

Приведенный выше скриптлет запустится внутри установленной системы (в chroot). Если нужно запустить скриптлет в LiveCD, то к %post необходимо добавить параметр --nochroot. Ниже приведен пример того же самого действия не из chroot:

%post --nochroot
LC_ALL=C date > "${INSTALL_ROOT}/var/log/installtime"
%end

Можно удалить ненужные пакеты:

%post
dnf remove -y firefox-esr52
%end

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

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.

Установка необходимых пакетов

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

 dnf install dhcp-server tftp-server syslinux

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

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

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

Пусть сервер является десктопной операционной системой, на которой сеть настраивается автоматически через NetworkManager. Откройте настройки сетевого соединения. Перейдите во вкладку "IPv4". Поставьте отметку "Для этого соединения требуется IPv4". Поставьте "Метод" = "Вручную". В появившейся таблице нажмите "Добавить", заполните поля: "Адрес" = "192.168.1.1", "Маска сети" = "255.255.255.0". Нажмите "ОК". Отключите и включите соединение.

Снимок1889.png

При необходимости на сервере установите пакет 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 syslinux

Копируем в папку сервера TFTP компоненты первоначального загрузчика:

 ( cd /usr/share/syslinux && cp -v menu.c32 pxelinux.0 ldlinux.c32 libutil.c32 /var/lib/tftpboot/ )

Копируем урезанную версию ОС из 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 tftp

Настроить BIOS на загрузку по сети (PXE). Произвести загрузку.

Errata

Ниже перечислены известные ошибки, баги и недоработки Anaconda в ROSA.

  • индикатор прогресса rsync ("Установка ПО") может ошибочно показывать 100%, но на самом деле rsync еще идет, можно запустить htop и убидиться; достаточно подождать
  • консольная программа установки (TUI) не запрашивает установку пароля root, в результате чего при установке в режиме Nickel пароль на загрузчик Grub2 не может быть установлен, возникает ошибка установки системы; решение — ставить ОС «Никель» в ином режиме: GUI, VNC, автоматизированном
  • ручная разметка диска весьма неудобная и местами глючная
  • если в drakxtools выбрать сочетание клавиш для переключения раскладки, то его можно было бы подхватывать в Anaconda