Schlagwort-Archive: debian

Eigenes Debian/Ubuntu Repository aufbauen

Kurzanleitung zum Aufbau eines APT Paket Repository

In dem Repo wird das hallo-1.0.0.deb verwendet um die Funktion von reprepro zu zeigen, wie eigene DEB Pakete erstellt werden können könnt Ihr hier lesen.

Installation der benötigten Pakete

apt install reprepro apache2 gnupg

Erstellen eines GnuPG keys

Mit diesem GPG Schlüssel wird das Repository und die Pakete signiert. Der Public Key muss auf den Zielsystemen als Trusted Key hinterlegt werden. (siehe unten)

Beim Erstellen des Keys muss man ein Passwort angeben. Nur mit diesem Passwort ist es möglich neue Pakete zum Repository hinzuzufügen und zu signieren.

gpg --gen-key

...

Ihr Name ("Vorname Nachname"): Mein APT Repo Key
Email-Adresse: example@example.org
Sie haben diese User-ID gewählt:
    "Mein APT Repo Key <example@example.org>"

Ändern: (N)ame, (E)-Mail oder (F)ertig/(A)bbrechen? f

...


Öffentlichen und geheimen Schlüssel erzeugt und signiert.

pub   rsa3072 2020-10-11 [SC] [verfällt: 2022-10-11]
      4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D
uid                      Mein APT Repo Key <example@example.org>
sub   rsa3072 2020-10-11 [E] [verfällt: 2022-10-11]

Der Key hat eine Gültigkeit von 2 Jahren, man kann die Gültigkeit verlängern. Das geht mit „gpg –edit-key <key_id>“. Mit „expire“ kann die Gültigkeit des Keys geändert werden.

gpg --edit-key 4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D


gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Geheimer Schlüssel ist vorhanden.

sec  rsa3072/28C7770DD3A8D10D
     erzeugt: 2020-10-11  verfällt: 2022-10-11  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa3072/236EB690D64E39D8
     erzeugt: 2020-10-11  verfällt: 2022-10-11  Nutzung: E
[ ultimativ ] (1). Mein APT Repo Key <example@example.org>



gpg> expire
Ändern des Verfallsdatums des Hauptschlüssels.
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 10y
Key verfällt am Mi 09 Okt 2030 21:37:42 CEST
Ist dies richtig? (j/N) j

sec  rsa3072/28C7770DD3A8D10D
     erzeugt: 2020-10-11  verfällt: 2030-10-09  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa3072/236EB690D64E39D8
     erzeugt: 2020-10-11  verfällt: 2022-10-11  Nutzung: E
[ ultimativ ] (1). Mein APT Repo Key <example@example.org>


gpg> key 1
gpg> expire
Ändern des Verfallsdatums des Unterschlüssels.
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 10y
Key verfällt am Mi 09 Okt 2030 21:37:42 CEST
Ist dies richtig? (j/N) j

sec  rsa3072/28C7770DD3A8D10D
     erzeugt: 2020-10-11  verfällt: 2030-10-09  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa3072/236EB690D64E39D8
     erzeugt: 2020-10-11  verfällt: 2030-10-09  Nutzung: E
[ ultimativ ] (1). Mein APT Repo Key <example@example.org>


gpg> quit
Änderungen speichern? (j/N) j



Erstellen des REPO Verzeichnis

mkdir -p /var/www/repos/apt/debian
mkdir /var/www/repos/apt/debian/conf

Erstellen der Apache Konfiguration

In dem einfachen Beispiel habe ich einfach die Default Virtual Host Konfiguration ersetzt/angepasst, diese liegt unter /etc/apache2/sites-enabled/000-default

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /var/www/repos/ >
                Options Indexes FollowSymLinks Multiviews
                Require all granted
        </Directory>

        <Directory "/var/www/repos/apt/*/db/">
                Require all denied
        </Directory>

        <Directory "/var/www/repos/apt/*/conf/">
                Require all denied
        </Directory>

        <Directory "/var/www/repos/apt/*/incoming/">
                Require all denied
        </Directory>
</VirtualHost>

Entfernen von unnötigen Files im Webroot /var/www

rm -rf /var/www/html

Testen der Apache Konfiguration und Neustart des Services

root@repodev:~# apache2ctl configtest
Syntax OK
root@repodev:~# /etc/init.d/apache2 reload
[ ok ] Reloading apache2 configuration (via systemctl): apache2.service.

Erstellen der distributions Datei

Die Datei beschreibt das Repository und für welche Distribution das Repo ist. Bei „SignWith“ wird die Key ID verwendet von dem eben erzeugten GPG Key.

Bei Codename wird der OS Release Name angegeben, z.B. bei Debian „buster“ oder bei Ubuntu „bionic“, das hängt von dem jeweiligen Release ab. Ist es ein generisches Repo dann kann hier auch z.B. „all“ genommen werden.

/var/www/repos/apt/debian/conf/distributions

Origin: Mein APT Repo
Label: Mein APT Repo
Codename: <osrelease>
Architectures: i386 amd64
Components: main
Description: APT repository fuer meine Pakete
SignWith: 4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D

/var/www/repos/apt/debian/conf/options

verbose
basedir /var/www/repos/apt/debian
ask-passphrase

Exportieren des GnuPG Keys

Der GPG Key muss in den APT Keyring auf dem Zielsystem aufgenommen werden damit man Pakete installieren kann. Dazu exportieren wir Ihn und stellen Ihn auf dem Webserver bereit.

gpg --armor --output /var/www/repo_key.key --export 4A2E138451DD449DF3FC2C7A28C7770DD3A8D10D

Ein Paket veröffentlichen

Mit folgendem Befehl wird ein neues Paket z.B. hallo_1.0.0.deb dem Repository hinzugefügt. Wird das Kommando ausgeführt fragt der Assistent nach dem Passwort für den GPG Key.

# reprepro -b /var/www/repos/apt/debian includedeb <osrelease> /root/hallo_1.0.0.deb

/root/hallo-1.0.0.deb: component guessed as 'main'
Exporting indices...




Im Browser kann man ebenfalls prüfen ob die Veröffentlichung geklappt hat, dazu http://<repo>/repos/apt/debian/pool/main/h/hallo/ aufrufen:

Installieren von hallo aus eigenem Repository

Als erstes muss der Public Key des Repositorys zur Keychain hinzugefügt werden.

wget -O - http://10.10.10.10/repo_key.key|apt-key add -

Erstellen einer sources.list.d Datei

Die Datei wird verwendet um das Repo einzubinden.

/etc/apt/sources.list.d/mein_repo.list

deb http://10.10.10.10/repos/apt/debian <osrelease> main

Aktualisieren von APT Quellen

# apt update


Holen:1 http://10.10.10.10/repos/apt/debian all InRelease [2.331 B]
Holen:2 http://10.10.10.10/repos/apt/debian all/main amd64 Packages [1.018 B]
OK:3 http://deb.debian.org/debian buster InRelease
Holen:4 http://deb.debian.org/debian buster-updates InRelease [51,9 kB]
OK:5 http://security.debian.org/debian-security buster/updates InRelease
Es wurden 55,2 kB in 1 s geholt (86,7 kB/s).
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Alle Pakete sind aktuell.

Installieren ….

# apt install hallo

Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden NEUEN Pakete werden installiert:
  hallo
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 776 B an Archiven heruntergeladen werden.
Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt.
Holen:1 http://10.10.10.10/repos/apt/debian all/main amd64 hallo all 1.0-0 [776 B]
Es wurden 776 B in 0 s geholt (0 B/s).
Vormals nicht ausgewähltes Paket hallo wird gewählt.
(Lese Datenbank ... 35202 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../archives/hallo_1.0-0_all.deb ...
Entpacken von hallo (1.0-0) ...
hallo (1.0-0) wird eingerichtet ...

Viel Spaß 😉

Eigene Debian/Ubuntu Pakete bauen

Dies ist eine Kurzanleitung wie man selber einfache Debian/Ubuntu Pakete bauen kann um z.B. eigene Skripte etc. zu verteilen.

Als erstes wird ein Projekt Ordner erstellt. z.B. hallo-1.0.0

mkdir ~/hallo-1.0.0

Die Struktur innerhalb des Ordners wird so auf das System kopiert, legt Ihr z.B. eine „hallo“ Datei in ~/hallo-1.0.0/usr/bin ab wird sie im Zielsystem in /usr/bin installiert.

mkdir -p ~/hallo-1.0.0/usr/bin
mkdir -p ~/hallo-1.0.0/DEBIAN

Im Ordner DEBIAN liegen die Dateien die für das bauen des Pakets benötigt werden.

nano ~/hallo-1.0.0/usr/bin/hallo

Hier ein kleines Testscript das wir verteilen wollen:

#!/bin/sh
echo "Hallo :-)"

Rechte die für Dateien gesetzt sind werden übernommen.

chmod +x ~/hallo-1.0.0/usr/bin/hallo

Jetzt noch die „control“ Datei im Ordner DEBIAN erstellen. Die Datei beinhaltet den Namen, die Beschreibung und Abhänigkeiten.

Package: hallo
Version: 1.0-0
Section: base
Priority: optional
Architecture: all
Maintainer: "Der Packetbauer <example@example.org>"
Description: Ein Skript das Hallo sagt

Das bauen des Pakets wird mit dpkg-deb gemacht.

dpkg-deb --build ~/hallo-1.0.0/

Ist die Erstellung des Pakets erfolgreich kommt folgende Meldung:

mt@dev:~# dpkg-deb --build hallo-1.0.0/
dpkg-deb: Paket »hallo« wird in »hallo-1.0.0.deb« gebaut.

Im Verzeichnis sollte jetzt eine hallo-1.0.0.deb vorhanden sein.

Kleine Kontrolle:

mt@dev:~# dpkg -I hallo-1.0.0.deb
 neues Debian-Paket, Version 2.0.
 Größe 776 Byte: control-Archiv= 340 Byte.
     172 Byte,     7 Zeilen      control
 Package: hallo
 Version: 1.0-0
 Section: base
 Priority: optional
 Architecture: all
 Maintainer: "Der Packetbauer <example@example.org>"
 Description: Ein Skript das Hallo sagt

Jetzt kann man versuchen das Paket zu installieren:

mt@dev:~# dpkg -i hallo-1.0.0.deb
Vormals nicht ausgewähltes Paket hallo wird gewählt.
(Lese Datenbank ... 34468 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von hallo-1.0.0.deb ...
Entpacken von hallo (1.0-0) ...
hallo (1.0-0) wird eingerichtet ...

Die Installation war erfolgreich, in /usr/bin ist jetzt die Datei hallo und ist ausführbar.

mt@dev:~# ls -la /usr/bin/hallo
-rwxr-xr-x 1 root root 27 Okt 11 16:52 /usr/bin/hallo

mt@dev:~# hallo
Hallo :-)

Beim Entfernen des Pakets werden die Dateien entsprechend entfernt.

mt@dev:~# apt remove hallo
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden Pakete werden ENTFERNT:
  hallo
0 aktualisiert, 0 neu installiert, 1 zu entfernen und 0 nicht aktualisiert.
Nach dieser Operation werden 0 B Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n] j
(Lese Datenbank ... 34469 Dateien und Verzeichnisse sind derzeit installiert.)
Entfernen von hallo (1.0-0) ...

Natürlich ist noch wesentlich mehr möglich und das ist ein einfaches Beispiel. Zum Nachlesen eignen sich folgende Seiten:

https://wiki.debian.org/Packaging/Intro?action=show&redirect=IntroDebianPackaging

https://packaging.ubuntu.com/html/

Debian/Ubuntu Liste installierter Pakete exportieren und diese Liste auf einem neuen System installieren

Mit diesem Befehl lassen sich die installieren Pakete in eine Liste exportieren.

sudo dpkg-query -f '${binary:Package}\n' -W > packages_list.txt

Mit xargs lässt sich apt install z.B. auf einem neuen System füttern.

sudo xargs -a packages_list.txt apt install