如何创建本地 APT 存储库?

120 apt repository

我想在我的局域网上建立我自己的本地存储库,以便局域网上的机器可以从中更新和升级。我想下载软件包并将它们存储在我的本地服务器上,以便我可以在不使用 Internet 的情况下从中更新、升级、安装等。

Big*_*ack 92

Ubuntu 帮助维基

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

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

安装 dpkg-dev

输入终端

sudo apt-get install dpkg-dev
Run Code Online (Sandbox Code Playgroud)

目录

创建一个目录,您将在其中保存您的包。对于这个例子,我们将使用/usr/local/mydebs.

sudo mkdir -p /usr/local/mydebs
Run Code Online (Sandbox Code Playgroud)

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

以前下载的软件包通常存储在您系统上的/var/cache/apt/archives目录中。如果您安装了 apt-cacher,您将在其 /packages 目录中存储其他软件包。

脚本更新-mydebs

这是一个简单的三个班轮:

#! /bin/bash
 cd /usr/local/mydebs
 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
Run Code Online (Sandbox Code Playgroud)

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

chmod u+x ~/bin/update-mydebs

How the script works:
Run Code Online (Sandbox Code Playgroud)

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

来源.list

添加行

deb file:/usr/local/mydebs ./
Run Code Online (Sandbox Code Playgroud)

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

光盘选项

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

sudo apt-cdrom add
Run Code Online (Sandbox Code Playgroud)

使用存储库

每当你在 mydebs 目录中放入一个新的 deb 时,运行

sudo update-mydebs
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

现在可以使用 Synaptic、aptitude 和 apt 命令来操作您的本地包:apt-get、apt-cache 等。当您尝试 apt-get install 时,任何依赖项都会为您解决,只要它们可以满足.

制作不良的软件包可能会失败,但您不会忍受 dpkg 地狱。

  • 注意,如果你在 `/etc/apt/sources.list` 中使用 `deb file:/usr/local/mydebs ./`,你可能会遇到问题 *E: The repository 'file:/home/path Release'没有发布文件。N:无法安全地从此类存储库进行更新,因此默认情况下禁用*。要解决此问题,请使用 `deb [trusted=yes] file:/usr/local/mydebs ./`。 (6认同)
  • 你能解释一下 `dpkg-scanpackages 行上的语法吗?/开发/空| gzip -9c > Packages.gz`。`/dev/null` 在那里做什么。我也阅读了手册页,但不是很清楚。 (3认同)

小智 45

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

安装本地 Apache Web 服务器

# apt-get install apache2
Run Code Online (Sandbox Code Playgroud)

默认情况下,Debian 的 Apache 软件包会/var/www在您的系统下建立一个网站。就我们的目的而言,这很好,所以没有理由再做任何事情了。您可以通过将您最喜欢的浏览器指向http://localhost您应该看到默认的安装后网页,该网页实际上存储在/var/www/index.html


Create a Debian Package Repository Directory 中

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


创建 Packages.gz 文件

现在我们需要创建一个目录文件供 APT 使用。这是通过名为“dpkg-scanpackages”的实用程序完成的。这里'

# cd /var/www/debs/

# dpkg-scanpackages amd64 | gzip -9c > amd64/Packages.gz
Run Code Online (Sandbox Code Playgroud)




请已知APT仓库

现在剩下要做的唯一事情就是让APT了解你的资料库。您可以通过更新 /etc/apt/sources.list 文件来完成此操作。你需要一个这样的条目:

deb http://localhost/debs/ amd64/

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

# apt-get update
Run Code Online (Sandbox Code Playgroud)

  • 将该行添加到 /etc/apt/sources.list 会在不在 LAN 中时中断更新,不是吗? (2认同)
  • 对于 Ubuntu 16.04,您可能需要将此答案中的“/var/www/debs”替换为“/var/www/html/debs”。或者你需要额外的步骤来手动编辑 `/etc/apache2` 中的 apache 配置 (2认同)

hap*_*tic 27

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

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

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

设置 repo 目录

mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial
Run Code Online (Sandbox Code Playgroud)

然后将这样的一行添加到sources.list

deb file:/home/srv/packages/local-xenial/ ./
Run Code Online (Sandbox Code Playgroud)

添加和删​​除包

移除包裹

rm /home/srv/packages/local-xenial/some_package_idont_like
Run Code Online (Sandbox Code Playgroud)

添加包

cp /some/dir/apackage.deb /home/srv/packages/local-xenial
Run Code Online (Sandbox Code Playgroud)

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

mkdir /home/srv/packages/local-xenial
cd /home/srv/packages/local-xenial
Run Code Online (Sandbox Code Playgroud)

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


小智 9

您还可以通过 nginx 和 reprepro 设置本地源服务器:

  1. 安装 debian 软件包

    sudo apt-get install reprepro nginx 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为 reprepro 创建目录并编辑它

    sudo mkdir -p /srv/reprepro/ubuntu/{conf,dists,incoming,indices,logs,pool,project,tmp}
    
    $ cd /srv/reprepro/ubuntu/
    $ sudo chown -R `whoami` . # changes the repository owner to the current user
    
    Run Code Online (Sandbox Code Playgroud)

    /srv/reprepro/ubuntu/conf/distributions

    Origin: Your Name
    Label: Your repository name
    Codename: karmic
    Architectures: i386 amd64 source
    Components: main
    Description: Description of repository you are creating
    SignWith: YOUR-KEY-ID
    
    Run Code Online (Sandbox Code Playgroud)

    /srv/reprepro/ubuntu/conf/options

    ask-passphrase
    basedir .
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将它包含在 reprepro 中,构建它

    $ reprepro includedeb karmic /path/to/my-package_0.1-1.deb \
    # change /path/to/my-package_0.1-1.deb to the path to your package
    
    Run Code Online (Sandbox Code Playgroud)
  4. 配置nginx:

    /etc/nginx/sites-available/vhost-packages.conf

    server {
      listen 80;
      server_name packages.internal;
    
      access_log /var/log/nginx/packages-access.log;
      error_log /var/log/nginx/packages-error.log;
    
      location / {
        root /srv/reprepro;
        index index.html;
      }
    
      location ~ /(.*)/conf {
        deny all;
      }
    
      location ~ /(.*)/db {
        deny all;
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 优化桶大小:

    /etc/nginx/conf.d/server_names_hash_bucket_size.conf

    server_names_hash_bucket_size 64;
    
    Run Code Online (Sandbox Code Playgroud)

参考安装指南链接

  • 虽然这在理论上可以回答这个问题,但 [最好](​​http://meta.stackexchange.com/q/8259) 在此处包含答案的基本部分,并提供链接以供参考。 (4认同)

Wow*_*ppy 8

在说明@ BigSack的答案Ubuntu的官方的wiki后并没有为我工作在Ubuntu 18.04,直到我做了这两个变化:

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

    cd /usr/local/mydebs
    dpkg-scanpackages -m . > Packages
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加以下条目 /etc/apt/sources.list

    deb [trusted=yes] file:/usr/local/mydebs ./
    
    Run Code Online (Sandbox Code Playgroud)


con*_*use 7

您可能想看看apt-mirrorapt-cacher

这是有关如何安装和使用它的指南。