将物理磁盘添加到KVM虚拟机。

我正在一个Ubuntu Server 12.04系统上设置一个文件服务器(nas4free)作为KVM虚拟机。
我想知道如何直接将物理硬盘添加到虚拟机中,以便客户端(nas4free)可以使用它们,而主机则不能。
具体来说,我想要挂载的硬盘是/dev/sda(目前未在服务器上挂载)。
到目前为止,我找到了两种解决方案,但都没有成功。
第一种解决方案来自Server Fault,建议使用virt-manager。但是我无法使其工作,因为当我尝试选择现有驱动器时,列表中没有任何内容。我猜测这可能是因为我通过ssh使用virt-manager,并且没有以root身份连接,这会有所不同吗?
我找到的第二个解决方案here只是运行命令(根据我的系统进行修改)。
qm set nas4free -virtio /dev/sda

但这似乎需要安装Proxmox,而我没有安装它,也似乎不在默认软件源中?
最后,一旦上述问题解决并且我可以直接将驱动器挂载到虚拟机,是否有人有经验告诉我该将驱动器作为SCSI、IDE还是VirtIO挂载到虚拟机?(我知道链接的ServerFault页面推荐使用VirtIO,但在此之前我并不知道它,因为我主要使用VMWare)。
谢谢你的帮助!

1运行 sudo virt-manager,无需以 root 身份连接。不知道 virtio 是否适用于物理设备... - ish
@izx,谢谢你的回复!即使virt-manager是在我的桌面上运行而不是服务器上,这是否会有所影响呢? - evan
3个回答

有着完全相同的需求,我找到了以下内容
(下面的整个文本来自上述来源)

使用virt-manager无法完成此操作。我花了一段时间才弄清楚这一点。据我所知,virt-manager与存储池一起工作。您可以将磁盘转换为存储池,但无法直接将现有磁盘添加到虚拟机中。

幸运的是,修复方法很简单:您可以手动将磁盘添加到域的xml配置文件中。因此,请在您喜欢的编辑器中打开/etc/libvirt/qemu/.xml,并在

部分中添加一个
部分:

<disk type='block' device='disk'>
  <driver name='qemu' type='raw'/>
  <source dev='/dev/md/storage'/>
  <target dev='vdb' bus='virtio'/>
</disk>

这将使主机的/dev/md/storage在虚拟机中作为/dev/vdb可用。手动更改域配置后,您必须手动重新加载配置。登录到主机并执行以下命令:
# virsh define /etc/libvirt/qemu/jetsetetser.xml
Domain jetser defined from /etc/libvirt/qemu/jetsetetser.xml

这里有一个很好的资源,提供了关于使用libvirt管理虚拟机的更多信息:https://help.ubuntu.com/community/KVM/Managing 我强烈建议你遵循smccloud给出的建议。这对我来说非常有效。请注意,不要挂载任何卷到用于客户机的物理驱动器上,否则会严重损坏其文件系统!

5不要使用virsh define...,建议使用virsh edit <NAME>。这样可以在您喜欢的文本编辑器中编辑XML,并自动更新虚拟机的更改。 - Nathan Osman
尽管我已经从主机上卸载了/dev/sd...块设备,但在尝试访问时仍然遇到了权限被拒绝的问题 :( - Sridhar Sarnobat

虽然这个问题已经得到了回答,但是你应该使用/dev/disk/by-id/而不是/dev/sda,从中获取 信息。
    ls -l /dev/disk/by-id

这样,你就可以放心了,以防万一磁盘从/dev/sda变成了/dev/sdb。

2目前这是唯一的答案(迄今为止)在这个问题上发布的。评论中有一些信息可能会有所帮助,但据我所知,他们解决问题的可能性很小。您可以考虑扩展此答案以提供完整的解决方案。如果您的解决方案的某些部分是由其他人设计的,您可以引用并链接到他们的解决方案。我怀疑 izx 不会介意...尤其是因为(当我现在发表评论时)izx 已经一年多没有登录该网站了。 - Eliah Kagan
我正在使用 virsh attach-device domain XML-file... 命令来挂载磁盘。在 <source dev='/dev/...'/> 元素中,你也可以使用磁盘 ID 吗? - MrCalvin

首先,在virt-manager的首选项中启用xml编辑。
然后,在virt-manager的图形界面中为您的虚拟机添加一个普通的基于文件的SATA磁盘。您可以将磁盘大小设置为1GB,或者选择任何未使用的磁盘镜像。
然后,在virt-manager的图形界面中,在您刚刚创建的磁盘的xml窗格中,现有的xml应该如下所示:
<disk type="file" device="disk">
  <driver name="qemu" type="qcow2"/>
  <source file="/var/lib/libvirt/images/vol-1.qcow2"/>
  <target dev="sdc" bus="sata"/>
  <address type="drive" controller="0" bus="0" target="0" unit="2"/>
</disk>

改成:

<disk type="block" device="disk">
  <driver name="qemu" type="raw"/>
  <source dev="/dev/sda"/>
  <target dev="vda" bus="sata"/>
  <address type="drive" controller="0" bus="0" target="0" unit="2"/>
</disk>

然后按下应用按钮。
请注意,您应该保持“address”标签不变,并将其他参数更改为上述内容。
在这里,“/dev/sda”是主机上要由虚拟机使用的物理驱动器。
名称“vda”就像“sda,sdb…”一样,您也可以使用“vdb,vdc…”等。
这适用于Ubuntu 22.04主机和Windows 10虚拟机。Windows没有virtIO驱动程序,因此选择SATA更容易(不确定SATA和virtIO之间是否有性能差异)。