Вопрос или проблема
Я думаю, это специфическое требование, так как я не нашёл полезных идей, как это сделать. Поэтому публикую своё решение здесь для комментариев.
Я создал собственный RPM-пакет, который устанавливаю во время кастомной минимальной установки Rocky Linux (9.5) с помощью kickstart. Пакет требует доступа к сборочному носителю, чтобы увидеть детали конфигурации (которые могут изменяться) для полной установки и настройки.
Кажется, что сборочный носитель автоматически недоступен на этапе установки chroot в kickstart. Я могу видеть его на этапах %pre и %post.
Пробуя различные способы сделать сборочный носитель доступным во время стадии установки и терпя неудачу, я обнаружил, что могу сделать это следующим образом:
%pre
MOUNT_SCRIPT_PATH="/tmp/mount_build_media.sh"
cat << EOF > "$MOUNT_SCRIPT_PATH"
SYS_ROOT_MOUNT="/mnt/sysimage"
MEDIA_PATH="\$SYS_ROOT_MOUNT/media"
while true; do
if [ -d "\$MEDIA_PATH" ]; then
mkdir "\$MEDIA_PATH/install"
mount --bind "/run/install/repo" "\$MEDIA_PATH/install"
break
else
sleep 1
fi
done
EOF
chmod +x "$MOUNT_SCRIPT_PATH"
setsid "$MOUNT_SCRIPT_PATH" >/dev/null 2>&1 < /dev/null &
Когда стадия установки kickstart в конечном итоге создаёт каталог /media в создаваемой системе, ожидающий скрипт монтирует в него сборочный носитель.
Возникает ощущение, что это может вызвать проблемы с синхронизацией, но это всё, что у меня есть. Надеюсь, это поможет другим, и я открыт для более хорошего способа сделать это. Спасибо.
Вау, я искал нечто подобное для RHEL 9.5. Я делал это другим способом в более ранней версии, но это не сработало на RHEL 9.5. Следующий скрипт – мой текущий:
%pre
cat << EOF > /tmp/mounta
while true; do
if [ -d /mnt/sysroot/root ]; then
sleep 10
mount --bind /run/install/repo /mnt/sysroot/opt
break
else
sleep 5
fi
done
EOF
chmod +x /tmp/mounta
setsid /tmp/mounta >/dev/null 2>&1 < /dev/null &
%end
%post --interpreter=/usr/bin/bash
#!/bin/bash
/opt/path-to-your-application-torun-from-DVD
%end
он ищет /mnt/sysroot/root, и как только он становится доступным, он монтирует DVD в каталог opt, но вот в чем дело. После того как /mnt/sysroot/root становится доступным, /mnt/sysroot/opt требует некоторое время, чтобы появиться, так как система ещё строится. Сначала это не сработало, потом я заметил, что он появился, и вставил 10-секундную задержку – Вуаля!
Ответ или решение
Вопрос о том, как сделать загрузочный носитель доступным во время установки через Anaconda и Kickstart в Rocky Linux, затрагивает довольно специфическую проблему, которая была явно недооценена в сообществе. Большинство существующих решений и документации не предусматривают этот сценарий напрямую, что вынуждает пользователей искать кастомные способы достижения цели. В данном случае, рассматривается пример, когда пользователь создает собственный RPM-пакет, требующий доступ к сборочному носителю для получения конфигурационных данных во время минимальной установки.
Теория
Anaconda — это программа для установки операционной системы в системах на базе Red Hat, включая Rocky Linux. Процесс установки часто автоматизируется с помощью файлов Kickstart, которые содержат все нужные параметры и сценарии для автоматизированной установки системы без вмешательства пользователя. Однако одна из сложностей, с которыми сталкиваются пользователи, заключается в том, что не все этапы установки предоставляют одинаковый доступ к системным ресурсам и носителям. Например, сборочный носитель, на котором находится весь инсталляционный контент, может быть недоступен в chroot окружении, которое используется Anaconda для установки пакетов.
Пример
Описанное в источнике решение начинает с выполнения скриптов на этапе %pre. Здесь создается и начинает выполняться скрипт, предназначенный для периодического опроса состояния установки и выполнения монтирования как только определённые каталоги системы становятся доступными. Скрипт ждет появления каталога /mnt/sysimage, в который в дальнейшем должен быть примонтирован сборочный носитель (/run/install/repo), и в котором находится система, будучи установленной. Монтирование осуществляется с помощью команды mount --bind
.
Аналогичный подход предложен и другим пользователем для RHEL 9.5, где скрипт развертывания ждет появления каталога /mnt/sysroot/root. После его появления также выполняется монтирование через mount --bind
, обеспечивая доступ к данным на носителе.
Применение
Для тех, кто хочет воспроизвести такие подходы в своих установленных системах, необходимо понимать, что такие решения могут не быть идеальными с точки зрения надежности. Основной проблемой является потенциальная зависимость от времени, так как система не всегда может создать нужные каталоги точно в предсказуемые моменты. Это требует внедрения временных задержек (sleep) и циклов опроса (polling) для асинхронного ожидания нужных событий, но это может оказаться неустойчивым подходом в более сложных сценариях развертывания.
Более надежное решение может включать использование внутренних средств самой Anaconda, например, добавления пользовательских скриптов снижения уровня, более глубокой интеграции с специфическими более высокими уровнями команд, управляющих состоянием установки, либо же даже доработку самого установщика. В сложных производственных средах имеет смысл обратиться к опыту с использованием orchestration систем или инструментов конфигурации, таких как Ansible, для более плотной интеграции процессов установки и конфигурирования системных компонентов.
Заключительным шагом должно встать непосредственная проверка решения в безопасной тестовой среде для обеспечения корректности и надежности его работы. Это включает в себя тестирование для обнаружения любого потенциального воздействия времени выполнения на развертывание и устойчивость системы.