menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

Linux下用KVM虚拟Windows7

作者:Chancel Yang, 创建:2019-07-19, 字数:4366, 已阅:655, 最后更新:2019-07-19

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

在Linux下,KVM的体验十分优秀

刚好Nas需要安装一个Windows7虚拟系统来使用迅雷、百度网盘等下载工具,于是打算在Bash下纯手动敲命令行来创建虚拟机

本文是在Debian系的openmediavault上测试通过,大部分Debian发行版操作步骤是差不多的

其他Linux发行版可能有些许细微不同,请根据真实情况参考本文进行安装

1. 准备工作

1.1. 程序安装

首先检查虚拟化支持,有flags输出支持虚拟化

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

安装环境

sudo apt-get install kvm qemu-kvm bridge-utils virtinst libvirt-clients libvirt-daemon-system

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

上述程序说明

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

1.2. 桥接网络

建立桥接网络环境可能会导致网络断开,如果不是特别熟练,不建议远程操作

首先创建桥接网卡

brctl addbr br0

使用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配置

# 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

无论采用哪一种配置,都要注释或删掉enp1s0的配置

最后启用br0网卡

ifup br0

1.3. VNC监听配置

VNC是一种远程配置,用于安装系统时远程(类似于微软的远程桌面)

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

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

配置完成后重启虚拟机配置

sudo systemctl restart libvirt-guests.service

2. 创建虚拟机

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

SUDO qemu-img create -f qcow2 windows7.qcow2 32G

接着创建Windows7虚拟机

# 创建一个名为windows7的虚拟机,操作系统类型为windows
# 使用KVM虚拟化技术,启用硬件虚拟化扩展,分配2048MB的内存给虚拟机
# 分配2个虚拟CPU给虚拟机
# 使用网络桥接模式,网络接口模型为e1000
# 创建一个名为windows7.qcow2的磁盘镜像文件,使用IDE总线连接
# 启用VNC图形界面访问,监听5900端口
# 使用cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso文件作为光盘镜像
sudo virt-install --name=windows7 --os-type=windows \
--virt-type=kvm --hvm --ram=2048 \
--vcpus=2 --network bridge=br0,model=e1000 \
--disk path=windows7.qcow2,bus=ide \
--graphics vnc,port=5900 \
--cdrom=cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso

创建完成后,使用sudo netstat -tlnp查看一下5900端口是否正在监听,如有,则可用vnc客户端连接至5900端口

2.1. 虚拟机管理

列出当前所有虚拟机

sudo virsh list --all

启动/关闭/销毁虚拟机

sudo virsh start windows7
sudo virsh shutdown windows7
sudo virsh destroy windows7 && virsh undefine windows7

最后,如果遇到动态IP获取下,虚拟机没有获取到IP,可能是防火墙问题

如果是iptables的话,开放如下

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

如果是firewalld防火墙,开放如下

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

[[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)]]