cbsd创建ubuntu jail 时下载系统慢的问题解决

下载时速度慢

使用cbsd创建ubuntu jail的时候

 cbsd jconstruct-tui

提示:

no base dir in: /usr/jails/basejail/base_amd64_amd64_jammy
Select base sources:
 0 .. CANCEL
 a .. build 
 b .. extract 
 c .. pkg 
 d .. repo 

选了pkg没找到

fetch: https://pkg.convectix.com/FreeBSD:jammy:amd64/latest/distribution_amd64_amd64_jammy.tgz: Not Found

选了repo太慢:

config-based sources: https://dl.bsdstore.ru/releases/Linux/amd64/jammy/base.txz
register_base: no such bases here: /usr/jails/basejail/base_amd64_amd64_jammy
Looking for official Linux mirror:
retrieve base.txz from dl.bsdstore.ru, size: 148m
/usr/jails/tmp/src.26470/base.txz               0% of  147 MB   10 kBps 04h03m^C

这是跑到俄罗斯去下载base.txz了,速度非常慢。有时候还会找到https://dl.bsdstore.ru/releases/amd64/amd64/jammy/base.txz去下载,导致完全连不上

config-based sources: https://dl.bsdstore.ru/releases/Linux/amd64/jammy/base.txz

register_base: no such bases here: /usr/jails/basejail/base_amd64_amd64_jammy

Looking for official Linux mirror:

retrieve base.txz from dl.bsdstore.ru, size: 148m

/usr/jails/tmp/src.39578/base.txz 0% of 147 MB 10 kBps^[[A

/usr/jails/tmp/src.39578/base.txz 0% of 147 MB 77 kBps

/usr/jails/tmp/src.39578/base.txz 0% of 147 MB 9 kBps 02h36m^C^CPlease set unregister_base: arch

retry: 2/2

Not found

REPO: https://bsdstore.ru

found new mirror for jammy: https://dl.bsdstore.ru

Looking for: https://dl.bsdstore.ru/releases/amd64/amd64/jammy/base.txz

fetch: https://dl.bsdstore.ru/releases/amd64/amd64/jammy/base.txz: Not Found

retry: 1/2

fetch: https://dl.bsdstore.ru/releases/amd64/amd64/jammy/base.txz: Not Found

retry: 2/2

base not found: https://dl.bsdstore.ru/releases/amd64/amd64/jammy/base.txz

Not found data

Please set unregister_base: arch

于是只好先下载到本地,然后

选择使用本地base.txz

菜单里选择" b .. extract " ,也就是指定本地文件。

当然一开始走了弯路,使用了Ubuntu官网的base文件

使用Ubuntu官网base文件

Ubuntu Base 22.04.4 LTS (Jammy Jellyfish)

wget https://cdimage.ubuntu.com/ubuntu-base/releases/jammy/release/ubuntu-base-22.04.4-base-amd64.tar.gz

比如放置在/home/root/download/目录,并改名为base.txz 。这个文件只有28.45M...跟官方的相比相差太多了。

但是安装完之后报错:

x var/tmp/

mkdir: /usr/jails/basejail/base_amd64_amd64_jammy/var/db: No such file or directory

cp: /usr/jails/basejail/base_amd64_amd64_jammy/etc/ssl/cert.pem: No such file or directory

timeout: failed to run command 'pkg': No such file or directory

Bases registered: /usr/jails/basejail/base_amd64_amd64_jammy

后来发现cbsd官网base.txz位置在:https://dl.bsdstore.ru/releases/Linux/amd64/jammy/base.txz

而且大小是148MB,所以从ubuntu官网下载的base文件是不行的。重新下载,cbsd官网从国内连接很慢,但是从美国连接很快,想办法下载到本地,然后放置到/home/root/download目录。

(再来尝试一下,一开始这个文档都没有留存命令,所以到底是啥命令已经不知道了....多亏后来又试出来)

cbsd创建jail的命令:

cbsd jconstruct-tui

使用CBSD官网base文件

菜单里选择" b .. extract " ,也就是指定本地文件

/home/root/download/base.txz

这样就创建好了。

但是由于一开始不太懂,还下错了base.txz文件,所以走了很多弯路,以至于后来创建成功ubuntu jail子系统后,还以为没有创建成功,误以为这cbsd起linux的jail这个功能有问题。

后来才明白了,所谓Ubuntu jail子系统,就是创建一个FreeBSD jail,然后在jail里面再安装linux虚拟....好吧,其实这种理解也不完全正确,因为Ubuntu jail里确实只有一个进程,没有经过FreeBSD的周转。

# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     64600  0.0  0.0   7456  3876 pts/1    R+   Jun15   0:00 ps -aux
root     64570  0.0  0.0   2876  1764 pts/1    S    Jun15   0:00 /bin/sh

去掉ps哪个进程,这个Ubuntu jail子系统里只有64570这一个进程,相当省资源。

按照cbsd的手册来创建linux jail

由于前面的弯路,终于静下心来按照cbsd官网手册来操作创建Ubuntu jail 。但是使用下来,需要再手动创建Ubuntu的虚拟子系统。

首先用cbsd创建一个jail子系统:

cbsd jcreate jname=ubu jprofile=ubuntu_focal allow_raw_sockets=1
cbsd jstart ubu

登录子系统

cbsd jlogin ubu

这时候我们发现这个jail子系统还是FreeBSD系统:

cbsd jlogin ubu
Last login: Mon Jun 17 13:57:47 on pts/3
FreeBSD 14.1-RELEASE (GENERIC) releng/14.1-n267679-10e31f0946d8

后面就简单了,我们在FreeBSD jail子系统里,再安装Ubuntu虚拟子系统

安装centos子系统

pkg install emulators/linux_base-c7

当然由于各种原因,现在大家用cenos的越来越少了。

安装ubuntu子系统

首先使用pkg安装debootstrap

pkg install debootstrap

然后按照提示安装Ubuntu,debootstrap可以自由选择ubuntu的版本,比如bionic18.04、focal20.04和jammy22.04

debootstrap bionic /compat/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:/# 
I have no name!@ubu:/# 
I have no name!@ubu:/# 
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

可见已经是linux 了!

Ubuntu apt 加速

修改/etc/apt/sources.list

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

现在的问题是没有apt .... 估计可以用dpkg解决,不过不去管它了,前面装的版本是bionic ,也就是18.04版本,还是改成22 jammy版本吧(当然最后我们知道没有apt是因为用了错误的base.txz文件导致的)

安装Ubuntu22.04子系统

debootstrap jammy /compat/ubuntu

chroot /compat/ubuntu /bin/bash

正常情况下这样就装好了。

以下部分都是因为使用了错误base.txz文件才走了很多弯路。

踩坑记录,只是为了留档

以下部分,一直到官方例子focal成功,都是踩坑记录留档,正常情况下不会碰到,大家也不需要去看。

尝试Ubuntu子系统里装apt

进入Ubuntu子系统之后还是没有apt,不慌,下载apt.deb

因为本系统是在FreeBSD的jail里面,所以是切换到FreeBSD,直接wget下载即可:

wget http://www.ftp.ne.jp/Linux/packages/ubuntu/archive/pool/main/a/apt/apt_2.9.4_amd64.deb

http://www.ftp.ne.jp/Linux/packages/ubuntu/archive/pool/main/a/apt/apt_2.9.4_amd64.deb

切换到ubuntu安装deb报错:

dpkg -i apt_2.9.4_amd64.deb 
dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
 missing 'Description' field
dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
 missing 'Architecture' field
Selecting previously unselected package apt.
(Reading database ... 0 files and directories currently installed.)
Preparing to unpack apt_2.9.4_amd64.deb ...
Unpacking apt (2.9.4) ...
dpkg: dependency problems prevent configuration of apt:
 apt depends on base-passwd (>= 3.6.1) | adduser; however:
  Package base-passwd is not installed.
  Package adduser is not installed.
 apt depends on gpgv; however:
  Package gpgv is not installed.
 apt depends on libapt-pkg6.0t64 (>= 2.9.4); however:
  Package libapt-pkg6.0t64 is not installed.
 apt depends on ubuntu-keyring; however:
  Package ubuntu-keyring is not installed.
 apt depends on libc6 (>= 2.38); however:
  Package libc6 is not installed.
 apt depends on libgcc-s1 (>= 3.3.1); however:
  Package libgcc-s1 is not installed.
 apt depends on libgnutls30t64 (>= 3.8.1); however:
  Package libgnutls30t64 is not installed.
 apt depends on libseccomp2 (>= 2.4.2); however:
  Package libseccomp2 is not installed.
 apt depends on libstdc++6 (>= 13.1); however:
  Package libstdc++6 is not installed.
 apt depends on libsystemd0; however:
  Package libsystemd0 is not installed.

dpkg: error processing package apt (--install):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 apt

又下载了两个文件

wget http://www.ftp.ne.jp/Linux/packages/ubuntu/archive/pool/main/a/apt/libapt-pkg6.0t64_2.9.4_amd64.deb
wget http://www.ftp.ne.jp/Linux/packages/ubuntu/archive/pool/main/a/apt/apt-utils_2.9.4_amd64.deb

还是不管用,缺的东西有点多啊。

查看debootstrap jammy /compat/ubuntu时候的log信息,发现有apt的deb安装包。

于是进入jammy ubuntu,发现apt的deb包放在这个目录:/var/cache/apt/archives

里面有apt包,于是安装,并根据提示安装需要的包:

dpkg -i apt_2.4.5_amd64.deb 
dpkg -i libapt-pkg6.0_2.4.5_amd64.deb 
dpkg -i libstdc++6_12-20220319-1ubuntu1_amd64.deb
dpkg -i libxxhash0_0.8.1-1_amd64.deb dpkg -i libapt-pkg6.0_2.4.5_amd64.deb

还是报错:

apt update
/usr/lib/apt/methods/http: error while loading shared libraries: libnettle.so.8: cannot open shared object file: No such file or directory
Reading package lists... Done
E: Method http has died unexpectedly!
E: Sub-process http returned an error code (127)
E: Method /usr/lib/apt/methods/http did not start correctly
W: No sandbox user '_apt' on the system, can not drop privileges
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease  
E: Some index files failed to download. They have been ignored, or old ones used instead.
I have no name!@ubu:/var/cache/apt/archives# 

安装了很多deb包之后,执行

/var/cache/apt/archives# apt full-upgrade
Reading package lists... Done
Building dependency tree... Done
You might want to run 'apt --fix-broken install' to correct these.

按照提示,fix一下:

apt --fix-broken install
Reading package lists... Done
Building dependency tree... Done
Correcting dependencies... failed.
The following packages have unmet dependencies:
 apt : Depends: adduser but it is not installable
       Depends: gpgv but it is not installable or
                gpgv2 but it is not installable or
                gpgv1 but it is not installable
       Depends: ubuntu-keyring but it is not installable
       Depends: libsystemd0 but it is not installable
       Recommends: ca-certificates but it is not installable
 libapt-pkg6.0 : Depends: libsystemd0 (>= 221) but it is not installable
 libgcrypt20 : Depends: libgpg-error0 (>= 1.27) but it is not installable
 libgnutls30 : Depends: libgmp10 (>= 2:6.2.1+dfsg) but it is not installable
               Depends: libhogweed6 (>= 3.6) but it is not installable
               Depends: libnettle8 (>= 3.7~) but it is not installable
 libp11-kit0 : Depends: libffi8 (>= 3.4) but it is not installable
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
E: Unable to correct dependencies

还是有很多

dpkg -i libbz2-1.0_1.0.8-5build1_amd64.deb libgcrypt20_1.9.4-3ubuntu3_amd64.deb liblz4-1_1.9.3-2build2_amd64.deb liblzma5_5.2.5-2ubuntu1_amd64.deb libsystemd0_249.11-0ubuntu3_amd64.deb libudev1_249.11-0ubuntu3_amd64.deb libzstd1_1.4.8+dfsg-3build1_amd64.deb zlib1g_1%3a1.2.11.dfsg-2ubuntu9_amd64.deb gcc-12-base_12-20220319-1ubuntu1_amd64.deb 

还差,继续安装

dpkg -i adduser_3.118ubuntu5_all.deb gpgv_2.2.27-3ubuntu2_amd64.deb ubuntu-keyring_2021.03.26_all.deb libsystemd0_249.11-0ubuntu3_amd64.deb ca-certificates_20211016_all.deb libgpg-error0_1.43-3_amd64.deb libgmp10_2%3a6.2.1+dfsg-3ubuntu1_amd64.deb libhogweed6_3.7.3-1build2_amd64.deb libnettle8_3.7.3-1build2_amd64.deb libffi8_3.4.2-4_amd64.deb 

继续安装

dpkg -i passwd_1%3a4.8.1-2ubuntu2_amd64.deb debconf_1.5.79ubuntu1_all.deb libsystemd0_249.11-0ubuntu3_amd64.deb 

继续安装

dpkg -i libsystemd0_249.11-0ubuntu3_amd64.deb openssl_3.0.2-0ubuntu1_amd64.deb debconf-i18n_1.5.79ubuntu1_all.deb libsystemd0_249.11-0ubuntu3_amd64.deb 

继续

dpkg -i libaudit1_1%3a3.0.7-1build1_amd64.deb libssl3_3.0.2-0ubuntu1_amd64.deb libpam0g_1.4.0-11ubuntu2_amd64.deb libselinux1_3.3-1build2_amd64.deb libsemanage2_3.3-1build2_amd64.deb  sensible-utils_0.0.17_all.deb 

放弃了,这种笨方法不行啊。理论上应该是安装ubuntu的时候,这些库就应该安装好了。(对啊对啊,普通安装确实apt是安装好的,咱这是手动下载错误的base.txz文件的下场)

安装目录下的所有deb包

dpkg -i *.deb

还是不行,现在pkg update 可以执行,但是感觉有些问题,

而执行fix则报缺很多东西

apt --fix-broken install 
Reading package lists... Done
Building dependency tree... Done
Correcting dependencies... failed.
The following packages have unmet dependencies:
 adduser : Depends: debconf (>= 0.5) but it is not installable or
                    debconf-2.0 but it is not installable
 apt : Depends: libsystemd0 but it is not installable
 ca-certificates : Depends: debconf (>= 0.5) but it is not installable or
                            debconf-2.0 but it is not installable
 console-setup-linux : Depends: keyboard-configuration (= 1.205ubuntu3) but it is not installable
 dbus : Depends: libsystemd0 but it is not installable
 debconf-i18n : Depends: debconf (= 1.5.79ubuntu1) but it is not installable
                Depends: liblocale-gettext-perl but it is not installable
 init-system-helpers : Depends: perl-base (>= 5.20.1-3) but it is not installable
 iproute2 : Depends: debconf (>= 0.5) but it is not installable or

明白了,我创建的是focal,但是虚拟机里安装的是jammy,难道是这里不兼容?

现在改成创建jammy

cbsd jcreate jname=ubu jprofile=ubuntu_focal allow_raw_sockets=1

To 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 ubjammy

login竟然会退出:

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/pro

This 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.
Last login: Sat Jun 15 09:54:07 UTC 2024 on pts/1
Cannot execute /bin/bash: No such file or directory

看来要完全用官方的例子才行(其实这里是可以用jexec ubjammy sh 进入的,而且进去就是linux环境)

官方例子focal版本安装成功

cbsd jcreate jname=focal jprofile=ubuntu_focal allow_raw_sockets=1

进入jail之后

debootstrap focal /compat/ubuntu

再执行

chroot /compat/ubuntu /bin/bash

即可进入linux

也可以在host主机执行:

jexec focal 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!@focal:/# uname -a
Linux focal.my.domain 5.15.0 FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC x86_64 x86_64 x86_64 GNU/Linux

但是进入之后apt还是没有(当然最后我们知道没有apt是因为用了错误的base.txz文件导致的) 。

安装apt参考这个文档:FreeBSD jail虚拟容器里装ubuntu系统没有apt命令怎么办?-CSDN博客

我怀疑没有apt,是因为我使用了错误的base.txz导致的,如果用官方的,应该没问题。但是现在找不到从哪里选了?(终于开窍了)

后来是重新安装了新版本的cbsd,再创建的时候用了正确的base.txz文件,这样创建好,apt存在了。apt update之后就能使用了。

总结

因为对cbsd不熟悉,所以在使用了错误的base.txz文件后,一步错,步步错。没有这个错误的文档的话,任何一种安装方法都是可以成功的,不管是

 cbsd jconstruct-tui

还是

cbsd jcreate jname=ubu jprofile=ubuntu_focal allow_raw_sockets=1
cbsd jstart ubu

本文档当初为了解决下载base.txz速度慢问题才记录的,但最终影响到apt文件包的情况,所以水了这么一大篇文档。

不过也有所得,就是那个错误的base.txz文件是Ubuntu官网的文件,要比cbsd官网提供的文件小很多,如果真要再精简Ubuntu系统,这也是一种解决方案。

更详细的安装文档可以参考这篇:FreeBSD通过CBSD管理低资源容器jail来安装Ubuntu子系统实践-CSDN博客

调试

创建之后cbsd jstart jammy的时候报错

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

mkdir: /usr/jails/jails/jammy/lib/init/rw: Read-only file system

mountfstab warning: mountfstab: unable to create mountpoint for tmpfs tmpfs: /usr/jails/jails/jammy/lib/init/rw

mountfstab warning: mountfstab: read-only location? Skip mount for: /usr/jails/jails/jammy/lib/init/rw

mkdir: /usr/jails/jails/jammy/dev/fd: No such file or directory

mountfstab warning: mountfstab: unable to create mountpoint for fdescfs fdescfs: /usr/jails/jails/jammy/dev/fd

mountfstab warning: mountfstab: read-only location? Skip mount for: /usr/jails/jails/jammy/dev/fd

这是另一台机器测试的时候报错,不知道怎么回事,先搁置。

相关推荐
Camellia__Wang35 分钟前
Linux中的库
linux
pin️‍灼灼灼灼36 分钟前
Linux——线程练习
linux·服务器·算法
worthsen43 分钟前
Linux kernel 与 设备树
linux·kernel
薛定谔式炼丹1 小时前
linux问题总结2
linux·运维·服务器
懒人w1 小时前
百万数据量修改数据思路及方法
java·linux·windows
云计算_Later1 小时前
【mysql】の 用户 | 权限 | 存储引擎 | 变量 | 索引~
linux·mysql·云计算
ztenv1 小时前
C++23特性一览
linux·c++·c++23
Comedy_宁1 小时前
分布式NAS集群+ceph+CTDB
linux·分布式·ceph·nas·ctdb
m0_747124532 小时前
量产工具一一输入系统(二)
linux·imx6ull
这题怎么做?!?2 小时前
自我反思与暑假及大三上学期规划
linux·数据结构·c++