专业的编程技术博客社区

网站首页 > 博客文章 正文

从virsh当中学习QEMU/KVM启动命令

baijin 2024-09-05 11:27:18 博客文章 5 ℃ 0 评论

1. 简单的翻译

由于我司并非采用virsh管理KVM虚拟机,只有QEMU/KVM命令,目前我的学习是基于virsh,所以从virsh启动的虚拟机当中,通过ps -ef的方式来学习一波QEMU/KVM的启动虚拟机命令

使用virsh启动KVM我使用的是一条非常简单的命令

virt-install --graphics vnc,listen=0.0.0.0 --name vm02 --ram 4096 --vcpus=2 --disk path=CentOS-7-x86_64-GenericCloud-1707.qcow2 --network=bridge:br0 --force --import --autostart

通过ps -ef|grep vm01 我获取到了virtsh帮我实现的一条QEMU/KVM命令

/usr/libexec/qemu-kvm -name vm02 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Broadwell,+rtm,+hle -m 16384 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 4af3d353-030e-4d18-a749-f1a1dcb1c7af -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-vm02/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 -drive file=/home/images/vm02/CentOS-7-x86_64-GenericCloud-1707.qcow2,format=qcow2,if=none,id=drive-ide0-0-0 -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=26,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:44:b9:32,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:1 -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -msg timestamp=on

下面我们就基于这个启动命令来简单学一下QEMU/KVM的命令

  • -name vm01:虚拟机的名称为 vm02。

  • -S :表示启动后暂停虚拟机,等待命令继续运行

  • -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off:定义虚拟机使用的硬件配置。pc-i440fx-rhel7.0.0 是一种虚拟机机型,accel=kvm表示使用KVM加速,usb=off表示禁用USB设备,dump-guest-core=off表示禁用将虚拟机内核转储到文件的功能。

  • -m 16384: 指定虚拟机内存大小为16GB。

  • -realtime mlock=off: 禁用实时性能优化。

  • -smp 4,sockets=4,cores=1,threads=1: 指定虚拟机使用的CPU数量,4个CPU,4个sockets,每个socket 1个core,每个core 1个thread。

  • -uuid 566247a0-2abb-47f8-9632-f81c85e3e485: 给虚拟机指定一个UUID。

  • -no-user-config: 不使用用户配置文件。

  • -nodefaults: 不使用默认配置。

  • -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-vm02/monitor.sock,server,nowait: 定义一个字符设备,用于监控虚拟机状态,路径为/var/lib/libvirt/qemu/domain-2-vm02/monitor.sock。

  • -mon chardev=charmonitor,id=monitor,mode=control: 定义一个监控虚拟机状态的设备。

  • -rtc base=utc,driftfix=slew: 设置虚拟机使用的时钟类型为RTC,时间基准为UTC,使用slew调整时间漂移。

  • -global kvm-pit.lost_tick_policy=delay: 设置虚拟机时钟丢失时的处理方式为delay。

  • -no-hpet: 禁用HPET设备。

  • -no-shutdown: 禁用ACPI关机指令。

  • -global PIIX4_PM.disable_s3=1: 禁用S3睡眠状态。

  • -global PIIX4_PM.disable_s4=1: 禁用S4睡眠状态。

    ACPI S4状态:也被称为挂起到磁盘(Suspend-to-Disk),是一种深度睡眠模式,它将系统的内存内容保存到硬盘中,并关闭计算机以节省能源。当计算机重新启动时,内存内容将从硬盘中恢复,系统会恢复到挂起之前的状态。

    ACPI S3状态:也被称为挂起到RAM(Suspend-to-RAM),是一种较浅的睡眠模式,它将系统的状态保存到RAM中,关闭计算机以节省能源。当计算机重新唤醒时,保存在RAM中的状态将被恢复,并且计算机将继续执行挂起之前的操作。

  • -boot strict=on: 启用严格的引导模式。

  • -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7: 定义一个USB设备,使用EHCI控制器,设备ID为usb,连接到pci.0总线的地址为0x4.0x7。

  • -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4:在虚拟机中添加一个USB控制器设备

    • ich9-usb-uhci1:设备的类型是ICH9 USB UHCI #1。
    • masterbus=usb.0:将此设备连接到名为usb.0的USB控制器上。
    • firstport=0:该设备将在USB控制器上的第一个端口(端口0)上启动。
    • bus=pci.0:将此设备连接到PCI总线上的设备。
    • multifunction=on:启用多功能设备支持。
    • addr=0x4:将此设备映射到PCI总线上的地址0x4
  • -msg timestamp=on: 是 QEMU 的启动参数之一,它可以在输出信息中包含时间戳。在 QEMU 启动后,它会在控制台中显示各种信息,如启动进程、设备初始化等,这些信息中包含了时间戳

2. QEMU monitor 协议(HMP/QMP)

如果我们是virsh的管理方式,那我们大可使用virsh直接操作QEMU,但是如果我们不想依赖这个工具,我们就得使用QEMU monitor 了。

Qemu monitor 就是提供了一个控制台,可以在Qemu 虚拟机运行的时候,和虚拟机交互,获取虚拟机当前信息,给虚拟机发送命令执行等。实际上 qemu monitor 设计了一种协议,可以该协议发送消息给Qemu进程,从而完成对Qemu进程的某些控制。标准控制台stdio只是其中一种实现该协议的交互方式,我们还可以让Qemu监听某个TCP端口,然后我们通过程序控制发送命令给Qemu,只要遵守QMP协议即可。

stdio方式

参数使用 -monitor stdio即可。

sudo qemu-system-x86_64 -m 2048 -hda ubuntubase.qcow2 -smp 4 -netdev user,id=network-ubuntubase -device e1000,netdev=network-ubuntubase,mac=52:54:e4:99:78:31 -monitor stdio

telnet方式

参数使用 -monitor telnet:127.0.0.1:port,server,nowait. 然后就可以通过 telnet 127.0.0.1 port 连接了。

sudo qemu-system-x86_64 -m 2048 -hda ubuntubase.qcow2 -smp 4 -netdev user,id=network-ubuntubase -device e1000,netdev=network-ubuntubase,mac=52:54:e4:99:78:31 -monitor telnet:127.0.0.1:9999,server,nowait

unix socket方式

参数使用 -monitor unix:/tmp/monitor.sock,server,nowait. 然后用 socat - UNIX-CONNECT:/tmp/monitor.sock 或者 nc -U /tmp/monitor.sock 或者直接写一个程序采用连接该套接字。

tcp方式

参数使用 -monitor tcp:127.0.0.1:port,server,nowait, 然后使用 nc 127.0.0.1 port 就可以交互了,或者直接写一个采用TCP连接到该端口。

这里我们来演示一下tcp的方式进入QEMU monitor ,那经过我们上述的二进制启动方式,我们构造一个比较简单的命令出来

/usr/libexec/qemu-kvm -enable-kvm -m 8G -drive file=/home/images/CentOS-7-x86_64.raw,format=raw,if=virtio -device virtio-net-pci,netdev=net0 -netdev tap,id=net0 -name vm-monitor -vnc 0.0.0.0:11 -monitor tcp:127.0.0.1:55900,server,nowait -daemonize

然后我们直接执行

[root@localhost images]# nc 127.0.0.1 55900
QEMU 1.5.3 monitor - type 'help' for more information
(qemu)

这样就可以进入monitor模式了,在这里面可以执行非常多的操作,可以直接help查看帮助信息(help信息太多我就不贴了)

以及最常见的查看QEMU状态的信息

(qemu) info balloon
info balloon
Device 'balloon' has not been activated
(qemu) info status
info status
VM status: running
(qemu)



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表