正如我之前所写的那样,FreeBSD 下的虚拟机管理程序 bhyve 即将支持 Windows 了。在其通过 FreeBSD Virtualization 邮件列表公布时,FreeBSD 11.0-CURRENT r288524 版已对其正式支持。不久之后,Windows 的外交人员 Michael Dexter 就在 FreeBSD Wiki 上编写了一个关于在 bhyve 下运行 Windows 的很棒的指引手册。 在 bhyve 下运行 Windows 的秘密武器就是全新的 UEFI 支持。这真是个相当棒的消息,因为当你在 bhyve 中采用 UEFI 时, 你已不必先在 bhyveload 或 grub-bhyve 中加载操作系统。下面是在命令行运行一个 Windows bhyve 实例的示例:
在我得业余时间里,我正在开发一个叫做 iohyve 小的 shell 脚本,所以当此支持到来时,我欣喜若狂。我开始开发 iohyve 是因为当进行沙箱测试时,我不想使用 Oracle 的 VirtualBox。有时我喜欢点击一些不可靠的链接并写邮件给滥用的部门并标记为垃圾邮件,我希望让尽可能多的任何可能的潜在恶意软件远离我。由于大多数恶意软件都是为 Windows 用户所写,在 bhyve 中支持它意味着我已经慢慢的接近实现这一目标了。现在 iohyve 还不能将客户机放在优秀的虚拟 NAT 网络,但我最近已经把 UEFI 支持 加入到了 FreeBSD ports 中的 iohyve v0.7 版本了。对于今天这个教程,我将使用 GitHub 上的版本来完成在 FreeBSD 中创建一个 bhyve Windows 客户机的任务,因为这个 iohyve UEFI 命令的版本的 bug 比较少。请注意,由于 UEFI 固件还是很新的,是实验性质的,所以 iohyve 对它的支持也是实验性质的。现在的局限在于你只能有一个 HDD,一个虚拟 NIC(使用 tap 设备),以及没有支持 pass-through。其他操作系统若通过 bhyveload 或 grup-bhyve 命令启动则可以支持多个虚拟 HDD,甚至是 passthrough 支持。 主机和安装 ISO 准备。为了利用在 bhyve 中启动芯片(UEFI)的功能,你需要运行FreeBSD 11.0-CURRENT(至少是r288524版本)。自从 iohyve 使用了ZFS, 如果你还在运行 11-CURRENT,你真应该跳过它,使用 zpool 去设置。在我的笔记本上,我选择使用 Root on ZFS 来安装FreeBSD,使用它非常简单。稍后,我将会进入 iohyve 的设置。在这之前,我会先运行 bhyve,我需要先创建一个自定义的 Windows 安装 ISO。因为 bhyve 不能输出视频,我们必须创建一个“无人值守的”安装 ISO。因为我们会重新制作新的 ISO,我们将会在重新制作的 ISO 中安装 VirtIO NIC 驱动来确保 Windows guest 能连接到网络。
正如我前面提到的,FreeBSD 的 wiki 条目 细节已经达到了这种程度。自从 bhyve 开始支持 Windows 之后,为了尝试在 bhyve 下运行不同版本的 Windows 操作系统,我编写了一系列小的脚本和文件。我发现自己一遍又一遍的尝试不同的 AutoUnattend.xml 文件。这个 XML 文件基本上是当在裸机上安装 Windows 时一系列点击按钮的“响应”。我在一个被我称为 Yabs 的脚本里简化了这些流程。我会在本教程中使用那些脚本,但我会随时检查并与 wiki 上的文章同步。你也需要找一个 Windows ISO 安装文件的副本。在本教程中,我将使用 Windows 2008,尽管我也已经用 Windows 2012 试过了。 -用 git 克隆 Yabs 的 repo,并开始你的初始工作目录。 $ git clone https://github.com/pr1ntf/YetAnotherBhyveScript.git Cloning into 'YetAnotherBhyveScript'... remote: Counting objects: 22, done. remote: Compressing objects: 100% (17/17), done. remote: Total 22 (delta 9), reused 17 (delta 4), pack-reused 0 Unpacking objects: 100% (22/22), done. Checking connectivity... done.$ mv YetAnotherBhyveScript/ win2k8auto$ cd win2k8auto/ -使用 fetch 命令从 Peter 那里取得固件,并从 Fedora Project 取得驱动。我将使用 0.1-94 版驱动,因为较新版的驱动在 Windows 2008 下不能正常工作。 $ fetch https://people.freebsd.org/~grehan/bhyve_uefi/BHYVE_UEFI_20151002.fd $ fetch https://fedorapeople.org/groups/virt/virtio-win/deprecated-isos/archives/virtio-win-0.1-94/virtio-win-0.1-94.iso -我找到的 ISO 安装文件叫做 Win2k8R2.iso,其目录内容如下: $ ls BHYVE_UEFI_20151002.fd Win2k8-AutoUnattend.xml extract.sh remaster.sh yabs.sh README.txt Win2k8R2.iso null.iso virtio-win-0.1-94.iso -我们现在必须修改 extract.sh 脚本来指向正确的位置。要注意运行 extract.sh 需要 FreeBSD 的 Port archivers/pz7ip。我的文件如下:
-在我们执行 ./extract.sh 之后我们可以将 AutoUnattend.xml 文件复制到我们的 win2k8 目录下。Yabs 中包含的 AutoUnattend.xml 文件会将管理员密码设置为 R3dm0nd!,并会将默认网卡 IP 设置为 192.168.0.111 并具有指定网关和子网掩码。因此一定要先对其进行修改。你可以在此文件中删除第二个 <SynchronousCommand wcm:action="add">。(在第一次登陆时执行这个命令 netsh interface ipv4 set address name="local area connection" source=static address=192.168.0.111 mask=255.255.255.0 gateway=192.168.0.1)。
iohyve 的安装和准备现在我们的工作目录看起来应该是这样的: $ ls BHYVE_UEFI_20151002.fd Win2k8R2.iso remaster.sh win2k8.iso README.txt extract.sh virtio-win-0.1-94.iso yabs.sh Win2k8-AutoUnattend.xml null.iso win2k8 我们可以继续安装 iohyve 并为我们的 Windows 安装过程做准备。如前所述,我们要使用 GitHub 上的版本,而不是 FreeBSD ports 中的版本。 执行 iohyve version 命令会输出 0.7.1。 $ git clone https://github.com/pr1ntf/iohyve.git Cloning into 'iohyve'... remote: Counting objects: 904, done. remote: Compressing objects: 100% (3/3), done. remote: Total 904 (delta 0), reused 0 (delta 0), pack-reused 901 Receiving objects: 100% (904/904), 231.14 KiB | 0 bytes/s, done. Resolving deltas: 100% (505/505), done. Checking connectivity... done.$ cd iohyve/$ sudo make install clean Password: gzip -cn iohyve.8 > iohyve.8.gz mkdir -p /usr/local/sbin install -c -m 555 /usr/home/pr1ntf/iohyve/iohyve /usr/local/sbin/ install -c /usr/home/pr1ntf/iohyve/rc.d/* /usr/local/etc/rc.d/ install -c iohyve.8.gz /usr/local/man/man8/ rm -f iohyve.8.gz iohyve.8.cat.gz$ cd ~$ iohyve version iohyve v0.7.1 2015/12/08 Im Here for the Party Edition 现在我们需要告诉 iohyve 三件事来设置它。
因为我们想要让 iohyve 在我每次启动电脑的时候都会设置网络和内核模块,我会将 iohyve 的设置分为两部分:为 zpool 执行 iohyve setup pool=zroot 命令,然后修改主机上的 /etc/rc.conf 文件并为接口和模块执行 service iohyve start 命令。
因为我的默认以太网接口是 em0,于是我在主机的 /etc/rc.conf 文件中添加了下面的几行代码。 iohyve_enable="YES" iohyve_flags="kmod=1 net=em0" 现在我可以执行 iohyve setup pool=zroot 命令和 service iohyve start 命令了: $ sudo iohyve setup pool=zroot Setting up iohyve pool...$ sudo service iohyve start Starting iohyve guests... Loading kernel modules... Seting up bridge0 on em0... net.link.tap.up_on_open: 1 -> 1 在我们可以创建我们的 Windows iohyve 客户机之前,我们需要尽早在我们的 win2k8auto 文件夹中做以下三件事。
为了实现这一点,我们可以使用 iohyve cpiso 和 iohyve cpfw 命令: $ ls BHYVE_UEFI_20151002.fd Win2k8R2.iso remaster.sh win2k8.iso README.txt extract.sh virtio-win-0.1-94.iso yabs.sh Win2k8-AutoUnattend.xml null.iso win2k8$ sudo iohyve cpiso win2k8.iso Password: Copying win2k8.iso from win2k8.iso...$ sudo iohyve cpiso null.iso Copying null.iso from null.iso...$ sudo iohyve cpfw BHYVE_UEFI_20151002.fd Copying BHYVE_UEFI_20151002.fd from BHYVE_UEFI_20151002.fd...$ iohyve isolist Listing ISO's... null.iso win2k8.iso$ iohyve fwlist Listing Firmware... BHYVE_UEFI_20151002.fd
Windows 客户机的创建和准备首先我们可以使用 32G 大小的虚拟 HDD 创建一个叫做 win2k8 的新的客户机。
现在我们需要在客户机上设置一些属性,以便 bhyve 可以正常的启动客户机。
现在我们可以开始第一次引导安装了。 |