在 Linux 上创建软件包存储库:Fedora 和 Debian
本文是我们的 PXE 文章的逻辑延续,因为阅读本文后,您将能够网络引导并实际安装您选择的发行版。但是创建自己的存储库还有其他用途。例如,带宽。如果您管理一个网络并且所有系统(或某些系统)都运行相同的发行版,那么您可以更轻松地与附近的镜像结合进行 rsync 并自行提供更新。接下来,也许您创建了一些您的发行版在主树中不接受的软件包,但用户发现它们很有用。获取域名,设置网络服务器就可以了。我们不会在这里详细介绍网络服务器的设置,仅介绍基本安装任务以及 Fedora 或 Debian 系统存储库的基本设置。因此,您需要具备必要的硬件(服务器和必要的网络设备,视情况而定)以及一些有关 Linux 和网络服务器的知识。那么,让我们开始吧。
注意:本文是从我们之前的域 linuxcareer.com 移走的。
安装工具
Fedora 有一个名为createrepo 的工具,它可以简化手头的任务。所以,我们需要安装的是 httpd 作为网络服务器:
# yum install createrepo httpd
设置存储库
现在,设置网络服务器后,我们假设根目录是 ar /var/www。我们必须以有组织的方式创建必要的目录(如有必要,请随意调整口味或仅遵循官方布局):
# cd /var/www/html
# mkdir -p fedora/15/x86_64/base
# mkdir fedora/15/x86_64/updates
现在就这样。我们所要做的就是 rsync 到创建的文件夹并确保我们有足够的可用空间:
# rsync -avrt rsync://ftp.heanet.ie/pub/fedora/linux/releases/15/Everything\
/x86_64/os/Packages/ /var/www/html/fedora/15/x86_64/base
现在使用 createrepo 作为基本文件夹:
# createrepo /var/www/html/fedora/15/x86_64/base
这是强制性的,因为它将创建 yum 使用您的存储库时需要的 repodata 目录。现在让我们重复上面相同的步骤,但这次我们将获得更新:
# rsync -avrt rsync://ftp.heanet.ie/pub/fedora/linux/\
updates/15/x86_64/ /var/www/html/fedora/15/x86_64/updates
最后,我们建议您检查 httpd 是否设置为开机启动,并使用 cron 定期获取更新:
# systemctl enable httpd.service
# crontab -e
请记住,要添加的 rsync 命令是第二个命令,该命令与更新相关,并且 systemctl 仅在 Fedora 15 或更高版本上可用。在较旧的 Fedora 系统上使用 ntsysv 或 chkconfig。
客户端设置
您必须告诉将从您的服务器获取更新的计算机在哪里可以找到它们,因此我们首先创建 .repo 文件:
# this will be base-lan.repo
[base-lan]
name=Fedora $releasever - $basearch
failovermethod=priority
baseurl=http://192.168.1.2/fedora/$releasever/$basearch/base
enabled=1
# Make sure you disable the official .repo files with enabled=0
gpgcheck=0
# this will be updates-lan.repo
[updates-lan]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
baseurl=http://192.168.1.2/fedora/$releasever/$basearch/updates
gpgcheck=0
现在,只需做一个
# yum update
现在您就可以出发了。
包裹签收
正如我们的一位读者所指出的,安装软件包时应该注意安全问题。软件可能是从受感染的服务器下载的,并且可能包含恶意可执行文件。 Yum(以及 apt、zypper 和其他包管理系统)通过使用 GPG 密钥克服了这个问题。我们讨论了镜像 Fedora 存储库。这些软件包已经签名,密钥可以在 /etc/pki/rpm-gpg 中找到。如果您在启用本地存储库之前曾经使用官方 Fedora 存储库作为客户端,则该目录将已经包含必要的密钥。如果没有,可以从 getfedora.org/keys/ 下载密钥。现在,我们必须更改 .repo 文件以启用 gpgcheck 并告诉 yum 密钥在哪里。
# These are the only lines that need to be changed
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
如果您使用本地自定义软件包存储库,yum 会抱怨您的自定义软件包未签名。如果您是镜像/存储库维护者并且您只向您的组织提供包,则可以使用 yum 标志 –nogpgcheck,或者以安全的方式对自定义包进行签名。这是因为保存自定义/本地存储库的服务器也可能受到损害。因此,您必须在服务器上创建 GPG 密钥并使用 rpm 对自定义包进行签名:
$ gpg --gen-key
$ gpg --list-sigs
正如您所看到的,在我们的例子中,USERID 是“Linux Career
$ gpg --armor --export "USERID" > my.key.file.asc
$ gpg --keyserver pgp.mit.edu --send-key "USERID"
当然,您的 USERID 会有所不同,因此请相应地更改信息。请注意,在我们测试过的 Fedora 16 上,可执行文件名为 gpg2 而不是 gpg。
我们只需要在将签署软件包的用户的主目录中创建一个 .rpmmacros 文件,并将以下内容放入其中:
%_signature gpg
%_gpg_name USERID
%_gpgbin /usr/bin/gpg2
既然一切都已设置,那么签署包的命令将是
$ rpm --addsign name_of_package.rpm
现在,从自定义存储库下载的客户端将使用“rpm –import $key”,以便能够下载这些自定义软件包。
安装中
由于 Debian 的存储库结构更加复杂,您会发现在服务器端需要更多的工作,但在客户端则需要更少的工作。无论何时,都会分为三个部分:稳定、测试和不稳定(不包括实验),每个部分都有三个组件,具体取决于软件包的许可方式:主要、贡献和非免费。您可以决定要镜像发行版的哪一部分,但我们有责任警告您:Debian 提供的软件包比 Fedora 多得多,因此磁盘空间需求将显着增长。您可以使用很多工具来使用自己的自定义包创建自定义存储库,但我们现在将坚持使用官方包。因此,我们将重新进行 PXE 文章的设置并为安装创建本地存储库。我们需要一个网络服务器,所以让我们安装它:
# aptitude install apache2
在继续之前,请确保 Apache 已配置并启动。
服务器设置
默认根目录,就像在 Fedora 中一样,是 /var/www,所以让我们在其中创建一个 debian 目录:
# mkdir /var/www/debian
Debian 人员推荐 ftpsync,这是一组 perl 脚本,旨在帮助您将所需内容传输到本地镜像上。特别令人感兴趣的是 --exclude
选项,因为您不想获取 Debian 存档的所有内容(仅 amd64、仅 main 和 contrib、仅挤压、无 CD 等) 。如果您想创建一个安装后使用的存储库,只需将 /etc/apt/sources.list 指向包含软件包的目录(您已经在那里有一个工作模型),仅此而已。例如:
deb http://192.168.1.2/debian squeeze main contrib
但是,如果您不喜欢使用 ftpsync,让我们详细看看您需要下载什么。 Debian(和 Ubuntu,可能还有其他 Debian 衍生品)有一个名为 apt-utils 的软件包,其中提供了我们将使用的 apt-ftparchive 程序等。我们的自定义存储库。所以…
# aptitude install apt-utils
将在您的系统上安装必要的工具。我们已经在网络服务器上创建了基本目录,因此我们需要根据需要定制子目录:
# cd /var/www/debian
# mkdir -p pool/main
# mkdir pool/contrib
# mkdir -p dists/squeeze/main/binary-amd64
# mkdir -p dists/squeeze/contrib/binary-amd64
# mkdir .cache
现在我们已经有了目录结构,让我们创建必要的配置文件来帮助 apt-ftparchive 查找并索引我们的软件。请注意,您可以使用此设置来镜像官方 Debian 软件包或使用您自己的软件包创建存储库,因为步骤是相同的。
我们需要创建的两个文件中的第一个文件(都位于 /var/www/debian 中)名为 apt-release.conf。
# cd /var/www/debian
# $editor apt-release.conf
与我们的需求相关的内容如上所示,如下所示:
APT::FTPArchive::Release::Codename "squeeze";
APT::FTPArchive::Release::Origin "linuxcareer.com";
APT::FTPArchive::Release::Components "main contrib";
APT::FTPArchive::Release::Label "Linuxcareer.com Debian Repo";
APT::FTPArchive::Release::Architectures "amd64";
APT::FTPArchive::Release::Suite "squeeze";
您还可以使用 apt-ftparchive 根据命令行参数生成配置文件。使用您喜欢的任何方法。
第二个配置文件名为 apt-ftparchive.conf ,其内容如下所示:
Dir {
ArchiveDir ".";
CacheDir "./.cache";
};
Default {
Packages::Compress ". gzip bzip2";
Contents::Compress ". gzip bzip2";
};
TreeDefault {
BinCacheDB "packages-$(SECTION)-$(ARCH).db";
Directory "pool/$(SECTION)";
Packages "$(DIST)/$(SECTION)/binary-$(ARCH)/Packages";
Contents "$(DIST)/Contents-$(ARCH)";
};
Tree "dists/squeeze" {
Sections "main contrib";
Architectures "amd64";
}
正如您所看到的,这两个文件的语法非常不言自明。
为了举例,我们现在将从 Debian 镜像下载一个 .deb,以便正确地说明我们的想法。
# cd /var/www/debian/pool/main
# wget -c ftp://ftp.heanet.ie/mirrors/ftp.debian.org/debian/pool/main/\
p/patch/patch_2.6.1.85-423d-3_amd64.deb
现在让我们生成内容(每次添加或删除包时都必须重复此操作)。
# cd /var/www/debian
# apt-ftparchive generate apt-ftparchive.conf
# apt-ftparchive -c apt-release.conf release dists/squeeze > \
dists/squeeze/Release
这些操作完成了所谓的“构建存储库”。现在,按照上面的说明,在您的sources.list中添加一行,您就可以访问您的软件存储库了。如果您需要成为 Debian 镜像但仍然不喜欢 ftpsync,请使用 rsync 与名为 pool/$section 的远程目录,然后去给自己喝杯咖啡什么的。另外,请使用镜像,不要超载 ftp.debian.org。
包裹签收
如果您想使用 CD/DVD/蓝光映像向客户提供内容,则默认情况下不会对光学介质映像上的发行文件进行签名。但如果您通过 rsync 镜像的内容来提供服务,那么您很可能不需要执行任何操作。如果您有自定义存储库,请按以下步骤操作。首先,如 Fedora 示例中所示,生成 GPG 密钥:
$ gpg --gen-key
现在,由于 designsign 中的错误#639204(今年八月最后一次更新),我们似乎不得不采取替代路线。由于 Debian 软件包基本上只是 ar 档案,因此我们将使用较低级别的方式来签署我们的软件包:
$ ar x package_name.deb
$ cat debian-binary control.tar.gz data.tar.gz > tempfile
$ gpg -abs -o _gpgorigin tempfile
$ ar rc package_name.deb _gpgorigin debian-binary control.tar.gz data.tar.gz
因此,我们在这里所做的是使用 ar 提取 .deb 文件,将其内容连接到一个临时文件(注意顺序),对该文件进行签名,然后将 .deb 重新组合为其原始状态。现在我们需要导出 GPG 密钥(如您所见,该过程与 Fedora 上应用的过程没有太大不同)。
$ gpg --export -a > mydebsign.asc
现在让我们提取密钥以供进一步使用:
$ gpg --fingerprint
记住密钥指纹中的最后四组(如下所示),因为它们将是密钥 ID,我们稍后将使用它。
在客户端计算机上,确保安装了 debsig-verify,然后您可以为密钥创建一个位置:
# mkdir /usr/share/debsig/keyrings/$key_id
正如您在屏幕截图中看到的,我们的示例密钥 ID 是 8760C540B4FC5C21。现在让我们导入密钥:
# gpg --no-default-keyring --keyring \
/usr/share/debsig/keyrings/$key_id/debsign.gpg --import mydebsign.asc
现在,棘手的部分来了:我们需要一个密钥的策略文件。使用的语言是 XML,但无需担心:在 /usr/share/doc/debisg-verify/examples 中,您会找到一个名为 generic.pol 的文件,可以将其复制到某处进行编辑和重命名。此类文件的示例如下所示:
<Policy xmlns="http://www.debian.org/debsig/1.0/">
<Origin Name="Linux Career" id="8760C540B4FC5C21"
Description="Package offered by Linux Career"/>
<Selection>
<Required Type="origin" File="debsign.gpg" id="8760C540B4FC5C21"/>
</Selection>
<Verification MinOptional="0">
<Required Type="origin" File="debsign.gpg" id="8760C540B4FC5C21"/>
</Verification>
</Policy>
您在上面看到的只是策略文件的重要部分。检查示例并进行必要的更改后,将此文件保存到 /etc/debsig/policies/$key_id/$policy_name.pol。完成此步骤后,如果您正确执行了这些步骤,则可以使用 debsig-verify 并以软件包名称作为参数来检查下载的软件包。感谢 PurpleFloyd 对此很有帮助的文章。
客户端设置
因此,让我们启动客户端计算机,确保其设置为从网络启动,并且当系统要求您选择镜像时,选择“手动输入信息”。输入你的服务器的 IP,然后输入相对于 /var/www 的位置(在我们的例子中是 debian),你应该准备好安装了。
节省带宽的重要性怎么强调都不为过,即使在小型网络上也是如此。当然,本地镜像方法还有其他优点,例如为您的公司提供定制软件(应用特殊补丁或只是进行更改以更好地满足公司的需求)或为您最喜欢的发行版打包的软件提供服务。