FreeBSD通过CBSD管理低资源容器jail来安装Ubuntu子系统实践
简介
FreeBSD、CBSD、Jail和Ubuntu,四者的组合方案可以说是强强联合,极具性价比和竞争力!同时安装简单方便,整体方案非常先进。
CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案的单一集成工具,用于使用预定义的软件集以最少的配置快速构建和部署计算机虚拟环境。
FreeBSD jail系统容器本身是FreeBSD子系统的低资源解决方案,但是因为FreeBSD支持Linux模拟,就使得jail容器也支持了Linux,比如可以在jail里建立Ubuntu子系统。整个解决方案非常丝滑,简单方便。
一、安装cbsd
pkg安装
pkg install cbsd
CBSD初始化
如果是使用zfs系统,需要先执行:
/sbin/zfs create -o mountpoint=/usr/jails -o atime=off zroot/jails
然后进行初始化即可:
env workdir=/usr/jails /usr/local/cbsd/sudoexec/initenv
具体安装可以参考官网:CBSD — FreeBSD Jail and Bhyve Management Tools
还有这篇文档: jail管理器CBSD实践@FreeBSD-CSDN博客
二、使用CBSD菜单方式安装Ubuntu子系统
创建Ubuntu子系统
使用命令
cbsd jconstruct-tui
进入菜单后,配置profile选择ubuntu_jammy
名字jname 自定义,比如ubjammy
其它使用默认即可,如下图:

然后选择“2 GO”,按回车,很快就创建成功了:
Please wait: this will take a while...
Applying custom skel system dir template from: /usr/local/cbsd/share/Linux-jail-ubuntu-jammy-system-skel
customskel dir specified but not found: /usr/local/cbsd/share/Linux-jail-ubuntu-jammy-skelTo edit VM properties use: cbsd jconfig jname=ubjammy
To start VM use: cbsd jstart ubjammy
To stop VM use: cbsd jstop ubjammy
To remove VM use: cbsd jremove ubjammy
For attach VM console use: cbsd jlogin ubjammyCreating ubjammy complete: Enjoy!
jcreate done in 9 seconds
可以看到6秒创建好了。使用cbsd jls可以看到还是关机状态,于是使用cbsd jstart ubjammy命令开机:
cbsd jstart ubjammy
Check environment script: 00.check_distribution.sh
populate jails data from: /usr/jails/basejail/base_amd64_amd64_jammy ...
Applying custom skel dir template from: /usr/jails/basejail/base_amd64_amd64_jammy
Default NIC automatically selected: web
set resource limit: [ ]
jail renice: 1
Starting jail: ubjammy, parallel timeout=5
ubjammy: created
CBSD setup: jail ipfw counters num: 107/108
jstart done in 6 seconds
开机速度也很快,只需要6秒就开机成功!
登录Ubuntu子系统
这里要注意,使用常规登录方法是不行的
cbsd jlogin ubjammy
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0 x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/proThis system has been minimized by removing packages and content that are
not required on a system that users do not log into.To restore this content, you can run the 'unminimize' command.The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.Cannot execute /bin/bash: No such file or directory
常规登录会报错没有/bin/bash文件,而导致无法登到虚拟子系统。这时候要用jail原装命令“jexec ubjammy sh”登录:
root@fbhost:~ # jexec ubjammy sh
# uname -a
Linux ubjammy.my.domain 5.15.0 FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC x86_64 x86_64 x86_64 GNU/Linux
登录之后,通过使用uname命令,可以看到这是一台5.15.0内核版本Linux系统,到这里安装就算完成了
装好apt管理软件
装好内核后,并不能干什么事情,因为我们习惯了在Ubuntu下使用apt来管理软件,所以要
首先更新apt
apt update
然后就可以越快的玩耍拉!
三、使用CBSD命令方式安装Ubuntu子系统
可以直接用一条命令创建Linux子系统,但是如果需要Ubuntu子系统,则需要创建好之后再到里面安装Ubuntu虚拟子系统。
先用命令创建Linux虚拟子系统
使用命令创建:
cbsd jcreate jname=ubu jprofile=ubuntu_focal allow_raw_sockets=1
一会儿就创建好了。注意,如果想后面装哪个版本的Ubuntu,就要在jprofile这里调用哪个版本的配置文件(怀疑如果不一致后面库会发生不一致的问题,实际上这里应该影响后面网上下载base.txz库的链接)。所以这里的例子是Ubuntu的focal版本。
cbsd jcreate jname=ubu jprofile=ubuntu_focal allow_raw_sockets=1
Please wait: this will take a while...
Applying skel dir template from: /usr/jails/share/FreeBSD-jail-skelTo edit VM properties use: cbsd jconfig jname=ubu
To start VM use: cbsd jstart ubu
To stop VM use: cbsd jstop ubu
To remove VM use: cbsd jremove ubu
For attach VM console use: cbsd jlogin ubuCreating ubu complete: Enjoy!
/usr/jails/jails/ubu/etc already mounted
/usr/jails/jails/ubu/root already mounted
/usr/jails/jails/ubu/tmp already mounted
/usr/jails/jails/ubu/home already mounted
/usr/jails/jails/ubu/usr/local already mounted
/usr/jails/jails/ubu/compat already mounted
/usr/jails/jails/ubu/var already mounted
jcreate done in 1 minutes and 9 seconds
启动子系统
cbsd jstart ubu
Default NIC automatically selected: web
set resource limit: [ ]
jail renice: 1
Starting jail: ubu, parallel timeout=5
ubu: created
ELF ldconfig path: /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/compat/pkg
32-bit compatibility ldconfig path: /usr/lib32 /usr/lib32
Updating motd:.
Creating and/or trimming log files.
Clearing /tmp (X related).
Updating /var/run/os-release done.
Starting syslogd.
Starting cron.Fri Jun 14 14:17:01 CST 2024
CBSD setup: jail ipfw counters num: 99/100
jstart done in 5 seconds
登录Linux子系统
与进入菜单方式安装的Ubuntu子系统不同,命令方式建立的子系统,既可以使用jexec指令进入,也可以用常规的cbsd指令进入。
使用jexec 指令直接进入Linux子系统
jexec ubu chroot /compat/linux /bin/bash
bash-4.2# uname -a
Linux ubu.my.domain 5.15.0 FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC x86_64 x86_64 x86_64 GNU/Linux
使用cbsd命令需要两步
首先使用cbsd进入FreeBSD虚拟子系统
cbsd jlogin ubu
这时候系统是FreeBSD的。进入FreeBSD虚拟子系统后,再执行chroot进入Linux子系统
chroot /compat/linux/ /bin/bash
这样就进入了Linux子系统,但是如果想用Ubuntu,还需要手工安装Ubuntu子系统。
手工安装Ubuntu子系统
在FreeBSD子系统里面,安装Ubuntu子系统
首先安装debootstrap
pkg install debootstrap
然后使用debootstrap安装Ubuntu
debootstrap focal /compat/ubuntu
安装好后
执行chroot进入Ubuntu子系统
chroot /compat/ubuntu /bin/bash
groups: cannot find name for group ID 0
groups: cannot find name for group ID 5
I have no name!@ubu:/# uname -a
Linux ubu.my.domain 5.15.0 FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC x86_64 x86_64 x86_64 GNU/Linux
好了,Ubuntu子系统就安装好了。
登录ubuntu子系统
要使用这个子系统,可以直接在宿主FreeBSD主机使用命令进入:
jexec ubu chroot /compat/ubuntu /bin/bash
检查一下,确实是Ubuntu linux
root@ubu:/# uname -a
Linux ubu.my.domain 5.15.0 FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC x86_64 x86_64 x86_64 GNU/Linux
这样不需要再进入FreeBSD子系统周转,管理起来特别简单方便。当然可以采用先登录FreeBSD子系统,再进入Ubuntu子系统的方法:
root@fbhost:~ # cbsd jlogin ubu
Last login: Sun Jun 16 19:21:31 on pts/1
FreeBSD 14.1-RELEASE (GENERIC) releng/14.1-n267679-10e31f0946d8
ubu:/root@[19:33] # chroot /compat/ubuntu/ /bin/bash
root@ubu:/# uname -a
Linux ubu.my.domain 5.15.0 FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC x86_64 x86_64 x86_64 GNU/Linux
由于jail是特别轻量级的容器,所以Ubuntu子系统竟然连apt也没有装.....(其实这里是误会了,正常安装的话都是有apt的,我没有安装出来,是因为使用的base.txz里面没装apt,啥都没装)
如果没有apt,那么要装apt也是一个费脑筋的活。
四、安装Ubuntu子系统下的apt管理软件
可以参考这个文档:FreeBSD jail虚拟容器里装ubuntu系统没有apt命令怎么办?-CSDN博客
一般大家不会碰到我这个问题,我是因为使用的base.txz里面没装apt,啥都没装导致的。
不过万一碰到了没有apt的情况,可以使用如下方法安装:
首先进入Ubuntu子系统
jexec ubu chroot /compat/ubuntu /bin/bash
或
root@fbhost:~ # cbsd jlogin ubu
Last login: Sun Jun 16 19:21:31 on pts/1
FreeBSD 14.1-RELEASE (GENERIC) releng/14.1-n267679-10e31f0946d8
ubu:/root@[19:33] # chroot /compat/ubuntu/ /bin/bash
root@ubu:/# uname -a
Linux ubu.my.domain 5.15.0 FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC x86_64 x86_64 x86_64 GNU/Linux
直接进入/var/cache/apt/archivers目录dpkg安装所有deb包
进入目录
cd /var/cache/apt/archives
然后使用dpkg -i 命令安装所有deb包
dpkg -i *.deb
这样就不用一个一个安装deb包了,当然如果能精确控制最好,但是对大多数项目不需要这一点半点的空间,即使对单片机,也不在乎这区区几十几百M的空间了
3 修复dpkg和apt
修复dpkg
dpkg --configure -a
修复apt
apt --fix-broken install
最后apt update一下,完活拉!
apt update
五、总结
FreeBSD、CBSD、Jail和Ubuntu,四者的组合方案可以说是强强联合,极具性价比和竞争力!同时安装简单方便,整体方案非常先进。
但是第一次实践的时候,估计会走一些弯路,因为说明书实在太简单了,忽略了很多细节,这导致新手会踩好几个坑。好消息就是坑被我踩过了,大家可以愉快的实践拉!

调试
apt update 报错
apt update
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://security.ubuntu.com/ubuntu jammy-security InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
Reading package lists... Error!
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
E: Error occurred while processing libsurgescript0.5.4.4 (NewVersion1)
E: Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_jammy_universe_binary-amd64_Packages
E: The package lists or status file could not be parsed or opened.
尝试更新dpkg
dpkg --configure -a
没反应
尝试修复apt
apt --fix-broken install
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
Reading package lists... Error!
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
E: Error occurred while processing libsurgescript0.5.4.4 (NewVersion1)
E: Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_jammy_universe_binary-amd64_Packages
E: The package lists or status file could not be parsed or opened.
这好象是因为空间不够造成的。
先搁置。
有时候因为中文空格或拼写错误导致命令会报错
比如
root@ubu:/var/cache/apt/archives# cd /var/cache/apt/archivers
bash: cd: /var/cache/apt/archivers: No such file or directory
这是拼写错误。
有时候是因为中文空格,这时候把命令中间的空格在终端重新输入一下即可。
相关文章:
FreeBSD通过CBSD管理低资源容器jail来安装Ubuntu子系统实践
简介 FreeBSD、CBSD、Jail和Ubuntu,四者的组合方案可以说是强强联合,极具性价比和竞争力!同时安装简单方便,整体方案非常先进。 CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案…...
SpringCloud总结(springcloud alibaba)
目录 版本说明(很重要) springcloud alibaba对应组件版本说明 简述 spring cloud albaba 几大模块 周会讨论 - spring cloud alibaba每周都会有周会讨论,社区活跃 spring cloud alibaba官网 注册配置中心 简单介绍 nacos 步骤 示例代码 依赖…...
轻轻松松上手的LangChain学习说明书
本文为笔者学习LangChain时对官方文档以及一系列资料进行一些总结~覆盖对Langchain的核心六大模块的理解与核心使用方法,全文篇幅较长,共计50000字,可先码住辅助用于学习Langchain。 一、Langchain是什么? 如今各类AI…...
全面对比与选择指南:Milvus、PGVector、Zilliz及其他向量数据库
本文全面探讨了Milvus、PGVector、Zilliz等向量数据库的特性、性能、应用场景及选型建议,通过详细的对比分析,帮助开发者和架构师根据具体需求选择最合适的向量数据库解决方案。 文章目录 向量数据库概述向量数据库的关键功能向量数据库的扩展和选择向量…...
svm 超参数
https://www.cnblogs.com/ChevisZhang/p/12932674.html https://wenku.baidu.com/view/b8a2c73cfd4733687e21af45b307e87100f6f861.html?wkts1718332423081&bdQuerysvm%E7%9A%84%E8%B6%85%E5%8F%82%E6%95%B0 用交叉验证找到最好的参数 C 和γ 。使用 RBF 核时,…...
001-基于Sklearn的机器学习入门:Sklearn库基本功能和标准数据集
本节将介绍Sklearn库基本功能,以及其自带的几个标准数据集的调用方法。本节是学习后面内容的基础,如果您已经对本节内容相当熟悉,可跳过本节内容。 1.1 Sklearn库基本功能 的 1.2 Sklearn库标准数据集 Sklearn自带许多标准数据集ÿ…...
充电学习—7、BC1.2 PD协议
BC1.2(battery charging)充电端口识别机制: SDP、CDP、DCP 1、VBUS detect:vbus检测 PD(portable device,便携式设备)中有个检测VBUS是否有效的电路,电路有个参考值,高…...
技术点梳理0618
ann建库,分布式建库,性能优化,precision recall参数优化 hnsw,图索引 1. build a)确定层:类似跳表思路建立多层,对每一个插入的节点,random层号l,从图的起始点search_…...
石英砂酸洗提纯方法和工艺
石英砂酸洗提纯方法和工艺是石英砂加工中至关重要的一个环节,其目的是通过化学手段去除石英砂中的杂质,提升其纯度。以下将详细介绍石英砂酸洗提纯的方法和工艺,以便更好地理解和应用这一技术。 一、概述 石英砂酸洗提纯主要是利用酸液对石英…...
linux安装dgl
1.DGL官网、选择与自己cuda、python版本匹配的dgl的whl文件CUDA11.8、python10并下载 2.用pip install运行 pip install /home/u2023170749/download/dgl-2.2.0cu118-cp310-cp310-manylinux1_x86_64.whl或者直接安装https://blog.csdn.net/weixin_44017989/article/details/13…...
【SAP-ABAP】-权限批导-批量给某个角色导入事务码权限
需求:SAP期初上线的时候,业务顾问经常会遇到批量创建角色和分配角色权限的情况 岗位需求:一般是业务顾问定义权限,BASIS进行后期运维,今天讲两个批导功能,方便期初上线 主要函数:PRGN_READ_ROLE…...
异常处理总结
自定义异常 系统中的异常可以分为我们能预知的异常和未知的系统异常,对于我们能预知的异常如空值判断,用户名错误,密码错误等异常我们需要返回客户端,对于系统内部异常如SQL语法错误,参数格式转换错误等需要统一包…...
大模型日报2024-06-18
大模型日报 2024-06-18 大模型资讯 大模型产品 Olvy 3.0:AI加速客户反馈分析 摘要: Olvy 3.0推出AI自动监听和智能标签功能,通过Google Meet集成轻松提取洞察,贴近客户,激发同理心。 PlantIdentify-免费植物识别应用 摘要: PlantI…...
NumPy 双曲函数与集合操作详解
NumPy 双曲函数 NumPy 提供了 sinh()、cosh() 和 tanh() 等 ufunc,它们接受弧度值并生成相应的双曲正弦、双曲余弦和双曲正切值。 示例: import numpy as npx np.sinh(np.pi/2)print(x)示例 找到数组 arr 中所有值的双曲余弦值: import…...
ABSD-系统架构师(十三)
1、CDN和反向代理的基本原理都是()。 A缓存 B负载均衡 C路由转发 DNAT转发 答案:A 2、(必考)在ABSD(基于架构的软件开发)方法中,顶层被分解为()ÿ…...
PLC通过Profibus协议转Modbus协议网关接LED大屏通讯
一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议,它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议,被广泛应用于各种设备之间的通信,如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议&…...
第二十三篇——香农第二定律(二):到底要不要扁平化管理?
目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 对于企业的理解,扁平化的管理,如果从香农第二定律…...
stm32f103 HAL库 HC-SR04测距
目录 一、实现测距二、添加TIM3控制LED根据距离以不同频率闪烁三、观察时序Modebus协议12路超声波雷达设计方案1. 系统架构设计2. 硬件设计3. 软件设计4. 通信协议设计5. 用户接口6. 安全和冗余7. 测试和验证8. 电源和物理封装9. 文档和支持 一、实现测距 配置时钟 配置定时器…...
vue中通过自定义指令实现一个可拖拽,缩放的弹窗
效果 功能描述 按住头部可拖拽鼠标放到边框,可缩放多层重叠丰富的插槽,易于扩展 示例 指令代码 export const dragDialog {inserted: function (el, { value, minWidth 400, minHeight 200 }) {// 让弹窗居中let dialogHeight el.clientHeight ?…...
FreeRtos-09事件组的使用
1. 事件组的理论讲解 事件组:就是通过一个整数的bit位来代表一个事件,几个事件的or和and的结果是输出 #define configUSE_16_BIT_TICKS 0 //configUSE_16_BIT_TICKS用1表示16位,用0表示32位 1.1 事件组适用于哪些场景 某个事件若干个事件中的某个事件若干个事件中的所有事…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
