我家里有几台机器运行 Debian Linux,我一直想制作打包系统的部分镜像。我曾考虑过制作一个完整的镜子,但我没有使用大部分软件包。但是,我发现的大多数部分镜像解决方案都要求您手动将包放入配置文件中。有没有办法拥有部分镜像,以便当我在客户端上安装软件包时我的本地服务器下载/更新软件包?
另外,也许还支持 Ubuntu(我有一些 Ubuntu VM)。
谢谢!
答案1
有一些事情要做,但我理解不想制作 Debian 的完整镜像。当然,他们将完整镜像定义为所有架构、所有版本。
使用一个较小的子集,但仍然比您想要的更大apt-mirror
- 这样您可以根据需要将其调整为单个版本和架构。 https://apt-mirror.github.io/
不过,您可能确实想要的是在第一次下载任何包时缓存它,并使其可用于网络上的所有计算机。您可以通过在客户端和镜像服务器之间放置一个代理来做到这一点,并且有一个(嗯,有一些但最新的)代理/网络服务器组合,apt-cacher-ng
您可以将其指向您本地的 Debian/Ubuntu/Mint/etc机器在。http://xmodulo.com/apt-caching-server-ubuntu-debian.html
答案2
我不是专家,但我也做过类似的事情。不是完全自动的,而是只需要输入几个命令。
首先获取正在使用的列表(假设所有机器都有相同的架构):
$ apt list --installed > install.list
然后将其翻译成易于理解的格式:
$ sed -r 's/ \[.*?\]//g' install.list | sed -r 's/(^.*?)\/.*?[ ](.*?)[ ](.*?)$/\1:\3=\2/g' > install.list.to.dl
然后下载当前的软件包版本:
$ xargs apt download < install.list.to.dl
这会将当前安装的所有 deb 下载到当前目录。
您需要创建一个 Packages.gz 文件才能将此文件夹添加为 apt 的源。例如
$ cd ~/deb_server/debs/
$ dpkg-scanpackages -m . /dev/null | gzip -9c > Packages.gz
编辑: dpkg-scanpackages 的路径必须是相对的,否则这将破坏稍后的下载过程
(-m允许你有多个版本,如果你想要最新版本,删除-m)
现在您必须启动一个文件服务器(例如 apache2)并将其配置为索引文件。
/etc/apache2/sites-enabled/000-debserver.conf
包含:
DocumentRoot /var/www
<Directory /var/www/>
Options +Indexes +FollowSymLinks
Require all granted
</Directory>
最后,您需要将 deb 文件夹符号链接到 /var/www。 (或者将服务器配置为当前 deb 下载位置)例如
$ ln -s ~/deb_server/debs/ /var/www/repo
最后一点是将服务器计算机添加为每台目标计算机上 apt 更新的唯一来源。
$ deb [trusted=yes] http://deb_server_ip/repo /
如果你想更新软件包,你需要重新运行 apt download 列表,但没有版本。
$ sed -r 's/ \[.*?\]//g' install.list | sed -r 's/(^.*?)\/.*?[ ](.*?)[ ](.*?)$/\1:\3/g' > install.list.for.update
$ apt update && xargs apt download < install.list.for.update
并更新 Packages.gz。
我不确定这是最好的方法,但它对我有用。
答案3
我一直在寻找一种解决方案来控制 apt 存储库中的包和依赖项,以便能够在多台计算机上部署完全相同的内容。我认为这与您的情况类似,您希望保持客户端和服务器同步。
我恰巧遇到了(https://www.aptly.info/)并且它似乎解决了这个确切的问题,而不必镜像完整的存储库,而只需镜像您指定的包的子集及其依赖项。
我还没有测试过,但看起来很有希望。