在 Ubuntu 的 KVM 中安装 Windows 系统

Virtualization

为什么要折腾 KVM 虚拟机

最近因为公司的事情,没有太多时间进行写作,就用一篇技术类的文章来凑数吧。

事情是这样的,我们公司有一个小东西是基于嵌入式的系统开发的,不属于 Android 也不属于 iOS 平台。嗯,这意味着什么呢?这意味着开发这个小东西的语言是 C 语言,而不是 Java, Objective-C 抑或是 Swift。所以我们需要一个 Cross Compiler,也就是俗称的交叉编译环境来编译这个代码。

其实 Xcode 编译出来的 iOS App 也属于交叉编译的范畴。

然鹅,这个交叉编译环境竟然只有 Windows 平台的!其实,好像除了 GCC 之外,好用的交叉编译环境都是 Windows 下面的。估计很多玩嵌入式的同学应该都知道,现在业内用得比较多的也就是 KeilIAR 系列了。而及其不幸的是,两者都是 Windows 特供的,没有 macOS 或 Linux 版本。

为什么 Windows 会让我这么得不爽呢?因为平常为了更好的提高工作效率(其实是为了公司的逼格够高),除了不得不使用的行业应用软件必须要跑在 Windows 下的时候,我们只用 Mac 不用 Windows。所以,我们基本上没有闲置和富裕的 Windows 主机,不!是压根就没有,没有什么「基本没有」一说。

而在服务器端,更不要跟我说什么 Windows Server 云云的。作为一个 macOS 和 Ubuntu 的脑残用户,我是不可能在 Bare metal 上跑一个 Windows Server 的。服务器我们只跑 Linux,别的没兴趣。

那么问题来了,我们有一套自动化编译系统,也就是大家所熟知的 CI 体系 (Continuous integration),用的是 Atlassian 的全家桶:Bitbucket、Bamboo、JIRA 还有 Confluence 什么的,全部跑在 Linux 平台的 Docker 虚拟化容器中。

现在我们想把这个小东西也自动化编译器来,以便更好地把人力释放出来,也方便未来跟踪和管理每一次 Release 的内容。而第一个要解决的问题就是:我们没有 Windows 的服务器。

既然现在虚拟化这么流行,那么我们就利用现有的 Ubuntu 服务器虚拟化一个 Windows 好啦,走起!

啥是 KVM

KVM 的全称是:Kernel-based Virtual Machine,简单一句话概括,就是一个基于 Linux 内核的虚拟化管理系统。

从 Linux 内核 2.6.20 版本开始就已经集成了该功能。简单理解 Docker 是在应用层的虚拟化,而 KVM 是在系统层的虚拟化。

区别就是,Docker 虚拟化的内容,必须跟 Host 主机共享内核,也就意味着只能跑 Linux 类系统。

而 KVM 是整个主机虚拟,所以可以安装不同的操作系统,而不局限于 Linux 本身。等我过段时间抽风的时候,看看能不能在 Ubuntu 上虚拟化个 macOS 出来。这样就不用单独再弄个 Mac 主机来自动化编译 iOS App 了。

安装 KVM

我这里使用的是 Ubuntu 16.04 LTS 版本,考虑长期使用和稳定性,基本上只选 LTS 版本,其他版本差别也不太大,参考着做就好了。

首先是安装 KVM 相关的包文件,因为我的服务器都是命令行,没有安装 X 桌面,所以我加了 --no-install-recommends 参数。不然的话它会安装 virt-viewer 之类的包,而它们的依赖关系中又有 X11 和很多图形图像库,而这些都用不上。但是如果你开启了桌面系统,那么也可以不加该参数。

$ sudo apt-get install --no-install-recommends qemu-kvm qemu-utils libvirt-bin virtinst cpu-checker

让我们来验证一下是不是一切 OK

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

很好,一切顺利,我们再来弄个桥接网络。其实这个也不是必须的,看你的使用场景。

KVM 会自己创建一个 virbr0 的桥接网络,但是这个是一个 NAT 的网络,没有办法跟局域网内的其他主机进行通信,所以还是别偷懒,自己建一个桥接网络吧。

参考配置如下:

$ cat /etc/network/interfaces
# 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

# The bridged network interface
auto br0
iface br0 inet static
    address 1.2.3.4
    netmask 255.255.255.0
    gateway 1.2.3.1
    dns-nameservers 1.2.3.1
    bridge_ports enp9s0
    bridge_stop off
    bridge_fd 0
    bridge_maxwait 0

重启网络,并验证一下桥接状态:

$ sudo systemctl restart networking
$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.f079593874d9       no              enp9s0
virbr0          8000.525400087ef2       yes             virbr0-nic

OK,一切正常,可以开始创建虚拟主机了。

创建虚拟主机

KVM 只是完成了第一步,我们还需要创建虚拟主机才可以继续往下走。

在开始之前,我们要准备好几个东西:

我这里使用的是 Virtio 0.1.126-2 版本。操作系统版本是:Ubuntu 16.04.1 LTS。

一切准备就绪,使用 virt-install 命令来帮助创建虚拟机:

virt-install \
--name win10 \
--memory 2048 \
--vcpus sockets=1,cores=1,threads=2 \
--cdrom=/path/to/windows_10.iso \
--os-variant=win8.1 \
--disk /path/to/win10/win10.qcow2,bus=virtio,size=40 \
--disk /path/to/virtio/virtio-win-0.1.126_amd64.vfd,device=floppy \
--network bridge=br0,model=virtio \
--graphics vnc,password=Passw0rd,port=5910 \
--hvm \
--virt-type kvm

基本上配置信息都在上面了,虚拟信息机配置如下:

  • 2G 内存
  • 1 个 CPU,1 个核,2 个线程
  • 1 个 CDROM(Windows 安装光盘)
  • 40G 硬盘(系统盘)
  • 1 个软驱(Virtio 驱动)
  • 在 5910 端口开放一个 VNC 远程桌面

如果你的命令输入的正确,应该会得到类似的反馈信息:

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

简单来说,就是虚拟机已经创建好了,但是因为没有图像界面,所以没有办法下一步了。当我们连接了 VNC 以后,就可以继续往下走了。这个提示只会出现一次,安装好系统以后,不会出现这个启动等待的情况。

安装 Windows 10

虽然我们在创建虚拟机的时候,指明了使用 5910 端口来提供 VNC 远程桌面。但是这个端口是不能直接访问的,因为它默认绑定在 127.0.0.1 上,也就是只有本地才能访问。我们需要先把远程的本地端口,映射成本地的端口。

ssh -L 5910:127.0.0.1:5910 server

然后在 macOS 下,⌘ + Space 呼叫出 Spotlight,然后输入:

vnc://127.0.0.1:5910

在弹出的窗口中输入密码:Passw0rd

然后就可以愉快的安装 Windows 系统了,如果不能识别硬盘,需要手动加载一下驱动,选择 A 盘和对应的 Windows 目录就可以了。同样的,如果网卡没有驱动,也是如法炮制。

附安装完成的屏幕截图一张:

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容