Projekt vznikl jako idea managera týmu DNF/YUM Jana Zeleného. Je určen především pro zařízení, které mají slabší hardware, ale samozřejmě jej lze použít i na běžných počítačích s Fedorou. V současné době na projektu pracují studenti z FITu VUT Brno v rámci projektu Red Hat Lab-Q.

Studenti:

  • Josef Řídký
  • Michal Ruprich
  • Šimon Matěj

Cíl:

Řekněme, že máme zařízení, které nemá dostatečné hardwarové prostředky. Při počítání závislostí na straně zařízení může dojít k zahlcení paměti, k restartu zařízení a dalším neočekávaným stavům a tím pádem se závislosti balíčku nevypočítají vůbec či špatně.
Projekt by tedy měl tuto chybu či nedostatečnost odstranit tak, aby se závislosti vyřešily na straně serveru a klient by pouze nainstaloval balíky.

Jako další možný cíl projektu je “cachování” jednotlivých závislosti a v případě,
že by závislost již byla jednou vyřešena, pak by klient pouze nainstaloval balíky se spravnými verzemi.
Projekt je také použitelný v případě, že máme farmu čítající desítky stejných strojů,
a jakmile jeden stroj vypočítá pomocí projektu závislosti, ostatní balíky již pouze instalují dané verze balíků.
Součástí projektu je také potřeba vytvořit Fedora infrastrukturu, ale to bude potřeba až v pozdějších fázích projektu.

Jak projekt vyzkoušet na lokálním počítači?

Projekt ještě není součástí Fedory a tak je nutné projekt nainstalovat z Gitového repositáře. Nicméně na přidání balíčku do Fedory se usilovně pracuje.

Nejprve je potřeba projekt naklonovat na počítač pomocí příkazu:

git clone https://github.com/rh-lab-q/server-side-dependency-solving

Tím máme projekt na nášem počítači, či zařízení s menším množstvím paměti.

Před samotným spuštěním projektu je nutné doinstalovat balíky, které budou potřebné pro kompilaci a spuštění.
Bohužel v tomto kroku ještě nemůžeme využít projekt Remote Dependency Solving.
Doinstalovaní balíků uděláme pomocí příkazu:

sudo dnf install gcc cmake libsolv librepo-devel hawkey-devel glib2-devel json-glib json-glib-devel check-devel

Nyní si projekt zkompilujeme a nainstalujeme

Kompilace projektu

Prvně přejdeme do adresáře build v adresáři, kde jsem si naklonovali projekt a spusťme příkaz příkaz cmake:

$ cd build
$ cmake ../

Příkazem se nám ověří, jestli máme nainstalovány všechny potřebné balíky pro projekt.

Nyní zkompilujeme projekt pomocí příkazu make:

$ make

Příkaz make vytvoří dva binární soubory s názvem rds-client a rds-server.

Jak nainstalovat/smazat balíček pomocí RDS?

Jak otestovat projekt na lokálním počítačí přes localhost?

Nejprve si připravme dva terminály. Jeden terminál bude použit pro rds-server
a druhý pro rds-clienta.
Jelikož potřebujeme spustit rds-server a rds-client s právy roota, spustíme jej přes příkaz sudo:

sudo ./rds-server

a

sudo ./rds-client

Nyní zkusme zda-li fungují příkazy jako --install a --delete a podívejme se co uvidíme na obou terminálech.

Instalace balíčku emacs

Předtím než nainstalujeme emacs zkontrolujeme, zda-li již není nainstalován na systému příkazem rpm -q emacs.

$ rpm -q emacs
package emacs is not installed

Nyní spustíme vlastní instalaci.
Na prvním terminalu máme spuštěn rds-server, kde uvidíme jak probíhá komunikace s klientem

$ 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" : [
    ]
  }
}

Na druhém terminálu spustíme rds-client --install emacs.

$ 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       ################################# [ 50%]
   2:emacs-1:24.5-6.fc23              ################################# [100%]

Zkontrolujeme, jestli se balíček skutečně nainstaloval pomocí rpm -q.

$ rpm -q emacs
emacs-24.5-6.fc23.x86_64
$

Vymazání balíčku emacs

Opět spustíme příkaz rds-server s právy roota, kde budeme sledovat komunikaci mezi klientem a serverem.

$ 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" : [
    ]
  }
}

Vymazání balíčku provedeme pomocí příkazu rds-client --erase emacs.

$ 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.

Nyní ověříme, zda-li je balíček skutečně odinstalován.

$ rpm -q emacs
package emacs is not installed
$

Jak updatovat systém pomocí RDS?

Update systému

Opět spustíme příkaz rds-server s právy roota, kde budeme sledovat komunikaci mezi klientem a serverem.

  $ 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).
Downloading repo: adobe-linux-i386	 - 100%
... SNIP ...
Downloading repo: mhlavink-developerdashboard	 - 100%
[MESSAGE]: Metadata for mhlavink-developerdashboard - download successfull (Destination dir: /tmp/ssds/mhlavink-developerdashboard).
Downloading repo: rhpkg	 - 100%
[MESSAGE]: Metadata for rhpkg - download successfull (Destination dir: /tmp/ssds/rhpkg).
Downloading repo: fedora-steam	 - 100%
[MESSAGE]: Metadata for fedora-steam - download successfull (Destination dir: /tmp/ssds/fedora-steam).
Downloading repo: helber-atom	 - 100%
[MESSAGE]: Metadata for helber-atom - download successfull (Destination dir: /tmp/ssds/helber-atom).
Downloading repo: google-chrome	 - 100%
[MESSAGE]: Metadata for google-chrome - download successfull (Destination dir: /tmp/ssds/google-chrome).
{
  "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"
      },
      {
        "pkg_name" : "selinux-policy-targeted",
        "pkg_loc" : "s/selinux-policy-targeted-3.13.1-158.4.fc23.noarch.rpm",
        "base_url" : null,
        "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64"
      },
      {
        "pkg_name" : "selinux-policy",
        "pkg_loc" : "s/selinux-policy-3.13.1-158.4.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" : [
    ]
  }
}

Update systému pomocí rds-client --update

  $ 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"
      },
      {
        "pkg_name" : "selinux-policy-targeted",
        "pkg_loc" : "s/selinux-policy-targeted-3.13.1-158.4.fc23.noarch.rpm",
        "base_url" : null,
        "metalink" : "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f23&arch=x86_64"
      },
      {
        "pkg_name" : "selinux-policy",
        "pkg_loc" : "s/selinux-policy-3.13.1-158.4.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
	selinux-policy-targeted
	selinux-policy
... SNIP ...
	abi-dumper
[QUESTION]: Is it ok?
[y/n/d]: y
[MESSAGE]: Downloading preparation for package: tzdata-java
[MESSAGE]: Downloading preparation for package: tzdata
[MESSAGE]: Downloading preparation for package: selinux-policy-targeted
[MESSAGE]: Downloading preparation for package: selinux-policy
... 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.
$

Zbylé příkazy, které podporuje dnf příkaz budou v projektu doimplementovány v nejbližší době.

Co dál?

Jakmile bude projekt podporovat "důležité příkazy" DNF, projekt samozřejmě nekončí.

  • Stejné použití příkazů jako DNF
  • Zabezpečení komunikace mezi serverem a klientem.
  • Spuštění příkazu rds-server jako daemona.
  • Vytvoření balíčku a přidání do Fedora repositářů
  • Cachování jednotlivých požadavků na straně serveru, tak abychom neřešily závislosti vícekrát.
  • Zapojení do fedora-infrastructure
  • RDS projekt může být použit při tvorbě composů či Docker image souborů

Odkazy na GitHub