FreeBSD虚拟化解决之道:高效、安全、灵活的虚拟解决方案全览

FreeBSD下的虚拟化技术

虚拟化软件可让一台计算机同时运行多个操作系统。这种用于个人电脑的系统软件通常涉及一个运行虚拟化软件的宿主机(host)操作系统,并支持任何数量的客户机(guest)操作系统。

FreeBSD下的虚拟解决方案包括多种技术和工具,以下是对这些虚拟解决方案的简单介绍:

  1. Jails :
    • Jails是FreeBSD操作系统内建的虚拟化技术。
    • 它类似于Linux中的chroot环境,但功能更强大,可以实现将一个系统划分成多个独立的虚拟环境。
    • 每个Jail可以有自己的文件系统、网络配置和用户空间进程。
    • 使用Jail时,需要安装jailkit软件包,并按照官方文档进行配置和使用。
  2. bhyve :
    • bhyve是FreeBSD操作系统的内核级虚拟化技术。
    • 它可以在FreeBSD系统中运行虚拟机,支持多种操作系统,如Linux、Windows等。
    • 作为一种轻量级的虚拟化解决方案,bhyve提供了接近原生的性能。
  3. QEMU :
    • QEMU是一款开源的虚拟化软件,可以在FreeBSD系统中使用QEMU来模拟硬件虚拟化,并运行其他操作系统。
    • QEMU Guest Agent是针对FreeBSD虚拟机的一个版本,为虚拟机内部与宿主机之间搭建了一座通讯桥梁。
    • 它允许宿主机与FreeBSD虚拟机进行直接交互,执行文件系统冻结等高级操作,以及获取内存状态、控制虚拟CPU等。
  4. VirtualBox :
    • VirtualBox是一款开源的虚拟化软件,可以在FreeBSD系统中安装VirtualBox来创建和管理虚拟机。
    • 作为一个成熟的虚拟化解决方案,VirtualBox提供了丰富的功能和友好的用户界面。
  5. 存储技术 :
    • FreeBSD还支持多种虚拟化存储技术,如ZFS(Zettabyte File System)、ZVOLs(ZFS Volumes)、iSCSI、HAST(Highly Available Storage)等。
    • 这些存储技术提供了数据完整性检查、压缩、快照、高可用性等功能,有助于在虚拟化环境中实现高效、可靠的数据存储和管理。
  6. 网络配置 :
    • 在FreeBSD的虚拟化解决方案中,网络配置是一个重要的方面。
    • 用户可以根据需要配置虚拟机的网络连接,包括桥接模式、NAT模式等,以实现虚拟机与宿主机、其他虚拟机或外部网络的通信。
  7. 管理工具 :
    • FreeBSD提供了多种虚拟化管理工具,如ezjail、AppJail、bvm、cbsd等,用于创建、配置和管理虚拟机。
    • 这些工具允许用户启动、停止、暂停和恢复虚拟机,以及调整资源分配等。

总结来说,FreeBSD下的虚拟解决方案包括Jails、bhyve、QEMU、VirtualBox等多种技术和工具,以及多种虚拟化存储技术和网络配置选项。用户可以根据自己的需求选择合适的虚拟化技术和工具来构建和管理虚拟化环境。

jail的简介

Jail最早在FreeBSD 4.X便可使用,并且一直在持续强化它的功能、效率、稳定性以及安全性。

Jail建立在chroot概念之上,会更改一系列程序的根目录。这可以创造一个安全的环境,将程序与系统的其他部份分隔。在chroot的环境所建立的程序不能存取该环境以外的档案或资源。也因此,渗透一个在chroot的环境执行的服务并不会让整个系统被攻击者渗透。但chroot有许多限制,只适合用在简单的工作,不需要许多弹性或复杂性、进阶功能的工作。随着时间推移,许多可以逃离chroot的环境的方法已经被找到,让这个方法不再是确保服务安全的理想方案。

Jail用许多方式改进了传统chroot环境的概念。在传统chroot环境,程序仅限制在一部份档案系统可存取的地方。其余的系统资源、系统使用者、执行的程序以及网络子系统被chroot的程序及主机系统的程序所共享。Jail透过虚拟化存取档案系统、使用者及网络子系统来扩展这个模型,可使用更多细微的控制参数来调校Jail的环境存取方式,Jail可算是一种操作系统层级的虚拟化。

Jail的四个要素:

一个子树状目录:进入Jail的起点目录,一但在Jail中,程序便没有权限离开此目录之外。

一个主机名称:将会由Jail所使用。

一个IP位址:用来分配给Jail。Jail的IP位址通常是现有网络界面的别名位址。

一个指令:要在Jail中可执行的执行档路径名称。该路径是Jail环境根目录的相对路径。

Jail管理器

在FreeBSD系统中,jail的管理器有多种

Name License Package Documentation 更新时间 github地址
BastilleBSD BSD-3 sysutils/bastille Documentation 2023.11 GitHub - BastilleBSD/bastille: Bastille is an open-source system for automating deployment and management of containerized applications on FreeBSD.
pot BSD-3 sysutils/pot Documentation 2023.12 GitHub - bsdpot/pot: pot: another container framework for FreeBSD, based on jails, ZFS and pf
cbsd BSD-2 sysutils/cbsd Documentation 2024 GitHub - cbsd/cbsd: Yet one more wrapper around jail, bhyve, QEMU and XEN
AppJail BSD-3 sysutils/appjail, for devel sysutils/appjail-devel Documentation 2024 GitHub - DtxdF/AppJail: Simple and easy-to-use tool for creating portable jails.
iocage BSD-2 sysutils/iocage Documentation 2023.12 https://github.com/iocage/iocage
ezjail Beer Ware sysutils/ezjail Documentation 2015.6

其它还有ocijail

https://github.com/dfr/ocijail

下面单独介绍几种比较流行的管理器

CBSD

cbsd 同时还可以管理jail和bhyve (Yet one more wrapper around jail, bhyve, QEMU and XEN) ,代码:GitHub - cbsd/cbsd: Yet one more wrapper around jail, bhyve, QEMU and XEN。这里还有作者关于docker的解决方法:CBSD --- FreeBSD Jail and Bhyve Management Tools

实践文档:jail管理器CBSD实践@FreeBSD-CSDN博客

BastileBSD

BastileBSD手册:Bastille --- Bastille 0.10.20231125-beta documentation 代码:GitHub - BastilleBSD/bastille: Bastille is an open-source system for automating deployment and management of containerized applications on FreeBSD.

AppJail

AppJail is an open-source BSD-3 licensed framework entirely written in POSIX shell and C to create isolated, portable and easy to deploy environments using FreeBSD jails that behaves like an application. 手册:AppJail Handbook

源码:GitHub - DtxdF/AppJail: Simple and easy-to-use tool for creating portable jails.

AppJail的特点是它可以设置一种叫tiny jail的模式,只提供相关c代码的文件即可。 它还支持LinuxJails

AppJail实践文档:Jail管理器AppJail的使用@FreeBSD-CSDN博客

AppJail主页写的几种管理器的对比图

除了没有cbsd,其它几种都在,好像就AppJail最牛

AppJail bastille pot iocage ezjail
ZFS support supported supported required required supported ZFS support
Language C, Bourne Shell Bourne Shell Rust, Bourne Shell Python Bourne Shell Language
Automation Makejail, Initscripts, Images Templates Flavours, Images Plugins Flavours Automation
Jail Type clone, copy, tiny, thin, thick, empty, linux+debootstrap thin, thick, vnet, Linux, empty thick clone, basejail, template, empty, thick basejail Jail Type
VNET Supported Supported Supported Supported Not Supported VNET
Dynamic firewall Yes Requires a loopback interface Yes No No Dynamic firewall
Resource control Full support Yes, but it does not support statistics and all rctl(8) actions and does not support actions by rule Basic: CPU and memory only Legacy only Not Supported Resource control
CPU Sets Yes No Yes Yes Yes CPU Sets
IPv6 support Yes (+SLAAC) Yes Yes Yes Yes IPv6 support
Linux containers Yes Yes ?? Yes ?? Linux containers
Dynamic DEVFS Ruleset Management Yes No No No No Dynamic DEVFS Ruleset Management
Network management Virtual networks, Bridges No Subnet, requires sysutils/potnet No No Network management
Jail dependency Yes No Yes Yes No Jail dependency
Supervisor Yes (Healthcheckers) No No No No Supervisor
Log management Yes No No No No Log management
Parse jail.conf(5) file for syntax errors Yes Not supported Yes Yes Yes Parse jail.conf(5) file for syntax errors
Volume management Yes No Basic, Only supported when using the fscomp feature Basic No Volume management
Parallel startup Yes (Healthcheckers, jails & NAT) No No No No Parallel startup
Netgraph Yes No No No No Netgraph
Startup order control Yes Yes, but don't support priorities Yes, but don't support priorities Yes Yes, using rcorder(8) Startup order control
X11 support Yes No No No No X11 support
import/export Yes Yes Yes Yes Yes import/export

CBSD主页画的jial管理软件生命周期图

bhyve简介

自 FreeBSD 10.0-RELEASE 起,BSD 许可的 bhyve 虚拟机管理器已成为底层系统不可或缺的一部分。bhyve 强大而灵活,支持多种客户机操作系统,涵盖 FreeBSD、OpenBSD 以及多个 Linux® 发行版。在默认配置下,bhyve 提供对串行控制台的直接访问,无需模拟图形化界面,从而为用户提供了简洁而高效的交互方式。

安装使用bhyve

官网文档:Chapter 24. Virtualization | FreeBSD Documentation Portal

中文文档:24.6.使用 FreeBSD 上的 bhyve 虚拟机 --- FreeBSD Handbook 2023.09.08 documentation (fiercex.github.io)

FreeBSD准备工作

若要支持bhyve,需要cpu支持,可以通过 /var/run/dmesg.boot 文件来查看,比如对AMD芯片需要支持POPCNT ,Inter芯片需要支持 EPTUG

bash 复制代码
cat /var/run/dmesg.boot

显示如下:

Features2=0x7dfafbbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,SDBG,F

MA,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT ,TSCDLT,XSAVE,OSXSAVE,AV

X,F16C,RDRAND>

AMD Features=0x2c100800<SYSCALL,NX,Page1GB,RDTSCP,LM>

AMD Features2=0x121<LAHF,ABM,Prefetch>

Structured Extended Features=0x21c27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERM

S,INVPCID,NFPUSG,RDSEED,ADX,SMAP,PROCTRACE>

XSAVE Features=0x1<XSAVEOPT>

VT-x: PAT,HLT,MTF,PAUSE,EPT,UG,VPID

可以看到cpu是支持POPCNT和EPT,UG

准备工作:加载 bhyve 内核模块

配置宿主机,首先,加载 bhyve 内核模块:

复制代码
# kldload vmm
kldload vmm
kldstat
Id Refs Address                Size Name
 1   27 0xffffffff80200000  1f370e8 kernel
 2    1 0xffffffff82138000     77d8 cryptodev.ko
 3    1 0xffffffff82140000   5cd4d8 zfs.ko
 4    1 0xffffffff831e5000     3250 ichsmb.ko
 5    1 0xffffffff831e9000     2178 smbus.ko
 6    1 0xffffffff83200000   33e438 vmm.ko

创建网络接口

然后,创建 tap 接口以供虚拟机中的网络设备进行连接。为了让该网络设备加入网络,另外创建一个桥接接口,其中包含 tap 接口和物理网络接口作为成员。在下面的例子中,物理网络接口为 igb0

# ifconfig tap0 create
# sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
# ifconfig bridge0 create
# ifconfig bridge0 addm igb0 addm tap0
# ifconfig bridge0 up

一共5条指令:

ifconfig tap0 create

sysctl net.link.tap.up_on_open=1

ifconfig bridge0 create

ifconfig bridge0 addm igb0 addm tap0

ifconfig bridge0 up

做好这些准备工作,就可以开始配置客户机了。

创建一个FreeBSD客户机

可以创建一个单独的目录,比如~/bhyve ,将所有文件都放在这个目录里。

文档讲创建一个文件guest.img用作客户机的虚拟磁盘。指定这个虚拟磁盘的大小

复制代码
truncate -s 16G guest.img

我们这里创建一个较小的客户机,名字也改成freebsd.img

bash 复制代码
truncate -s 10G freebsd.img

下载 FreeBSD 的安装镜像:

到中科大FreeBSD镜像站下载iso安装盘

bash 复制代码
wget https://mirrors.ustc.edu.cn/freebsd/releases/ISO-IMAGES/14.1/FreeBSD-14.1-BETA3-amd64-bootonly.iso

启动脚本

下面是一个启动 bhyve 虚拟机的示例命令,vmrun.sh是一个脚本,这个脚本将会启动虚拟机并循环执行,所以可在其崩溃时自动重新启动。这个脚本可接受数个选项来配置虚拟机:-c 控制虚拟 CPU 的数量,-m 限制客户机的可用内存,-t 定义使用的 tap 设备,-d 指定其使用的磁盘镜像,-i 控制 bhyve 从 CD 镜像引导,而非从磁盘引导,-I 指定要使用的 CD 镜像。最后一个参数是虚拟机的名称,该名称将被用来追踪运行中的虚拟机。这个例子将在安装模式下启动虚拟机:

bash 复制代码
sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d guest.img -i -I FreeBSD-13.1-RELEASE-amd64-bootonly.iso guestname
复制代码
具体我们的命令是:
sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d freebsd.img -i -I FreeBSD-14.1-BETA3-amd64-bootonly.iso testfreebsd

然后命令行下面,就看到FreeBSD启动的画面了

好久没有用无头机(没有安装显示器)安装系统了,vt100真亲切啊:

Console type [vt100]

虚拟硬盘是:vtbd0 VirtIO Block Device

后面就是按部就班的安装FreeBSD。安装好后,重启,结果还是从光盘启动。

只好kill掉,当然bhyve还有专门的指令:

复制代码
bhyvectl --destroy --vm=testfreebsd

装机完成后再次开机

再次进入虚拟系统,这回就不挂载光盘了,手册命令:

bash 复制代码
sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d guest.img guestname

实际执行命令:

复制代码
sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d freebsd.img testfreebsd

启动后进入了该服务器看一下:

uname -a

FreeBSD fb_bhyve 14.1-BETA3 FreeBSD 14.1-BETA3 releng/14.1-n267636-2a964a7fc34e GENERIC amd64

果然FreeBSD下用原生bhyve虚拟主机系统真的是简单又方便啊!

创建一个Linux虚拟机

要引导进入 FreeBSD 以外的系统,必须先安装 sysutils/grub2-bhyve

bash 复制代码
pkg install grub2-bhyve

接下来,创建一个文件用作客户机的虚拟磁盘:

bash 复制代码
truncate -s 16G linux.img
复制代码
手册里讲创建 device.map 文件,让 grub 将虚拟设备映射到宿主机上的镜像文件,文件内容:
bash 复制代码
(hd0) ./linux.img
(cd0) ./ubuntu-18.04.6-server-amd64.iso

当然实际上为了简单方便,device.map文件内容如下:

bash 复制代码
(hd0) ./linux.img
(cd0) ./debian.iso

下载linux安装盘

可以选择自己喜欢的linux发行版,比如可以选择ubuntu和dibian。

下载linux ubuntu安装盘:

wget https://mirrors.ustc.edu.cn/ubuntu-cdimage/releases/18.04.6/release/ubuntu-18.04.6-server-amd64.iso

下载linux debian安装盘:

wget https://mirrors.tuna.tsinghua.edu.cn/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso

为了方便建立一个文件链接:

bash 复制代码
ln -s debian-12.5.0-amd64-netinst.iso debian.iso

这样不管是device.map文件里面,还是后面命令行里面,都不需要使用那么长的文件名了。

加载linux内核

使用 sysutils/grub2-bhyve 从 ISO 文件中加载 Linux® 内核,如果没有可以pkg安装:

bash 复制代码
pkg install grub2-bhyve
复制代码
从 ISO 文件中加载 Linux® 内核
bash 复制代码
grub-bhyve -m device.map -r cd0 -M 1024M linuxguest

执行后进入光盘安装debian的选择界面,但是选了之后回车就退出了。刚开始不知道为什么会退出,还以为出问题了,其实就应该是这样。

如果没有进入光盘启动界面,就需要自己手工在grub里面输入boot:

grub> ls

(hd0) (cd0) (cd0,msdos1) (host)

grub> ls (cd0)/isolinux

boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest

splash.jpg TRANS.TBL vesamenu.c32 vmlinuz

grub> linux (cd0)/isolinux/vmlinuz

grub> initrd (cd0)/isolinux/initrd.img

grub> boot

安装ubuntu linux

现在 Linux® 内核就加载完毕了,可以启动客户机,启动ubuntu安装:

bash 复制代码
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img -s 4:0,ahci-cd,./ubuntu-18.04.6-server-amd64.iso -l com1,stdio -c 4 -m 1024M linuxguest

当然最终我们是选择了安装dibian:

安装debian linux

bash 复制代码
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img -s 4:0,ahci-cd,./debian.iso -l com1,stdio -c 2 -m 1024M linuxguest

后面就是按部就班的安装过程了。

安装的时候可以设置软件包下载镜像,镜像源选了华为云。

mirrors.huaweicloud.com

安装debian完成后,选择重启机器,就会退出虚拟系统。

启动debian linux

每次启动之前,都要先加载内核:

bash 复制代码
grub-bhyve -m device.map -r hd0,msdos1 -M 1024M linuxguest

然后引导进入虚拟机:

bash 复制代码
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img -l com1,stdio -c 4 -m 1024M linuxguest

启动真是简洁明快啊,也就1-2秒就进入登录界面了:

bash 复制代码
rdmsr to register 0xcd on vcpu 0
wrmsr to register 0x140(0) on vcpu 0
wrmsr to register 0x140(0) on vcpu 1
wrmsr to register 0x140(0) on vcpu 2
wrmsr to register 0x140(0) on vcpu 3
rdmsr to register 0x34 on vcpu 1
rdmsr to register 0xc0011029 on vcpu 3
Unhandled ps2 mouse command 0xe1
/dev/vda1: clean, 36301/987360 files, 505236/3943936 blocks
Unhandled ps2 mouse command 0x88
rdmsr to register 0x64d on vcpu 0

Debian GNU/Linux 12 debian ttyS0

debian login: xxxx
Password: 
Linux debian 6.1.0-21-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

这样就可以进入debian愉快的玩耍拉!

持久化配置

要配置系统在启动时运行 bhyve 虚拟机,请对相应文件进行如下配置:

  1. /etc/sysctl.conf

    复制代码
    net.link.tap.up_on_open=1
  2. /etc/rc.conf

    复制代码
    cloned_interfaces="bridge0 tap0"
    ifconfig_bridge0="addm igb0 addm tap0"
    kld_list="nmdm vmm"

安装bvm管理bhyve

为了更好的管理hbyve,我们可以安装bvm管理软件。bvm ,是FreeBSD下的一个开源的虚拟机监控器 (hypervisor),它使用FreeBSD的Capsicum沙箱框架提供安全性。

bash 复制代码
pkg install bvm

在第一次运行bvm --ls 的时候,会提示做哪些操作:

bash 复制代码
# bvm can't run, you need to add the following lines to /boot/loader.conf
vmm_load="YES"
if_bridge_load="YES"
if_tap_load="YES"
# In order to help you solve the NAT reflow problem, 
# you need to add the following line to /boot/loader.conf
ipfw_load="YES"
ipfw_nat_load="YES"
libalias_load="YES"
net.inet.ip.fw.default_to_accept=1
# please edit '/usr/local/etc/bvm/bvm.conf' first
vmdir=/your/vm/dir/path/

也就是最主要的是先编辑/usr/local/etc/bvm/bvm.conf文件,加入vmdir目录配置。然后再将上面配置语句写入/boot/loader.conf文件中。

使用bvm创建虚拟机

bash 复制代码
bvm --create Node-1

会问很多问题,就用数字回答就行

bash 复制代码
Welcome to Bhyve Vm Manager
---------------------------
Enter os type: 
[0]. FreeBSD
[1]. OpenBSD
[2]. NetBSD
[3]. Debian
[4]. Debian_LVM
[5]. Ubuntu
[6]. Kali
[7]. CentOS
[8]. openSUSE
[9]. openSUSE_LVM
[a]. Gentoo
[b]. Fedora
[c]. TrueOS
[d]. Windows10
[e]. WinServer2016
[f]. pfSense
[g]. OPNsense
[h]. Other
Enter os type: 5
Enter vm CPUs: 2
Enter vm RAM (e.g. 512m): 512M
Enter cd status: 
[0]. on
[1]. off
Enter cd status: 0
Enter iso path for CD-ROM: /root/bhyve
Enter a iso file: 
[0]. debian.iso
[1]. ubuntu.iso
[2]. FreeBSD-14.1-BETA3-amd64-bootonly.iso
[3]. ubuntu-18.04.6-server-amd64.iso
[4]. debian-12.5.0-amd64-netinst.iso
Enter a iso file: 1
Enter boot from: 
[0]. cd0
[1]. hd0
Enter boot from: 0
Enter uefi type: 
[0]. none
[1]. uefi
[2]. uefi_csm
Enter uefi type: 0
Enter hostbridge: 
[0]. hostbridge
[1]. amd_hostbridge
Enter hostbridge: 0
Enter auto booting: 
[0]. no
[1]. yes
Enter auto booting: yes
input invalid
[0]. no
[1]. yes
Enter auto booting: 1
Enter booting sequence index (1~1000): 10
Enter booting estimate time (1~1000 secs.): 10
[0]. name          : Node-1
[1]. os            : Ubuntu
[2]. cpus          : 2
[3]. ram           : 512m
[4]. CD            : on
[5]. iso path      : /root/bhyve/ubuntu.iso
[6]. boot from     : cd0
[7]. uefi type     : none
[8]. hostbridge    : hostbridge
[9]. auto boot     : yes
[a]. boot index    : 10
[b]. boot time     : 10
[c]. disk config   
[d]. network config
[e]. cancel        

Enter an number to edit or 'ok' to complet: c
Enter vm number of disks: 1
Enter vm disk(0) size (e.g. 5g): 10g
Enter ZFS support: 
[0]. on
[1]. off
Enter ZFS support: on
input invalid
[0]. on
[1]. off
Enter ZFS support: 0
Enter zpool: 
[0]. zroot/ROOT/default
[1]. zroot/tmp
[2]. zroot/home
[3]. zroot/usr/src
[4]. zroot/usr/ports
[5]. zroot/var/log
[6]. zroot
[7]. zroot/var/audit
[8]. zroot/var/crash
[9]. zroot/home/skywalk
[a]. zroot/var/mail
[b]. zroot/var/tmp
Enter zpool: 0
Enter storage interface: 
[0]. SATA hard-drive [ahci-hd]
[1]. Virtio block storage interface [virtio-blk]
Enter storage interface: 1
[0]. disk number  : 1
[1]. disk(0) size : 10g
[2]. ZFS support  : on
[3]. ZFS pool     : zroot/ROOT/default
[4]. interface    : virtio-blk
[5]. go back      
Enter an number: 5
---------------------------
[0]. name          : Node-1
[1]. os            : Ubuntu
[2]. cpus          : 2
[3]. ram           : 512m
[4]. CD            : on
[5]. iso path      : /root/bhyve/ubuntu.iso
[6]. boot from     : cd0
[7]. uefi type     : none
[8]. hostbridge    : hostbridge
[9]. auto boot     : yes
[a]. boot index    : 10
[b]. boot time     : 10
[c]. disk config   
[d]. network config
[e]. cancel        

Enter an number to edit or 'ok' to complet: d
Enter vm number of nics: 1
Enter nic-0 network mode: 
[0]. Bridged
[1]. NAT
Enter nic-0 network mode: 0
Select the binding device: 
[0]. igb0
[1]. switch0  10.0.1.0/24
[2]. switch1  10.0.2.0/24
[3]. switch2  10.0.3.0/24
[4]. switch3  
[5]. switch4  
[6]. switch5  
[7]. switch6  
[8]. switch7  
Select the binding device: 0
Enter IP-Address: 
[0]. none
[1]. dhcp
[2]. static
Enter IP-Address: 1
Enter network interface: 
[0]. Intel e82545 network interface [e1000]
[1]. Virtio network interface [virtio-net]
Enter network interface: 1
[0]. NIC numbers   : 1
[1]. nic-0 mode    : Bridged
[2]. nic-0 bind    : igb0
[3]. nic-0 ip      : dhcp
[4]. interface     : virtio-net
[5]. add a nic     
[6]. go back       
Enter an number: 6
---------------------------
[0]. name          : Node-1
[1]. os            : Ubuntu
[2]. cpus          : 2
[3]. ram           : 512m
[4]. CD            : on
[5]. iso path      : /root/bhyve/ubuntu.iso
[6]. boot from     : cd0
[7]. uefi type     : none
[8]. hostbridge    : hostbridge
[9]. auto boot     : yes
[a]. boot index    : 10
[b]. boot time     : 10
[c]. disk config   
[d]. network config
[e]. cancel        

Enter an number to edit or 'ok' to complet: ok

创建好就可以启动了

开始启动bvm虚拟机

bash 复制代码
bvm --start Node-1

启动之后,可以用bvm --ls 看到状态信息:

bvm --ls
NAME		GUEST		CPU	MEMORY	DISK		STATE
Node-1		Ubuntu		2	512M	[1]10G		on

可以使用bvm --login 登录虚拟机

bvm --login Node-1

然后就可以在命令行下开始装机拉!

其它bvm指令

关机命令:

bvm --poweroff Node-1

复制虚拟机,使用

bvm --clone Node-1 Node-2

如果虚拟机被关机挂住,可以ps找到进程kill掉

ps -aux |grep bvm
root    8525   0.0  0.0  13184  2696  0  I+   09:48       0:00.00 bvm --login Node-1
root    9117   0.0  0.0  12808  2384  1  S+   10:09       0:00.00 grep bvm
root    8430   0.0  0.0  13184  2700  2  Is+  09:47       0:00.01 bvmb Node-1
root    9020   0.0  0.0  13184  2708  3  Ss+  10:08       0:00.01 bvmb Node-2
root@fbhost:~/bhyve # kill 8430

CBSD创建和管理bhyve容器Ubuntu@FreeBSD

首先,创建bhyve虚拟机

cbsd bconstruct-tui

然后启动bhyve虚拟机

cbsd bstart bub22

启动后提示

init_systap: waiting for link: igb0

Looks like /usr/jails/vm/bub22/dsk1.vhd is empty.

May be you want to boot from CD?

[yes(1) or no(0)]

yes确认

然后使用cbsd blogin bub22 登录

cbsd blogin bub22

显示

Boot from CD

Waiting for first connection via VNC to starting VMs...

[debug] env LIB9P_LOGGING=/usr/jails/jails-system/bub22/cbsd_lib9p.log /usr/bin/nice -n 1 /usr/sbin/bhyve -c cpus=2,sockets=2,cores=1,threads=1 -m 2684354560 -H -A -U 6c3d474b-323f-11ef-81c3-00e2691367f6 -s 0,hostbridge -s 4,virtio-blk,/usr/jails/vm/bub22/dsk1.vhd,sectorsize=512/4096 -s 2,ahci-cd,/usr/jails/src/iso/cbsd-iso-ubuntu-22.04.3-live-server-amd64.iso,ro -s 5,virtio-net,tap2,mtu=1500,mac=00:a0:98:ca:22:95 -s 6,virtio-rnd -s 7,fbuf,tcp=127.0.0.1:5900,w=1024,h=768,wait,password=cbsd -s 30,xhci,tablet -s 31,lpc -l com1,stdio -l bootrom,/usr/local/cbsd/upgrade/patch/efi.fd,/usr/jails/jails-system/bub22/BHYVE_UEFI_VARS.fd bub22

使用vncviewer登录

发现只有本机的5900服务:

tcp4 0 0 127.0.0.1.5900 *.* LISTEN

需要进去设置一下,

设置vnc

可以使用bsdconfig 按e进入csdn管理界面,也可以使用cbsd bconfig jname=bub22 进入管理界面。

注意,这里是bconfig,但是后面还是用的jname参数。

进入bhyve_vnc_options 修改bhyve_vnc_tcp_bind ,把127.0.0.1 改成 0.0.0.0

修改之后不要忘记commit

然后就可以使用vncviewer 来登录拉!

开始安装ubuntu

vncviewer登录后,就可以看到光盘启动界面了,按照提示,一步步安装即可。

在 FreeBSD 上安装 VirtualBox™

VirtualBox™ 是一个正在活跃开发的,完备的虚拟化软件。可运行于大多操作系统,包括 Windows®,macOS®,Linux® 和 FreeBSD。它也同样能够运行 Windows® 或者类 UNIX® 客户机系统。该软件作为开源软件发行,但是在单独的扩展包中提供了闭源组件。这些组件包括对 USB 2.0 设备的支持。更多的信息可以在 VirtualBox™ 维基下载页中找到。截至目前为止,这些扩展尚不支持 FreeBSD。

24.5.在 FreeBSD 上安装 VirtualBox™ --- FreeBSD Handbook 2023.09.08 documentation

使用 FreeBSD 上的 Xen™ 虚拟机

Xen 是一个 GPLv2 许可的第 1 类虚拟机管理器,适用于 Intel® 和 ARM® 架构。FreeBSD 从 FreeBSD 8.0 开始就包含了对 i386™,AMD® 64-Bit DomUAmazon EC2 非特权域(虚拟机)的支持,并在 FreeBSD 11.0 中包含了对 Dom0 控制域(宿主机)的支持。在 FreeBSD 11 中,取消了对准虚拟化(PV)域的支持,转而支持硬件虚拟化(HVM)域,这提供了更好的性能。

Xen™ 是一个裸虚拟机管理器,这意味着它是在 BIOS 之后加载的第一个程序。然后会启动一个称为 Domain-0(简称 Dom0)的特殊权限客户机。Dom0 利用其特殊权限直接访问底层物理硬件,使其成为一个高性能的解决方案。它能够直接访问磁盘控制器和网络适配器。用于管理和控制 Xen™ 虚拟机管理器的 Xen™ 管理工具也被 Dom0 用来创建、列出和销毁虚拟机。Dom0 为非特权域提供虚拟磁盘和网络,通常称为 DomU。Xen™ Dom0 可以比作其他虚拟机管理器解决方案的服务控制台,而 DomU 是运行单个客户虚拟机的地方。

但是现在Xen虚拟机的占比已经下降很多,不建议用Xen来虚拟化了。

调试

VirtualBox和bhyve两种虚拟机不能并存。

这个目前没有办法,就是没法并存。不过一般我们会使用jail+bhybe的解决方案。

相关推荐
九河云44 分钟前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock1 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零2 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
云飞云共享云桌面3 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
一坨阿亮4 小时前
Linux 使用中的问题
linux·运维
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
wclass-zhengge6 小时前
Docker篇(Docker Compose)
运维·docker·容器
李启柱6 小时前
项目开发流程规范文档
运维·软件构建·个人开发·设计规范
free7 小时前
netstat中sendq/recvq用于排查发送端发送数据的问题
服务器
力姆泰克8 小时前
看电动缸是如何提高农机的自动化水平
大数据·运维·服务器·数据库·人工智能·自动化·1024程序员节