我正在构建一个工具来帮助我管理我的 KVM 服务器。它生成一个命令,使用 kickstart 文件自动为我安装 KVM 来宾。下面是它生成的用于自动安装 Ubuntu 16.04 客户机的示例命令。
virt-install --connect qemu:///system \
--nographics \
--os-type linux \
--accelerate \
--hvm \
--network network=default,model=virtio \
--name testing124 \
--os-variant ubuntu16.04 \
--ram 1024 \
--vcpus 2 \
--location http://us.archive.ubuntu.com/ubuntu/dists/xenial/main/installer-amd64/ \
--disk /home/stuart/code-copy/vms/testing124/disk.raw,bus=virtio,format=raw,cache=writethrough \
--extra-args "console=ttyS0 ks=http://pastebin.com/raw/6TznVUuN"
我希望使用 exec 命令从工具内部执行此命令,而不是将其打印出来并要求我手动复制并粘贴它来执行,就像我到目前为止所做的那样。问题是该命令永远不会完成因为虚拟控制台始终保持打开状态。默认情况下,来宾将重新启动,并连接控制台。如果我指定shutdown
而不是reboot
,那么安装将卡在这一步:
如果我指定halt
或 而poweroff
不是shutdown
,则来宾将关闭,但控制台仍挂在空白屏幕上。 Virsh 还向来宾显示就像running
您执行一样virsh list --all
我需要对命令或 kickstart 文件进行哪些更改才能正常完成 KVM 来宾安装?
附录
将 kickstart 文件复制到下面,以防引用的文件发生更改或丢失。
# Ubuntu server 64bit example kickstart/seed with shutdown
# System language
#lang en_US
lang en_GB
# Language modules to install
#langsupport en_US
langsupport en_GB
# System keyboard
keyboard us
# System mouse
mouse
# System timezone
#timezone America/Chicago
timezone --utc America/Chicago
# Root password
rootpw --disabled
# Initial user
user ubuntu --fullname "" --password ubuntu
preseed user-setup/allow-password-weak boolean true
# pick only one of these actions to take after installation completed
#reboot
#shutdown
#halt
poweroff
# Use text mode install
text
# Install OS instead of upgrade
install
# Use http installation media
url --url http://archive.ubuntu.com/ubuntu
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr yes
# Partition clearing information
clearpart --all --initlabel
# Partition setup
part / --fstype ext4 --size 1 --grow
#part /boot --fstype ext2 --size 200 --asprimary
#part swap --size 1024
#part pv.01 --size 1 --grow
#volgroup rootvg pv.01
#logvol / --fstype ext4 --vgname=rootvg --size=1 --grow --name=rootvol
#preseed partman-lvm/confirm_nooverwrite boolean true
# If you have swap commented out/not specified then you need to have this line.
preseed --owner partman-basicfilesystems partman-basicfilesystems/no_swap boolean false
# System authorization infomation
auth --useshadow --enablemd5
# Firewall configuration
firewall --disabled
# Do not configure the X Window System
skipx
# Make sure to install the acpid package so that virsh commands such
# as virsh shutdown will take effect
%packages
@ubuntu-server
@openssh-server
@acpid
答案1
事实证明,这正是--noautoconsole
in 中的选项virt-install
的完美选择。
描述来自手册页:
不要自动尝试连接到访客控制台。默认行为是启动 VNC 客户端以显示图形控制台,或运行“virsh”“console”命令以显示文本控制台。使用此参数将禁用此行为。
现在,程序执行的 virt-install 命令将几乎立即执行并返回,因为它不会连接到控制台并等待来宾完成安装。即使没有任何内容连接到控制台,来宾仍将使用 kickstart 脚本在后台继续安装。只要 kickstart 文件没有任何问题,来宾将在完成后执行完整安装并关闭(如果在 kickstart 文件中指定关闭)。我可以通过轮询知道来宾何时完成安装,virsh list --all
直到来宾不再显示为running
。
更新后的命令如下:
virt-install --connect qemu:///system \
--nographics \
--os-type linux \
--accelerate \
--hvm \
--network network=default,model=virtio \
--name testing124 \
--os-variant ubuntu16.04 \
--ram 1024 \
--vcpus 2 \
--location http://us.archive.ubuntu.com/ubuntu/dists/xenial/main/installer-amd64/ \
--disk /home/stuart/code-copy/vms/testing124/disk.raw,bus=virtio,format=raw,cache=writethrough \
--noautoconsole \
--extra-args "console=ttyS0 ks=http://pastebin.com/raw/6TznVUuN"
答案2
我通常在自动化安装中使用的--noreboot --noautoconsole
几乎涵盖了完全无人值守的安装。话虽virt-builder
如此,使用它通常virt-install
比完全安装操作系统更快、更好,因为命令更稳定,图像操作更快、更一致。顺便说一句,使用预制模板 VM 映像,速度甚至更快。