前提条件,cpu要支持xvm或者svm,可以用lscpu查看。
更新系统
$sudo pacman -Syy
$sudo pacman -Suy
安装kvm+noVNC
$sudo pacman -Sy libvirt virt-install qemu python python-numpy libvirt-python git tigervnc wget net-tools bridge-utils ovmf
$cd ~
$git clone https://github.com/novnc/noVNC.git
设置vnc
$vncpasswd
$vncserver
$vncserver -kill :1
建立放ISO的文件夹,比如驱动,系统等都可以放在里面
$mkdir -p ~/ISO
$cd ~/ISO
$wget -c -t5 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso
$wget -c -t5 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win_x86.vfd
$wget -c -t5 https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win_amd64.vfd
然后把windows系统放到里面,建议用安装版,因为需要f6加载软盘驱动,来驱动硬盘。
把你当前用户加到kvm和libvirt组
$sudo usermod -a -G kvm,libvirt xxxxx #注意:xxxxx是指你当前使用的用户名
若不加组,你只能使用root用户启动虚拟机,不建议这样做。
编辑qemu,让当前用户能正常创建启动虚拟机。
$sudo nano /etc/libvirt/qemu.conf
去掉#号并更改为你当前用户和用户组
user = "xxxxx"
group="libvirt"
创建一个桥接网卡
$sudo cp /etc/netctl/examples/bridge /etc/netctl/kvm-bridge
$sudo nano /etc/netctl/kvm-bridge
更改和添加内容
Description="Kvm Bridge connection"
Interface=br0
Connection=bridge
BindsToInterfaces=(enp2s0)
# 我的网卡名是enp2s0,用ip addr查看你的网卡名并更改。
IP=static
# 我使用的是静态IP,如果你使用动态IP,你改成dhcp,并删除下面的内容。
Address=('192.168.1.6/24')
Gateway='192.168.1.1'
DNS=('211.98.4.1' '211.98.2.4')
MACAddressOf=enp2s0
## Ignore (R)STP and immediately activate the bridge
#SkipForwardingDelay=yes
激活并使用些桥接网卡
$sudo netctl enable kvm-bridge
$sudo netctl start kvm-bridge
创建虚拟机
先创建一个事半功倍的运行脚本
$cd ~
$nano winkvm.sh
添加内容
#!/bin/bash
exec virt-install \
--connect qemu:///system \
--virt-type=kvm \
--name=win10 \
--ram=2048 \
--vcpus=2 \
--hvm \
--arch x86_64 \
--boot loader=/usr/share/ovmf/ovmf_code_x64.bin,loader_ro=yes,loader_type=pflash,nvram_template=/usr/share/ovmf/ovmf_vars_x64.bin,loader_secure=no \
--machine q35 \
--os-variant=win10 \
--cdrom=/home/xxxxx/ISO/win10.iso \
--network bridge=br0,model=virtio \
--graphics vnc,listen=0.0.0.0,password=passwd123,port=5910 \
--disk path=/home/xxxxx/kvm/images/win10.img,size=30,bus=virtio,format=qcow2 \
--disk /home/xxxxx/ISO/virtio-win-0.1.141_amd64.vfd,device=floppy \
--boot=uefi \
--video qxl
解析上面的内容:
--virt-type=kvm: 使用KVM作为虚拟机监视器。
--name=win10: 虚拟机实例的名字,每个虚拟机的名字都不能一样,不能有空格。
--ram=2048: 指定虚拟机内存大小,单位是Mb。
--vcpus=2: 为虚拟机指定分配的虚拟CPU核数。
--os-variant=win10: 指定虚拟机系统所属系列以优化虚拟机参数,可以通过命令osinfo-query os 来显示所有支持的系统列表。
--hvm: 启用全虚拟化,KVM虚拟机支持全虚拟化,属于优化性参数。
--cdrom=/home/xxxxx/ISO/win10.iso: 指定作为虚拟机光驱内容的设备或文件,可以是主机的CDROM或者iso文件。
--network network=br0,model=virtio: 将虚拟机连接到主机网络,使用桥接模式,网卡模式设置为virtio。
--graphics vnc: 设置虚拟机的console并将其输出到VNC,这样就可以通过VNC来连接虚拟机了。同时可以指定vnc的端口和监听范围以及密码: port=5910,listen=0.0.0.0,password=passwd123连接密码自行更改。默认情况下端口为从5900开始的第一个空闲端口,监听范围为本机127.0.0.1,修改为0.0.0.0以使外网主机可以连接。后面会讲对于只支持SSH协议的情况下,如何通过SSH隧道连接,所以是否设置为0.0.0.0没有影响,但能设置为0.0.0.0的话,还是设置为0.0.0.0,毕竟直接通过VNC连接更加方便。这些参数也可以在/etc/libvirt/qemu.conf中修改,以使其对所有虚拟机生效,VNC默认连接没有密码。VNC可以理解为linux下的远程桌面。
--disk path=/home/xxxxx/kvm/images/win7.img,size=30,bus=virtio,format=qcow2: 指定虚拟机所使用的存储路径,大小为30G,bus类型为virtio(当然也可以为ide),磁盘格式为qcow2,如果不指定fortmat,则默认格式即为raw。网络和磁盘建议都设置为virtio,virtio即启动优化的虚拟机专用IO驱动,性能更好。磁盘格式使用qcow2更好,因为qcow2格式即QEMU支持的QEMU Copy On Write磁盘格式,是优化后的磁盘格式,支持快照,并且是使用多少占用多少空间。例如你分配了20G大小,如果是raw格式,则立即占用20G,而qcow2则是从很小开始,用多少,占用多少。之前有些人说qcow2性能不如raw,这两种格式可以使用qemu-img进行转换。
--disk /home/xxxxx/ISO/virtio-win-0.1.141_amd64.vfd:指定软盘,添加驱动用,类型device=floppy软驱。
--boot cdrom,hd --video qxl:--boot是指定boot启动顺序,不指定的话,只显示硬盘。--video是指定显卡为qxl,你也可以选择vga,cirrus,vmware,virtio等。
启动虚拟机
$chmod +x winkvm.sh
$./winkvm.sh //这一步可能不动的时候按Ctr + C,继续下面
$virsh --connect qemu:///system list --all
VNC远程连接虚拟机
$~/noVNC/utils/launch.sh --vnc localhost:5910
在其它电脑上打开http://IP:6080/vnc.html,输入password中设置的passwd123就可以连接上了。