Как полностью автоматизировать автоматическую установку virt?

#virtualization #qemu #kvm

#виртуализация #qemu #kvm

Вопрос:

Позвольте мне начать с того, что я хочу сделать. Я хотел бы полностью автоматизировать создание образов виртуальных машин QEMU / KVM с использованием virt-install . Я знаю, что некоторые люди используют для этого инструмент GUI или редактируют XML-описание уже существующего изображения, но я хочу начать с нуля.

Я поискал в Google, и примеры этого трудно найти. Я обнаружил, что virt-install это команда для использования, и что ее можно использовать в интерактивном режиме с подключенной консолью TTY (вы вручную отвечаете на вопросы конфигурации во время установки). Для полностью автоматизированного решения вы можете указать файл запуска (обычно preseed.cfg ), чтобы предоставить ответы на вопросы, которые вы обычно вводите вручную. В файле kickstart также можно указать дополнительное программное обеспечение для установки, конфигурацию диска и сети и т. Д.).

Я думаю, что у меня это в основном работает, за исключением того, что установка зависает вскоре после начала установки. Я думаю, что это как-то связано с необходимостью (или нет) подключения консоли к установке. Вот virt-install команда, которую я использую:

 virt-install --connect qemu:///system 
  --name vm --ram 128 
  --disk path=./vm.qcow2,size=8,format=qcow2 
  --location 'http://archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/' 
  --network user,model=virtio 
  --initrd-inject preseed.cfg 
  --extra-args="console=tty0 console=ttyS0,115200"
  

Это preseed.cfg файл (который я скопировал из многих примеров в Интернете и в документации Ubuntu):

 ### Localization
# Locale sets language and country.
d-i debian-installer/locale string en_US
# Keyboard selection.
d-i keyboard-configuration/layoutcode string us
d-i keyboard-configuration/modelcode string pc105
d-i keyboard-configuration/variantcode string

### Network configuration
# netcfg will choose an interface that has link if possible. This makes it
# skip displaying a list if there is more than one interface.
d-i netcfg/choose_interface select auto
# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp.
d-i netcfg/get_hostname string vm
d-i netcfg/get_domain string foobar.net
# Disable that annoying WEP key dialog.
d-i netcfg/wireless_wep string

### Mirror settings
d-i mirror/country string manual
d-i mirror/http/hostname string us.archive.ubuntu.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string

### Partitioning
# Encrypt your home directory?
d-i user-setup/encrypt-home boolean false
# Alternatively, you can specify a disk to partition. The device name
# can be given in either devfs or traditional non-devfs format.
d-i partman-auto/disk string /dev/vda
# In addition, you'll need to specify the method to use.
# The presently available methods are: "regular", "lvm" and "crypto"
d-i partman-auto/method string regular
# You can choose from any of the predefined partitioning recipes.
d-i partman-auto/choose_recipe select atomic
# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

### Clock and time zone setup
# Controls whether or not the hardware clock is set to UTC.
d-i clock-setup/utc boolean true
# You may set this to any valid setting for $TZ; see the contents of
# /usr/share/zoneinfo/ for valid values.
d-i time/zone string UTC

### Account setup
# Skip creation of a root account (normal user account will be able to
# use sudo).
d-i passwd/root-login boolean false

# To create a normal user account.
d-i passwd/user-fullname string VMuser
d-i passwd/username string vmuser
# Normal user's password, either in clear text
# or encrypted using an MD5 hash.
d-i passwd/user-password-crypted password CRACKMECRACKM

# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine.
d-i grub-installer/only_debian boolean true

### Package selection
d-i tasksel/first multiselect standard
# Individual additional packages to install
d-i pkgsel/include string openssh-server

### Finishing up the first stage install
# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note
# How do you want to manage upgrades on this system?
d-i pkgsel/update-policy select none
  

После всего этого, когда я выполняю virt-install команду, я вижу:

 WARNING  Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
WARNING  No console to launch for the guest, defaulting to --wait -1

Starting install...
Retrieving file linux...                                                                                
Retrieving file initrd.gz...                                                                            
Allocating 'virtinst-linux.rCdX0h'                                                                      
Transferring virtinst-linux.rCdX0h                                                                      
Allocating 'virtinst-initrd.gz.BbRBMv'                                                                  
Transferring virtinst-initrd.gz.BbRBMv                                                                  
Creating domain...                                                                                      
Domain installation still in progress. Waiting for installation to complete.
  

и он просто зависает. Если я ^Z перейду в фоновый режим и начну virsh , я увижу виртуальную машину в запущенном состоянии.

Я думаю, что я близок, но нужно исправить это, чтобы:

  1. Установка завершается и virt-install возвращается в оболочку.
  2. Новая виртуальная машина завершает работу, и я остаюсь с файлом образа, готовым к работе.

Я думаю, что # 2 можно выполнить в preseed.cfg файле с помощью каких-то инструкций по очистке (все еще изучаю это), но любая помощь в исправлении # 1 была бы очень признательна.

Комментарии:

1. Привет, вы наконец решили свою проблему? Я думаю, что у меня такая же проблема…

2. @HadrienTOMA Я так и не разобрался в этом и решил использовать Packer для автоматизированных сборок виртуальных машин. Он работает хорошо (полностью без присмотра), кажется, хорошо поддерживается и будет создавать образы виртуальных машин для ряда платформ в дополнение к QEMU (например, AWS-AMI, VirtualBox и т. Д.).

3. Хорошо, спасибо, что упомянули Packer, я попробую!

4. @HadrienTOMA Этот репозиторий также может помочь вам начать создавать виртуальные машины для QEMU с помощью Packer. Я нашел это очень полезным.

5. Отлично, большое вам спасибо!

Ответ №1:

Чтобы virt-install использовать файл Kickstart для инициализации операционной системы, вам необходимо передать ks= аргумент ядру, указав его через --extra-args параметр:

 --initrd-inject preseed.cfg 
--extra-args="ks=file:/preseed.cfg console=tty0 console=ttyS0,115200"
  

В приведенном выше примере в гостевую операционную систему вводится локальный файл Kickstart, который будет использоваться для автоматической установки.

Вы также можете указать ks через HTTP:

 --extra-args="ks=http://192.168.1.1/preseed.cfg"
  

или FTP:

 --extra-args="ks=ftp://192.168.1.1/preseed.cfg"
  

или NFS:

 --extra-args="ks=nfs:192.168.1.1:/preseed.cfg"