Можно ли по сценарию запустить виртуальную машину FreeBSD, запустить на ней программу и получить результат? - PullRequest
3 голосов
/ 08 мая 2020

У меня есть библиотека, которую я хотел бы протестировать на FreeBSD. В моей настройке CI нет систем FreeBSD, и добавить их было бы сложно, , но I могу развернуть виртуальную машину внутри моего сценария CI. (Фактически, я уже делаю это, чтобы протестировать на других версиях ядра exoti c Linux.)

Для Linux это довольно просто: возьмите готовый образ машины с какого-нибудь сайта дистрибутива. , и используйте cloud-init для внедрения сценария первого запуска, готово.

Можно ли сделать то же самое с FreeBSD? Я ищу автоматический способ взять стандартный образ машины FreeBSD (например, загруженный из https://freebsd.org), загрузить его и ввести программу для запуска. Сложность заключается в том, что это должно быть полностью автоматизировано - я не хочу, чтобы вам приходилось вручную щелкать программу установки всякий раз, когда FreeBSD выпускает новую версию.

Ответы [ 3 ]

1 голос
/ 09 мая 2020

Из коробки нет опции, такой как cloud-init, но вы можете создать свой собственный образ и использовать firstboot, например, этот скрипт используется для bootstrap виртуальной машины с saltstack in AWS:

#!/bin/sh

# KEYWORD: firstboot
# PROVIDE: set_hostname
# REQUIRE: NETWORKING
# BEFORE:  login

. /etc/rc.subr

name="set_hostname"
rcvar=set_hostname_enable
start_cmd="set_hostname_run"
stop_cmd=":"

export AWS_ACCESS_KEY_ID=key
export AWS_SECRET_ACCESS_KEY=secret
export AWS_DEFAULT_REGION=region

TAG_NAME="Salt"
INSTANCE_ID=$(/usr/local/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(/usr/local/bin/curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//')
TAG_VALUE=$(/usr/local/bin/aws ec2 describe-tags --filters "Name=resource-id,Values=${INSTANCE_ID}" "Name=key,Values=$TAG_NAME" --region ${REGION} --output=text | cut -f5)

set_hostname_run()
{
    hostname ${INSTANCE_ID}
    sysrc hostname="${INSTANCE_ID}"
    sysrc salt_minion_enable="YES"
    echo ${INSTANCE_ID} > /usr/local/etc/salt/minion_id
    pw usermod root -c "root on ${INSTANCE_ID}"
    if [ ! -z "${TAG_VALUE}" ]; then
        echo "node_type: ${TAG_VALUE}" > /usr/local/etc/salt/grains
    fi
    service salt_minion start
}

load_rc_config $name
run_rc_command "$1"

Для создания ваших собственных изображений вы можете использовать этот скрипт в качестве отправной точки: https://github.com/fabrik-red/images/blob/master/fabrik.sh#L124, подробнее здесь: https://fabrik.red/post/creating-the-image/

Вы также можете просто установить FreeBSD в Virtualbox, настроить сценарии, относящиеся к firstboot, протестировать и, когда вы будете довольны результатами, экспортировать их, просто будьте осторожны перед экспортом, что /firstboot существует (touch /firstboot), так как после первой загрузки он будет удален, и может случиться так, что после экспорта, если его нет, он не будет вызывать сценарии.

После того, как вы создали образ вы можете использовать его несколько раз, нет необходимости каждый раз создавать новую «настраиваемую» виртуальную машину, все зависит от скриптов, которые вы используете для bootstrap и загружаете скрипты при «первой загрузке».

0 голосов
/ 11 мая 2020

Я изучил это немного подробнее, и оказалось, что это возможно, хотя это довольно неудобно.

Есть три типа официальных выпусков FreeBSD: предустановленные виртуальные машины, установщики ISO и USB

Официальные предустановленные образы виртуальных машин по умолчанию не предлагают никаких способов их создания извне. И они используют файловую систему FreeBSD UFS, которую нельзя изменить ни в одной обычной ОС. (Linux может монтировать UFS только для чтения и имеет некоторый код для поддержки чтения-записи, но поддержка чтения-записи отключена по умолчанию и требует специального ядра.) Таким образом, нет простого способа программно изменить их, если вы еще не иметь установленную FreeBSD.

Установщики USB-накопителей также используют файловые системы UFS, так что этого нет. То же самое и с предварительно собранными живыми компакт-дисками, которые я нашел, например mfsBSD (сам компакт-диск - iso9660, но это всего лишь контейнер для большого двоичного объекта UFS, который распаковывается в память). Оказывается, они фактически используют iso9660 для своей фактической разметки файлов. И нам не нужна FreeBSD для работы с iso9660!

Итак, что вам нужно сделать, это:

  • Загрузить установщик с компакт-диска
  • Изменить файлы на нем чтобы выполнить установку без взаимодействия с пользователем, примените некоторую пользовательскую конфигурацию к новой системе, а затем выключите
  • Используйте свой любимый бегун виртуальной машины, чтобы загрузить компакт-диск с пустым образом жесткого диска, и дайте ему поработать для установки FreeBSD на этот жесткий диск
  • Загрузите жесткий диск, и он будет делать все, что вы захотите.

Есть масса неудобных деталей, которые я замалчиваю, но это основная идея c. Здесь также есть полностью проработанный пример: https://github.com/python-trio/trio/pull/1509/

0 голосов
/ 09 мая 2020

Чтобы «внедрить» ваше программное обеспечение, вам обычно требуется возможность записи в файловую систему, и самый надежный способ сделать это - запустить саму систему. Другими словами, у вас есть виртуальная машина FreeBSD для создания виртуальных машин FreeBSD - вы можете либо собрать их локально (выпуск man 7), либо получить образы виртуальных машин из http://download.FreeBSD.org, смонтировать их rootfs где-нибудь, разместить свое программное обеспечение, где бы вы ни находились. нужно, и заставить его выполнить его из смонтированной файловой системы /etc/rc.local.

...