.. _bhyve_ubuntu: ====================== bhyve虚拟化运行Ubuntu ====================== .. note:: 在部署 ``xcloud`` 用于 ``cloud-atlas.dev`` 的后端基础运行环境,为后续 :ref:`bhyve_pci_passthru` 准备,最终目标是实现 :ref:`nvidia_gpu` 能够在FreeBSD的虚拟化环境中使用,构建 :ref:`ollama` 运行。 主机准备 ========== 内核vmm ---------- 在 ``bhyve`` 创建虚拟机之前需要加载加载 ``bhyve`` 内核模块: .. literalinclude:: bhyve_startup/kldload :caption: 加载内核模块 并且确保启动时加载内核模块: .. literalinclude:: bhyve_startup/loader.conf :caption: 配置启动时加载模块 创建网桥和tap ---------------- - 在 ``/etc/sysctl.conf`` 中配置tap设备在操作系统启动时启动: .. literalinclude:: bhyve_startup/sysctl.conf :caption: 配置tap设备启动 - 创建网桥并连接网卡( 案例中使用的网卡设备是 ``igc0`` ) .. literalinclude:: bhyve_startup/bridge :caption: 创建网桥并连接网卡 - 确保启动时激活: .. literalinclude:: bhyve_startup/rc.conf :caption: 在 ``/etc/rc.conf`` 中配置 虚拟磁盘 ============== .. note:: 我采用 :ref:`zfs` 来构建本地存储 创建ZFS数据集 --------------- 对于host主机具备 :ref:`zfs` 环境的话, **使用ZFS volumes来代替磁盘镜像,可以获得明显的性能提升** 在构建 ``cloud-atlas.dev`` 模拟环境中,已经完成了 :ref:`freebsd_zfs_stripe` 部署,所以具备了 ``zdata`` 存储池,在此基础上完成虚拟机磁盘创建: - 创建 ``zdata/vms/ubuntu`` : .. literalinclude:: bhyve_ubuntu/zfs_vms :caption: 创建vms数据集 .. note:: 设置为 ``volmode=dev`` 的数据集不会自动挂载,所以在 ``/zdata/vms`` 目录下是空白的 下载安装iso ==================== - 从ubuntu官网下载安装镜像: .. literalinclude:: bhyve_ubuntu/ubuntu_iso :caption: 下载ubuntu安装镜像 安装bhyve的Grub支持 ====================== 通过 ``bhyveload`` 和 ``grub-bhyve`` 的插件, ``bhyve`` hyperviosr可以使用UEFI firmware来启动虚拟机。这个选项可以用来支持那些特定的不支持其他loaders的guest操作系统。 ``grub`` 启动管理器是Linux guests启动建议的加载器,这样就能够运行 ``grub-bhyve`` 执行程序,也就是允许我们启动非FreeBSD guest操作系统: .. literalinclude:: bhyve_startup/grub :caption: 安装grub相关软件包 在安装了firmware之后,在 ``bhyve`` 命令行添加参数 ``-l bootrom,/path/to/firmware`` 来加载UEFI firmware 安装虚拟机 ============ BIOS模式启动bhyve虚拟机 ------------------------- .. warning:: 我这里尝试失败,手册中使用镜像文件,我模仿改成zfs卷集,没有启动成功。待后续再尝试 - 创建一个设备映射文件以便grub能够将虚拟设备映射为host主机中的文件: .. literalinclude:: bhyve_ubuntu/ubuntu.map :caption: 创建 ``/zdata/vms/ubuntu.map`` 配置文件作为设备映射 - 使用 ``grub2-bhyve`` 从ISO镜像中加载Linux内核: .. literalinclude:: bhyve_ubuntu/grub-bhyve_load :caption: 使用 ``grub2-bhyve`` 从ISO镜像中加载Linux内核 此时就会在终端进入Linux安装的grub界面(安装镜像包含了一个 ``grub.cfg`` ) .. literalinclude:: bhyve_ubuntu/grub_install :caption: 进入安装界面 使用UEFI Firmware启动bhyve虚拟机 --------------------------------- ``bhyveload`` 和 ``grub-bhyve`` 为 ``bhyve`` hypervisor 提供了使用UEFI firmware启动虚拟机的功能。(需要安装 ``bhyve-firmware`` ) - 执行以下命令开始启动虚拟机安装: .. literalinclude:: bhyve_ubuntu/vm :caption: 安装虚拟机 命令参数: - ``-c`` 设置虚拟机vcpu数量 - ``-H`` 输出给加载器的host文件系统 - ``-l`` 使用OS loader(对于非FreeBSD需要使用uefi) - ``-m`` 设置虚拟机内存 - ``-w`` 忽略没有实现的MSRs - ``-s`` 配置一个虚拟PCI slot 以及其他功能如硬盘,cdrom和其他设备 - ``-A`` 生成ACPI表,对于FreeBSD/amd64 guests需要 - ``-H`` 当检测到HLT指令是限制vcpu线程,如果该选项没有检测到,则vcpu可以使用100%的host CPU - ``-P`` 当检测到PAUSE指令时强制guest虚拟机vcpu退出 - ``-s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait`` 提供了 ``Graphical UEFI Framebuffer`` ,这对于图形安装界面非常有用,例如安装Windows就需要这个参数 VNC客户端连接 =============== 启动安装以后就可以使用 ``remmina`` 这样的VNC客户端俩皆 ``127.0.0.1:5900`` 来访问(如果是远程服务器,则使用服务器IP) .. figure:: ../../../_static/freebsd/virtual/bhyve/bhyve_debian.png 启动 ======= .. note:: 我在 :ref:`bhyve_startup` 实践中提到了按照handbook,在上述安装过程结束时候需要复制 ``grubx64.efi`` 为 ``bootx64.efi`` 。但是我现在实践没有执行这步efi文件复制,看起来也能够启动虚拟机。 最后重启虚拟机,需要强制退出,然后再启动 - 强制虚拟机关机: .. literalinclude:: bhyve_ubuntu/stop_vm :caption: 停止虚拟机 - 启动虚拟机(去除了cdrom配置): .. literalinclude:: bhyve_ubuntu/start_vm :caption: 启动虚拟机 ``start_ubuntu`` 生成虚拟机配置 ================ 上述启动虚拟机需要很长的命令行,为了方便启动,可以先把虚拟机配置dump出来,也就是修改上述 ``start_ubuntu`` ,添加一行 ``-o config.dump=1`` 参数,就可以输出配置(需要重定向到文件): .. literalinclude:: bhyve_ubuntu/start_vm_config :caption: 启动虚拟机 ``start_ubuntu`` 重定向输出vm配置 :emphasize-lines: 10,11 此时生成的配置文件 ``ubuntu.config`` 如下: .. literalinclude:: bhyve_ubuntu/ubuntu.config :caption: 启动虚拟机 ``start_ubuntu`` 重定向输出vm配置文件 ``ubuntu.config`` :emphasize-lines: 25 - 删除掉上述配置文件中 ``config.dump=1`` 行,就可以使用 ``-k`` 参数来启动虚拟机: .. literalinclude:: bhyve_ubuntu/bhyve_config :caption: 使用 ``-k`` 指定配置文件启动虚拟机 参考 ====== - `FreeBSD handbook: Chapter 24. Virtualization `_ - `How to install Linux VM on FreeBSD using bhyve and ZFS `_ - `From 0 to Bhyve on FreeBSD 13.1 `_ - `bhyve wiki `_