当前位置: 首页>>技术教程>>正文


在Linux上创建软件包存储库:Fedora和Debian

, ,

介绍

这篇文章是我们逻辑上的延续PXE文章,因为在阅读本文之后,您将能够进行网络启动并实际安装您选择的发行版。但是创建您自己的存储库还有其他用途。例如,带宽。如果您管理网络,并且所有系统(或某些系统)都在运行相同的分发,则只需要同步与附近的镜像一起使用,并为您自己更新。接下来,也许您有一些自己创建的软件包,发行版不会在主树中接受,但是用户发现它们很有用。获取域名,设置网络服务器,然后就可以开始了。在这里,我们将不详细介绍Web服务器的设置,仅介绍基本的安装任务以及用于Fedora或Debian系统的存储库的基本设置。因此,期望您具有必要的硬件(服务器和必要的网络设备,具体取决于情况)以及有关Linux和Web服务器的一些知识。所以,让我们开始吧。

注意:本文来自我们先前的域名linuxcareer.com。

在Fedora系统上创建存储库

安装工具

Fedora有一个名为createrepo这简化了手头的任务。因此,我们需要安装的只是httpd作为网络服务器:

 # yum install createrepo httpd 

设置存储库

现在,设置好您的Web服务器之后,我们将假定根目录为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

Create RPM package gpg key

如您所见,在我们的案例中,USERID是“ Linux Career此电子邮件地址已受到防止垃圾邮件机器人的保护。您需要启用JavaScript才能查看它。 的document.getElementById( ‘cloak47b718fbecf76a36cae157df5a7ba0c7’).innerHTML=”; VAR前缀= ‘ma’+’il’+’to’; VAR路径= ‘hr’+’ef’+’=’; VAR addy47b718fbecf76a36cae157df5a7ba0c7 = ‘user’+’@’; addy47b718fbecf76a36cae157df5a7ba0c7 = addy47b718fbecf76a36cae157df5a7ba0c7 + ‘linuxcareer’+’.’+’com’; VAR addy_text47b718fbecf76a36cae157df5a7ba0c7 = ‘user’+’@’+’linuxcareer’+’.’+’com’;document.getElementById(‘cloak47b718fbecf76a36cae157df5a7ba0c7’).innerHTML+=” + addy_text47b718fbecf76a36cae157df5a7ba0c7 +”;>“。现在公开密钥:

 $ 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的存储库结构比较复杂,因此您会发现它在服务器端需要更多的工作,而在客户端却需要较少的工作。在任何时候,都会分为三个部分:稳定,测试和不稳定(不包括实验性的),每个部分都包含三个组件,具体取决于软件包的许可方式:主要,贡献和非自由。您要决定要映射的发行版的哪个部分,这是您的决定,但我们有必要警告您: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-derivatives)有一个名为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";
    }

如您所见,关于这两个文件的语法非常类似于self-explanatory。

为了举例说明,我们现在将从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 /Blu-Ray映像将内容提供给客户端,则默认情况下不会对光学媒体映像上的Release文件进行签名。但是,如果您通过同步镜像内容来提供服务,则您不必做任何事情。如果您有自定义存储库,请按以下步骤操作。首先,如Fedora示例中所示,生成GPG密钥:

 $ gpg --gen-key

现在,由于debsign中的错误#639204(今年8月的最新更新),看来我们将不得不采用替代方法。由于Debian软件包基本上只是ar档案,因此我们将使用lower-level方式对我们的软件包进行签名:

 $ 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与程序包名称一起用作参数,以检查下载的程序包。感谢PurplePloyd在这方面的有用文章。

客户端设置

因此,让我们启动客户端计算机,确保将其设置为从网络启动,并在要求您选择镜像时选择“手动输入信息”。输入服务器的IP,然后输入相对于/var /www的位置(在本例中为debian),就可以开始安装了。

结论

即使在小型网络上,人们也永远讲不到节省带宽的重要性。当然,本地镜像方法还有其他优点,例如为公司提供定制的软件(应用特殊补丁或进行更改以更好地满足公司的需求)或为自己喜欢的发行版打包软件。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9089.html,未经允许,请勿转载。