如何创建本地APT存储库?

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

来自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

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

 #! /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)。

的sources.list

添加线

 deb file:/usr/local/mydebs ./ 

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

CD选项

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

 sudo apt-cdrom add 

使用存储库

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

 sudo update-mydebs sudo apt-get update 

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

糟糕的包裹可能会失败,但你不会忍受dpkg地狱。

* 通过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 – 这样我的局域网上的所有计算机的代码都是相同的,但是如果你只运行一台计算机,localhost就可以了。
现在,更新APT:

 # apt-get update 

创建经过身份validation的存储库

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

请注意,我没有在这里介绍如何通过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 (eg 14.04 is trusty)\n The way to use this script is to do the changes to the repo first, ie 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

您还可以通过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 /分布

     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目录/选项

     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; 

参考安装指南链接

你可能想看看apt-mirrorapt-cacher

以下是如何安装和使用它的指南。

您可能希望创建本地存储库有几个原因。 首先,如果要更新多台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存储库

创建脱机本地存储库
1.使dir可访问(至少由root)

sudo 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 file:/ var / my-local-repo ./”> /tmp/my-local.list

sudo mv /tmp/my-local.list /etc/apt/sources.list.d/my-local.list

sudo apt-get update

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

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

相反,我使用apt-cache depends ,这就是诀窍:

获取依赖项的递归列表

 apt-cache depends  -i --recurse 

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

把它变成易消化的列表

  • 删除符号和空格: | tr -d "|,<,>, " | tr -d "|,<,>, "
  • 删除取决于:&PreDepends: | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g' | sed -e 's/^Depends://g' | sed -e 's/^PreDepends://g'
  • 对列表进行排序: | sort | sort
  • 只有唯一值: | uniq > list.txt | uniq > list.txt

完成命令:

 apt-cache depends  -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 

BigSack上面回答的说明 – 以及他引用的原始wikipost – 在我做了两处修改之前对我不起作用:

1)我生成了一个扁平的“Packages”文件而不是gzip的版本:

dpkg-scanpackages -m。 >包裹

2)我在sources.list中的repo的条目中添加了[trusted=yes]

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

我怀疑#2只是Ubuntu wiki过时的问题。 我不确定为什么#1是必要的 – 但由于我无法在其他任何地方找到它,我想确保该解决方案是公开的。

我已经使用了apt-mirror。

它很好,但你需要有更多的硬盘空间,因为它将与repos服务器同步。