![使用 apt 下载不同发行版的软件包](https://linux22.com/image/28030/%E4%BD%BF%E7%94%A8%20apt%20%E4%B8%8B%E8%BD%BD%E4%B8%8D%E5%90%8C%E5%8F%91%E8%A1%8C%E7%89%88%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85.png)
我想下载一个.deb
包含不同发行版依赖项的包。
我的公司有很多Linux系统:Ubuntu 11.04、11.10、12.10以及Debian 5和6。
下载完整依赖树的命令是apt-get -d install package
。
我目前正在使用 Debian 6 (squeeze),下载相同发行版的软件包可以正常工作。我尝试下载(没有sources.list
通过将我的源更改为 Debian 5 (lenny) 源来安装)软件包树。
但是我收到以下错误:
# apt-get -d install python-lxml
...
The following packages have unmet dependencies:
python-lxml : Depends: python (< 2.6) but 2.6.6-3+squeeze7 is to be installed
E: Broken packages
为每个发行版运行不同的操作系统将导致 12 台以上的机器。我正在寻找更清晰的解决方案。
有什么建议么?
答案1
APT的核心工作是解决依赖关系。所以你不能真的责怪它抱怨依赖关系。
您需要使用不同的配置来调用它,以便它不会混合包数据库。为每个发行版保留单独的apt.conf
和sources.list
文件,例如。
apt-get -o Dir::Etc::Main=/path/to/precise/apt.conf -d …
且apt.conf
至少含有
Dig::State::status "/path/to/precise/status";
APT::Get::Download-Only "true";
您可能需要符号链接或复制目录/etc/apt
中的某些文件/path/to/precise
(取决于其中的内容)。
当您传递备用数据库时,不要以 root 身份运行 apt-get。如果apt-get
有权修改您的系统,并且您不小心错误配置了某些内容或关闭了系统-d
,则可能会严重搞乱您的系统。仅使用所需的权限运行apt-get
,只要您只下载不包含 root 的内容。您需要有足够的权限才能写入缓存目录/var/cache/apt
及其内容;我建议为此创建一个组(addgroup aptcache; chgrp -R aptcache /var/cache/apt; chmod -R g+w /var/cache/apt
并将您自己添加到其中)。
答案2
下载这些软件包后很难辨别您打算如何处理它们,这确实很有帮助。
如果您正在下载这些软件包以便将来安装在另一台计算机上,并且希望将它们保留在本地,我建议使用以下命令为每个发行版创建一个部分 apt 存储库复制品。如果您的公司有很多 debian/ubuntu 系统,您可能无论如何都会想要这样做。
在我的环境中,存储库上有一个 python xmlrpc 服务器,客户端发送要dpkg --get-selections
与存储库上的部分包列表合并的输出,有助于保持本地存储库同步。它们是非常简单的脚本,当我有时间时,我会将它们发布到 github 上。
如果您需要在下载后在本地计算机上使用这些软件包,并且这些软件包不是为您正在使用的系统构建的,您可能需要使用施鲁特。该schroot
软件包将允许您运行chroot
每个发行版,以便您可以测试您的代码或您需要执行的任何其他操作。
答案3
我真的非常非常建议您决定选择一个发行版并在网络上强制使用它,除非您特别喜欢花费五倍的时间和精力来确保所有系统都是最新的并且安全问题已修补。
至少,debian Lenny 被宣告生命终结差不多一年前——不会有是任何更多的安全更新。我不必告诉你继续运行它是一个多么糟糕的主意。
我对 ubuntu 的生命周期不太熟悉,但我敢打赌 04/11 变体也不会再保持最新状态。
此外,即使你设法做到你所要求的,你也故意禁用了如此多的内部保护措施,以至于一个错误就会让你的系统陷入可怕的混乱
如果你真的绝对必须运行所有这些发行版,也许你最好告诉每个 apt 使用缓存 http 代理,例如乌贼您在中央服务器上设置的,以最大限度地减少带宽使用和与外部的接触。
答案4
您可以使用要下载软件包的发行版的 docker 镜像,然后从那里获取它们。获取依赖项的答案从这里。
# Get the distro image of choice
docker pull debian:stretch-slim
# Run the image binding the current (host) directory to container
docker run -it --mount type=bind,source="$(pwd)",target=/packages debian:stretch-slim bash
在您的 docker 提示符下
# Change to the packages directory
cd packages
# Update your packages list
apt update
# Define what packages (and their dependencies) you want to download
PACKAGES="wget unzip"
# Downloads to `/packages` i.e. your PWS on host
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests \
--no-conflicts --no-breaks --no-replaces --no-enhances \
--no-pre-depends ${PACKAGES} | grep "^\w")
exit