例子

例子

我对构建自己的自定义 Ubuntu remix 很感兴趣,并且一直在使用Ubuntu Mini Remix ISO

为此,我以类似于的方式挂载磁盘映像并将 chroot 放入其中本指南

我的构建目录层次结构如下:

home
  |
  \builds
     |
     +build(n)
     |  |
     |  +mnt
     |  +extract-cd
     |  +edit
     |  \&
     |
     +build(n+1)
     |  |
     |  \&
     |
     \sources (various debfiles/ISOs)

每个版本都将 $HOME 设置为 ./edit/root,因此层次结构中更高层的任何内容(./mnt、./extract-cd 等)对于 chroot 环境而言都是不可访问的。

有没有办法将 chroot 的 apt 下载的软件包镜像到例如 ~/builds/cache(或者更好的是 ~/builds/cache/[ubuntu-version])目录,然后可以将其用作其他构建的存储库?

这样的设置可以节省我很多带宽,因为只需要从网络上拉取那些还没有下载/镜像到存储库的包。

无论如何,提前感谢您的任何建议/帮助。

答案1

我从未使用过 Ubuntu Mini Remix ISO,但在运行 vmbuilder 构建时我曾使用过几种方法来实现此目的:

  1. 安装apt-cacher-ng在您的系统上(或本地网络上的服务器)并将其用作构建的代理。这会创建构建期间使用的包的本地缓存。因此,在第一次构建之后,您将命中任何以前使用过且上游没有较新版本的包的缓存。它仍然需要网络连接,因为它与上游存储库通信以获取较新版本或您尚未使用的包。第二个好处是它只缓存必要的文件,这是明显更少比一面完整的镜子还要大。

编辑:apt-cahcer-ng 本身不需要以任何方式进行配置 - 只需使用 安装即可sudo apt-get install apt-cacher-ng。有一些​​我从未需要过的高级配置选项。您可以找到有关如何配置客户端(构建)以使用缓存的说明这里

  1. 您可以使用镜像或者apt-镜像创建完整镜像。但请注意,这通常需要几百 GB 的磁盘空间,具体取决于您选择镜像的存储库(主存储库、受限存储库、Universe 存储库、Multiverse 存储库)等等。此外,镜像通常需要更长的时间(数百 GB)。此外,您还必须使用 cron 作业来更新它或在需要时手动更新它。缺乏自动更新既可以看作是一种好处(我见过上游发布了坏软件包并花了几天时间用好软件包替换它们的情况),也可以看作是一种缺点(您没有最新的安全补丁)。

答案2

一个可行的策略是将一个公共文件夹挂载到 chroot 的包缓存中(使用 --bind 选项)。此缓存位于/var/cache/apt/archives/

使用此方法可以使 apt 运行的任何命令都与通用本地档案一起运行。

例子

让两个 chroot 共享一个通用的 apt 档案

sudo mount --bind ~/builds/cache <chroot location>/var/cache/apt/archives
sudo mount --bind ~/builds/cache <another chroot location>/var/cache/apt/archives

这将使 ~/builds/cache 和两个 chroot 的 apt 存档针对同一目录进行操作。

让两个 chroot 共享本地安装的存档

sudo mount --bind /var/cache/apt/archives <chroot location>/var/cache/apt/archives
sudo mount --bind /var/cache/apt/archives <another chroot location>/var/cache/apt/archives

与第一个类似,但现在主安装和两个 chroot 都将使用相同的 apt 档案,即,所有三个 apt 将在同一个位置查找下载的 .deb 文件。

(我认为软件包并不直接关心 ubuntu 版本,只关心相关软件包的版本。所以您可能不需要担心每个版本的单独文件夹,甚至可以使用本地安装的软件包存档。)

打扫干净

最后,也是最重要的一点,在关于清理 chroot 以准备最终构建的部分中,您不需要运行 apt clean。由于 apt 现在在以这种方式设置的所有 chroot 中使用相同的文件夹,因此 apt clean 基本上会一次性清除所有 chroot 的存档。相反,在 chroot 中,运行:

umount /var/cache/apt/archives

这将有效地从运行命令的 chroot 中“清理”存档,同时保持公共文件夹不变。

绑定安装手册信息

以下是该man mount页面的直接副本。请查看它以了解 mount --bind 的完整说明,并可能了解使用 bind 的其他方法。

The bind mounts.
          Since  Linux  2.4.0  it  is possible to remount part of the file
          hierarchy somewhere else.  The call is:

                 mount --bind olddir newdir

          or by using this fstab entry:

                 /olddir /newdir none bind

          After this call the same contents are accessible in two  places.
          One  can  also  remount  a single file (on a single file).  It's
          also possible to use the bind mount to create a mountpoint  from
          a regular directory, for example:

                 mount --bind foo foo

          The bind mount call attaches only (part of) a single filesystem,
          not possible submounts.  The  entire  file  hierarchy  including
          submounts is attached a second place by using:

                 mount --rbind olddir newdir

          Note  that  the filesystem mount options will remain the same as
          those on the original mount point,  and  cannot  be  changed  by
          passing  the  -o  option  along  with --bind/--rbind.  The mount
          options can be changed by a separate remount command, for  exam‐
          ple:

                 mount --bind olddir newdir
                 mount -o remount,ro newdir

          Note  that  the behavior of the remount operation depends on the
          /etc/mtab file.  The first command stores the 'bind' flag in the
          /etc/mtab  file  and  the second command reads the flag from the
          file.  If you have a system without the /etc/mtab file or if you
          explicitly  define  source  and  target  for the remount command
          (then mount(8) does not read /etc/mtab), then you  have  to  use
          the  bind  flag  (or  option)  for the remount command too.  For
          example:

                 mount --bind olddir newdir
                 mount -o remount,ro,bind olddir newdir

          Note that remount,ro,bind will  create  a  read-only  mountpoint
          (VFS  entry),  but the original filesystem superblock will still
          be writable, meaning that the olddir will be writable,  but  the
          newdir will be read-only.

答案3

我最终使用了用户 7134 的答案,以及来自这里。

因为他的回答没有完全满足我的想法,所以我写了自己的答案。尽管如此,我还是给了他赏金,因为它为我指明了正确的道路。

解决这个问题的方法是这样的:在 cd 到目录之后build(n),在 chroot 进入构建之前,运行

`sudo mount --bind /home/[username]/builds/cache edit/var/cache/apt/archives`

这将有效地缓存 chrooted 构建下载的包。

继续正常构建。目前还不需要创建我们的 repo,因为里面什么都没有。

构建完成后,卸载并清理 chroot 时,输入

umount /var/cache/apt/archives

然后我们可以创建 repo 以便在未来的构建中使用。

为此,请创建repobuild.sh,如下文件:

#! /bin/bash
cd /home/[username]/builds/cache
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

通过运行使我们的脚本可执行chmod u+x /home/[username]/repobuild.sh ,然后运行脚本:/home/[username]/repobuild.sh

开始准备 chroot 到新版本,确保按照上面所示进行/home/[username]/builds/cache挂载。edit/var/cache/apt/archives

Chroot 进入edit然后添加

deb file:/var/cache/apt/archives ./

/etc/apt/sources.list

运行 apt-get update,就大功告成了。现在,您可以apt-get install [packagename],像平常一样输入命令来使用缓存的软件包。

请记住,每次将包添加到目录时cacherepobuild.sh如果您想使用缓存的包,就必须重新运行。

相关内容