使用qemu-kvm创建虚拟机
本文包含以下几个部分:
使用qemu-kvm工具中的qemu-img创建磁盘。
支持的文件类型:blkdebug blkverify bochs cloop dmg file ftp ftps gluster host_cdrom host_device host_floppy http https iscsi nbd parallels qcow qcow2 qed quorum raw rbd sheepdog ssh tftp vdi vhdx vmdk vpc vvfat
$ qemu-img create -f qcow2 qcow2.rhel64.img 5G
还可以使用dd命令创建raw disk(不推荐)
- dd if=/dev/zero of=/path/os.img bs=1024 count=1024
- dd if=/dev/zero of=/path/os.img bs=1 count=1 seek=3G
- mkfs.ext3 /path/os.img
- mount -o loop /path/os.img /mnt
往/mnt中写东西,然后umount
到其它地方挂载即可。
注: 如果安装图形化界面的Linux,最好5G以上,因为安装完RHEL或者CentOS 6后,系统会占用2.6GB以上的空间。
2. 安装VNC Server
- $ yum install vnc-server tigervnc #centos 5.x
- $ yum install tigervnc-server tigervnc #centos 6.x
注:如果vncserver仅用于虚拟机VNC访问,那么不需要初始化配置和启动vncserver。
3. 启动虚拟机
qemu-kvm创建虚拟机时,可以指定CPU、内存、磁盘、光驱、网卡、USB、声卡等硬件,也可以指定monitor监控方式用于监控和管理虚拟机。
由于虚拟机网络比较复杂,本文不配置网卡,留在虚拟机网络一文和openswitch网络中详细介绍。
由于虚拟机USB和声卡目前用不到,本文不配置,不介绍。
启动虚拟机后需要安装操作系统的,用下面的命令:
- /usr/libexec/qemu-kvm
- -name centos_desktop_vm09 #虚拟机名字
- -uuid 9929edac-19cb-505c-fbac-1b4d2c30bafe #虚拟机UUID
- -m 1024 # 内存
- -smp 2,sockets=2,cores=1,threads=1 # CPU
- -monitor tcp:10.60.0.45:8809,server,nowait # 监控
- -drive file=/home/kvmdisk/qcow2.rhel64.3g.05.img,if=none,id=drive-virtio-disk0,format=qcow2,cache=writeback #磁盘
- -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 # 驱动
- -vnc 192.168.1.5:9 # 远程桌面访问
- -vga cirrus # 选择显卡
- -cdrom /home/iso/rhel-server-6.4-x86_64-dvd.iso
- -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7
- -boot once=dc #指定驱动器启动顺序
启动虚拟机后不需要安装操作系统的,去掉-boot或者改为-boot c,去掉-cdrom。
注: 实际使用时,需要安装操作系统后,制作成虚拟机镜像,每次启动虚拟机时,直接使用复制镜像作为启动磁盘,启动后就不用安装操作系统了。虚拟机镜像会在之后的文章中单独描述。
参数含义:
-m,指定内存,如果不指定,内存默认为128MB;如果参数值为数字,则单位为MB;可以加单位,M或者G。
-smp,cpu架构为smp,sockets为插槽数(CPU数),cores为单颗CPU核心数,threads为超线程数。
-monitor,监视器重定向,默认为vc(图形界面)和stdio(命令行界面);如果希望通过网络访问,可以为telnet:192.168.1.5,server,nowait ,也可以为tcp:192.168.1.5:5555,server,nowait。server表示是一个linstening socket, nowait表示等待客户端连接的时候不应该阻塞。
-drive和-device,磁盘命令,drive是磁盘,device是驱动,两者配合在一起使用,drive用于指定磁盘文件位置,device用于指定驱动,采用virtio驱动来提升效率,对应的virtio磁盘驱动为virtio-blk-pci。注意-device的drive属性值需要指向某个drive,所以-drive的id和-device的drive要一致。bootindex表示启动顺序。bus、addr用于指定总线,一般是pci,可以指定pci.0, pci.1等,addr不能和其它device重复,大于0即可。
(-drive详细) -drive option[,option[,option[,...]]]
option有以下列表:
file=[file path], if=[file type (ide, scsi, virtio...)], index=[index], media=[disk| cdrom], snapshot=[on|off],cache=[none|writeback|unsafe|directsync|writethrough],format=[qcow2|raw|vmdk|...],copy-on-read=[on|off]
-cdrom,指定CD/DVD的iso文件路径,最常用于系统安装时。
-boot,指定驱动器启动顺序,可以直接用-boot c或者-boot d,其中d表示磁盘,c表示光驱。这个参数可以用-device参数后面的bootindex属性代替。
-vnc,指定vnc地址,-vnc后面的格式是:, 不是Port,是Port_Index。vncserver不需要提前启动,指定-vnc 192.168.1.5:9后,qemu-kvm命令执行后,会自动启动vncserver。
注: 有三个参数本次测试没有使用,但是virt-manager启动虚拟机时会自动加上。
-nodefconfig (默认下qemu会从sysconfdir和datadir读取配置,-nodefconfig禁止qemu读取 )
-nodefaults (默认qemu会创建serial port, parallel port, virtual console, monitor device, VGA adapter, floppy and CD-ROM drive and others,-nodefaults禁止创建这些默认的)
-enable-kvm (允许KVM全虚拟化支持,该选项只有在linux编译时就加入了KVM支持的时候才有效)
带第二块盘:
- /usr/libexec/qemu-kvm
- -name centos6 -smp 2,cores=2 -m 1024
- -drive file=/home/kvmdisk/qcow2.rhel64.2.img,media=disk,format=qcow2,if=none,id=systemdisk
- -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x04,drive=systemdisk,id=systemdiskvirtio,bootindex=0
- -drive file=/home/kvmdisk/qcow2.pdisk.1.img,media=disk,format=qcow2,if=none,id=datadisk
- -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x05,drive=datadisk,id=datadiskvirtio
- -vnc 10.60.0.45:7
- -boot c
4. 通过VNC访问虚拟机
客户端:在windows中,下载vncviewer,运行后,访问:<5900+Port_Index> ( 192.168.1.5:5909 ) 地址。
5. 通过nc访问虚拟机监控和管理(虚拟机模拟器)
根据-monitor指定的参数,如果是tcp类型的,则可以通过以下命令访问:
- $ nc 192.168.1.5 5555
-
- [xinhua@mysql01 ~]$ nc mysql01 8809
- QEMU 0.12.1 monitor - type 'help' for more information
- (qemu) info
- info
- info version -- show the version of QEMU
- info commands -- list QMP available commands
- info network -- show the network state
- info chardev -- show the character devices
注: 如果是telnet类型的,可以直接通过telnet 192.168.1.5访问。如果是unix socket类型的,可以通过 nc -U 访问,但是这种方式实际并不可用。
6.本次测试遇到的问题
(1) 如果忘记设置内存-m,那么系统启动时停止在childrip,即内存越界。
- [ 7.048543] [<ffffffff8100ce22>] kernel_thread+0x82/0xe0
- [ 7.054566] [<ffffffff8105fec1>] ? __call_usermodehelper+0x0/0x6a
- [ 7.061482] [<ffffffff8105fcd8>] ? ____call_usermodehelper+0x0/0x118
- [ 7.068666] [<ffffffff8100ce80>] ? child_rip+0x0/0x20
- [ 7.074407] [<ffffffff8105ff0c>] ? __call_usermodehelper+0x4b/0x6a
- [ 7.081403] [<ffffffff8106168e>] worker_thread+0x14e/0x1f8
- [ 7.087627] [<ffffffff810651a3>] ? autoremove_wake_function+0x0/0x38
- [ 7.094818] [<ffffffff81061540>] ? worker_thread+0x0/0x1f8
- [ 7.101039] [<ffffffff81064f69>] kthread+0x69/0x71
- [ 7.106488] [<ffffffff8100ce8a>] child_rip+0xa/0x20
- [ 7.112027] [<ffffffff81064f00>] ? kthread+0x0/0x71
- [ 7.117564] [<ffffffff8100ce80>] ? child_rip+0x0/0x20
(2) 遇到vnc窗口一闪而过,通过在客户端的expert页面中修改colorlevel属性为rgb222解决。
(3) qemu-kvm命令后面的参数的属性用逗号隔离的,注意逗号前不要加空格
(4) 如果设置内存小于512M,可能不能通过图形化界面安装Linux操作系统,只能通过文本命令行安装。
7. 其它更高级的虚拟化管理工具生成的qemu-kvm进程
OpenStack nova启动的KVM虚拟机进程
/usr/libexec/qemu-kvm -name instance-0000008b -S -machine pc-i440fx-rhel7.1.0,accel=kvm,usb=off -cpu Westmere,+rdtscp,+pdpe1gb,+x2apic,+dca,+pcid,+pdcm,+xtpr,+tm2,+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pclmuldq,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme -m 512 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 9916d558-ca8d-4afe-b545-1b0144ef8c17 -smbios type=1,manufacturer=Fedora Project,product=OpenStack Nova,version=12.0.0-1.el7,serial=6d17f1e0-1901-48a2-aa98-7e8636183b0f,uuid=9916d558-ca8d-4afe-b545-1b0144ef8c17,family=Virtual Machine -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-instance-0000008b/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/data3/novastate/instances/9916d558-ca8d-4afe-b545-1b0144ef8c17/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -netdev tap,fd=23,id=hostnet0,vhost=on,vhostfd=32 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:73:cc:7f,bus=pci.0,addr=0x3 -chardev file,id=charserial0,path=/data3/novastate/instances/9916d558-ca8d-4afe-b545-1b0144ef8c17/console.log -device isa-serial,chardev=charserial0,id=serial0 -chardev pty,id=charserial1 -device isa-serial,chardev=charserial1,id=serial1 -device usb-tablet,id=input0 -vnc 192.168.201.253:12 -k en-us -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5 -msg timestamp=on
virt-manager启动的KVM虚拟机进程
如果img为qcow2格式,但是自动创建虚拟机时,向导并没有让指定磁盘类型,因此为raw。这样在安装客户机的操作系统时,会报磁盘没有空间的错误。
/usr/libexec/qemu-kvm -name centos-vm01 -S -M rhel6.6.0 -enable-kvm -m 1024 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 55c34d55-23f2-2f13-a02d-ce8995adebb7 -nodefconfig -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/centos-vm01.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-reboot -no-shutdown -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 -drive file=/home/kvmdisk/qcow2.rhel64_vm01.img,if=none,id=drive-virtio-disk0,format=raw,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=2 -drive file=/home/kvmdisk/rhel-server-6.4-x86_64-dvd.iso,if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0,bootindex=1 -netdev tap,fd=23,id=hostnet0,vhost=on,vhostfd=24 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:70:46:65,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device usb-tablet,id=input0 -vnc 127.0.0.1:0 -vga cirrus -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on