如何设置 APT 存储库?

如何设置 APT 存储库?

我想在服务器上建立一个 APT 存储库,以提供一些软件包。

有没有办法设置一个没有在服务器上安装任何软件吗?

这些文件该如何组织?


编辑:我肯定做错了什么...有人能帮我吗?我的存储库位于http://quickmediasolutions.com/apt/dists

我不确定在哪里或什么,但有些东西配置错误。我目前只有一个包,它适用于所有架构。

以下是我添加的内容/etc/apt/sources.list

deb http://quickmediasolutions.com/apt stable main

答案1

只需设置一个简单但签名的存储库在 Web 服务器上。由于大多数其他教程都有些过时或繁琐,我将尝试在此复制该过程。初始配置需要一点努力,但简单的构建脚本使其易于管理。您可以直接放入新*.deb文件,然后更新,或者让 cron 作业处理。

生成一些签名密钥

首先,您需要gpg为软件包和存储库创建一个签名密钥。将其设为 (4) RSA 签名密钥,无密码,并$KEYNAME在需要时为其指定一个唯一的密钥。(进一步的示例假设“ dpkg1”为密钥名。)

 gpg --gen-key
 gpg -a --export-secret-key dpkg1 > secret.gpg
 gpg -a --export dpkg1            > public.gpg

我说不用密码,因为你的 Web 服务器没有内置的 monkey 来反复输入密码。签名的软件包和存储库只是为了满足更新管理员对此的抱怨。只需将两个密钥上传到/apt/Web 服务器上的新存储库目录,但删除secret.gpg密钥初始化。

更新 CGI 脚本

这是它的简单更新 shell/CGI 脚本:

#!/bin/sh
echo Status: 200 Okay
echo Content-Type: text/plain
echo
echo Rebuilding APT repository:

{
  #-- settings
  export GNUPGHOME=/var/www/usr12345/files
  export KEYNAME=dpkg1
  #-- one-time setup
  if [ ! -e "$GNUPGHOME/secring.gpg" ] ; then
     gpg --import -v -v ./secret.gpg
     gpg --import -v -v ./public.gpg
     gpg --list-keys
  fi

  #-- symlink .deb files from adjacent sub-directories
  find .. -name '*.deb' -exec ln -s '{}' . \;

  #-- build Packages file
  apt-ftparchive packages . > Packages
  bzip2 -kf Packages

  #-- signed Release file
  apt-ftparchive release . > Release
  gpg --yes -abs -u $KEYNAME -o Release.gpg Release

} 2>&1

这三行gpg只需执行一次,用于在某个目录$GNUPGHOME(文档根目录之上)中初始化 GPG 设置。secret.gpg成功后只需删除。

这个小型 shell 脚本的一个独特功能是,它接受*.deb您放入的任何文件,但也会递归地(从一个级别开始)搜索其他文件,并将它们符号链接进去。(Options FollowSymLinks最终需要 .htaccess。)

您可以手动以 CGI 或 cron-job 方式执行此脚本。但请隐藏它,或者最好将其移出文档根目录。

因为它是一个“简单的”apt存储库,所以它需要以下apt-sources.list条目:

deb http://example.org/deb/  ./    # Simple signed repo

这适用于单一架构存储库,并且如果您不期望有数百个软件包的话。

程序包签名Package signature

一旦您设置了 gpg 密钥,签署您的个人软件包也很简单:

dpkg-sig -k dpkg1 -s builder *.deb

(这应该在构建包的工作站上完成,而不是在存储库网络服务器上完成。)

未签名的存储库

如果您不需要签名的软件包,那么您可以将更新脚本缩减为:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

普通用户仍然可以使用,但需要自定义标志apt.sources

deb [trusted=yes] http://apt.example.org/deb/ ./

但是请不要trusted=yes对所有事情习惯性地使用该标志,或者如果您实际上不确定包裹的来源。

为了可用性

对于最终用户,只需将 放入HEADER.html存储库目录即可。Apachemod_auto_index将在前面添加以下注释:

<h1>http://example.org/apt/</h1>
<dl>
<dt>Add this repository to /etc/apt/sources.list as:
 <dd><kbd>deb http://example.org/apt/ ./  # example repo</kbd>
<dt>Import verification key with:
 <dd><kbd>wget -q http://http://example.org/apt/public.gpg -O- | sudo apt-key add -</kbd>
</dl>

备择方案

如今,有一些工具可以自动化存储库管理。甚至还有存储库在线托管商和软件包构建服务(宝石之怒包云宾特雷ETC。)

  • 一个相当方便的替代方案是普尔姆。它是一个 Ruby 脚本,用于构建复杂的 APT 和 YUM 存储库。(但我们只希望 RPM 最终能很快消亡。) - 最好按照 进行安装gem install prm

  • 而且我还编写了一个小脚本来实现类似的自动化操作:http://apt.include-once.org/apt-phparchive- 请注意,它不是很强大并且是用 PHP 编写的(这一次,这只是巧合),并且最初是为 DEB、RPM-over-APT 和 Phar 捆绑包设计的。

由于这与原始问题密切相关,因此还有一些工具可以更轻松地构建 Debian 软件包。有些过时:绩效管理. 更加现代:纤维增强塑料. 我个人的分叉如下:超细粉煤灰(打包脚本语言应用程序的更懒惰的方法。)

答案2

使用 dpkg-scanpackages 设置一个简单的存储库非常容易。这一页解释如何设置一个简单的仓库,以及这个解释如何使用它(向下滚动到示例 4)。

答案3

是的。您可以这样做。您只需以正确的方式组织文件并创建索引文件即可。如果您将目录结构放在 Web 服务器的文档根目录中,则可以通过 Web 服务器访问包。

这里详细描述了如何组织文件以及如何创建索引文件。

您还可以使用名为复制版如果您愿意安装该软件包。这将使管理更加方便。

答案4

对于按照马里奥的回答后遇到此错误的人:

Unable to find expected entry 'Packages' in Release file (Wrong sources.list entry or malformed file)

请执行下列操作:

dpkg-scanpackages debs /dev/null > Packages
gzip -k Packages
apt-ftparchive release . > Release
gpg --default-key $KEYID -abs -o Release.gpg Release

我把我的*.deb文件放在debs文件夹中。

相关内容