ROCK Linux

Ein Toolkit zum Erstellen von Linux Distributionen und Betriebssystemloesungen

Benjamin Schieder

Problemstellung

Distributionen sind sehr komplex

Der Pflegeaufwand fuer Pakete kann sehr gross werden

Viele Gemeinsamkeiten ueber Distributionsgrenzen hinweg

Loesungsansatz

ROCK Linux vereinfacht die Erstellung individueller Distributionen:

./scripts/Config -cfg myboot

./scripts/Config -cfg mydist

./scripts/Download -cfg myboot -required

./scripts/Download -cfg mydist -required

./scripts/Build-Target -cfg myboot

./scripts/Build-Target -cfg mydist

./scripts/Create-ISO mydemo myboot mydist

./scripts/Config

Konfiguration der Distribution

Jede Architektur kann Optionen registrieren

Jedes Paket kann Optionen registrieren

Jedes Target kann Optionen registrieren

Prioritaeten 1/3

architecture/*/preconfig.in

Architektur auswaehlen

architecture/$ROCKCFG_ARCH/config.in

misc/*/preconfig.in

target/*/preconfig.in

package/*/*/preconfig.in

Target auswaehlen

target/$ROCKCFG_TARGET/config.in

Prioritaeten 2/3

misc/*/noexpertconfig.in

package/*/*/config-*.in

misc/*/config-*.in

package/*/*/config.in

misc/*/config.in

Allgemeine Optionen zur Distribution

Prioritaeten 3/3

package/*/*/postconfig.in

misc/*/postconfig.in

architecture/$ROCKCFG_ARCH/postconfig.in

target/$ROCKCFG_ARCH/postconfig.in

Namenskonvention

ROCK:	ROCKCFG_*

Architektur:	ROCKCFG_ARCH_<ARCH>_*

Target:	ROCKCFG_TRG_<TARGET>_*

Paket:	ROCKCFG_PKG_<PKG>_*

Standard:	ROCKCFGSET_*

Beispiel config.in

package/base/subversion/config.in

if pkgcheck subversion X

then

menu_begin MENU_PKG_SUBVERSION 'Subversion Options'

bool 'Create a subversion-static package' \

ROCKCFG_PKG_SUBVERSION_STATIC 1

if [ "$ROCKCFG_PKG_SUBVERSION_STATIC" = "1" ] ; then

pkgfork subversion subversion-static

fi

menu_end

fi

Pakete

Jedes Paket hat ein Verzeichnis in package/ (Beispiel: package/base/subversion)

Jedes Paket benoetigt eine .desc Datei

ROCK erkennt automatisch das compile system fuer verschiedene Systeme (autotools, Makefile, makefile.PL, setup.py)

Aussergewoehnliches kann mit .conf Dateien behandelt werden

*.patch Dateien werden automatisch angewandt

Repositories

Jedes Paket ist in einem Repository (Beispiel: package/base, package/blindcoder, package/kde)

Unabhaengig von Paket Kategorien (Beispiel: base/system, extra/crypto, extra/desktop/kde)

Beispiel
einer .desc Datei

package/base/subversion/subversion.desc

[I] A compelling replacement for CVS

[T] The goal of the Subversion project is to build a version control

[T] system <...>

#if xpkg == subversion-static

[T]

[T] This package contains the statically linked subversion tools.

#endif

[U] http://subversion.tigris.org/

[A] The Subversion Crew

[M] The ROCK Linux Project

[C] extra/server extra/development

[F] CORE

[L] OpenSource

[S] Stable

[V] 1.2.1

[P] X -?---5---9 181.200

[D] 339598553 subversion-1.2.1.tar.bz2 http://subversion.tigris.org/tarballs/

Beispiel
einer .conf Datei

package/blindcoder/bzflag.conf

bzflag_postmake() {

mv $root/$bindir/bzflag $root/$bindir/bzflag.bin

cat >$root/$bindir/bzflag <<EOF

#!/bin/bash

$bindir/bzflag.bin -directory /$ROCKCFG_PKG_GAMES_DATADIR/bzflag "\$@"

EOF

chmod +x $root/$bindir/bzflag

}

confopt="$confopt --datadir=$root/$ROCKCFG_PKG_GAMES_DATADIR"

hook_add postmake 5 "bzflag_postmake"

Architekturen

Jede Architektur hat ein Verzeichnis in /architectures

Informationen werden in einer Datei namens archtest.out gesammelt

Komplexe Architekturen mit Unterkategorien (x86, x86-64) koennen mit archtest.sh konfiguriert werden

Beispiel
einer archtest.out

architecture/x86/archtest.out

arch_sizeof_short=2

arch_sizeof_int=4

arch_sizeof_long=4

arch_sizeof_long_long=8

arch_sizeof_char_p=4

arch_bigendian=no

arch_machine=i386

arch_target=i386-unknown-linux-gnu

Beispiel
einer archtest.sh

architecture/x86/archtest.sh

if [ "$ROCKCFG_X86_BITS" = 32 ] ; then

case "$ROCKCFG_X86_OPT" in

i?86)

arch_machine="$ROCKCFG_X86_OPT" ;;

pentium|pentium-mmx|k6*)

arch_machine="i586" ;;

pentium*|athlon*)

arch_machine="i686" ;;

esac

else

arch_sizeof_long=8

arch_sizeof_char_p=8

arch_machine="x86_64"

fi

arch_target="${arch_machine}-unknown-linux-gnu"

Targets

Eine ROCK Distribution wird auch Target genannt

Eine Distribution besteht gewoehnlich aus zwei Targets:

Das installierte System

Das System, von welchem installiert wird

Jedes Target muss einzeln konfiguriert und kompiliert werden

Beispiel einer
Target Konfiguration

target/crystal/preconfig.in

CFGTEMP_TARGETLIST="$CFGTEMP_TARGETLIST crystal Crystal_ROCK_(The_general_purpose_distribution)"

target/crystal/config.in

pkgfilter sed -e '/CORE/ ! s/^X/O/'

ROCKCFGSET_DO_REBUILD_STAGE=0

Beispiel einer
Target Konfiguration

target/crystal/build.sh

pkgloop

echo_header "Finishing build."

echo_status "Creating package database ..."

admdir="build/${ROCKCFG_ID}/var/adm"

create_package_db $admdir build/${ROCKCFG_ID}/ROCK/pkgs \

build/${ROCKCFG_ID}/ROCK/pkgs/packages.db

echo_status "Creating isofs.txt file .."

cat << EOT > build/${ROCKCFG_ID}/ROCK/isofs.txt

DISK1 $admdir/cache/ ${ROCKCFG_SHORTID}/info/cache/

DISK1 $admdir/cksums/ ${ROCKCFG_SHORTID}/info/cksums/

DISK1 $admdir/dependencies/ ${ROCKCFG_SHORTID}/info/dependencies/

$admdir/descs/ ${ROCKCFG_SHORTID}/info/descs/

DISK1

DISK1 $admdir/flists/ ${ROCKCFG_SHORTID}/info/flists/

DISK1 $admdir/md5sums/ ${ROCKCFG_SHORTID}/info/md5sums/

DISK1 $admdir/packages/ ${ROCKCFG_SHORTID}/info/packages/

EVERY build/${ROCKCFG_ID}/ROCK/pkgs/packages.db ${ROCKCFG_SHORTID}/pkgs/packages.db

SPLIT build/${ROCKCFG_ID}/ROCK/pkgs/ ${ROCKCFG_SHORTID}/pkgs/

FList Wrapper

ROCK Linux verwendet den “flist wrapper” um Dateien einem Paket zuzuordnen

Alternativ stehen Mechanismen fuer strace sowie find zur Verfuegung

Compile-Time Abhaengigkeiten werden hier aufgeloest

Command Wrapper
1/3

Viele Installationsroutinen ignorieren $CFLAGS oder spezifische Installationspraefixe

ROCK Linux verwendet Command Wrapper um diese Probleme zu loesen: gcc, find, cp, mv, install

Command Wrapper
2/3

package/base/gcc/parse-config

[...]

if [ $pkg != glibc23 -a $pkg != glibc22 -a \

$pkg != grub -a $pkg != dietlibc ]

then

if [ "$ROCKCFG_PKG_GCC_STACKPRO" = 1 ] ; then

var_append GCC2_WRAPPER_INSERT \

" " "-fstack-protector"

var_append GCC3_WRAPPER_INSERT \

" " "-fstack-protector"

fi

fi

[...]

Command Wrapper
3/3

package/base/findutils/findutils.conf

[...]

var_append INSTALL_WRAPPER_FILTER "|" \

"sed -e ’s,usr/bin/find,bin/find,’ \

-e ’s,usr/bin/xargs,bin/xargs,’"

[...]

Alles in einem

Ein Paket kann auf zwei Arten in Unterpakete aufgeteilt werden.

Packagefork: Aus gcc wird gcc2, gcc3, gcc33, gcc34, gcc4

Packagesplit: Aus gcc33 wird gcc33, gcc33:doc und gcc33:dev

Packageforking

package/blindcoder/ksimus/preconfig.in:

if pkgcheck ksimus X ; then

pkgfork ksimus ksimus-boolean

pkgfork ksimus ksimus-datarecorder

pkgfork ksimus ksimus-floatingpoint

fi

Packagesplitting

package/base/subversion/subversion.conf

[...]

if pkginstalled apache; then

apacheprefix=${ROCKCFG_PKG_APACHE_PREFIX:-opt/apache}

[...]

splitdesc_apache(){

desc_I="Apache module for subversion"

}

splitreg 50 apache ${apacheprefix}.*mod_.*so

fi

[...]

Statusausgabe

Ausgabe auf Konsole

HTML Ausgabe

Text-To-Speech

MythTVOSD

E-Mail Versand

Crystal ROCK 1/2

ROCK 3.0 beinhaltet eine Distribution namens Crystal

Crystal ist eine Beispieldistribution welche alle Funktionen von ROCK demonstriert

Crystal beinhaltet etwa 300 Pakete inklusive KDE und gaengigen Diensten und Entwicklerwerkzeugen

Crystal ROCK 2/2

Fehlende Pakete koennen mittles “rocket” nachinstalliert oder kompiliert werden

Mit “stone” koennen grundlegende Systemkonfigurationen vorgenommen werden. Dennoch kann alles mit Hilfe eines beliebigen Texteditors von Hand eingestellt werden

Crystal stellt einen guten Ausgangspunkt zum Erstellen eigener Distributionen dar

Referenzen

ROCK Linux Webseite

http://www.rocklinux.org/

ROCK Linux Dokumentation

http://doc.rocklinux.org/

Mailinglisten

http://www.rocklinux.net/mailman/listinfo/

IRC Channel

irc://irc.freenode.net#rocklinux

2005-10-08T10:50:35