如何使用APT推送和管理软件包升级

前言

在现代 Linux 系统中,APT(Advanced Package Tool)作为一个强大的包管理工具,提供了集中化和自动化的软件包管理功能。通过使用 APT 推送和管理软件包升级,我们可以简化软件的部署和维护过程。APT 不仅支持自动化更新和版本控制,还能够有效处理软件包的依赖关系,从而减少手动干预和潜在的冲突。此外,APT 通过签名和认证机制增强了软件的安全性,同时为用户提供了简洁直观的命令行工具。借助 APT,我们可以创建自定义仓库,以便在组织内部分发和管理软件。

下面将简单说明如何创建和配置一个APT服务器,并在机器人或其他客户端上管理软件包,从而简化软件分发和更新的过程。

流程说明

要在测试 PC 上搭建一个本地仓库服务器(local repository server),并让机器人上的 OTA 组件可以从本地仓库服务器上下载并安装,可以按照以下步骤进行操作:

  • 安装Sonatype Nexus Repository Manager:首先,在测试 PC上 安装 Sonatype Nexus Repository Manager。可以从 Sonatype 官方网站下载适用操作系统的 Nexus Repository Manager 安装包,并按照官方文档提供的指引进行安装和配置。
  • 创建本地仓库:在 Nexus 管理界面中创建一个本地仓库,用于存储 OTA 组件。可以选择 “Maven (Hosted)” 或者其他适合 OTA 组件存储的仓库类型,并设置相应的名称、URL等信息。
  • 上传 OTA 组件到本地仓库:将 OTA 组件上传到新建的本地仓库中。可以使用 Nexus 提供的 Web界面或者 Maven 命令行工具来上传 OTA 组件到本地仓库中。
  • 配置机器人的 OTA 组件来源:在机器人的 OTA 组件更新设置中,将 OTA 组件的源配置为搭建的本地仓库服务器的 URL。这样,机器人就会从本地仓库服务器上下载并安装 OTA 组件。
  • 验证和测试:确保本地仓库服务器能够成功提供 OTA 组件,并且机器人能够从本地仓库服务器上下载并安装 OTA 组件。可以手动触发一次 OTA 更新,然后查看 Nexus 服务器的日志以及机器人的更新日志来验证是否成功从本地仓库服务器上获取 OTA 组件。

安装 Sonatype Nexus

在 PC (比如 Ubuntu 18.04) 上部署 Sonatype Nexus 服务器:

# 安装Java:Sonatype Nexus需要Java运行环境。在Ubuntu 18.04上,你可以通过以下命令安装OpenJDK 8
sudo apt update sudo apt install openjdk-8-jdk
# 下载Nexus Repository Manager 3的最新版本,假设你将Nexus安装到/opt目录下
cd /opt
sudo wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
 
# 将安装包放到/opt 目录下并进入该目录,解压安装包 sudo tar -zxvf nexus-3.62.0-01-unix.tar.gz
# 启动Nexus:进入Nexus安装目录下的bin目录,并执行启动脚本来启动Nexus服务
cd /opt/nexus-3.62.0-01/bin
sudo ./nexus run

Nexus 启动后会监听默认端口8081。

访问 Nexus 控制台:使用浏览器访问 Nexus 的 Web 控制台,在地址栏输入 localhost:8081,选择 sign in 登录,账号 admin, 密码去弹窗显示的路径里获取,cat admin.password

Nexus 创建本地存储库

sonatype 官方文档

登录后选择设置图标,选择 Repositories -> Create repositiory -> apt(hosted) 创建本地存储库,比如创建 xiezhi2_ota_repo

在这里插入图片描述

创建密钥

# 更新软件源
sudo apt update
# 安装 GnuPG
sudo apt install gnupg
# 生成 GPG 密钥对, 系统将提示你选择密钥类型、密钥大小、有效期等选项。按照提示进行选择和设置
gpg --gen-key # 输入用户与邮箱,密码
# 列出密钥
gpg --list-keys # 这将列出你的 GPG 密钥对。记下你要导出的密钥对的 ID
# 导出公钥和私钥
# 进入要导出密钥对的文件夹
cd <path to the folder to import the key pair>
# 导出公钥
gpg --armor --output public.gpg.key --export <gpg key Id>
# 导出私钥
gpg --armor --output private.gpg.key --export-secret-key <gpg key Id>
#可以看到目录下多了 public.gpg.key, private.gpg.key

将 private.gpg.key 的内容粘贴到 setting key 里,继续按下图配置
在这里插入图片描述

在 Nexus 服务上放置私钥是为了对数据进行加密或签名,确保数据的完整性和保密性。只有拥有对应公钥的客户端可以解密或验证这些加密的数据或签名。私钥的安全性至关重要,必须保护好以防止数据被未授权访问。

将软件包部署到APT托管存储库

在网页端手动导入软件包
在这里插入图片描述

或者使用命令导入

curl -u "admin:password" -H "Content-Type: multipart/form-data" --data-binary "@./test_packages.deb" "http://localhost:8081/repository/xiezhi2_ota_repo/"

这个命令的含义是使用 curl 工具向 Nexus Repository Manager 上传一个名为 test_packages.deb 的 Debian 软件包到一个名为 xiezhi2_ota_repo 的仓库中。下面逐步解释一下这个命令各部分的含义:

  • curl: 这是一个命令行工具,用于在各种协议下传输数据。在这里,它被用来发送 HTTP 请求。
  • -u “admin:password”: 这部分指定了 HTTP 身份验证的用户名和密码。在这里,用户名是 “admin”,密码是 “password”。这样可以确保只有经过授权的用户才能上传软件包。
  • -H “Content-Type: multipart/form-data”: 这部分设置了 HTTP 请求头,指定了要上传的数据是multipart/form-data 类型的,这通常用于上传文件。
  • –data-binary “@./test.deb”: 这部分指定了要上传的数据,@后面的路径 “./test_packages.deb” 表示当前目录下的 test.deb 文件。这个文件将会被作为二进制数据上传到服务器。
  • “http://localhost:8081/repository/xiezhi2_ota_repo/”: 这是目标服务器的 URL,用于指定上传到哪个仓库。在这个例子中,软件包将被上传到名为 xiezhi2_ota_repo 的仓库中。

服务器开放端口服务

外部网络想要访问 8081 端口,必须在服务器开放端口服务,或者直接禁用防火墙

# 禁用防火墙
sudo ufw disable
# 查看是否存在 Sonatype Nexus 服务端口
ss -tuln | grep 8081
# 确保 ufw 已经安装, 如果尚未安装,可以使用以下命令安装
sudo apt update
sudo apt install ufw
# 确认防火墙状态
sudo ufw status
# 如果防火墙处于非活动状态,可以启用它
sudo ufw enable
# 允许特定的端口
sudo ufw allow 8081/tcp
# 确认已经添加了相应的规则
sudo ufw status

在机器上配置公钥

# 删除机器人旧的连接密钥
ssh-keygen -f "/home/chenqinhu/.ssh/known_hosts" -R "192.168.55.1"
# 将公钥传到机器
sshpass -p 'your_password' scp -o StrictHostKeyChecking=no public.gpg.key developer@192.168.55.1:

# 登录机器
ssh ubuntu@192.168.55.1
# 使用公钥
sudo apt-key add public.gpg.key

机器(客户端)需要导入服务器的公钥,以便能够验证服务器的身份和解密服务器发送的加密数据。

使用 apt 更新软件

如果我们已经配置好了 Sonatype Nexus 服务器,并且将它作为软件包的源,那就可以通过以下步骤从 Nexus 服务器上更新软件:

# 自定义OTA更新源
echo "developer" | sudo -S tee -a /etc/apt/sources.list.d/ota_sources.list <<< "deb http://192.168.55.100:8081/repository/xiezhi2_ota_repo bionic main"
# 更新机器时间为当前时间,避免机器时间早于APT托管存储库服务器时间导致更新失败
sudo date --set="2023-11-15 21:30:00" # 机器时间一定要晚于托管存储库的服务器时间
# 更新自定义OTA源软件包列表,系统将会查询Nexus服务器上的软件包列表并获取最新的可用版本
sudo apt update -o Dir::Etc::sourcelist="/etc/apt/sources.list.d/ota_sources.list"
# 安装或升级软件包,比如 test_packages.deb
sudo apt install test_packages
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值