menu Chancel's blog
rss_feed
Chancel's blog
我就是这样的人

Linux下使用Bash安装KVM并虚拟Windows7

作者:Chancel, 更新:2019 Aug 01, 字数:4941, 已阅:648

这篇文章更新于 1396 天前,文中部分信息可能失效,请自行甄别无效内容。

在已经习惯Linux的图形界面下,使用KVM体验良好,刚好Nas需要安装一个Windows7虚拟系统来使用迅雷、百度网盘等下载工具,但Nas并没有安装桌面系统,于是打算在Bash下纯手动敲命令行来创建虚拟机

本文是在Debian系的openmediavault上测试通过,大部分Debian发行版应该是完全一致的(Debian版本9.5) 其他Linux发行版可能有些许细微不同,请根据真实情况参考本文进行安装

准备阶段

检查虚拟化支持,有flags输出基本就支持虚拟化(除非是很老的机器否则一般都支持了)

egrep '(vmx|svm)' --color=always /proc/cpuinfo

安装环境

Tip:网上大部分资料提到的 libvirt-bin 在许多包管理器上都已经被拆分为libvirt-daemon-system和libvirt-clients了,根据情况安装这两个,libvirt-clients可以支持windows安装阶段的vnc访问

apt-get install kvm qemu-kvm bridge-utils virtinst libvirt-clients libvirt-daemon-system
  • kvm:KVM核心
  • qemu-kvm:KVM的设备模拟,由开源虚拟化软件QEMU中的管理工具演变而来
  • bridge-utils:桥接网卡的集成管理工具
  • libvirt-clients/libvirt-daemon-system:虚拟机命令行管理工具
  • virtinst:虚拟机创建工具

网络桥接环境搭建

建立桥接网络环境可能会导致网络断开,如果是ssh远程操作,请千万注意每一步的意义跟执行后果

创建桥接网卡

brctl addbr br0

建立与真实网卡的桥接,下面是我的网卡输出信息

root@chancel-ov:~# ip a
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
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 70:85:c2:82:20:27 brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:bd:b3:99:14 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 70:85:c2:82:20:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.11/24 brd 192.168.11.255 scope global br0
       valid_lft forever preferred_lft forever

可以看到 enp1s0是我的真实网卡(已经桥接了,所以看起来是没有IP地址的),建立br0与真实网卡的桥接

brctl addif br0 enp1s0

配置桥接网卡的IP获取模式,编辑 /etc/network/interfaces文件 如果要设置动态获取IP模式,注释掉真实网卡的所有配置,再输入虚拟网卡桥接到真实网卡的命令,如下面所示(我删掉了有关enp1s0的所有配置,可以选择注释掉)

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports enp1s0 
bridge_stp off
bridge_fd 0
bridge_maxwait 0

如果要设置成静态固定IP模式,可参考如下配置, 也要注释掉真实网卡的所有配置

# This file describes the network interfaces available on your system
 # and how to activate them. For more information, see interfaces(5).

 # The loopback network interface
 auto lo br0
 iface lo inet loopback

 # Bridge setup
 iface br0 inet static
    bridge_ports eth0 eth1
        address 192.168.1.2
        broadcast 192.168.1.255
        netmask 255.255.255.0
        gateway 192.168.1.1

启用br0网卡

ifup br0

VNC监听配置

重启VNC监听设置要先关闭关联的虚拟机

编辑 /etc/libvirt/qemu.conf,配置好如下字段

vnc_listen = "0.0.0.0"
vnc_password = "XYZ12345" #密码任意设置
spice_listen = "0.0.0.0" #debian6 不需配置这个

配置完成后重启

systemctl restart libvirt-guests.service

创建虚拟机

首先要创建虚拟机需要使用的磁盘空间

qemu-img create -f qcow2 /opt/kvm/windows7.qcow2 32G

创建Windows7虚拟机

virt-install --name=windows7 --virt-type=kvm --hvm --ram=2048 --vcpus=2 --network bridge=br0,model=e1000 --graphics vnc,port=5900 --disk path=/opt/kvm/windows7/windows7.qcow2,bus=ide --os-type=windows --cdrom=/srv/dev-disk-by-id-ata-TOSHIBA_HDWD130_479AVK3AS-part1/systems/Windows/cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso --debug

参数说明

  • name - 虚拟机名称
  • virt-type - 虚拟机类型
  • ram - 运行内存
  • vcpus - cpu核心数
  • network - 网络类型
  • bridge - 桥接的网卡名称
  • model - 桥接的驱动模式(viritio/e1000/SRIVO,这个展开很复杂,通常情况下Windows选择e1000或者viritio都可以,但viritio在版本较低的Windows下可能有断流的情况)
  • port - vnc端口
  • disk path - 磁盘路径
  • os-type - 系统类型
  • cdrom - 安装镜像路径
  • debug - 输出日志信息,可不选

使用 netstat -aptlen 查看是否有"0.0.0.0:5900"端口暴露出去,如果有,直接使用VNC进行连接并继续Windows的安装部署 部署完成之后会发现虚拟机可能没有网卡,更换桥接的驱动模式进行尝试

虚拟机管理

列出当前所有虚拟机

# Root用户
virsh list --all
# 普通用户
virsh --connect qemu:///system list --all

启动/关闭/销毁虚拟机

virsh start windows7
irsh shutdown windows7
virsh destroy windows7 && virsh undefine windows7

在最后面,我自己遇到了一个问题,虚拟机没有获取到IP,即使手动填了IP发现可以识别到网络但无法上网,但可以连接内网其他机器,而其他机器无法连接虚拟机的怪异现象,最后查询资料发现可能是开启了Firewalld的原因 尝试关闭Firewalld之后果然虚拟机就正常了 如果你是iptables的话,很幸运,使用如下指令开放设置

iptables -A INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT

如果你是firewalld防火墙的话,使用如下指令可以尝试一下是否能启用dhcp自动获取

firewall-cmd --permanent --zone=public --remove-interface=enp0s3
firewall-cmd --permanent --zone=internal --add-interface=enp0s3
firewall-cmd --permanent --zone=internal --add-port=67/udp
firewall-cmd --permanent --zone=internal --add-port=68/udp
firewall-cmd --reload

资料参考

debian,ubuntu 安装使用kvm虚拟机 - EdmundChen Debian 9 安装 KVM 虚拟机 - Herald Yu


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]
目录