如何从 CDROM(ISO 映像)启动以使用 virsh 安装 guest OS
How to boot up from CDROM(ISO image) to install the guest OS using virsh
2017 年 10 月 4 日更新:请参阅下面的回答。感谢 DanielB,因为如果没有 Daniel 的帮助我无法解决问题,所以我将接受他的回答而不是我自己的回答。
我是 libvirt 和系统管理方面的新手,所以如果我问的是愚蠢的问题,请原谅我,尽管我事先已经尝试做尽可能多的功课。
我的问题是:如何在使用 virsh 创建 VM 后立即从 CDROM 启动以安装来宾 OS?
我正在开发 Ubuntu 桌面版 14.04,virsh 1.2.2。
当我使用 'virt-install' 并将 ISO 文件路径作为它的 '--cdrom' 参数传递时,我可以成功启动 virt-viewer window 这让我可以通过来宾OS安装。
据我所知,我还可以使用 XML 定义创建 VM,我转储了使用 'virt-install' 创建的 VM 的 XML 定义。然后我希望 'virt-viewer' window 会在我启动 VM 时自动启动,这样我就可以安装来宾 OS。但是没有。
下面是我的 VM 的 XML 定义。
如果我启用加载程序行,正如我在下面标记为 "suspicious",我将收到 "error: internal error: cannot load AppArmor profile 'libvirt-1092d51d-3b66-46a2-bf9b-71e13dc91799'" 的错误消息。我这样做是因为我正在尝试 libvirt's document here.
中给出的示例
但是,如果我禁用 "loader" 行,并且 运行 virsh create def_domain_test.xml
,可以成功创建域并显示为 'running',但是 没有启动 virt-viewer window,所以我无法在 VM.
上安装 guest OS
有人能帮我吗?我不明白为什么 'virt-install' 可以启动 virt-viewer 但我的 XML 定义不能'吨。我可能错误配置了域 XML 定义,但即使我尝试阅读尽可能多的文档,我也无法找出我错在哪个特定部分。
如有需要,请随时询问更多详情。
<!-- Let's call this file 'def_domain_test.xml' -->
<domain type='kvm'>
<name>vm_c2</name>
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
<!-- Next line is suspicious! -->
<!-- <loader readonly='yes' secure='no' type='rom'>/usr/lib/xen-4.4/boot/hvmloader</loader> -->
<boot dev='cdrom'/>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<!-- Here is the hard drive that doesn't have OS installed. -->
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/home/me/me/testing/vm/pool/mvs_vol_c2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<!-- Here is the Ubuntu ISO. -->
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/home/me/me/testing/vm/ubuntu-14.04.5-server-amd64.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
<alias name='ide0-1-0'/>
<address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='network'>
<source network='default'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</memballoon>
</devices>
</domain>
virsh
是一个非常低级的工具,其命令直接映射到单独的 libvirt API 调用。 virt-install
完成的安装将进行多次 API 调用以完成其工作。因此,仅获取已安装来宾的最终 XML 并将其传递给 virsh define
是不等价的。
首先,virt-install
通常会更改 XML - 它首先创建一个临时访客,将一个 XML 适合从 CDROM 启动的文档,然后完成它将更改 XML 以改为从磁盘启动。 virt-install
将手动启动 virt-viewer
以显示控制台,这不是 virsh
所做的。
那个特定的 <loader>
行不应该与 KVM 一起使用 - 它只与 Xen 相关 - 通过使用你告诉 KVM 运行 Xen paravirt 代码作为其 BIOS 而不是 SeaBIOS - 这肯定会崩溃和燃烧。
如果您对 virt-install
使用 '--debug' 参数,您将看到它在每个步骤中执行的操作的详细信息。如果您想查看每个 libvirt API 调用的详细信息,您还可以设置 LIBVIRT_LOG_FILTERS=1:libvirt
和 LIBVIRT_LOG_OUTPUTS=1:stderr
。
感谢 DanielB 的帮助! virt-install
的“--debug”参数确实揭示了我解决这个问题所需的信息。
首先,在XML定义中,我不需要<loader>
这一行。 <os>
部分应该是:
<os>
<type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
<boot dev='cdrom'/>
<boot dev='hd'/>
</os>
两个<boot>
标签已经指定了启动顺序。
其次,virt-install
的调试输出建议了启动 virt-viewer
:
的所需方式
- 运行:
virt-viewer --connect=qemu:///system --wait vm_c2
- 您可以选择将“--debug”和“--verbose”添加到
virt-viewer
以查看更多输出。
- 此时,应该调出查看器 window 并显示一条消息:
Waiting for guest domain to be created
。
- 运行:
virsh create --file def_domain_test.xml
。
- 现在将激活查看器并显示 VM 的输出。
一个警告 导致我在一开始就卡住了:您不必在 VM 之前启动 virt-viewer
。但是,如果您先启动 VM,然后再启动查看器,则查看器屏幕可能会全黑,这可能会让您感到困惑,让您认为那里什么也没有发生。在这种情况下,单击查看器 window 使其获得输入焦点,然后按 'Enter' 键,您可能会刷新它并查看实际存在的内容。 (调整 window 的大小不会强制刷新。)
仅供参考:如果您输出 virt-viewer 的调试消息,您可能会看到这样的消息:
(virt-viewer:6296): virt-viewer-DEBUG: Error operation forbidden: read only access prevents virDomainOpenGraphics
这似乎没有给我带来任何问题,但如果 virt-viewer 不能为您正常工作,这可能是其他问题的暗示。
2017 年 10 月 4 日更新:请参阅下面的回答。感谢 DanielB,因为如果没有 Daniel 的帮助我无法解决问题,所以我将接受他的回答而不是我自己的回答。
我是 libvirt 和系统管理方面的新手,所以如果我问的是愚蠢的问题,请原谅我,尽管我事先已经尝试做尽可能多的功课。
我的问题是:如何在使用 virsh 创建 VM 后立即从 CDROM 启动以安装来宾 OS?
我正在开发 Ubuntu 桌面版 14.04,virsh 1.2.2。
当我使用 'virt-install' 并将 ISO 文件路径作为它的 '--cdrom' 参数传递时,我可以成功启动 virt-viewer window 这让我可以通过来宾OS安装。
据我所知,我还可以使用 XML 定义创建 VM,我转储了使用 'virt-install' 创建的 VM 的 XML 定义。然后我希望 'virt-viewer' window 会在我启动 VM 时自动启动,这样我就可以安装来宾 OS。但是没有。
下面是我的 VM 的 XML 定义。
如果我启用加载程序行,正如我在下面标记为 "suspicious",我将收到 "error: internal error: cannot load AppArmor profile 'libvirt-1092d51d-3b66-46a2-bf9b-71e13dc91799'" 的错误消息。我这样做是因为我正在尝试 libvirt's document here.
中给出的示例但是,如果我禁用 "loader" 行,并且 运行 virsh create def_domain_test.xml
,可以成功创建域并显示为 'running',但是 没有启动 virt-viewer window,所以我无法在 VM.
有人能帮我吗?我不明白为什么 'virt-install' 可以启动 virt-viewer 但我的 XML 定义不能'吨。我可能错误配置了域 XML 定义,但即使我尝试阅读尽可能多的文档,我也无法找出我错在哪个特定部分。
如有需要,请随时询问更多详情。
<!-- Let's call this file 'def_domain_test.xml' -->
<domain type='kvm'>
<name>vm_c2</name>
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
<!-- Next line is suspicious! -->
<!-- <loader readonly='yes' secure='no' type='rom'>/usr/lib/xen-4.4/boot/hvmloader</loader> -->
<boot dev='cdrom'/>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<!-- Here is the hard drive that doesn't have OS installed. -->
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/home/me/me/testing/vm/pool/mvs_vol_c2'/>
<target dev='hda' bus='ide'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<!-- Here is the Ubuntu ISO. -->
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/home/me/me/testing/vm/ubuntu-14.04.5-server-amd64.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
<alias name='ide0-1-0'/>
<address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>
<controller type='usb' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='network'>
<source network='default'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes'/>
<video>
<model type='cirrus' vram='9216' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</memballoon>
</devices>
</domain>
virsh
是一个非常低级的工具,其命令直接映射到单独的 libvirt API 调用。 virt-install
完成的安装将进行多次 API 调用以完成其工作。因此,仅获取已安装来宾的最终 XML 并将其传递给 virsh define
是不等价的。
首先,virt-install
通常会更改 XML - 它首先创建一个临时访客,将一个 XML 适合从 CDROM 启动的文档,然后完成它将更改 XML 以改为从磁盘启动。 virt-install
将手动启动 virt-viewer
以显示控制台,这不是 virsh
所做的。
那个特定的 <loader>
行不应该与 KVM 一起使用 - 它只与 Xen 相关 - 通过使用你告诉 KVM 运行 Xen paravirt 代码作为其 BIOS 而不是 SeaBIOS - 这肯定会崩溃和燃烧。
如果您对 virt-install
使用 '--debug' 参数,您将看到它在每个步骤中执行的操作的详细信息。如果您想查看每个 libvirt API 调用的详细信息,您还可以设置 LIBVIRT_LOG_FILTERS=1:libvirt
和 LIBVIRT_LOG_OUTPUTS=1:stderr
。
感谢 DanielB 的帮助! virt-install
的“--debug”参数确实揭示了我解决这个问题所需的信息。
首先,在XML定义中,我不需要<loader>
这一行。 <os>
部分应该是:
<os>
<type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
<boot dev='cdrom'/>
<boot dev='hd'/>
</os>
两个<boot>
标签已经指定了启动顺序。
其次,virt-install
的调试输出建议了启动 virt-viewer
:
- 运行:
virt-viewer --connect=qemu:///system --wait vm_c2
- 您可以选择将“--debug”和“--verbose”添加到
virt-viewer
以查看更多输出。 - 此时,应该调出查看器 window 并显示一条消息:
Waiting for guest domain to be created
。
- 您可以选择将“--debug”和“--verbose”添加到
- 运行:
virsh create --file def_domain_test.xml
。- 现在将激活查看器并显示 VM 的输出。
一个警告 导致我在一开始就卡住了:您不必在 VM 之前启动 virt-viewer
。但是,如果您先启动 VM,然后再启动查看器,则查看器屏幕可能会全黑,这可能会让您感到困惑,让您认为那里什么也没有发生。在这种情况下,单击查看器 window 使其获得输入焦点,然后按 'Enter' 键,您可能会刷新它并查看实际存在的内容。 (调整 window 的大小不会强制刷新。)
仅供参考:如果您输出 virt-viewer 的调试消息,您可能会看到这样的消息:
(virt-viewer:6296): virt-viewer-DEBUG: Error operation forbidden: read only access prevents virDomainOpenGraphics
这似乎没有给我带来任何问题,但如果 virt-viewer 不能为您正常工作,这可能是其他问题的暗示。