如何创建本地APT存储库?


103

我想在我的LAN上建立自己的本地存储库,以便LAN上的计算机可以对其进行更新和升级。我想下载软件包并将其存储在我的本地服务器上,这样我就可以在不使用互联网的情况下从中进行更新,升级,安装等。



3
我不认为这是重复的。maythux想要完成的工作是创建自己的存储库服务器以配合aptitude使用。Keryx所做的是取代aptitude作为程序包管理器,并为程序包创建外部源。
con-f-use

Answers:


80

Ubuntu帮助Wiki中

有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中,并将其另存为〜/ bin中的update-mydebs。(波浪号“〜”表示您的主目录。如果〜/ bin不存在,请创建它:Ubuntu将把该目录放在您的PATH中。这是放置个人脚本的好地方)。接下来,使脚本可执行:

chmod u+x ~/bin/update-mydebs

How the script works:

dpkg-scanpackages会查看mydebs中的所有软件包,并将输出压缩并写入apt-get update可以读取的文件(Packages.gz)(请参阅以下参考资料,以详尽的方式对此进行解释)。/ dev / null是一个空文件;它替代了覆盖文件,其中包含有关软件包的一些其他信息,在这种情况下,实际上并不需要该信息。如果您想了解它,请参阅deb-override(5)。

资料清单

添加线

deb file:/usr/local/mydebs ./

到/etc/apt/sources.list,就可以完成了。

CD选件

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

sudo apt-cdrom add

使用储存库

每当您在mydebs目录中放置新的deb时,请运行

sudo update-mydebs
sudo apt-get update

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

制作不好的软件包可能会失败,但是您不会承受dpkg的麻烦。


3
您能在网上解释一下语法吗dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz/dev/null在那里做什么 我也阅读了手册页,但不清楚。
sayantankhan

@ blade19899我需要一点澄清。我想要一个只有几个精选软件包的存储库,而不是我接触过的每个软件包。我是否正确,这项技术会赋予我这种能力?这里的目标是要有一个软件安装组可以在隔离的LAN上使用的存储库,该存储库远离诱惑以轻松获得不需要的资源。
Wes Miller

@WesMiller我想你需要我只是编辑他的帖子!
blade19899 2013年

@ blade19899对不起,我不明白您的回答。
Wes Miller

@WesMiller你需要BigSack我只是编辑他的文章来解决语法问题(我认为它有一段时间了),这不是我的答案,而是BigSack的
blade19899

41

* 通过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”的实用程序完成。这里'

# 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

2
当不在局域网中时,将该行添加到/etc/apt/sources.list会中断更新,不是吗?
菲利克斯(Felix)

2
对于Ubuntu 16.04,您可能需要/var/www/debs将此答案替换为/var/www/html/debs。或者,你将需要额外的步骤来手动编辑你的Apache配置/etc/apache2
埃里克

18

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

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

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

设置仓库目录

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


@Phillip您的编辑使用了date -Rc,我将其更正为date -Ru假设您是从编辑描述中获取的意思
muru

谢谢,由于生成的日期在本地TZ(而不是UTC)中,所以我最近才开始收到有关此问题的警告。我使用自己的脚本对其进行了修复,但忘记了在此处进行编辑
happyskeptic

1
@KevinJohnson我现在用本地apt回购中的文件示例更新了主要答案
happyskeptic

8

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

  1. 安装Debian软件包

    sudo apt-get install reprepro nginx 
    
  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
    

    / 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
    

    / srv / reprepro / ubuntu / conf / options

    ask-passphrase
    basedir .
    
  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
    
  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;
      }
    }
    
  5. 优化铲斗尺寸:

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

    server_names_hash_bucket_size 64;
    

参考安装指南链接


4
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
gertvdijk

@elprup:您一定已经忘记更新该答案了:)
0xC0000022L

reprepor不支持同一软件包的多个版本。听起来很奇怪,但这就是reprepro的工作方式
maxadamo

6

您可能想看看apt-mirrorapt-cacher

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


您5年的答案被标记为LQ。如果将其删除,请转到meta并要求取消删除。我投票决定保持开放状态,但需要进行编辑! ;-)
Fabby

5

在说明@ 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 ./
    

4

您可能要创建本地存储库的原因有多种。首先是如果要更新多台Ubuntu计算机,则要节省带宽。例如,如果您有25台Ubuntu机器,它们每周至少需要更新一次,那么您将大大节省带宽,因为除了本地存储库之外,您还可以进行其他所有操作。

大多数组织的网络网关都有不错的带宽,但是这个带宽是宝贵的商品,需要明智地使用。

许多组织仍然在网关处设置具有10MB或100MB限制的路由器,但是内部具有1 GB的网络连接,因此可以在内部更好地使用带宽。创建自己的存储库的第二个原因是,您可以控制内部Ubuntu机器上加载了哪些应用程序。

您可以从更新计算机的存储库中删除组织不希望在本地网络上使用的任何应用程序。更好的是,您可以创建一个测试箱并测试应用程序和版本,然后再将它们推广到网络中,以确保安全性和稳定性。

首先,您需要设置一个镜像,您只需按 键盘上的Ctrl+ Alt+ T打开终端即可。打开时,运行以下命令。

apt-get install apt-mirror 

设置apt-mirror后,您可以使用此命令开始下载存储库。

apt-mirror /etc/apt/mirror.list 1

继续阅读

1资料来源:创建一个Ubuntu存储库


抱歉,链接已死
xamiro

3

制作离线本地存储库
1.使目录可访问(至少由root用户访问)

须藤mkdir / var / my-local-repo

  1. 将所有deb文件复制到该目录。
  2. 扫描目录

sudo dpkg-scanpackages / var / my-local-repo / dev / null> / var / my-local-repo / Packages

  1. 将本地存储库添加到源

echo“ deb文件:/ var / my-local-repo ./”> /tmp/my-local.list

须藤MV /tmp/my-local.list /etc/apt/sources.list.d/my-local.list

sudo apt-get更新


官方Wiki上也或多或少都存在相同的问题:存储库/个人-社区帮助Wiki
sdaau 2014年

1

我尝试apt-rdepends在选择的答案中使用like,但是当我尝试从本地存储库安装软件包时,它抱怨缺少依赖项。

apt-rdepends没有列出我的软件包的某些依赖项。我怀疑这与事实有关,它apt-cache show显示了多个记录。

取而代之的是,我使用apt-cache depends,并且达到了目的:

获取依赖项的递归列表

apt-cache depends <packagename> -i --recurse

-i:仅重要依赖项 --recurse:递归

把它变成可消化的清单

  • 删除符号和空格: | tr -d "|,<,>, "
  • 删除依赖项:&PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • 排序列表: | sort
  • 仅唯一值: | uniq > list.txt

完整的命令:

apt-cache depends <packagename> -i --recurse | tr -d "|,<,>, " | sed -e \
's/^Depends://g' | sed -e 's/^PreDepends://g' | sort | uniq > list.txt

下载包

for i in $( cat list.txt ); do apt-get download $i; done;

扫描软件包并将其转换为Packages.gz

dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

1
可能是一个好主意,引用其回答你谈论...
anonymous2

-1

我已经使用apt-mirror完成了。

很好,但是您将需要更多的硬盘空间,因为它将与回购服务器同步。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.