创建一个Raspbian软件库

如果你想托管自己的Raspbian仓库,这篇文章是为你准备的。

Raspbian软件库由网络服务器上的一个特殊目录结构组成。这些文件,包括软件包,都是静态的--因此这个软件库也可以简单地托管在Amazon S3实例上,比如说。

Raspbian中的sources.list条目

/etc/apt/sources.list

deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi

/etc/apt/sources.list.d/raspi.list

deb http://archive.raspberrypi.org/debian/ 伸展主界面

这些是Raspbian上软件包库的默认条目。

其结构如下。

  • deb : 二进制包的源代码
  • http://raspbian.raspberrypi.org/raspbian/ :存储库的URL
  • stretch : "distribution" / release / codename(在某些情况下也可以指定更深层次的子目录,如stretch/updates)。
  • main contrib non-free rpi : 你对这个资源库中的组件感兴趣,用空格分隔。

注意:从Debian / Raspbian Stretch开始的apt默认包括对https的支持。否则你将不得不安装apt-transport-https软件包。

这里有一个网页,解释了为什么安装软件包时不一定需要https。.

存储库的目录结构

请看一下 http://raspbian.raspberrypi.org/ 储存库的目录结构。

http://raspbian.raspberrypi.org/

形象

这个主目录包含几个子目录,特别是 raspbian.public.key

一些子目录是用于各种用途的,例如图像--对于正常的Debian / Raspbian Raspberry Pi软件库来说是不必要的。

这里值得关注的是

  • 伴侣
  • 共和国

子目录,以及已经提到的 raspbian.public.key.

密钥是一个文本文件,由GnuPG生成。下面是它的样子。

形象

等。

这个密钥是用来验证你确实是在和正确的软件仓库进行通信,也就是它声称的。如果你信任该软件库,你就把钥匙添加到你的apt钥匙圈中(关于如何添加你自己的钥匙和从你自己的新软件库中安装软件包的说明,见下文)。

那么它就可以被apt使用了 以验证APT存储库元数据的签名.软件包本身通常没有GPG签名/没有被验证。 详情请参考packagecloud文章.

作为子文件夹的存储库

mate和raspbian是两个不同的软件库(在这种情况下是针对Raspberry Pi的)。

请注意:aptly--下面解释的发布你自己的版本库的工具--将默认为webroot,并将显示webroot中的dists文件夹,但你也可以指定一个路径来发布。

我们来看看raspbian文件夹,就我们的目的而言,它就是这样一个资源库。

形象

形象

dists文件夹包含了Raspbian的发行版/版本--与Debian发行版同步编码。目前的稳定版--截至2.4.2019--是 伸展.

它们是以《玩具总动员》中的人物命名的。 即将发行的是巴斯特。

"稳定的"与 "stretch"(目前)完全相同。它将指向最新的稳定版本。

形象

这个目录包含apt工具运行所需的几个文件。特别是InRelease、Release和Release.gpg文件。

  • InRelease: 在线签署
  • 释放 - 与Release.gpg(签名)一起。

这些文件列出了发行版的索引文件和它们的哈希值。

形象

...

形象

一个InRelease文件的例子,底部是内联签名。

它就像apt的一种地图--在哪里可以找到软件包列表文件,以及以何种格式(.gz和.xz是压缩格式)可以下载它们。

形象

这里住着软件包的元数据。文件包是人类可读的(但非常长)。

形象

值得注意的是,这个文件包含一个指向 "池 "的链接,用于实际的包。

文件名: pool/rpi/g/gst-omx1.0/gstreamer1.0-omx_1.0.0.1-0+rpi12+jessiepmg_armhf.deb
rpi是组件的名称,而软件包则按首字母进一步分割。

形象

目录,以避免软件包的重复。

看一看 这个信息丰富的网站 以了解更多关于 Debian Repository Format 的信息。

https://wiki.debian.org/DebianRepository/Format

使用aptly--发布你自己的仓库和你自己的软件包

Aptly 是一个可以轻松建立和发布你自己的 .deb 仓库的工具--适用于 Debian 及其兄弟姐妹和表亲。

这包括Ubuntu,但当然也包括Raspbian。

所以,如果你想发布一个Raspbian软件库,你可以这样做。

设置一个Docker容器

我已经在这个git仓库的基础上创建了一个Docker容器。

https://github.com/urpylka/docker-aptly

我所介绍的变化。

  • FROM ubuntu:bionic
  • gnupg1
  • gpgv1
  • gpg 命令明确地以 gpg1 的身份运行(否则公钥和私钥的保存方式会不同,一切都不会像预期那样工作)。

因此,下面会有一些额外的解释。总的来说,如果你想在Docker上运行,urpylka的脚本是一个非常方便的起点。

此外,我强烈建议你使用docker-compose,而不是手动运行那些长的docker运行命令。

下面是我的docker文件供你参考

# Copyright 2019 Maximilian Batz
# Copyright 2018 Artem B. Smirnov
# Copyright 2018 Jon Azpiazu
# Copyright 2016 Bryan J. Hong
#
#根据Apache许可证2.0版("许可证")授权。
#你不能使用这个文件,除非遵守许可证的规定。
# 你可以在以下地址获得一份许可证的副本
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# 除非适用法律要求或书面同意,软件
根据本许可证分发的#是以 "原样 "为基础分发的。
#没有任何形式的保证或条件,无论是明示还是暗示。
# 请参阅许可协议中关于权限的具体语言,并在此说明。
#许可证下的限制。

FROM ubuntu:bionic

LABEL maintainer=""

ENV DEBIAN_FRONTEND 非交互式

RUN apt-get -q update \
   && apt-get -y install \
   gnupg1 && apt-key adv -keyserver pool.sks-keyservers.net -recv-keys ED75B5A4483DA07C\
   && echo "deb http://repo.aptly.info/ squeeze main" >> /etc/apt/sources.list

# 更新APT资源库和安装软件包
RUN apt-get -q update \
   && apt-get -y install \
     aptly=1.3.0 (在此基础上)。
     bzip2 /bzip2
     gpgv1
     graphviz (图)。
     supervisor (主管)
     nginx \
     wget ````。
     xz-utils
     apt-utils \
   && apt-get clean \
   && rm -rf /var/lib/apt/lists/*

#的安装配置很恰当
COPY assets/aptly.conf /etc/aptly.conf

#安装脚本
COPY assets/*.sh /opt/

#安装Nginx配置
RUN rm /etc/nginx/sites-enabled/*
COPY assets/supervisord.nginx.conf /etc/supervisor/conf.d/nginx.conf
RUN echo "daemon off;">> /etc/nginx/nginx.conf

# 绑定安装位置
VOLUME [ "/opt/aptly" ]

# 容器启动时执行启动脚本
ENTRYPOINT [ "/opt/startup.sh" ]

注意,截至2.4.2019年,aptly 1.3.0仍然是最新的版本。

连接到适当的容器

docker exec -it aptly /bin/bash

在这种情况下,你的容器被恰当地命名为/bin/bash,打开一个交互式终端。所有其他的命令都在容器内执行。

生成GPG密钥

上面提到的docker脚本会自动为你创建GPG密钥,通过将你的口令传入容器中的一个文件。相关的脚本片段是这样的。

#!/usr/bin/env bash

# Copyright 2016 Bryan J. Hong
#采用阿帕奇许可证2.0版许可。

cat < /opt/gpg_batch
%echo Generating a GPG key, might take a while
密钥类型。RSA
密钥长度: 4096
子键类型。ELG-E
子键长度: 1024
真实姓名:${FULL_NAME}。
名称-评论。Aptly Repo Signing
姓名-电子邮件。${email_address}.
过期日期: 0
密码口令:${GPG_PASSWORD}。
%pubring /opt/aptly/aptly.pub
%secring /opt/aptly/aptly.sec
%commit
%echo done
EOF

如果键不存在,将从容器的入口处运行。

# 如果版本库的GPG密钥对不存在,请创建它。
如果[[! -f /opt/aptly/aptly.sec ]]|| [[ ! -f /opt/aptly/aptly.pub ]]; 则
   echo "生成新的 gpg 密钥"
   cp -a /dev/urandom /dev/random
   /opt/gpg_batch.sh
   # 如果你的系统没有大量的熵,这可能需要很长的时间
   # 谷歌如何创建 "人工 "熵,如果这被卡住了。
   gpg1 -batch -gen-key /opt/gpg_batch
否则
   echo "不需要生成新的gpg密钥"
斐济

注意我的 "改进 "版本(gpg1,而不是只指定gpg)--这对Ubuntu bionic beaver来说似乎是必要的,因为否则你会得到gpg 2作为默认值。

注意:这个文件将包含你的口令!因此,我建议在初始设置完成后删除它。

不幸的是,gpg1似乎不支持%ask-passphrase控制。 因此,如果你想进行钥匙的批量生成,钥匙密码需要在批量文件中。

发布/导出GPG公钥

mkdir -p /opt/aptly/public

gpg1 -export -armor > /opt/aptly/public/repository.picockpit.key

适当地命名该钥匙。-armor用于导出ASCII格式的密钥(相对于二进制)。

注意这是两个破折号,我希望WordPress不会破坏它们。另外,这里使用了gpg1,而不是仅仅使用gpg

创建一个新的存储库

aptly repo create -comment="picockpit.com Repository" -component="main" -distribution="stretch" pcp-repository

创建一个新的本地版本库,你可以向其中添加软件包。这个软件库还没有发布。

-comment : 描述本地存储库的文本

-component:发布时的默认组件

-distribution:发布时的默认发行量(版本)。

pcp-repository: 这是我给这个本地仓库起的一个自定义名字,你可以在这里使用你自己的名字。请确保相应地修改其他命令,并使用你在这里选择的名字。

将.deb包添加到版本库

aptly repo add pcp-repository /opt/aptly/testpackage/

在这里,我把一个软件包文件夹添加到我在前面的步骤中创建的本地仓库中。 Aptly将确认添加的软件包,像这样。

形象

创建快照

虽然可以直接发布 repo,但强烈建议创建一个快照,然后发布快照。

aptly snapshot 从 repo pcp-repository 创建 pcp-snapshot

pcp-snapshot 是一个自定义的名字,而 pcp-repository 是你在上面给版本库的名字。

发布快照

aptly publish snapshot pcp-snapshot

在发布快照的过程中,会有两次提示你输入gpg密码的机会。

形象

aptly将发布到/opt/aptly/public目录,Nginx或其他你选择的网络服务器将从该目录提供服务。不需要

也请参考本文件。

切换已发布的存储库

如果你犯了一个错误,想把发布的版本库换成另一个快照,你可以使用 aptly publish switch。

aptly publish switch stretch raspbian pcp-snapshot

这将在raspbian路径下,用新的快照pcp-snapshot切换分布式拉伸。

将你的版本库添加到一个系统中

导入钥匙

curl -L http://192.168.1.2:3200/repository.picockpit.key | sudo apt-key add -

该命令使用curl获取密钥,然后将其输送到apt-key。也有一个apt-key的密钥获取功能,但它依赖于一个默认不安装在Raspbian上的软件包。

如果你不这样做,apt将无法从新的软件库中获取软件包,并且会出现错误。

添加存储库

echo "deb http://192.168.1.2:3200/raspbian stretch main" | sudo tee -append /etc/apt/sources.list.d/picockpit.list

形象

/etc/apt/sources.list.d下的子目录只有root可以写。-append确保文件不被覆盖,如果它应该已经存在。

也可以手动创建文件,例如,使用nano,添加一行

deb http://192.168.1.2:3200/raspbian 伸展的主要

安装软件包

sudo apt-get update

sudo apt-get install 驮运人的名字

形象

这张截图显示apt也在读取新的版本库。

形象

安装一个样本包。

创建一个包

我向你推荐这篇如何创建Debian软件包的优秀文章。

只有确保将架构改为 Armhf 用于Raspberry Pi平台。

需要专业支持吗?

我们以做Raspberry Pi的所有事情为生。如果你在设置方面需要专业支持,请联系我们。

目前我们的收费标准是每天统一1500欧元(+税)。我们很高兴能帮助你 🙂

进一步阅读

关于包装。