我们很多人都熟悉 包管理器 在我们的桌面上,例如
dnf
,
易于
,
百胜
,以及许多其他人。 这些包管理器的一个重要部分是它们能够找到您尝试安装的软件的依赖项,然后为您安装依赖项。 作为用户,这减少了您的工作量,因此您不必查找依赖项并手动安装它们。 作为系统管理员,这是一个有用的节省时间的方法。
但是,有时依赖关系解析会占用低端和低成本设备或机器上宝贵的 CPU 周期和内存。 在这些低端机器上尝试安装新软件或更新可能是一项艰巨的任务。 一个人该做什么?
利用云:远程依赖解决
引入云的力量,一群来自 红帽实验室 Q 很高兴为这个问题带来新的解决方案。 引入服务器端依赖解决,也称为远程依赖解决! 远程依赖解决是一个开源项目 GitHub 这有助于在硬件较慢的设备上节省内存和 CPU。
该项目由 扬·泽莱尼并由 彼得·赫拉克 和 FIT VUT Brno 的学生,包括 Josef Řídký、Michal Ruprich 和 Šimon Matěj。
重点是什么? 它是如何工作的?
您有一台具有低成本硬件的设备,并且您最近安装了 Fedora 在上面。 如果您想安装一个包或一组包,但设备内存不足,内存可能会重叠。 在计算依赖关系期间,设备也可能意外断电或重启。 如果发生故障或崩溃,则无法正确确定依赖关系。 有时,我们可能根本没有任何依赖关系!
远程依赖解决解决了这个问题。 顾名思义,依赖关系是远程计算的。 这有助于通过将这些 CPU 周期和内存卸载到“云”来节省机器上的这些 CPU 周期和内存,在云中确定依赖关系,然后将其发送回客户端。
首先,客户端发送有关系统的信息以及要安装的软件包。 接下来,服务器计算依赖关系并将一组具有正确版本的包返回给客户端。 最后,客户端正常安装。
缓存
这个项目的另一个特点是 缓存. 这在第二个客户端想要安装与服务器已经计算的另一个客户端相同的包和依赖项的情况下很有帮助。 这节省了计算时间并导致对客户端的整体响应速度更快。
这主要用于计算场,其中一台计算机解决依赖关系,另一台计算机安装具有正确版本的软件包集,如之前计算的那样。 红帽卫星 是一个 example 这种用法的。
像这样的项目需要基础设施,但目前不在开发团队的范围内。 有计划在未来进行这方面的工作。
本地测试
该包还不是官方的一部分 Fedora 存储库。 有工作将其打包 Fedora,但是团队还没有。 因此,远程依赖解决软件需要从 GitHub 仓库.
配置
首先,使用以下命令将项目克隆到计算机或嵌入式设备上。
$ git clone https://github.com/rh-lab-q/server-side-dependency-solving.git
这将克隆设备上的项目。 在项目执行之前,您需要安装依赖项。 不幸的是,这部分不能使用远程依赖解决! 运行以下命令以安装所有必需的软件包。
$ sudo dnf install gcc cmake libsolv librepo-devel hawkey-devel glib2-devel json-glib json-glib-devel check-devel
编译和安装
接下来,我们需要切换到构建目录,或者我们克隆项目的位置。 然后,我们需要运行
制作
命令,如下所示 example 显示。
$ cd build $ sudo cmake ../
该命令验证我们是否拥有项目所需的所有包。 如果没有错误,我们可以使用
制作
.
$ sudo make
该命令创建两个名为
rds-客户端
和
rds 服务器
.
运行远程依赖解决服务器和客户端
创建两个二进制文件后,您就可以开始了。 打开两个终端。 一个将用于
rds 服务器
另一个为
rds-客户端
. 为了安装、擦除或更新软件包,这些命令必须由 root 帐户执行。
在第一个终端中,运行以下命令。
$ sudo ./ssds-server
在第二个终端中,使用此命令。
$ sudo ./ssds-client
后台发生了什么? 在运行服务器的终端上,将与
rds-客户端
终端。
安装一个包
完成所有前面的步骤后,您就可以安装软件包了。 为了 example,
rds-客户端
将会安装
emacs
. 安装前
emacs
,请务必检查它是否已安装。 这可以通过以下命令完成。
$ rpm -q emacs package emacs is not installed
确认后
emacs
尚未安装,请运行以下命令安装包。 您应该会看到与本文中提供的类似的输出 example.
$ sudo ./rds-client --install emacs [2/2/16 14:30:27 SSDS]: Client startup. [MESSAGE]: Client startup. Required package count 1. [MESSAGE]: Trying to connect to server...(1 of 3) [MESSAGE]: Connection to server is established. [MESSAGE]: Sending initial message to server. [MESSAGE]: Message sent. [MESSAGE]: Installation of packages was selected. [MESSAGE]: Sending message with repo info to server. [MESSAGE]: Waiting for answer from server. Number of packages to install: 2 update: 0 erase: 0 maybe erase: 0 [MESSAGE]: Result from server: Packages for install emacs-common emacs [QUESTION]: Is it ok? [y/n/d]: y [MESSAGE]: Downloading preparation for package: emacs-common [MESSAGE]: Downloading preparation for package: emacs [MESSAGE]: Downloading packages. emacs 100% - Downloaded. emacs-common 100% - Downloaded. [MESSAGE]: All packages were downloaded successfully. [MESSAGE]: Installing packages. Preparing... ################################# [100%] Updating / installing... 1:emacs-common-1:24.5-6.fc23 ################################# [100%] 2:emacs-1:24.5-6.fc23 ################################# [100%]
这在服务器上是什么样子的? 如果您在运行命令时检查服务器终端窗口,您将看到类似于以下摘录的输出。
$ sudo ./rds-server [2/2/16 14:26:06 SSDS]: Server started. [MESSAGE]: Connection accepted from ip address 127.0.0.1 [MESSAGE]: DEPENDENCY SOLVING. pkg v query: emacs [MESSAGE]: Dependencies for emacs are ok. pred insert { "code" : 11, "data" : { "install" : [ { "pkg_name" : "emacs-common", "pkg_loc" : "Packages/e/emacs-common-24.5-6.fc23.x86_64.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=fedora-23&arch=x86_64" }, { "pkg_name" : "emacs", "pkg_loc" : "Packages/e/emacs-24.5-6.fc23.x86_64.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=fedora-23&arch=x86_64" } ], "upgrade" : [ ], "erase" : [ ], "obsolete" : [ ] } }
一切完成后,检查以确保
emacs
已安装。
$ rpm -q emacs emacs-24.5-6.fc23.x86_64
擦除一个包
也许您改变了主意,想要删除一个包。 我们将尝试擦除
emacs
从系统为此 example. 运行以下命令擦除包。 您应该在终端中具有与 example.
$ sudo ./rds-client --erase emacs [3/2/16 21:11:55 SSDS]: Client startup. [MESSAGE]: Client startup. Required package count 1. [MESSAGE]: Trying to connect to server...(1 of 3) [MESSAGE]: Connection to server is established. [MESSAGE]: Erase of packages was selected. [MESSAGE]: Sending message with repo info to server. [MESSAGE]: Waiting for answer from server. from server: { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ ], "erase" : [ { "pkg_name" : "emacs", "pkg_loc" : null, "base_url" : null, "metalink" : "@System" } ], "obsolete" : [ ] } } Number of packages to install: 0 update: 0 erase: 1 maybe erase: 0 [MESSAGE]: Result from server: Packages for erase emacs [QUESTION]: Is it ok? [y/n]: y [MESSAGE]: Downloading packages. [MESSAGE]: All packages were downloaded successfully. [MESSAGE]: Erasing packages. Preparing... ################################# [100%] Cleaning up / removing... 1:emacs-1:24.5-6.fc23 ################################# [100%] [3/2/16 21:12:04 SSDS]: End of client.
同样,如果您检查服务器终端窗口,输出应该类似于以下文本块。
$ sudo ./rds-server [2/2/16 14:26:06 SSDS]: Server started. [MESSAGE]: Connection accepted from ip address 127.0.0.1 [MESSAGE]: DEPENDENCY SOLVING. pkg v query: emacs [MESSAGE]: Dependencies for emacs are ok. pred insert { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ ], "erase" : [ { "pkg_name" : "emacs", "pkg_loc" : null, "base_url" : null, "metalink" : "@System" } ], "obsolete" : [ ] } }
最后,检查包是否被卸载。
$ rpm -q emacs package emacs is not installed
更新系统
更新系统可以用一个命令完成。 在客户端窗口中运行以下命令。
$ sudo ./rds-client --update [9/2/16 09:44:36 SSDS]: Client startup. [MESSAGE]: Client startup. Required package count 0. [MESSAGE]: Trying to connect to server...(1 of 3) [MESSAGE]: Connection to server is established. [MESSAGE]: Update all packages was initiated. [MESSAGE]: Sending message with repo info to server. [MESSAGE]: Waiting for answer from server. from server: { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ { "pkg_name" : "tzdata-java", "pkg_loc" : "t/tzdata-java-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "tzdata", "pkg_loc" : "t/tzdata-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, ... SNIP ... { "pkg_name" : "abi-dumper", "pkg_loc" : "a/abi-dumper-0.99.14-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" } ], "erase" : [ ], "obsolete" : [ ] } } Number of packages to install: 0 update: 31 erase: 0 maybe erase: 0 [MESSAGE]: Result from server: Packages for update tzdata-java tzdata ... SNIP ... abi-dumper [QUESTION]: Is it ok? [y/n/d]: y [MESSAGE]: Downloading preparation for package: tzdata-java [MESSAGE]: Downloading preparation for package: tzdata ... SNIP ... [MESSAGE]: Downloading preparation for package: abi-dumper [MESSAGE]: Downloading packages. [MESSAGE]: Packages are installed [9/2/16 09:47:23 SSDS]: End of client.
查看服务器终端,您应该会看到与此类似的输出。
$ sudo ./rds-server [9/2/16 09:44:21 SSDS]: Server started. [MESSAGE]: Connection accepted from ip address 127.0.0.1 [MESSAGE]: DEPENDENCY SOLVING. Downloading repo: updates - 100% [MESSAGE]: Metadata for updates - download successfull (Destination dir: /tmp/ssds/updates). Downloading repo: fedora - 100% [MESSAGE]: Metadata for fedora - download successfull (Destination dir: /tmp/ssds/fedora). ... SNIP ... { "code" : 11, "data" : { "install" : [ ], "upgrade" : [ { "pkg_name" : "tzdata-java", "pkg_loc" : "t/tzdata-java-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, { "pkg_name" : "tzdata", "pkg_loc" : "t/tzdata-2016a-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" }, ... SNIP ... { "pkg_name" : "abi-dumper", "pkg_loc" : "a/abi-dumper-0.99.14-1.fc23.noarch.rpm", "base_url" : null, "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64" } ], "erase" : [ ], "obsolete" : [ ] } }
下一步是什么?
这个项目有积极的发展,未来会有很多里程碑。 对于那些熟悉 DNF 的一些更高级功能的人,计划在不久的将来将这些功能集成到远程依赖解决中。
计划用于未来版本的其他一些项目是……
- 相同的命令 DNF
- 客户端和服务器之间的安全通信
- 将项目打包成 Fedora 存储库
- 在服务端缓存请求,这样我们就不需要重复解依赖了
- 启动 rds-server
作为守护进程
- 将项目纳入 Fedora 基础设施
了解有关远程依赖解决的更多信息
您可以通过访问了解更多关于远程依赖解决的信息 GitHub上的项目存储库. 此外,您还可以观看 DevConf 2016 演示文稿首先介绍该项目。