对于KVM虚拟机,一般启动我们会用 virsh create ×××.xml 方式启动,其实底层还是调用了qemu-kvm命令行去执行,只不过virsh在启动前做了一些准备工作。有时候,我们需要用qemu-kvm方式去启动虚拟机,比如本人想做基于KVM的linux内核调试。
1、生成命令行
如果正在跑一个虚拟机,可以根据域ID或者虚拟机名城生成命令行:
virsh domxml-to-native qemu-argv 1 或者
virsh domxml-to-native qemu-argv centos7.0
如图,生成了一大串命令行,里面默认带了很多参数,可以根据自己需求精简掉。
当然也可以一根据xml文件来生成命令:
virsh domxml-to-native qemu-argv –xml xxx.xml
2、修改需命令行参数
本处做了一些精简:
/usr/bin/qemu-kvm -name guest=centos7.0,debug-threads=on \
-machine pc-i440fx-3.0,accel=kvm,usb=off,vmport=off,dump-guest-core=off \
-cpu IvyBridge-IBRS,ss=on,vmx=on,pcid=on,hypervisor=on,arat=on,tsc_adjust=on,ssbd=on,xsaveopt=on,pdpe1gb=on \
-m 8192 \
-realtime mlock=off \
-smp 24,sockets=1,cores=24,threads=1 \
-uuid 00abc653-e597-4275-bf2f-bed93ad3a045 \
-no-user-config \
-nodefaults \
-rtc base=utc,driftfix=slew \
-global kvm-pit.lost_tick_policy=delay \
-boot menu=on,strict=on \
-drive file=/var/lib/libvirt/images/centos7.0.qcow2,format=qcow2,if=none,id=drive-virtio-disk0,cache=none,aio=native \
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1,write-cache=on \
-device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 \
[设置显示参数]
-netdev tap,id=hostnet0,ifname=vnet0 \
[设置网络设备,设备名为vnet0]
-device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:6b:0d:a1,bus=pci.0,addr=0x3 \
[设置网卡]
-vnc :2
[vnc设置,如果不设,默认会启动一个GTK窗口显示操作界面]
3、关于网络参数
一般情况,我们会为每个虚拟机建一个tap设备,然后桥接起来。
-netdev tap,id=hostnet0,ifname=vnet0
-device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:6b:0d:a1,bus=pci.0,addr=0x3
-netdev中的 id=hostnet0与下面的网卡参数中的netdev=hostnet0相关联。
如果只用上面的参数,会报一个错误:
qemu-system-x86_64: network script /etc/qemu-ifup failed with status 256
需要我们建一个网卡启动脚本,如果不想建脚本,可以将参数改为如下:
-netdev tap,id=hostnet0,ifname=vnet0,script=no,downscript=no
新加的两个参数指明,网卡启动和关闭不需要脚本操作。
命令行启动后,执行ip a ,会看到多了一个vnet0网卡设置,这个其实就是添加的tap设备:
如果想查看本机建了哪些tap设备,可以执行 ip tuntap show
在启动虚拟机后,会有eth0网络设备了,但是还是无法与宿主机通信,ping不通。
此时需要手动up一下vnet0,并将之加入kvm虚拟机网桥:
如果不想每次都敲一下命令,前面说的qemu-ifup脚本就派上用处了,下面是个简单的ifup脚本:
#!/bin/bash
ip link set $1 up
brctl addif virbr0 $1
qemu-ifdown可以不写,虚拟机关闭后,vnet0设备会自动删除掉,对应的桥接信息也会删掉。
这样新建了qemu-ifup脚本后,netdev参数可写为:
-netdev tap,id=hostnet0,ifname=vnet0,downscript=no