我正在尝试在具有有效互联网连接的服务器上下载所有软件包和所需的依赖项,然后将它们传输到没有互联网连接的服务器上,然后通过 apt-get 安装它们。
我下载包的解决方案有两种:
apt-get --print-uris --yes install pkgspec | grep ^\' | cut -d\' -f2 > downloads.list
它是无用的,因为它只适用于在具有有效互联网连接的服务器上尚未下载和安装的包和依赖项。
aptitude download '?reverse-depends(package)'
如果您不需要所有软件包和依赖项,它也会下载它们。
有谁知道在全新安装的 Ubuntu 服务器 16.04 上下载所需软件包和依赖项的更好解决方案?
我想创建一个脚本,浏览包列表并自动下载所有包和依赖项。
然后我需要一个解决方案,以便在离线计算机上使用 apt-get 来使用这些软件包。想法是创建一个本地 apt 存储库,以便您可以通过 apt-get 使用本地软件包。
所以我使用这个命令来创建 Packages.gz,其中包含有关第一步下载的所有包的信息。
dpkg-scanpackages . /dev/null | gzip > Packages.gz
然后我将新源添加到 /etc/apt/sources.list.d/ 并运行 apt-get update。
deb [trusted=yes] file:///tmp/dpkgs /
现在我遇到一个问题,例如,我可以安装 apache(仍然有一些错误)。但如果我想安装 php,我会收到以下错误。
root@ubuntu:~# apt-get install php
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
php : Depends: php7.0 but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
有人有解决这个问题的办法吗?谢谢。
答案1
Lan Morrison 编写了一个isorespin.sh
脚本,该脚本将根据您给出的命令生成一个映像,并且使用附加命令可以将当时的所有更新都保存在映像中,并在其生成的安装映像上安装您想要的任何 apt 安装。我用过它,效果非常好。
有关详细信息,请参阅:自定义 Ubuntu ISO:使用文档和示例isorespin.sh
。
答案2
答案3
我的建议是使用 ssh 隧道,我假设您正在从具有互联网连接的机器上使用 SSH 连接登录到服务器,因此您可以尝试使用反向隧道至少可以访问您想要的存储库...请按照以下步骤操作:
使用以下命令登录到您的服务器:
ssh -R 127.0.0.1:9800:yourrepo.address:80 youruser@ServerWithoutInternetConnectionAddress
登录服务器后,将以下行添加到 /etc/hosts:
127.0.0.1 yourrepo.adress
在您的存储库配置文件中
/etc/apt/sources.list
或/etc/apt/sources.list.d/repofile.list
通过添加使用的端口来修改您的存储库地址(我使用了 9800,尽管它可以是任何高于 1023 的端口):deb [arch=amd64] http://yourrepo.address:9800/ubuntu-mirror/ xenial main deb [arch=amd64] http://yourrepo.address:9800/ubuntu-mirror/ xenial-updates main deb [arch=amd64] http://yourrepo.address:9800/ubuntu-java/ xenial main deb [arch=amd64] http://yourrepo.address:9800/ubuntu-production/ xenial multiverse
现在apt-get update
应该apt-get install
可以正常工作了。请考虑一下,您可以拥有与存储库一样多的隧道,您只需更改源端口即可。
例如,假设您在 中拥有官方 ubuntu 存储库,/etc/apt/sources.list
而在其他中,/etc/apt/sources.list.d/repofile.list
我可以使用端口 9801us.archive.ubuntu.com
和端口 9800,/etc/apt/sources.list.d/repofile.list
如下所示:
/etc/apt/sources.list
deb http://us.archive.ubuntu.com:9801/ubuntu/ xenial main restricted universe multiverse
deb-src http://us.archive.ubuntu.com:9801/ubuntu/ xenial main restricted multiverse
deb http://us.archive.ubuntu.com:9801/ubuntu/ xenial-security main restricted universe multiverse
deb http://us.archive.ubuntu.com:9801/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://us.archive.ubuntu.com:9801/ubuntu/ xenial-security main restricted multiverse
deb-src http://us.archive.ubuntu.com:9801/ubuntu/ xenial-updates main restricted multiverse
/etc/apt/sources.list
deb [arch=amd64] http://yourrepo.address:9800/ubuntu-mirror/ xenial main
deb [arch=amd64] http://yourrepo.address:9800/ubuntu-mirror/ xenial-updates main
deb [arch=amd64] http://yourrepo.address:9800/ubuntu-java/ xenial main
deb [arch=amd64] http://yourrepo.address:9800/ubuntu-production/ xenial multiverse
通过将其添加到/etc/hosts
127.0.0.1 yourrepo.adress us.archive.ubuntu.com
并从具有互联网连接的机器登录如下:
ssh -R 127.0.0.1:9800:yourrepo.address:80 -R 127.0.0.1:9801:us.archive.ubuntu.com:80 youruser@ServerWithoutInternetConnectionAddress
附言:考虑一下,如果您的存储库需要密钥,您将需要提取密钥(从具有密钥的机器中apt-key export KEY_ID >> key.asc
)并使用以下命令添加它:
apt-key add key.asc