CentOS 7 上使用 KVM,关联 virtualize

  1. 检查是否支持虚拟化,不支持的话,重启去BIOS里面设置下

    1
    2
    3
     lscpu | grep Virtualization
    
     Virtualization: VT-x
    
  2. 安装 KVM

    1
     yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install
    

    Start the libvirtd service:

    1
    2
     systemctl enable libvirtd
     systemctl start libvirtd
    

    Verify kvm installation

    1
    2
     # Make sure KVM module loaded
     lsmod | grep -i kvm
    
  3. 权限设置
    这一步在centos上使用root倒不需要,在 debian 系上用的。

    1. 添加用户到 kvmlibvirt 用户组
      1
      2
       sudo adduser foo kvm
       sudo adduser foo libvirt
      
    2. libvirt.conf
      1
      2
      3
       $ mkdir ~/.config/libvirt
       $ sudo cp -rv /etc/libvirt/libvirt.conf ~/.config/libvirt/
       $ sudo chown foo: ~/.config/libvirt/libvirt.conf
      

      修改 libvirt.conf

      1
       uri_default = "qemu:///system"
      
    3. qemu.conf

      修改 /etc/libvirt/qemu.conf, 设置 user 为自己,grouplibvirt

      1
      2
       user = "foo"
       group = "libvirt"
      
    4. 重启 libvirt 服务
      1
       sudo systemctl start libvirtd
      
  4. Configure bridged networking

    By default dhcpd based network bridge configured by libvirtd.

    brctl show

    1
    2
     bridge name     bridge id               STP enabled     interfaces
     virbr0          8000.525500b8fe2c       yes             virbr0-nic
    

    virsh net-list

    1
    2
    3
      Name                 State      Autostart     Persistent
     ----------------------------------------------------------
      default              active     yes           yes
    

    All VMs (guest machine) only have network access to other VMs on the same server. A private network 192.168.122.0/24 created

    1
     virsh net-dumpxml default
    

    If you want your VMs avilable to other servers on your LAN, setup a a network bridge on the server that connected to the your LAN. Update your nic config file such as ifcfg-enp3s0 or em1:

    编辑 /etc/sysconfig/network-scripts/enp3s0 ,添加 BRIDGE=br0

    编辑 /etc/sysconfig/network-scripts/ifcfg-br0 ,添加:

    1
    2
    3
    4
    5
    6
    7
    8
     DEVICE="br0"
     # I am getting ip from DHCP server #
     BOOTPROTO="dhcp"
     IPV6INIT="yes"
     IPV6_AUTOCONF="yes"
     ONBOOT="yes"
     TYPE="Bridge"
     DELAY="0"
    

    Restart the networking service (warning ssh command will disconnect, it is better to reboot

    1
     systemctl restart NetworkManager
    

    Verify it with brctl command: brctl show

    1
    2
    3
     bridge name     bridge id               STP enabled     interfaces
     br0             8000.e0d55e4b60d1       no              enp0s31f6
     virbr0          8000.525500b8fe2c       yes             virbr0-nic
    
  5. ======================================================

  6. 创建VM(以创建centos 7为例)

  7. 下载iso
    1
    2
    3
    4
    5
    6
     cd /var/lib/libvirt/boot/
     wget https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
    
     # Verify ISO images:
     wget https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/sha256sum.txt
     sha256sum --ignore-missing -c sha256sum.txt
    
  8. Create CentOS 7.x VM
    下例创建 CentOS 7.x VM with 2GB RAM, 2 CPU core, 1 nics and 40GB disk space
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     virt-install \
     --virt-type=kvm \
     --name centos7 \
     --ram 2048 \
     --vcpus=1 \
     --os-variant=centos7.0 \
     --cdrom=/var/lib/libvirt/boot/CentOS-7-x86_64-Minimal-2009.iso \
     --network=bridge=br0,model=virtio \
     --graphics vnc \
     --disk path=/var/lib/libvirt/images/centos7.qcow2,size=40,bus=virtio,format=qcow2
    
  9. 看下 vnc 设置端口,例如,端口是 5901
    1
    2
     virsh dumpxml centos7 | grep vnc
     <graphics type='vnc' port='5901' autoport='yes' listen='127.0.0.1'>
    
  10. 在工作电脑上设置一个到虚拟机的隧道
    1
     ssh vivek@server1.cyberciti.biz -L 5901:127.0.0.1:5901
    
  11. 在工作电脑上打开 vnc viewer
    连接地址: localhost:5900
  12. vnc连上后,就会看到centos的安装UI界面,按照提示安装。
  13. centos安装完成后,重启完成,vnc可以连接上去,操作命令行登录,安装openssh后,使用ssh。
  14. qcow2 磁盘文件是逐步增长的,安装centos完成后,/var/lib/libvirt/images/centos7-1.qcow2的大小约 1.7G

  15. 配置下网卡
    虚拟机创建好,在 virt-manager 图形界面下,可以看到有一个虚拟网卡:
    • Network source: Bridge br0: Host devices enp0s31f6
    • Device model: virtio

    但此时网卡默认不会启动,修改下 /etc/sysconfig/network-scripts/ONBOOT=yes
    然后重启虚拟机,虚拟网卡启动后,通过host 的 bridge 进入 host 所在的 LAN。

  16. 查询、启动、关闭虚拟机 ==============================================

  17. 列出所有虚拟机
    ~~~sh
    # virsh list –all
    Id Name State
    —————————————————-
    • centos7-1 shut off
      ~~~
  18. 使用 virsh start 启动虚拟机
    1
    2
    3
    4
    5
    6
     virsh start centos7-1
    
     virsh list --all
      Id    Name                           State
     ----------------------------------------------------
      1     centos7-1                      running
    
  19. 使用 virsh shutdown 关闭虚拟机
    1
     virsh shutdown centos7-1
    
  20. 使用 virt-manager 安装 Windows 10 ==============================================
  21. New VM
  22. Choose how you would like to install the operating system:
    勾选 Local install media(ISO image or CDROM)
  23. 选择 windows 10 iso 文件
  24. 勾选 Automatically detect operating system based on install media
    识别出来: OS type : Windows , Version : Microsoft Windows 10
  25. 设置 Memory: 8192M (8G)
  26. 设置CPU数目
  27. 设置硬盘大小: 默认 40G
  28. 设置虚拟机Name
  29. 勾选 Customize configuration before install
  30. Network selection: 这里选bridge 模式: Bridge br0: Host device enp0s31f6
  31. 点击 Finish,完成创建。

  32. 继续,安装之前的配置
  33. 修改虚拟硬盘的性能
    1. 选中 “IDE Disk 1”,修改 disk storage type 为 virtio (默认是IDE)
    2. 点 Apply
    3. 选中 “VirtIO Disk 1”
      Performance Options
      Cache mode: none
      IO mode: Hypervisor default
  34. 设置windows iso 的 CDROM
  35. source path 点击connect,选中windows 10 的安装iso
  36. Disk bus,还是选IDE,虽然慢点,兼容性好
  37. 设置kvm的windows驱动 CDROM
    1. Add Hardware,选择virtio-win-0.1.229.iso,Disk bus,还是选IDE,SATA的话,后面windows installer 找不到。
  38. 选中“Boot Options”,设置下启动顺序

  39. 选中 “CPU”, 勾选 “Manually set CPU topology”
    Sockets: 1
    Cores 和 Threads 自己看物理CPU性能判断吧。

  40. 选中 “Display Spice” ,不用改,保持默认
    Type: Spice server
    Listen type: Address
    Address: Hypervisor default
    Port: 勾选 Auto
    TLS Port: 勾选 Auto
  41. 选中 “Video QXL”,不用改,保持默认
    Model: QXL”

  42. 配置好后,不要x掉这个配置窗口!! 点击窗口左上角“Begin Installation”
  43. 按照提示安装,弹出“选择要安装的驱动程序”
    提示:缺少计算机所需的介质驱动程序。
  44. 点击“Load drivers”,浏览文件系统,在 virtio-win-0.1.229.iso 的盘下面找到驱动
    硬盘驱动,amd64/w10 目录下
    网卡驱动, NetKVM目录下,我没装这个驱动,也正常的。
    显卡驱动, qxldod目录下,我没装这个驱动,也正常的。
  45. 接下来和不同安装 Windows 10 过程一样,直到安装完成,进入windows10
  46. 安装 VirtIO guest tools ,会提高虚拟机Spice的性能和集成度。
    包括qxl video driver and the SPICE guest agent (for copy and paste, automatic resolution switching, …)
  47. 进入 virtio-win-0.1.229.iso 挂载的盘符,运行根目录下的 wirtio-win-guest-tools
  48. 一路next,直到装好。

设置VM自动启动

设置自动启动

1
virsh autostart vmName

关闭自动启动

1
virsh autostart VMNameHere --disable

关闭VM

1
virsh shutdown your-vm-name

克隆VM

1
2
3
4
virt-clone \
  --original ubuntu18.04 \
  --name cloned-ubuntu \
  --file /var/lib/libvirt/images/cu.qcow2

目录说明

虚拟机image默认目录: /var/lib/libvirt/images
系统iso光盘文件目录: /var/lib/libvirt/isos
虚拟机的配置xml: /etc/libvirt/qemu
CPU型号信息: /usr/share/libvirt/cpu_map.xml

保存VM当前状态,host重启后也能恢复

保存VM当前状态: virsh managedsave <domain-name>

恢复: virsh start <domain-name>

保存的状态文件位置: /var/lib/libvirt/qemu/save/<domain-name>.save

  • 执行 managedsave 的时候报错: blocked by non-migratable device 0000:00:06.0/ich9_ahci

    1
      error: internal error: unable to execute QEMU command 'migrate': State blocked by non-migratable device '0000:00:06.0/ich9_ahci'
    

    据 proxmox 论坛的帖子 说: qemu 代码在 sata disk 的保存还是存在问题,不要缓存包含sata设备的VM。

    解决方法: 删除 SATA 类型的硬盘,同时也要删除 SATA Controller

    KVM 中一般使用 VirtIO 类型的硬盘,不用 SATA 也没啥关系。

硬盘格式

img 格式,转换为 qcow2

1
qemu-img convert -f raw -O qcow2 image.img image.qcow2