qemu外围设备
备注: 本文为自己的理解,可能有误。
参考文档:
https://github.com/qemu/qemu/blob/master/docs/qdev-device-use.txt
- qemu的外围设备在虚拟机启动时进行配置,当然也可以通过monitor进行动态配置。
- 目前社区正在统一设备的描述方式。
- 设备的描述分为两个部分,虚拟机部分以及宿主机部分,虚拟机部分负责描述在虚拟机中以何种方式展示这个设备。
宿主机部分则描述在物理机中如何访问这个设备。
这两者的连接部分则有qemu来完成。
设备的总线模型
这里只是简单介绍,具体可以查看i440fx 以及q35 的实现。
计算机系统通过总线将所有设备连接起来,根据速度的差异,北桥是高速总线,因为比较接近CPU,南桥是慢速总线,
用于连接磁盘,USB等设备。
所以当你为虚拟机添加一个设备时,处了需要向虚拟机描述这是个什么设备,设备的属性是什么之外,还需要描述这个设备挂在哪里。
i440fx 机器类型的根总线为pci.0,也可以写完整的路径,/i440FX-pcihost/pci.0。这个是系统默认就定义好的。
ide设备总线也是默认就设置好的。一共有两个IDE总线,ide.0 ide.1。每个IDE总线上可以有两个设备。分别 unit 0 跟 1
所以一个虚拟机一共可以有四个IDE设备。
那么,所有的设备都挂在同个总线上么? 显然不是,不同的设备有不同的总线类型。是的,能支持设备的类型是qemu默认定义好的,
总线的类型也是,通过 kvm -device help | grep pci 可以查看到qemu支持哪些总线类型。
如果你不想把所有设备都挂在在root总线上,也就是PCI.0, 那么你就得先创建一个总线设备,然后再把要添加的设备挂载到
指定的总线上。比如以virtio为驱动类型挂载一个磁盘。
虚拟机描述部分为
-device 'virtio-blk-pci,drive=drive-virtio6,id=virtio6,bus=pci.2,addr=0x1'
其中pci.2不是系统默认创建的。
创建方法如下
-device 'pci-bridge,id=pci.2,chassis_nr=2,bus=pci.0,addr=0x1f'
网络设备配置
- 宿主机部分``
-netdev 'type=tap,id=net0,ifname=接口名称,script=虚拟机启动时执行的脚本,downscript=虚拟机关闭时执行的脚本'
qemu 所支持的type 类型可以通过 kvm -netdev help 进行查询
tap为宿主机创建一个虚拟机网卡。
- 虚拟机部分
-device 'virtio-net-pci,mac=8A:9D:0C:30:FA:18,netdev=net1,bus=pci.0,addr=0x13,id=net1,bootindex=301'
# virtio-net-pci 为设备的类型,虚拟机中所展示的设备是预定义好的,并不是你想要添加什么就能添加什么。
# mac 为网卡物理地址, bus 为总线。 addr 为总线上的地址。bootindex 为启动顺序。
存储设备
(1) IDE 设备
# 宿主机部分
-drive 'file=磁盘文件路径,if=none,id=drive-ide3,format=raw,cache=none,aio=native,detect-zeroes=on'
# 虚拟机部分
-device 'ide-hd,bus=ide.1,unit=1,drive=drive-ide3,id=ide3'
需要注意的是驱动类型为 ide-hd
unit可选值为0,以及1
bus可选值为ide.0 以及 ide.1
(2) scsi 设备
# 宿主机部分
首先需要添加scsi总线
-device 'virtio-scsi-pci,id=scsihw0,bus=pci.0,addr=0x5'
-drive 'file=磁盘文件,if=none,id=drive-scsi0,format=raw,cache=none,aio=native,detect-zeroes=on'
#虚拟机部分
-device 'scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,bootindex=104'
备注: channel 有何用?暂时未知。
https://lists.gnu.org/archive/html/qemu-devel/2017-04/msg02823.html 暂时固定为0吧
lun为 scsi的id值,最大值为15
balloon 设备
-device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3'

浙公网安备 33010602011771号