如何创建本地 APT 存储库?

如何创建本地 APT 存储库?

我想在我的局域网上建立自己的本地存储库,以便局域网上的机器可以从中更新和升级。我想下载软件包并将其存储在本地服务器上,这样我就可以从中更新、升级、安装等,而无需使用互联网。

答案1

来自Ubuntu 帮助维基

为自己设置一个简单的存储库有 4 个步骤

  1. 安装dpkg-dev
  2. 将包放在目录中
  3. 创建一个脚本来扫描包并创建一个apt-get update可以读取的文件
  4. 添加一行sources.list指向你的存储库

安装 dpkg-dev

在终端中输入

sudo apt-get install dpkg-dev

目录

创建一个目录来保存您的软件包。在本例中,我们将使用/usr/local/mydebs

sudo mkdir -p /usr/local/mydebs

现在将您的包移到您刚刚创建的目录中。

之前下载的软件包通常存储在系统的/var/cache/apt/archives目录中。如果您已经安装, apt-cacher则其目录中还会存储其他软件包/packages

剧本update-mydebs

很简单,只有三行:

#! /bin/bash
cd /usr/local/mydebs
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

将上述内容剪切并粘贴到 gedit 中,然后将其另存为update-mydebs~/bin(波浪符号“~”表示您的主目录。如果~/bin不存在,请创建它:Ubuntu 会将该目录放在您的 中PATH。它是放置个人脚本的好地方)。接下来,使脚本可执行:

chmod u+x ~/bin/update-mydebs

脚本的工作原理:

dpkg-scanpackages查看 中的所有软件包mydebs,并将输出压缩并写入可读取的文件 ( Packages.gz) apt-get update(请参阅下面的参考资料,其中详细解释了这一点)。/dev/null是一个空文件;它是覆盖文件的替代品,该文件包含有关软件包的一些其他信息,在本例中这些信息并不是真正需要的。请参阅deb-覆盖(5) 如果你想了解它。

来源列表

添加行

deb file:/usr/local/mydebs ./

到你的/etc/apt/sources.list,你就完成了。

CD 选项

您可以将包含 deb 的目录刻录到 CD 上,并将其用作存储库(适合在计算机之间共享)。要将 CD 用作存储库,只需运行

sudo apt-cdrom add

使用存储库

每当你将新的 deb 放入 mydebs 目录时,运行

sudo update-mydebs
sudo apt-get update

现在,您的本地软件包可以通过 Synaptic、aptitude 和 apt 命令进行操作:apt-get、、apt-cache等。当您尝试时apt-get install,只要能够满足任何依赖关系,它都会为您解决。

制作不良的包装可能会失败,但您不会经历 dpkg地狱般的折磨。

答案2

*通过 LAN 创建离线存储库 *

安装本地 Apache Web 服务器

# apt-get install apache2

默认情况下,Debian 的 Apache 软件包将在您的系统上建立一个网站/var/www。就我们的目的而言,这很好,因此没有必要做更多的事情。您可以通过将您最喜欢的浏览器指向来轻松测试它http://localhost您应该看到默认的安装后网页,它实际上存储在/var/www/index.html


创建 Debian 软件包存储库目录

选择/var/www/debs为此创建一个目录。在该目录下,您应该创建“体系结构”目录,每个需要支持的体系结构一个目录。如果您只使用一台计算机(或一种类型的计算机),那么您只需要一个目录——通常 32 位系统的目录为“i386”,64 位系统的目录为“amd64”。如果您使用的是其他体系结构,我假设您可能已经知道这一点。现在只需将给定体系结构的“.deb”包文件复制到相应的目录中。如果您现在将您最喜欢的 Web 浏览器指向http://localhost/debs/amd64(例如),您将看到 64 位系统的软件包列表。


创建 Packages.gz 文件

现在我们需要创建一个目录文件供 APT 使用。这可以通过名为“dpkg-scanpackages”的实用程序完成。以下是我用来更新 LAN 上的 AMD64 软件包的命令:

# cd /var/www/debs/

# dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz




让 APT 知道存储库

现在剩下要做的就是让 APT 知道你的存储库。你可以通过更新 /etc/apt/sources.list 文件来做到这一点。你需要一个像这样的条目:

deb http://localhost/debs/ amd64/

我使用了系统的实际主机名,而不是 localhost —— 这样,我的 LAN 上的所有计算机的代码都是相同的,但如果您只运行一台计算机,localhost 就可以了。
现在,更新 APT:

# apt-get update

答案3

创建经过身份验证的存储库

我查看了这里和其他网站上的答案,大多数答案都有一个(在我看来很大的)缺点,那就是你设置了一个未经身份验证的存储库。这意味着你需要运行apt-get才能--allow-unauthenticated从中安装软件包。这可能是一个安全风险,尤其是在脚本中,你安装的软件包可能并非全部来自本地存储库。

请注意,我没有在这里介绍如何使其通过 LAN 可用,但这是使用 Apache 或 nginx 的相当通用的配置(请参阅此处的其他答案)。

设置 repo 目录

mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial

然后添加如下行sources.list

deb file:/home/srv/packages/local-xenial/ ./

添加和删​​除包

删除包

rm /home/srv/packages/local-xenial/some_package_idont_like

添加包

cp /some/dir/apackage.deb /home/srv/packages/local-xenial

现在运行以下脚本,生成 Packages、Release 和 InRelease 文件并使用您的 gpg 私钥对其进行签名:

#!/bin/bash

if [ -z "$1" ]; then
       echo -e "usage: `basename $0` DISTRO
where DISTRO is the Ubuntu version codename (e.g. 14.04 is trusty)\n
The way to use this script is to do the changes to the repo first, i.e. delete or copy in the .deb file to /srv/packages/local-DISTRO, and then run this script\n
This script can be run as an unprivileged user - root is not needed so long as your user can write to the local repository directory"
else
    cd /srv/packages/local-"$1"

    # Generate the Packages file
    dpkg-scanpackages . /dev/null > Packages
    gzip --keep --force -9 Packages

    # Generate the Release file
    cat conf/distributions > Release
    # The Date: field has the same format as the Debian package changelog entries,
    # that is, RFC 2822 with time zone +0000
    echo -e "Date: `LANG=C date -Ru`" >> Release
    # Release must contain MD5 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e 'MD5Sum:' >> Release
    printf ' '$(md5sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(md5sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release
    # Release must contain SHA256 sums of all repository files (in a simple repo just the Packages and Packages.gz files)
    echo -e '\nSHA256:' >> Release
    printf ' '$(sha256sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release
    printf '\n '$(sha256sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages' $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release

    # Clearsign the Release file (that is, sign it without encrypting it)
    gpg --clearsign --digest-algo SHA512 --local-user $USER -o InRelease Release
    # Release.gpg only need for older apt versions
    # gpg -abs --digest-algo SHA512 --local-user $USER -o Release.gpg Release

    # Get apt to see the changes
    sudo apt-get update
fi

conf/distributions 文件的示例内容

Origin: My_Local_Repo Label: My_Local_Repo Codename: xenial Architectures: i386 amd64 Components: main Description: My local APT repository SignWith: 12345ABC

链接

https://wiki.debian.org/RepositoryFormat

http://ubuntuforums.org/showthread.php?t=1090731

https://help.ubuntu.com/community/CreateAuthenticatedRepository

答案4

中的说明@BigSack 的回答Ubuntu 官方 wiki 帖子在 Ubuntu 18.04 上对我来说不起作用,直到我做了以下两项更改:

  1. 生成一个普通的、未压缩的Packages文件(执行此操作时,工作目录必须是所有包裹所在地点)

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
  2. 在以下位置添加以下条目/etc/apt/sources.list

    deb [trusted=yes] file:/usr/local/mydebs ./
    

相关内容