通过 bootindex 属性管理设备启动顺序

QEMU 可以告诉支持它的客户机固件(如 x86 PC BIOS),应按什么设备顺序查找 可启动操作系统。最简单的方法是 -boot order=,也可在命令行各块设备或 网络设备上设置 bootindex,获得更灵活的控制。

固件按 bootindex 决定尝试顺序。未设置的设备具有最低优先级,它们之间的 顺序不作保证,但仍可启动。

部分机器,例如 s390x,不支持 -boot order=,必须使用 bootindex。

-hda、-cdrom 等简写无法设置 bootindex,必须展开为 -drive 与 -device 选项对。

示例

假设机器有两张网卡(virtio、e1000)和两个磁盘(IDE、virtio):

qemu-system-x86_64 -drive file=disk1.img,if=none,id=disk1 \
              -device ide-hd,drive=disk1,bootindex=4 \
              -drive file=disk2.img,if=none,id=disk2 \
              -device virtio-blk-pci,drive=disk2,bootindex=3 \
              -netdev type=user,id=net0 \
              -device virtio-net-pci,netdev=net0,bootindex=2 \
              -netdev type=user,id=net1 \
              -device e1000,netdev=net1,bootindex=1

根据上述命令,固件先尝试 e1000 网卡,失败后尝试 virtio 网卡,再失败则 依次尝试 virtio 磁盘和 IDE 磁盘。

限制

有些固件限制可用于启动的设备。例如 x86 PC BIOS 规范只允许一个可启动 磁盘。如果该磁盘启动失败,不会再试其他磁盘,但仍可尝试软盘或网络。 s390x BIOS 最多尝试 8 个设备,其中磁盘和 virtio-net 数量可以任意组合。

有时固件无法将 QEMU 指定的设备路径映射为启动方法。固件原生支持的设备 通常没有问题,但依赖选项 ROM、且同一 ROM 用于多个设备时,可能无法可靠 指定其中一个。例如 PC BIOS 下,SCSI HBA 连接 target1、target3、target5 三个可启动设备,ROM 为各设备提供启动方法,却无法从方法反向映射具体目标。 这是 PC BIOS 启动规范的局限。

混用 bootindex 与启动顺序参数

不要同时使用 bootindex 和 -boot order=... 或 -boot once=...。 客户机固件通常只支持其中一种,不支持同时使用。混用会导致未定义行为, 很可能无法从预期设备启动。