Paketmanagement from Scratch

Max Bruckner (FSMaxB)

mathjs

Über mich

mathjs

Was und warum?

Programme bauen

Autotools

$ ./configure --prefix=$wherever #(z.B. '/usr')
$ make
# make DESTDIR=$wherever_else install

CMake

$ cmake -DCMAKE_INSTALL_PREFIX=$whereever`
$ make
# make DESTDIR=$wherever_else install`

Von Hand

$ make
$ cp some_files /usr/bin/

Paketmanagement-Konzepte (1)

Paketmanagement-Konzepte (2)

Fakeroot

PKGBUILD

pkgbuild_version=5
pkgname=packagename
pkgver=1.1.1

# ....
# einige Arrays
# ....

# ls-me download -> nach $sources_dir
sources=(
    "http://www.somedomain.com/${pkgname}-${pkgver}.tar.gz"
)
# --no-cert-check flag deaktiviert SSL-Check

# lfs-me checksums -> Prüfsummen erzeugen
# lfs-me check -> Prüfsummen von installiertem System testen
sha1sums=(
    '046fb3a32f7c2b21ae30d7f5566b112ca577f1dc'
)

# ....
# einige Funktionen
# ....

( weitere Details später )

Automatisierter Build (1)

Quellcode vorbereiten:

lfs_me_prepare() {
    tar -xf "${sources_dir}/${pkgname}-${pkgver}.tar.gz" -C "$build_dir"

    cd "${build_dir}/${pkgname}-${pkgver}"

    #gegebenenfalls anwenden von patches

    ./configure --prefix=/usr
}

Kompilieren:

lfs_me_build() {
    cd "${build_dir}/${pkgname}-${pkgver}"
    make
}

Automatisierter Build (2)

Tests ausführen:

lfs_me_check() {
    cd "${build_dir}/${pkgname}-${pkgver}"
    make check
}

Installieren in's fakeroot:

lfs_me_install() {
    cd "${build_dir}/${pkgname}-${pkgver}"
    make DESTDIR="$fakeroot_dir" install
    # Der Ordner $fakeroot_dir wird automatisch erstellt
}

Dateiliste

Dateien:

find . -type f | grep -ve '^\./FILES$' > "${fakeroot_dir}/FILES"
sed -i -e "s/^\\.//" "${fakeroot_dir}/FILES"

Symlinks:

find . -type l > "${fakeroot_dir}/LINKS"
sed -i -e "s/^\\.//" "${fakeroot_dir}/DIRS"

Ordner:

find . -type d > "${fakeroot_dir}/DIRS"
sed -i -e "s/^\\.//" "${fakeroot_dir}/LINKS"

SHA1-Checksummen:

find . -type f -exec sha1sum {} \; | grep -ve "\\./sha1sums$" \
  > "${fakeroot_dir}/sha1sums"

Paketformat und Installation

tar.xz von $fakeroot_dir inklusive PKGBUILD, FILES, DIRS, LINKS und sha1sums

fakeroot tar -cf "${pkgname}-${pkgver}.pkg" \
  -I "xz --threads=0 -c -z -" -C "$fakeroot_dir"

Installation:

rsync -rlpgoDK "${fakeroot_dir}/" /
-r:  rekursiv
-l:  Symlinks erhalten
-p:  Berechtigungen erhalten
-g:  Gruppe erhalten
-o:  Besitzer erhalten
-D:  Gerätedateien erhalten
-K:  Symlinks auf Ordner nicht mit Ordnern überschreiben

Beispiel: /usr/lib64 -> lib, Paket enthält /usr/lib64

Pre- und Postinstall

Vor Installation als root:

lfs_me_preinstall() {
  # Abbruchbedingung
  [ ! -z $LFS_TGT ] \
    || lfs_me_error "The LFS_TGT environment variable isn't set!" false
}

Nach Installation als root:

lfs_me_postinstall() {
  # Info Pages updaten
  echo "Adding info pages"
  install-info  "/usr/share/info/${pkgname}.info" /usr/share/info/dir

  # Benutzer anlegen
  useradd someuser
  chown -r /some/dir someuser
}

Pakete deinstallieren

  1. Liste aller Dateien/Links ... erstellen (EVERYTHING)
  2. Dateien aus FILES löschen, wenn nicht in EVERYTHING
  3. Ordner aus DIRS sortieren (Unterordner zuerst) und löschen, wenn nicht in EVERYTHING
  4. Löschen von Symlinks aus LINKS, falls sie auf nichts mehr zeigen

Funktionen vor/nach dem Löschen:

lfs_me_preremove() {
    echo "Removing info pages"
    install-info --delete "/usr/share/info/${pkgname}.info" /usr/share/info/dir
}

lfs_me_postremove() {
  # Backups wiederherstellen oder ähnliches
}

Paketindex

$install_prefix/$index_dir
├── $pkgname
│   └── $pkgver
│       ├── sha1sums
│       ├── PKGBUILD
│       ├── DIRS
│       ├── FILES
│       └── LINKS
└── version

Dateikonflikte

Lösung:

overwrite=(
    '/usr/lib/bla.so'
)

Abhängigkeiten

dependencies=(
    "!$pkgname"
    "python>=3"
    "linux=4.1"
)

Weitere Funktionen

Backup von Config-Dateien:

backup=(
    '/etc/config.file'
)

Zu welchem Paket gehört eine Datei?

lfs-me owner

  1. Pakete auflisten
  2. Schauen, ob ein Paket die Datei enthält

Demo

Quellen

  1. http://linuxfromscratch.org/lfs/view/stable-systemd/chapter06/pkgmgt.html
  2. http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt

Links

  1. https://github.com/FSMaxB/lfs-me
  2. https://github.com/FSMaxB/lfs-me-repos
  3. OS-Container und Folien: http://maxbruckner.de/gpn