SDB:创建你自己的软件源

跳转至: 导航, 搜索

本文教会你两种软件源的创建方式:本地和互联网。其中互联网章节又分为在 openSUSE 官方构建服务上创建软件源 和 在私人网络空间上创建软件源。

软件源介绍

请参考:软件源介绍软件源的种类

在本地创建你自己的软件源

在本地计算机创建你自己的软件源

如果是自己在网路上下载到的 RPM(当然我们是不推荐这种方式的,看完本文大家就会知道原因,网路上下载到的 RPM 是来历不明的,有些没有经过 GPG 签名,因此理论上是很不安全的; 但是 Linux 世界是一个分享的世界,很少有人会去做这种缺德事的啦),可以通过:

sudo rpm -ivh foo.rpm

来安装,也可以通过在本地创建你自己的软件源的方式来一劳永逸的避免每次都输入命令。

大家已经都体验过本地软件源,典型的例子就是使用 ISO 安装后会默认创建一个以 ISO 为仓库的软件源。我们就是要在 YaST 里通过这种方式来指定本地计算机的一个文件夹作为我们的 RPM 仓库。

首先我们要创建一个专用的本地文件夹:

cd /home/你的用户名
mkdir Local_RPM_Repository
#也可以是任何你喜欢的名字,你甚至可以像发行版命名那样以一个动物名哦
#学姐的就是,Lappin,兔子,当然你的也可以是 Wolf,Bunny 什么的。

然后打开「YaST 管理员设定」-「软件源仓库」,选择左下角的「新增」:

软件源仓库.png

接着选择「本机目录」:

本机目录.png

接着就是输入你想要的源名称,和浏览到之前创建好了的 /home/你的用户名/Local_RPM_Repository,勾选上「纯RPM仓库」的勾:

本机目录1.png

至此,你的本地软件源就创建好啦。以后你只需要下载好包,拖进那个文件夹,打开 YaST 就可以像安装网络源那样子图形化安装它们了。

在本地局域网创建你自己的软件源

在互联网上创建你自己的软件源

以下所有方法创建的软件源,如未特殊说明,添加方式默认都是 YaST Software Repositories(软件套件库)中的 http 方式。如何添加源请参考 SDB:添加软件源

在 openSUSE 官方构建服务上创建软件源

openSUSE 官方构建服务上面的软件源是在创建车库时自动配置的。你需要满足一些 要求 才能使用官方的构建服务。

关于如何创建车库请看: openSUSE 构建服务教学#工作流程 步骤一 - 登录和一次性本地项目设定

关于如何添加软件源请看: openSUSE 构建服务教学#工作流程 步骤三 - 选择编译目标

然后在 Home Project(私人车库首页)右侧的 Build Results(编译结果)栏目里,点击软件源的名字比如 openSUSE 12.1,接着点击在 Repository State of...(源状态)栏目下面的 Go to download repository(进入下载源),这时浏览器地址栏上面的地址比如 http://download.opensuse.org/repositories/home:/MargueriteSu/openSUSE_12.1/ 就是你的软件源的地址,可以用这个地址在 YaST 的 http 方式里面添加软件源。

在私人网络空间上创建软件源

为什么要在私人网路空间上创建软件源?官方构建服务那么好为什么不去?

先来回答这个问题,官方构建服务确实很好,很快速,很稳定。神秘打包侠 hillwood 讨论 - 贡献 甚至使用 源代码处理服务 的「下载」来做中转去下载在大陆难下载的东西。但是它是有一些约束诸如 [banlist] 这样的黑名单的,你不允许随意的去打包软件。而这份黑名单是针对网络限制最为严格的德国设置的,对我们这个神秘的东方国度就明显过于严格了。比如它不但像日本一样禁止 BT,还禁止 MP3 等私有编解码,甚至免费的软件如果不是 GPL 兼容协议的(比如商业公司推出的免费使用软件或试用版)都不可以在它上面打包。虽然有所谓的「社区源」 [Packman] 但是它实际上是一个 167 人的小圈子(相对官方构建服务 31637 人来说,0.527%真的是个很小的圈子,不配称社区啦),主要以 SuSE 德国的员工为主,一般打包者是很难注册和申请到的,因此不可能保证一定能支援我们用户尤其是中文用户的需求。但开源的世界是没有错误的路这个说法的,每一步都是对未知地图的探索。因此高质量的私人源做补充是必要的。

创建私人软件源需考虑的问题

在创建私人软件源这个问题上呢,我们先要问自己,你有没有经费和精力来做这件事情?是为了方便我们自己,还是为了方便他人?是为了方便大陆用户,还是为了方便台湾用户和海外用户?

  • 经费问题。如果有经费,一个收费的大硬盘大流量的专用空间是最好的。大硬盘自然是为了存放我们的 RPM,显卡驱动什么的是很大的,尤其是你想更专业,针对不同 openSUSE 的版本做源的情况下,可能会去存放好几个几十MB的显卡。大流量是应对用户下载的,你既然把一个源公布到了网路上面去,下载的用户往往会超出你的预期的,比如你是为中文用户优化的,但就有一些俄罗斯用户来下载,你也要负担他们的流量费用的。专用空间是因为 zypper 的下载是使用 http 协议的,在这种协议下面,传输大文件是会拖慢你其他的 http 请求比如网页浏览的(因为它的排队系统如果你没使用 iptables 对你的本地计算机或本地网络出口的路由器进行优化的话,是默认顺序执行的)。当然如果你能申请到比如学校的机房自然是最好,如果没有的话,费用问题一定要考虑清楚,不要头脑一发热就上马了项目,月底服务商的对账单会让你欲哭无泪的。
  • 精力问题。维护私人源是需要很多的精力的。比官方构建服务要付出多得多。如果你针对不同的发行版版本供源的话,意味着你在本地硬盘需要有至少 10GB 的空间来存放不同版本的依赖包,每个包每次升级你要编译若干次。因此我们不建议采用这种方式,而是采用 构建服务跨发行版教学#通过特殊代码检测发行版 的方式在一个 spec 里针对不同的版本做出一个统一的 RPM 包。这样可以节省服务器空间和本地硬盘,相比上面的 10GB 空间,如今只需要 1.5 GB 就够了。另外你还需要应对不了解情况的用户的质疑和非议。如果说在官方构建服务上开设软件源,你只是个打包者的话,那现在你把运行维护人员的活也接过来了。
  • 在用户方便和自己方便之间做出取舍。
    1. 如果觉得自己方便更重要,可以选择 dropbox,针对大陆用户优化的话可以选择坚果铺子或云诺。这样你只需要创建一个共享文件夹,打包好丢进去让它后台自动上传就好,有帐号的都可以来下。如果不想强制用户有帐号,可以选择 github/bitbucket/sourceforge/google code 这样的源代码存放站点,优点是可以采用 git 方式管理,任用户选择老版本下载,缺点是第一对你的学习要求比较高,第二是用户必须在本地分出一定的硬盘空间来存放 RPM,不然就要重新下载所有的 RPM。针对大陆用户优化的话可以选择国内的115网盘或华为网盘,甚至是新浪爱问共享资料和微软的 Skydrive。但需要你每次更新都手动上传。
    2. 如果觉得用户方便更重要,可以选择免费 php 网络空间来供源,优点是管理方便,只需要用 FTP 软件上传 RPM 到 Public_html 目录下就可以了。缺点是地址很不稳定,流量容易超标。
    3. 另外特别注意,不是上述所有的方法都可以施用下面所述的三类创建源方式的,所有提到的服务都支持无格式风格,因为如果面对一个需要登陆的站点,你创建 YUM/YaST 风格的软件源是没有意义的。只有免费和收费网络空间能够支持 YUM/YaST 风格的软件源。YUM/YaST 风格的好处是用户可以一气呵成的使用 YaST 安装。而需要手动下载的方式,就要求你在你软件源的 http 可访问位置的醒目地方引用本页的链接,教会用户如何 在本地计算机上创建升级源

创建一个无格式的软件源

如果是为了自己方便,无格式的软件源完全可以是一个只包含了 RPM 的文件夹。因为上述那些网站都不支持用 YaST 或 zypper 下载,而是你的用户手选下载的,因此上传给机器读的源定义文件是没有必要的。

如果是为了用户方便,请看这里的 无格式套件库介绍。你只需要在创建好后整个上传到你的 FTP 空间就好。

创建一个 YUM 风格的软件源

YUM 是由红帽资助的 Fedora 项目开发的针对 RPM 系发行版的软件安装升级管理器。由于红帽是 RPM 的鼻祖,所有的 RPM 系发行版都有它的影子,SuSE 10 阶段采用的也是 YUM。因此之后开发的 zypper 也是 YUM 兼容的,采用了 YUM 的源格式。

创建本地软件源不推荐创建 YUM 风格的,因为太麻烦。 每次你增删了你源中的软件包,都必须重新执行本章节命令以更新源文件列表(filelists.xml.gz)。因此在本地保留一份备份是非常有必要的。而后面的添加数字签名只用做一次。

首先你需要安装 createrepo 工具包,通过 YaST 软件安装管理器或:

sudo zypper in createrepo

创建这样结构的一个文件夹:

/home/你的用户名/suse_repo/
                       \- i586/
                             \- nvidia-gfxG02-295.20-1.i586.rpm
                             \- x11-video-nvidiaG02-295.20-1.i586.rpm
                       \- x86_64/
                             \- nvidia-gfxG02-295.20-1.x86_64.rpm
                             \- x11-video-nvidiaG02-295.20-1.x86_64.rpm
                       \- noarch/
                             \- gimp-lang-2.7.4-1.noarch.rpm
                       \- nosrc/
                             \- SublimeText2-build2180-2.3.nosrc.rpm
                       \- src/
                             \- kernel-source-3.3.0-1.1.src.rpm

因为想要创建 YUM 风格的软件源的人几乎都不是从別的地方下載 RPM 而是自己在本地通过 RPMBUILD 或者构建服务的命令行版 osc 编译出來的不能上传到构建服务网站的软件包,所以只要去照搬 /var/tmp/build-root/home/abuild/rpmbuild/RPMS/ 下面的目录就好。

然后执行:

createrepo /home/你的用户名/suse_repo/

接着你就会发现,suse_repo 子文件夹下多出来了一个 repodata 文件夹,这里就是 YUM 源的定义文件了。

  • *-filelists.xml.gz
  • *-other.xml.gz
  • *-primary.xml.gz
  • repomd.xml

至此,一个 YUM 风格的源的创建过程就已经结束了。可以使用 YaST 图形页面添加或:

sudo zypper ar -t YUM http://服务器地址//suse_repo/ lappin 

来添加。

为你的私人软件源添加数字签名

未经数字签名的源在刷新时会出现如下图所示的提示:

未签署的档案.png

如果你不想每次都被它困扰的话,可以用如下方式添加签名:

先进入你的源目录:

cd suse_repo/repodata/

然后使用 GPG 命令生成签名金钥(你当然需要 GPG,openSUSE 是预装的):

gpg -q --gen-key
  • 请选择你要使用的金钥种类:(2)DSA 和 Elgamal 2
  • 你想要用多大的金钥尺寸?(2048KB) 1024
  • 请指定这把金钥的有效期限是多久?(0 = 金钥不会过期)0
 # 官方源是有有效期限的,一般是一年。我们既然是自用,就没有必要设置有效期。
  • 以上正确吗?(y/N)y
  • GnuPG 需要建构使用者 ID 以识别你的金钥匙
真实姓名:
电子邮件地址:
注释:
  • 变更姓名(N),注释(C),电子邮件地址(E)或确定(O)/退出(Q)?O
  • 你需要一个密语来保护你的金钥:********
gpg: 正在檢查信任資料庫
gpg: 3 個勉強信任以及 1 個完全信任是 PGP 信任模型的最小需求
gpg: 深度: 0  有效:   1  已簽署:   0  信任: 0-, 0q, 0n, 0m, 0f, 1u
pub   1024D/A82ECBF6 2012-03-22
     金鑰指紋 = BDAD 2DA6 F019 EECF 19DE  C881 BE83 81A5 A82E ****
uid                  姓名 (注释) <电子邮件地址>
sub   1024g/BD500B92 2012-03-22

查看生成的金钥:

gpg --list-key

附加数字签名到 repomd.xml,之后 repodata 文件夹下会多了一个新文件 repomd.xml.asc:

gpg -a --detach-sign repomd.xml

导出金钥的公共部分:

gpg -a --export "你刚才输入的姓名" > repomd.xml.key

至此用于你的私人源的金钥生成完毕,只需上传 repomd.xml.asc 和 repomd.xml.key 两个新文件到你服务器的 repodata 目录,下次源刷新时就会提示你进行本地认证:

汇入不受信任的GPG金钥.png

至此,数字签名添加完毕。

创建一个 YaST 风格的软件源

参考文献