记录一次在迷你主机上安装KVM虚拟机并运行windows

自己的小服务器系统由于硬盘升级, kvm重装一遍, 因此趁这个机会记录下KVM安装历程, 我在里面安装Windows server 2019系统, 本文将安装qemu+kvm with virt

(English version translate by GPT-3.5)

准备安装

  1. 先检查自己的CPU是否支持虚拟化(如今的宿主机CPU基本没有不支持的)

    1
    cat /proc/cpuinfo | egrep 'vmx|svm'
  2. 如果返回如下的内容(其实只要如果有内容返回, 就行), 就表示支持。

    1
    2
    3
    4
    5
    6
    7
    8
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
    flags : fpu vme de pse tsc ...... monitor ds_cpl vmx est tm2 ssse3 ......
  3. 如果没有任何返回, 那么就表示。。。不支持虚拟化

安装基础包

  1. 关闭SELinux, 将/etc/sysconfig/selinux中的SELinux=enforcing改成SELinux=disabled, 改完后如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    # enforcing - SELinux security policy is enforced.
    # permissive - SELinux prints warnings instead of enforcing.
    # disabled - No SELinux policy is loaded.
    SELINUX=disabled // 更改这里
    # SELINUXTYPE= can take one of three values:
    # targeted - Targeted processes are protected,
    # minimum - Modification of targeted policy. Only selected processes are protected.
    # mls - Multi Level Security protection.
    SELINUXTYPE=targeted
  2. 执行以下命令

    1
    yum -y install qemu-kvm libvirt virt-install bridge-utils
  3. 然后就是建议重启机器(虽然不重启也没关系)

  4. 使用 lsmod | grep kvm来检查kvm模块是否运行, 如下输出表示运行成功

    1
    2
    3
    [root@localhost ~]# lsmod | grep kvm
    kvm_intel 188688 0
    kvm 636931 1 kvm_intel

设置网络为桥接网络

这里不讲述NAT网络具体设置

这一步建议到宿主机上进行操作, 不要用ssh, 因为这一步设置网络时用ssh可能会断开网络导致设置中断

  1. 进入目录: /etc/sysconfig/network-scripts/

  2. 找到自己的网卡, 并编辑它(网卡名可以通过ip addr), 例如我输入ip addr出现如下, 我的主网卡是enp1s0

    1
    2
    3
    4
    5
    6
    7
    8
    [root@Ruter-Home ~]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    ...
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    inet 10.0.0.80/24 brd 10.0.0.255 scope global noprefixroute dynamic br0
    3: wlp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    ......

    为什么不是eth0, 是因为从v197版本之后的systemd都将更改命名方式, 原来的ethN更改为为en[x][M]s[N], 原来的wlanN更改为wl[x][M]s[N], 从上面可以看到我有一个网口enp1s0, 以及1个无线网口wlp2s0

    具体参考该网址 Predictable Network Interface Names

    1. Names incorporating Firmware/BIOS provided index numbers for on-board devices (example: eno1)
    2. Names incorporating Firmware/BIOS provided PCI Express hotplug slot index numbers (example: ens1)
    3. Names incorporating physical/geographical location of the connector of the hardware (example: enp2s0)
    4. Names incorporating the interfaces’s MAC address (example: enx78e7d1ea46da)
    5. Classic, unpredictable kernel-native ethX naming (example: eth0)
  3. 备份你的主网卡配置,并运行如下命令(命令中的网卡改为自己网卡名)

    如果要删除网桥, 参考这个网站CentOS7.4 删除virbr0虚拟网卡

    1
    2
    3
    [root@Ruter-Home kvm]# virsh iface-bridge enp1s0 br0
    Created bridge br0 with attached device enp1s0
    ....
  4. 如果这里没有错误最好, 但是我这边遇到错误了, 出现了如下的报错

    1
    2
    3
    error: Failed to start bridge interface br0
    error: internal error: failed to create(start) interface br0: failed to execute external program - Running 'ifup br0' failed with exit code 1:
    Determining IP information for br0... failed: no link present. Check cable?
  5. 这个问题好像是br0无法指定IP,我查了下并做了如下更改

    修改ifcfg-enp1s0 vi /etc/sysconfig/network-scripts/ifcfg-enp1s0

    1
    2
    3
    4
    5
       DEVICE="enp1s0"
    ONBOOT="yes"
    BRIDGE="br0"
    # 下面的BOOTPROTO是新增的, 值为None
    BOOTPROTO=none

    修改ifcfg-br0如下 ``vi /etc/sysconfig/network-scripts/ifcfg-br0`

    1
    2
    3
    4
    5
    6
    7
    8
    DEVICE="br0"
    ONBOOT="yes"
    TYPE="Bridge"
    BOOTPROTO="dhcp"
    # 注释了这1/2行
    #STP="on"
    # 注释了这2/2行
    #DELAY="0"
  6. 停用网卡, 再启用网卡, 并重启网络服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ifdown enp1s0
    ifdown br0

    ifup enp1s0
    ifup br0

    # 此时依然没有IP, 然后我重启了network, IP有了

    systemctl restart network
  7. 配置完成 ifconfig

    1
    2
    3
    4
    5
    6
    7
    8
    br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.*.*.* netmask 255.255.255.0 broadcast 10.0.0.255
    inet6 ************ prefixlen 64 scopeid 0x20<link>
    ether ********* txqueuelen 1000 (Ethernet)
    RX packets 244 bytes 16938 (16.5 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 171 bytes 34132 (33.3 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

执行安装操作系统

在这之前, 还得准备好这2个软件

Download VNC-Viewer VNC连接软件, 因为CentOS是server版的, 通过该软件来进行系统安装

Download virtio-win-0.1.173-2 这个软件是windows驱动, 需要用它来识别出虚拟磁盘, 这个放到kvm主机上的某个位置

别忘了准备好windows的iso镜像, 这里提供 MSDN我告诉你 的镜像ed2k地址

1
2
3
4
5
文件名: cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso
SHA1: 1198eccdd944e49a8b981fb2c436c36a5b3ed301
文件大小: 4.98GB
发布时间: 2019-03-29
ed2k://|file|cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso|5347280896|49FCF8C558517608537E0396854560D6|/

准备好后, 创建虚拟磁盘

其实下面的格式后缀不一定是qcow2, 可以是.img 只是一个文件而已, 我创建在了/mnt/kvm中

1
qemu-img create -f qcow2 kvm-winserver2019.qcow2 50G

执行命令, 启动虚拟机

关于virt-install的详细命令解释如下

-n –name= 客户端虚拟机名称
-r –ram= 客户端虚拟机分配的内存
-u –uuid= 客户端UUID 默认不写时,系统会自动生成
–vcpus= 客户端的vcpu个数
-v –hvm 全虚拟化
-p –paravirt 半虚拟化
-l –location=localdir 安装源,有本地、nfs、http、ftp几种,多用于ks网络安装
–vnc 使用vnc ,另有–vnclient=监听的IP –vncport =VNC监听的端口
-c –cdrom= 光驱 安装途径
–disk= 使用不同选项作为磁盘使用安装介质
-w NETWORK, –network=NETWORK 连接客户机到主机网络
-s –file-size= 使用磁盘映像的大小 单位为GB
-f –file= 作为磁盘映像使用的文件
–cpuset=设置哪个物理CPU能够被虚拟机使用
–os-type=OS_TYPE 针对一类操作系统优化虚拟机配置(例如:‘linux’,‘windows’)
–os-variant=OS_VARIANT 针对特定操作系统变体(例如’rhel6’, ’winxp’,’win2k3’)进一步优化虚拟机配置
–host-device=HOSTDEV 附加一个物理主机设备到客户机。HOSTDEV是随着libvirt使用的一个节点设备名(具体设备如’virsh nodedev-list’的显示的结果)
–accelerate KVM或KQEMU内核加速,这个选项是推荐最好加上。如果KVM和KQEMU都支持,KVM加速器优先使用。
-x EXTRA, –extra-args=EXTRA 当执行从”–location”选项指定位置的客户机安装时,附加内核命令行参数到安装程序
–nographics “virt-install” 将默认使用–vnc选项,使用nographics指定没有控制台被分配给客户机
————————————————
版权声明:本文为CSDN博主「翟海飞」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhaihaifei/article/details/51153402

1
2
3
4
5
6
7
8
9
10
11
12
13
virt-install \
--name kvm-winserver2019 \
--memory 4096 \
--vcpus sockets=1,cores=3,threads=6 \
--cdrom=/mnt/cn_windows_server_2019_updated_march_2019_x64_dvd_c1ffb46c.iso \
--os-type=windows \
--os-variant=auto \
--disk /mnt/kvm/kvm-winserver2019.qcow2,bus=virtio,size=50 \
--disk /mnt/kvm/virtio-win-0.1.173_amd64.vfd,device=floppy \
--network bridge=br0,model=virtio \
--graphics vnc,password=123456,listen=::,port=5910 \
--hvm \
--virt-type kvm

如果希望NAT网络, 将--network bridge=br0,model=virtio 更改为 --network network=default

这里我用的名字是kvm-winserver2019, 如果名字不一样后面别忘了替换

会输出如下内容

1
2
3
4
5
WARNING  Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
WARNING No console to launch for the guest, defaulting to --wait -1

Starting install...
Domain installation still in progress. Waiting for installation to complete.

打开vnc-viewer, 连接到这台机器的5910端口

如果无法连接5910端口, 估计是centos的防火墙拦截掉了, 运行以下命令可以放通5910端口

[root@Ruter-Home ~]# firewall-cmd –zone=public –add-port=5910/tcp –permanent
success
[root@Ruter-Home ~]# firewall-cmd –reload
success

输入密码123456后, 出现这样的画面, 剩下的就是正常的安装流程了, 就不介绍了

installing-kvm-winserver2019

如果安装过程中硬盘找不到, 通过这样子安装驱动

install-driver

选择第二个, 然后磁盘就出来了, 接下来就是正常的安装

select-two

normal-installing

安装完毕后, 可能没有网卡, 进入设备管理器, 然后选择手动更新, 并选择软盘驱动器里面的win10 文件夹, 安装后就有网卡了

install-eth

如果希望看到真实的CPU名字的话

如果看到CPU名字是Qemu Virtual CPU不顺眼, 可以进行如下配置

  1. 执行 virsh edit 你虚拟机名字

    1
    virsh edit kvm-winserver2019
  2. 在首行文本中更改为如下, 其中 xmlns:qemu是增加的内容

    1
    <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  3. <domain></domain>之间添加如下, 就搞定了

    1
    2
    3
    4
    <qemu:commandline>  
    <qemu:arg value='-cpu'/>
    <qemu:arg value='host'/>
    </qemu:commandline>

好了, 安装完毕了, 放一点virsh的基本操作

查看虚拟机列表

1
2
3
4
5
6
virsh list

输出
Id Name State
----------------------------------------------------
5 kvm-winserver2019 running

启动和关闭

1
2
3
virsh start 虚拟机名    # 启动虚拟机
virsh shutdown 虚拟机名 # 关闭虚拟机
virsh destroy 虚拟机名 # 直接关闭虚拟机电源

查看/编辑 virsh XML配置(加硬盘会用到)

1
virsh edit 虚拟机名

导出xml配置

1
virsh dumpxml 虚拟机名 > 导出到的文件名

如果希望开机启动

1
virsh autostart 虚拟机名