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)
本文暂时没有评论,来添加一个吧(●'◡'●)