我对构建自己的自定义 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 构建时我曾使用过几种方法来实现此目的:
- 安装apt-cacher-ng在您的系统上(或本地网络上的服务器)并将其用作构建的代理。这会创建构建期间使用的包的本地缓存。因此,在第一次构建之后,您将命中任何以前使用过且上游没有较新版本的包的缓存。它仍然需要网络连接,因为它与上游存储库通信以获取较新版本或您尚未使用的包。第二个好处是它只缓存必要的文件,这是明显更少比一面完整的镜子还要大。
编辑:apt-cahcer-ng 本身不需要以任何方式进行配置 - 只需使用 安装即可sudo apt-get install apt-cacher-ng
。有一些我从未需要过的高级配置选项。您可以找到有关如何配置客户端(构建)以使用缓存的说明这里。
答案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],
像平常一样输入命令来使用缓存的软件包。
请记住,每次将包添加到目录时cache
,repobuild.sh
如果您想使用缓存的包,就必须重新运行。