在没有互联网连接的服务器上下载并安装 ubuntu 软件包和依赖项

在没有互联网连接的服务器上下载并安装 ubuntu 软件包和依赖项

我正在尝试在具有有效互联网连接的服务器上下载所有软件包和所需的依赖项,然后将它们传输到没有互联网连接的服务器上,然后通过 apt-get 安装它们。

我下载包的解决方案有两种:

  1. apt-get --print-uris --yes install pkgspec | grep ^\' | cut -d\' -f2 > downloads.list
    

它是无用的,因为它只适用于在具有有效互联网连接的服务器上尚未下载和安装的包和依赖项。

  1. 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

我从来没有尝试过这个,所以 YMMV。

查看apt-离线

他们声称能做您想做的事。

答案3

我的建议是使用 ssh 隧道,我假设您正在从具有互联网连接的机器上使用 SSH 连接登录到服务器,因此您可以尝试使用反向隧道至少可以访问您想要的存储库...请按照以下步骤操作:

  1. 使用以下命令登录到您的服务器:

    ssh -R 127.0.0.1:9800:yourrepo.address:80 youruser@ServerWithoutInternetConnectionAddress
    
  2. 登录服务器后,将以下行添加到 /etc/hosts:

    127.0.0.1 yourrepo.adress
    
  3. 在您的存储库配置文件中/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

相关内容