From 18b724911750d346e7d13ac5d29e4b0d321c9283 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Tue, 18 Sep 2007 19:47:14 +0200 Subject: [PATCH 01/16] Mention the /etc/locale.gen.grml TODO in /etc/grml/fai/config/scripts/GRMLBASE/25-locales --- etc/grml/fai/config/scripts/GRMLBASE/25-locales | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/etc/grml/fai/config/scripts/GRMLBASE/25-locales b/etc/grml/fai/config/scripts/GRMLBASE/25-locales index 477a182..c093e28 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/25-locales +++ b/etc/grml/fai/config/scripts/GRMLBASE/25-locales @@ -4,12 +4,13 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Sun Sep 16 22:59:23 CEST 2007 [mika] +# Latest change: Tue Sep 18 19:46:58 CEST 2007 [mika] ################################################################################ set -u set -e +# FIXME: replace it with /etc/locale.gen.grml finally! cp $target/etc/locale.gen.minimal $target/etc/locale.gen $ROOTCMD locale-gen -- 2.1.4 From 1544e35bd7c2bc398f9fc96e2df05e168b24700a Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Tue, 18 Sep 2007 21:23:19 +0200 Subject: [PATCH 02/16] Support use of local mirror (like NFS) through mount bind --- etc/grml/grml-live.conf | 8 +++++++- grml-live | 19 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/etc/grml/grml-live.conf b/etc/grml/grml-live.conf index 1c776e6..4c67f87 100644 --- a/etc/grml/grml-live.conf +++ b/etc/grml/grml-live.conf @@ -3,7 +3,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Tue Sep 18 09:31:39 CEST 2007 [mika] +# Latest change: Tue Sep 18 20:32:37 CEST 2007 [mika] ################################################################################ # main output directory @@ -49,6 +49,12 @@ CLASSES="GRMLBASE,I386" # Usage: # FAI_DEBOOTSTRAP="etch http://ftp.de.debian.org/debian" +# Do you want to use a local mirror (like NFS) as well? +# If so specify the directory where debian/ is available: +# MIRROR_DIRECTORY="/mnt/mirror" +# ... and the sources.list entry for the directory: +# MIRROR_SOURCES="deb file:///mnt/mirror/debian sid main contrib non-free" + # directory of configuration files for grml-live's FAI: GRML_FAI_CONFIG=/etc/grml/fai diff --git a/grml-live b/grml-live index 91a929d..ec336c2 100755 --- a/grml-live +++ b/grml-live @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Tue Sep 18 19:29:33 CEST 2007 [mika] +# Latest change: Tue Sep 18 20:32:35 CEST 2007 [mika] ################################################################################ # read configuration files, set some misc variables {{{ @@ -36,6 +36,7 @@ PN=$(basename $0) # clean exit {{{ bailout() { # rm -f "$TMPFILE" + [ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" [ -n "$1" ] && EXIT="$1" || EXIT="1" [ -n "$2" ] && echo "$2">&2 exit "$EXIT" @@ -129,7 +130,16 @@ fi # }}} # on-the-fly configuration {{{ -if [ -n "$GRML_LIVE_SOURCES" ] ; then +if [ -n "$MIRROR_DIRECTORY" ] ; then + if ! [ -d "$MIRROR_DIRECTORY/debian" ] ; then + echo "Sorry, $MIRROR_DIRECTORY/debian does not seem to exist. Exiting.">&2 + bailout 1 + fi + echo "$MIRROR_SOURCES" > /etc/grml/fai/apt/sources.list + if [ -n "$GRML_LIVE_SOURCES" ] ; then + echo "$GRML_LIVE_SOURCES" >> /etc/grml/fai/apt/sources.list + fi +elif [ -n "$GRML_LIVE_SOURCES" ] ; then echo "$GRML_LIVE_SOURCES" > /etc/grml/fai/apt/sources.list fi @@ -158,9 +168,14 @@ if [ -d "$CHROOT_TARGET" ] ; then echo " [x] $CHROOT_TARGET exists already, skipping the stage 'fai dirnstall'" else mkdir -p "$CHROOT_TARGET" || bailout 5 "Problem with creating $CHROOT_TARGET for FAI" + if [ -n "${MIRROR_DIRECTORY}" ] ; then + mkdir -p "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" + mount --bind "${MIRROR_DIRECTORY}" "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" + fi fai $VERBOSE -C "$GRML_FAI_CONFIG" -c"$CLASSES" dirinstall "$CHROOT_TARGET" $FAI_ARGS umount $CHROOT_TARGET/proc 2>/dev/null || /bin/true umount $CHROOT_TARGET/sys 2>/dev/null || /bin/true + [ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" # notice: 'fai dirinstall' does not seem to exit appropriate -> # we need better error handling if [ -r "$CHROOT_TARGET"/etc/grml_cd ] ; then -- 2.1.4 From 7b4718b59c0edbc1b5ff6dcc1c48bb61c83689d4 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 00:08:52 +0200 Subject: [PATCH 03/16] Big update of documentation; use sed -i instead of sed -ie in script --- docs/grml-live.txt | 326 ++++++++++++++++++++++++++++++++++-------------- etc/grml/grml-live.conf | 54 ++++---- grml-live | 13 +- 3 files changed, 266 insertions(+), 127 deletions(-) diff --git a/docs/grml-live.txt b/docs/grml-live.txt index 52b7d2d..9c0d88a 100644 --- a/docs/grml-live.txt +++ b/docs/grml-live.txt @@ -4,17 +4,16 @@ grml-live(8) Name ---- -grml-live - build framework for generating a grml and Debian based Linux Live -system (CD/ISO) +grml-live - build framework based on FAI for generating a grml and Debian based +Linux Live system (CD/ISO) Synopsis -------- -grml-live [-c ] [-t ] [-F] [-h|--help] +grml-live [-c ] [-t ] [-s ] [-Fvh] ******************************************************************************* -Important! grml-live is under heavy construction, though your feedback is highly -appreciated. This document is growing as requested. If you have questions which +Important! This document is growing as requested. If you have questions which aren't answered by this document yet please let me know: ! ******************************************************************************* @@ -22,17 +21,17 @@ Description ----------- grml-live provides the build system for creating a grml and Debian based Linux -live-cd. The build system is based on +Live-CD. The build system is based on link:http://www.informatik.uni-koeln.de/fai/[FAI] (Fully Automatic Installation). grml-live uses the "fai dirinstall" feature to generate a chroot -system based on the class concept of FAI (see later section for further details) -and provides all the details to be able to generate a full-featured ISO. It does -not use all the FAI features by default though and you don't have to know FAI to -be able to use it. +system based on the class concept of FAI (see later sections for further +details) and provides the framework to be able to generate a full-featured ISO. +It does not use all the FAI features by default though and you don't have to +know FAI to be able to use it. -The use of FAI behind the curtains gives you the flexibility to choose the -packages you would like to include on your very own Linux live-cd without having -to deal with all the details of a build process. +The use of FAI gives you the flexibility to choose the packages you would like +to include on your very own Linux Live-CD without having to deal with all the +details of a build process. CAUTION: grml-live does **not** use /etc/fai for configuration but instead provides and uses /etc/grml/fai. This ensures that it does not clash with @@ -42,39 +41,38 @@ completely independent at the same time! [NOTE] Please notice that you should have a fast network connection as all the Debian -packages will be installed via network. If you want to use a local mirror -(strongly recommended!) checkout mkdebmirror (see -/usr/share/doc/grml-live/examples/mkdebmirror), debmirror(1), reprepro(1) (see -/usr/share/doc/grml-live/examples/reprepro/ for a sample configuration) and -approx(8). To avoid downloading of the base system check out FAI's NFSROOT (check -docs for ../fai/nfsroot/live/filesystem.dir/var/tmp/base.tgz). +packages will be downloaded and installed via network. If you want to use a +local mirror (strongly recommended if you plan to use grml-live more than once) +checkout mkdebmirror (see /usr/share/doc/grml-live/examples/mkdebmirror), +debmirror(1), reprepro(1) (see /usr/share/doc/grml-live/examples/reprepro/ for a +sample configuration) and approx(8). To avoid downloading the base system again +and again check out FAI's NFSROOT (see FAQ of this document for details). Options ------- -c **CLASSES**:: -Specify the CLASSES to be used for building the ISO via fai. By default only +Specify the CLASSES to be used for building the ISO via FAI. By default only the classes GRMLBASE and I386 are assumed, resulting in a small base system -(being about ~150MB ISO size). +(being about ~150MB total ISO size) for x86 (32bit). -s **SUITE**:: Specify the Debian suite you want to use for your live-system. Defaults to -"etch"; support values are: etch, lenny, sid, stable, testing, unstable. +"etch" (being current Debian/stable). Supported values are: etch, lenny, sid, +stable, testing, unstable. -t **TARGET_DIRECTORY**:: -Main output directory of the build process of FAI. Three directories are -created inside the target directory, being: grml_cd/ - where the files for -creating the ISO are located (including the compressed squashfs file), -grml_chroot/ - the generated chroot system and grml_isos/ - where the resulting -ISO is stored. +Main output directory of the build process of FAI. Some directories are created +inside this target directory, being: grml_cd (where the files for creating the +ISO are located, including the compressed squashfs file), grml_chroot (the +chroot system) and grml_isos (where the resulting ISO is stored). -F:: -Force execution and do not prompt for / display summary of configuration -details. +Force execution and do not prompt for acknowledgment of configuration. -h:: @@ -84,30 +82,30 @@ Display short usage information and exit. Increase verbosity in the build process. -How to get your own live-cd - the easy, fast and simple way +How to get your own Live-CD - the easy, fast and simple way ----------------------------------------------------------- -To get a small, Debian-stable and grml based live-cd using /grml/grml-live -as build and output directory: +To get a small, Debian-stable and grml-based Live-CD using /grml/grml-live +as build and output directory just run: # grml-live -To get a small Debian-unstable and grml-small based live-cd using -/home/mika/grml-live as build and output directory: +To get a small Debian-unstable and grml-small based Live-CD using +/home/mika/grml-live as build and output directory just use: # grml-live -c GRMLBASE,GRML_SMALL,I386 -t /home/mika/grml-live [NOTE] If you have about 700MB of free space inside /dev/shm (being a tmpfs, usually -you have >=1GB of RAM) just run "mount -o remount,suid,dev,rw /dev/shm" and use -/dev/shm as build and output directory - resulting in very fast build process. -But please be aware of the fact that rebooting your system will result in an -empty /dev/shm, so please another directory for $CHROOT_TARGET, $BUILD_TARGET -and $ISO_TARGET if you plan to create more persistent output. :) +you should have >=1GB of RAM) just run "mount -o remount,suid,dev,rw /dev/shm" +and use /dev/shm as build and output directory - resulting in very fast build +process. But please be aware of the fact that rebooting your system will result +in an empty /dev/shm, so please another directory for $CHROOT_TARGET, +$BUILD_TARGET and $ISO_TARGET if you plan to create more persistent output. :) -Features --------- +Main features of grml-live +-------------------------- * create a grml-/Debian-based Linux Live-CD with one single command @@ -115,8 +113,8 @@ Features * supports integration of own hooks, scripts and configuration -* supports use and integration of own Software and/or Kernels via use of Debian -repositories +* supports use and integration of own Software and/or Kernels via simple use of +Debian repositories * native support of FAI features @@ -125,15 +123,15 @@ repositories The class concept ----------------- -grml-live uses FAI and its class based concept for adjusting configuration -according to your needs. This gives you flexibility and strength without losing -the simplicity in the build process. +grml-live uses FAI and its class based concept for adjusting configuration and +setup according to your needs. This gives you flexibility and strength without +losing the simplicity in the build process. The main and base class provided by grml-live is named GRMLBASE. It's strongly recommended to **always** use the class GRMLBASE when building an ISO using -grml-live as well as the architecture dependend class (being 'I386' for x86_32 -currently only). The following files and directories are relevant for class GRML -by default: +grml-live, as well as the architecture dependend class which provides the kernel +(being 'I386' for x86_32 currently only). The following files and directories +are relevant for class GRMLBASE by default: /etc/grml/fai/config/scripts/GRMLBASE/ /etc/grml/fai/config/debconf/GRMLBASE @@ -145,51 +143,61 @@ Take a look at the next section for information about the concept of those files/directories. If you want to use your own configuration, extend an existing configuration -and/or add additional packages to your ISO just invent a new class. For example -if you want to use your own class named "FOOBAR" just extend CLASSES="GRMLBASE" -inside /etc/grml/grml-live.conf to CLASSES="GRMLBASE,FOOBAR" or invoke grml-live -using the classes option: "grml-live -c GRMLBASE,FOOBAR ...". +and/or add additional packages to your ISO just invent a new class (or extend an +existing one). For example if you want to use your own class named "FOOBAR" just +extend CLASSES="GRMLBASE,I386" inside /etc/grml/grml-live.conf to +CLASSES="GRMLBASE,I386,FOOBAR" or invoke grml-live using the classes option: +"grml-live -c GRMLBASE,I386,FOOBAR ...". More details regarding the class concept can be found in the documentation of -FAI (available at /usr/share/doc/fai-doc/). +FAI itself (being available at /usr/share/doc/fai-doc/). Files ----- Notice that grml-live ships FAI configuration files that do not use the same -namespace as the FAI packages itself. This ensures that grml-live does not -clash with your usual FAI configuration, so instead of /etc/fai/fai.conf -(package fai-client) grml uses /etc/grml/fai/fai.conf instead. For more details -see below. To get an idea how another configuration or example files could look -like check out /usr/share/doc/fai-doc/examples/simple/ (provided by Debian package -fai-doc). /usr/share/doc/fai-doc/fai-guide.html/ch-config.html also provides -documentation regarding configuration possibilities. +namespace as the FAI packages itself. This ensures that grml-live does not clash +with your usual FAI configuration, so instead of /etc/fai/fai.conf (package +fai-client) grml uses /etc/grml/fai/fai.conf instead. For more details see +below. To get an idea how another configuration or example files could look like +check out /usr/share/doc/fai-doc/examples/simple/ (provided by Debian package +fai-doc). Furthermore /usr/share/doc/fai-doc/fai-guide.html/ch-config.html +provides documentation regarding configuration possibilities. /usr/sbin/grml-live -Script for the main build process (being a wrapper around FAI currently). -Requires root permissions for execution. +Script for the main build process. Requires root permissions for execution. + + /etc/grml/grml-live.conf + +Main configuration file for grml-live. All the important steps can be configured +at this stage. /etc/grml/fai/fai.conf -Main configuration file which specifies where all the configuration files and -scripts for FAI/grml-live can be found. By default it is +Main configuration file for FAI which specifies where all the configuration +files and scripts for FAI/grml-live can be found. By default it is set to FAI_CONFIGDIR=/etc/grml/fai/config, a directory shipped by grml-live out-of-the-box so you shouldn't have to configure anything in this file. /etc/grml/fai/make-fai-nfsroot.conf -TODO: documentation +This file is used by make-fai-nfsroot(8) only. Usually you don't have to change +anything inside this file. If you want to modify NFSROOT though you can adjust +it there. /etc/grml/fai/NFSROOT -TODO: documentation +This file specifies the package list for creating the NFSROOT. /etc/grml/fai/apt/sources.list This file specifies which mirrors should be used for retreiving the Debian -packages used for creating the ISO. If you want to use a local mirror you have -to adjust this file. +packages used for creating the main chroot (including all the software you would +like to see included). If you want to use a local mirror you either have to +adjust this file or use the GRML_LIVE_SOURCES variable inside +/etc/grml/grml-live.conf which modifies /etc/grml/fai/apt/sources.list +on-the-fly then. /etc/grml/fai/config/ @@ -207,24 +215,24 @@ through files. /etc/grml/fai/config/hooks/ -This directory provides files for customizing the build process through hooks. +This directory provides files for customising the build process through hooks. Hooks are user defined programs or scripts, which are called during the installation process. /etc/grml/fai/config/package_config/ -File with lists of software packages to be installed or removed. The different -classes describe what should find its way to your ISO. When running 'fai -v -C -/etc/grml/fai -cGRMLBASE dirinstall ...' only the files from the directory GRML/ -will be taken, if you use 'fai -v -C /etc/grml/fai -cGRMLBASE,FOOBAR dirinstall -...' then the files of GRML/ **plus** the files from FOOBAR/ will be taken. So -just create a new class to adjust it to your needs. Please notice that the -directory GRML contains a package list defining a minimum but still reasonable -package configuration. +Directory with lists of software packages to be installed or removed. The +different classes describe what should find its way to your ISO. When running +"grml-live -c GRMLBASE,I386 ..." only the files from the directories GRMLBASE +and I386 will be taken, if you use 'grml-live -c GRMLBASE,I386,FOOBAR ...' then +the files of GRMLBASE, I386 **plus** the files from FOOBAR will be taken. So +just create a new class to adjust the package selection according to your needs. +Please notice that the directory GRMLBASE contains a package list defining a +minimum but still reasonable package configuration. /etc/grml/fai/config/scripts/ -Scripts for customising the ISO within build process. +Scripts for customising the ISO within the build process. /etc/grml/fai/files/ @@ -240,8 +248,9 @@ live-initramfs(8). Requirements for the build system --------------------------------- -* any Debian based system should be sufficient (if not please send a bug -report), for example a grml2hd harddisk installation ships all you need +* any Debian based system should be sufficient (if not it's a bug, so please +send us a bug report then) [a usual link:http://grml.org/grml2hd/[grml2hd] +harddisk installation ships all you need] * enough free disk space; at least 800MB are required for a minimal grml-live run (\~400MB for the chroot [$CHROOT_TARGET], \~150MB for the build target @@ -252,44 +261,173 @@ temporary files) chroot (check out "local mirror" and "NFSROOT" to workaround this problem as far as possiblbe) +FAQ +--- + +Help, I'm using Debian etch and I don't have FAI version >3.2 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + wget http://www.informatik.uni-koeln.de/fai/download/etch/fai-client_3.2.1_all.deb \ + http://www.informatik.uni-koeln.de/fai/download/etch/fai-server_3.2.1_all.deb + dpkg -i fai-client_3.2.1_all.deb fai-server_3.2.1_all.deb + +or check out the link:http://www.informatik.uni-koeln.de/fai/[FAI-homepage] for +further details. + +I've problems with the build process. How to start debugging? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Check out the logs inside /var/log/fai/dirinstall/... If you don't have the time +to debug the problem in further detail or don't know how to proceed just send a +copy of your config, logs and the commandline with a short problem description +to : + + # history | grep grml-live > /etc/grml/grml_live.cmdline + # tar zcf grml_live_problem.tar.gz /etc/grml/grml-live.conf \ + /var/log/fai/dirinstall /etc/grml/fai + +Can I use my own (local) Debian mirror? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sure. Just adjust the variables GRML_LIVE_SOURCES and FAI_DEBOOTSTRAP (if not +already using NFSROOT's base.tgz) inside /etc/grml/grml-live.conf according to +your needs. Please don't forget that you should use the grml servers as well +(see default configuration) so all the grml packages can be downloaded as well. + +If you want to use a local (for example NFS mount) mirror additionally, just +adjust MIRROR_DIRECTORY and MIRROR_SOURCES insede /etc/grml/grml-live.conf as +well. + +Unless you specify GRML_LIVE_SOURCES and/or FAI_DEBOOTSTRAP the default from +/etc/grml/fai/apt/sources.list and /etc/grml/fai/make-fai-nfsroot.conf will be +taken. If you customise the variables in /etc/grml/grml-live.conf then the two +files will be adjusted during runtime automatically. + +If MIRROR_DIRECTORY and MIRROR_SOURCES are specified the local mirror will be +taken as first entry in the generated sources.list so it's prefered over +non-local mirrors. Using a fallback mirror (via providing several mirrors in +GRML_LIVE_SOURCES as used by default) is a recommended setting. + +How do I add additional Debian package(s) to my CD/ISO? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Just create a new class (using the package_config directory): + + # cat > /etc/grml/fai/config/package_config/MIKA << EOF + PACKAGES aptitude + + vim + another_name_of_a_debian_package + and_another_one + EOF + +and specify it when invoking grml-live then: + + # grml-live -c GRMLBASE,I386,MIKA + +I fscked up my grml-live configuration. How do I reset it to the defaults? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Notice: this deletes all your grml-live configuration files. If that's really +what you are searching for just run: + + rm -rf /etc/grml/fai /etc/grml/grml-live.conf + dpkg -i --force-confnew --force-confmiss /path/to/grml-live_..._all.deb + +[NOTE] + +If you don't control your /etc using a version control system (VCS) yet it's a +good chance to start using it now. Check out +link:http://michael-prokop.at/blog/2007/03/14/maintain-etc-with-mercurial-on-debian/[http://michael-prokop.at/blog/2007/03/14/maintain-etc-with-mercurial-on-debian/] +for more details how to maintain /etc using the mercurial VCS. + +How do I create a base.tgz for use as NFSROOT? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First of all build the chroot system: + + mkdir /tmp/nfsroot && cd /tmp/nfsroot + debootstrap etch /tmp/nfsroot/ http://ftp.de.debian.org/debian + tar zcf base.tgz ./ + +Then check out where your NFSROOT is located: + + # grep '^NFSROOT' /etc/grml/fai/make-fai-nfsroot.conf + NFSROOT=/grml/fai/nfsroot + +So as /grml/fai/nfsroot is your NFSROOT place the file under +/grml/fai/nfsroot/live/filesystem.dir/var/tmp/: + + mv base.tgz /grml/fai/nfsroot/live/filesystem.dir/var/tmp/base.tgz + +Now running "grml-live ..." will use this file as main system instead of +executing debootstrap. Check out the output for the following lines: + + [...] + Calling task_extrbase + Unpacking Debian base archive + Extracting /grml/fai/nfsroot/live/filesystem.dir/var/tmp/base.tgz + Calling task_mirror + [...] + +I've a question which isn't answered by this document +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Don't hesitate to ask on IRC (channel #grml on irc.freenode.org) or just drop me +a mail: + Known TODOs ----------- -* document the available classes in more detail +* "fai dirinstall" does not seem to always exit according to what happend during +the build; make sure to exit on any error -* make sure $TARGET is mounted rw,suid,dev +* document the available classes in more detail -* write a step-by-step guide **how** to adjust **what** at **which** place +* add a check to make sure $TARGET is mounted rw,suid,dev? * add support for amd64 [gebi?] + ppc [formorer?] (and identify all packages that are arch specific so we have a clean package list in all classes) * support different grml-flavours through classes right out-of-the-box (being: -grml, grml64, grml-small (done) for at least x86, amd64 and ppc) +grml and grml-small (done), each for x86, amd64 and ppc) * support signed apt repositories (currently it's deactivated via FAI's FAI_ALLOW_UNSIGNED=1 for some packages in the toolchain) -* explain (and provide configuration for) use of NFSROOT - * support setting stuff like ISO name, version,... on-the-fly (especially for stuff inside boot/isolinux/*) * support "final builds" (including stuff like generating md5sums, gpg,... - -create something like grml_release including all the details about the build -like dpkg selection, logs,...) +create a grml_release-directory including all the details about the build +process like dpkg selection, logs,...) -* the grml-live class(es) should send output as used inside FAI as well (so it's -not as verbose unless you specify it, make it configurable) +* the grml-live class(es) should send output to stdout and stderr as used inside +FAI as well (so it's not as verbose unless you specify it, make it configurable +though); check for errors inside the logs then as well * provide possibility for cleanup of all created build directories and a smart summary of the buildprocess (including "took ... minutes/seconds to -build...) +build...") + +* check out how FAI_DEBMIRROR of /etc/grml/fai/fai.conf could be merged with our +MIRROR_DIRECTORY and MIRROR_SOURCES feature of /etc/grml/grml-live.conf * support hooks to allow further customisation of the build process -Debian package --------------- +Long term goals +--------------- + +* Provide all upcoming grml releases based on grml-live. + +* Provide a console interface (using dialog) for easy and common use of +grml-live. + +* Provide a graphical interface (for example using pygtk) for easy and common +use of grml-live. + +Download / install grml-live as a Debian package +------------------------------------------------ Debian packages will be available through the grml-repository at link:http://deb.grml.org/[http://deb.grml.org/] as soon as the grml-team diff --git a/etc/grml/grml-live.conf b/etc/grml/grml-live.conf index 4c67f87..6d31354 100644 --- a/etc/grml/grml-live.conf +++ b/etc/grml/grml-live.conf @@ -3,38 +3,40 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Tue Sep 18 20:32:37 CEST 2007 [mika] +# Latest change: Tue Sep 18 22:27:31 CEST 2007 [mika] ################################################################################ -# main output directory -# please notice that you need suid,dev,rw permissions there +# Main output directory +# Please notice that you need suid,dev,rw permissions there TARGET="/grml/grml-live" +# You have enough RAM? Use shared memory for fast testing purposes: # TARGET="/dev/shm" # mount -o remount,suid,dev,rw /dev/shm -# chroot of the buildprocess files: +# Where do want to find the chroot of the buildprocess files? CHROOT_TARGET="$TARGET/grml_chroot" -# where do you want to find the compressed chroot, bootstuff,...? +# Where do you want to find the compressed chroot, bootstuff,...? BUILD_TARGET="$TARGET/grml_cd" -# where do you want to find the final ISO? +# Where do you want to find the final ISO? ISO_TARGET="$TARGET/grml_isos" -# which Debian suite to you want to use? unless set it defaults to "etch" -# supported values: stable, testing, unstable, etch, lenny, sid +# Which Debian suite to you want to use? Unless it's set it defaults to "etch" +# Supported values are: stable, testing, unstable, etch, lenny, sid # SUITE="sid" -# which FAI classes do you want to use by default? -# notice: GRMLBASE is recommended in any case unless you *really* -# know what you are doing; class I386 provides the kernel +# Which FAI classes do you want to use by default? +# Notice: GRMLBASE is recommended in any case unless you *really* +# know what you are doing; class I386 provides the kernel for x86 CLASSES="GRMLBASE,I386" ## Which mirrors do you want to use? Please set GRML_LIVE_SOURCES *and* -## *FAI_DEBOOTSTRAP* according! +## *FAI_DEBOOTSTRAP* accordingly. To use a local directory (like an NFS mount) +## check out MIRROR_DIRECTORY and MIRROR_SOURCES as well. # Do you want to generate /etc/grml/fai/apt/sources.list on-the-fly via grml-live? # If so then activate the according mirrors using GRML_LIVE_SOURCES=... -# If you do *not* set GRML_LIVE_SOURCES then grml-live will just take what -# /etc/grml/fai/apt/sources.list provides by default -# Usage: like your /etc/apt/sources.list looks like +# If you do *not* set GRML_LIVE_SOURCES here then grml-live will just take what +# /etc/grml/fai/apt/sources.list provides by default. +# Use the variable like your /etc/apt/sources.list looks like. #GRML_LIVE_SOURCES=" #deb http://192.168.1.112/debian etch main contrib non-free #deb http://deb.grml.org/ grml-stable main @@ -42,11 +44,11 @@ CLASSES="GRMLBASE,I386" #deb http://ftp.de.debian.org/debian etch main contrib non-free #" -# Which Debian flavour and which mirror do you want to use for basic debootstrapping? +# Which Debian suite and which mirror do you want to use for debootstrapping? # Unless specified the default from /etc/grml/fai/make-fai-nfsroot.conf will be # taken. If you specify a value then the file /etc/grml/fai/make-fai-nfsroot.conf # will be updated by grml-live on-the-fly. -# Usage: +# Usage: " " # FAI_DEBOOTSTRAP="etch http://ftp.de.debian.org/debian" # Do you want to use a local mirror (like NFS) as well? @@ -55,25 +57,25 @@ CLASSES="GRMLBASE,I386" # ... and the sources.list entry for the directory: # MIRROR_SOURCES="deb file:///mnt/mirror/debian sid main contrib non-free" -# directory of configuration files for grml-live's FAI: +# Directory of configuration files for grml-live's FAI: GRML_FAI_CONFIG=/etc/grml/fai -# specify hostname of the live-system: +# Specify hostname of the live-system: HOSTNAME=grml -# specify user with UID 1000 on live-system: +# Specify user with UID 1000 on live-system: USERNAME=grml -# do you want to pass any additional arguments to FAI? +# Do you want to pass any additional arguments to FAI? # FAI_ARGS="" -# which architecture do you want to build? -# defaults to output of 'dpkg --print-architecture' +# Which architecture do you want to build? +# It defaults to output of 'dpkg --print-architecture' # ARCH="i386" -# do you want to download pageant, plink, pscp, psftp, putty and puttygen -# to store it inside $BUILD_TARGET/windows/? -# just unset it do skip download via wget or modify URL +# Do you want to download pageant, plink, pscp, psftp, putty and puttygen +# using wget to store it inside $BUILD_TARGET/windows/? +# Just unset it do skip download via wget or modify the download URL. WINDOWS_BINARIES="http://the.earth.li/~sgtatham/putty/latest/x86/" ## END OF FILE ################################################################# diff --git a/grml-live b/grml-live index ec336c2..956f8b4 100755 --- a/grml-live +++ b/grml-live @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Tue Sep 18 20:32:35 CEST 2007 [mika] +# Latest change: Tue Sep 18 22:46:28 CEST 2007 [mika] ################################################################################ # read configuration files, set some misc variables {{{ @@ -82,7 +82,6 @@ http://grml.org/bugs/ while getopts "c:s:t:Fhv" opt; do case "$opt" in c) CLASSES="$OPTARG" ;; - # f) FLAVOUR="$OPTARG" ;; # TODO F) FORCE=1 ;; h) usage ; bailout 0 ;; s) SUITE="$OPTARG" ;; @@ -149,15 +148,15 @@ fi # does this suck? YES! if [ -n "$SUITE" ] ; then - sed -ie "s/SUITE=.*/SUITE=\"$SUITE\"/" $LIVE_CONF + sed -i "s/SUITE=.*/SUITE=\"$SUITE\"/" $LIVE_CONF DIST="\|\ etch\ \|\ stable\ \|\ lenny\ \|\ testing\ \|\ sid\ \|\ unstable\ " - sed -ie "s/\(deb .\+\)\([ \t]+\)$DIST\([ \t]+\)\(main \)/\1\2 $SUITE \3\4/" $LIVE_CONF - sed -ie "s/\(deb .\+\)\([ \t]+\)$DIST\([ \t]+\)\(main \)/\1\2 $SUITE \3\4/" /etc/grml/fai/apt/sources.list + sed -i "s/\(deb .\+\)\([ \t]+\)$DIST\([ \t]+\)\(main \)/\1\2 $SUITE \3\4/" $LIVE_CONF + sed -i "s/\(deb .\+\)\([ \t]+\)$DIST\([ \t]+\)\(main \)/\1\2 $SUITE \3\4/" /etc/grml/fai/apt/sources.list DIST='\"etch\|=\"stable=\"lenny=\"testing=\"sid=\"unstable' - sed -ie "s#FAI_DEBOOTSTRAP=$DIST#FAI_DEBOOTSTRAP=\"$SUITE#" $LIVE_CONF - sed -ie "s#FAI_DEBOOTSTRAP=$DIST#FAI_DEBOOTSTRAP=\"$SUITE#" /etc/grml/fai/make-fai-nfsroot.conf + sed -i "s#FAI_DEBOOTSTRAP=$DIST#FAI_DEBOOTSTRAP=\"$SUITE#" $LIVE_CONF + sed -i "s#FAI_DEBOOTSTRAP=$DIST#FAI_DEBOOTSTRAP=\"$SUITE#" /etc/grml/fai/make-fai-nfsroot.conf fi # }}} -- 2.1.4 From 79090b4fb2c828caea8a4d1eb8db6f30d9fa355b Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 11:33:03 +0200 Subject: [PATCH 04/16] First version of GRML_FALL; update docs --- docs/grml-live.txt | 9 +- etc/grml/fai/config/package_config/GRML_FULL | 2085 +++++++++++++++++++++++++- etc/grml/fai/grml/grml_cleanup_chroot | 2 +- 3 files changed, 2091 insertions(+), 5 deletions(-) diff --git a/docs/grml-live.txt b/docs/grml-live.txt index 9c0d88a..932e7c6 100644 --- a/docs/grml-live.txt +++ b/docs/grml-live.txt @@ -255,7 +255,8 @@ harddisk installation ships all you need] * enough free disk space; at least 800MB are required for a minimal grml-live run (\~400MB for the chroot [$CHROOT_TARGET], \~150MB for the build target [$BUILD_TARGET] and \~150MB for the resulting ISO [$ISO_TARGET] plus some -temporary files) +temporary files), if you plan to use GRML_FULL you should have at least 4GB of +total free disk space * fast network access for retreiving the Debian packages used for creating the chroot (check out "local mirror" and "NFSROOT" to workaround this problem as far @@ -380,7 +381,11 @@ Known TODOs ----------- * "fai dirinstall" does not seem to always exit according to what happend during -the build; make sure to exit on any error +the build; make sure to exit on any error (check logs for stuff like "dpkg: +error processing" [software.log], "FAILED with exit code" [shell.log],...) + +* support something like a directory /etc/grml/fai/packages to install +additional Debian packages without the need for a Debian repository * document the available classes in more detail diff --git a/etc/grml/fai/config/package_config/GRML_FULL b/etc/grml/fai/config/package_config/GRML_FULL index ad95a25..0091d7d 100644 --- a/etc/grml/fai/config/package_config/GRML_FULL +++ b/etc/grml/fai/config/package_config/GRML_FULL @@ -1,4 +1,2085 @@ PACKAGES aptitude -# TODO! -vim vim-addon-manager vim-common vim-gtk vim-gui-common vim-latexsuite vim-python vim-ruby vim-runtime vim-scripts vim-vimoutliner +# TODO: get rid of all packages that are libs/dependencies only; +# identify all I386-only packages + +## Known problems, TODO: + +# 3ware-3dm2-binary: problem with +# openssl req -new -x509 -nodes -out /etc/3dm2/3dm2.pem -keyout /etc/3dm2/3dm2.pem -days 365 +# of /var/lib/dpkg/info/3ware-3dm2-binary.postinst + +# apt-listbugs, fails due to: +# // DPkg::Pre-Install-Pkgs {"/usr/sbin/apt-listbugs apt || exit 10"}; +# in /etc/apt/apt.conf.d/10apt-listbugs +# with +# E: Sub-process /usr/bin/dpkg returned an error code (1) +# E: Sub-process /usr/sbin/apt-listbugs apt || exit 10 returned an error code (10) + +# a2ps fails with: +#Setting up a2ps (1:4.13c~rc5-1) ... +#ERROR: emacsen-common being used before being configured. +#ERROR: This is likely a bug in the a2ps package, which needs to +#ERROR: add one of the appropriate dependencies. +#ERROR: See /usr/share/doc/emacsen-common/debian-emacs-policy.gz +#ERROR: for details. +#dpkg: error processing a2ps (--configure): +# subprocess post-installation script returned error exit status 2 + +# bandwidthd-pgsql fails with: +#Preconfiguring packages ... +#cp: cannot stat `/usr/share/doc/bandwidthd-pgsql/bandwidthd-pgsql.conf': No such file or directory +#bandwidthd-pgsql failed to preconfigure, with exit status 1 + +# wvdial executes 'wvdialconf /etc/wvdial.conf': +#Setting up wvdial (1.56-1.2) ... +#Editing `/etc/wvdial.conf'. +# +#Scanning your serial ports for a modem. +# +#Modem Port Scan<*1>: S0 S1 S2 S3 +#WvModem<*1>: Cannot get information for serial port. +#ttyUSB0<*1>: ATQ0 V1 E1 -- OK +#[...] + +# vifm: +#Setting up vifm (0.3-2) ... +#dpkg: error processing vifm (--configure): +# subprocess post-installation script returned error exit status 1 + +# snort (snort, snort-common, snort-rules-default): +#Selecting previously deselected package snort. +#Unpacking snort (from .../snort_2.7.0-3_i386.deb) ... +#mkdir: cannot create directory `/var/log/fai/dirinstall/grml': No such file or directory +#dpkg: error processing /var/cache/apt/archives/snort_2.7.0-3_i386.deb (--unpack): +# subprocess pre-installation script returned error exit status 1 + +# gsm-utils: +# creates a group with GUID 1000 => #353967 + +# ivtv-utils: +# ships /usr/include/linux/ivtv.h => #443165 + +## End-of-TODO + +## Warnings: + +# /var/lib/dpkg/info/tidev-modules-2.6.22-grml.postinst: line 9: update-devfsd: command not found + +# The update-modules command is deprecated and should not be used! +# -> used by: +# dumputils evms ipx irda-utils mt-st rng-tools setserial tidev-modules-2.6.22-grml toshutils udftools + +## End-of-Warnings + +# grml specific packages: +3ware-cli-binary +aamath +advchk +aesutil +afflib +amap +asleap +bar +base64 +bfa +bkp +btsco +cmospwd +cpuburn-in-binary +ctapi-cyberjack +ctris +dcfldd +dd-rhelp +ded +deletemail +detox +dired +dupmerge +dupseek +dynamic-disk +elizatalk +ex +ext3rminator +firescope +ftpbackup +fvwm-crystal-minimal +gateguardian +gatling +gifshuffle +glipper-nognome +grml +grml2hd +grml2hd-utils +grml2usb +grml-autoconfig +grml-crypt +grml-ddcxinfo +grml-debian-keyring +grml-debootstrap +grml-debugtools +grml-desktop +grml-docs +grml-etc +grml-etc-core +grml-files +grml-firefox +grml-hwinfo +grml-laptop +grml-mercurial-utils +grml-network +grml-policyrcd +grml-pylib +grml-rebuildfstab +grml-saveconfig +grml-scanpartitions +grml-scripts +grml-sectools +grml-shlib +grml-templates +grml-terminalserver +grml-terminalserver-data +grml-tips +grml-usleep +grml-vpn +grml-x +heirloom-sh +histring +hydra +i855crt +icmp-mtu +icmp-quench +icmp-reset +ipw-firmware +lame +latextug +lcdtest +md5deep +minised +msgid-chooser +nat-traverse +ncp +pip +prism54-firmware +prosilla +pspax +ptfinder +rainbowcrack +rootsh +salvage-ntfs +scrounge-ntfs +shadowfs +shish +shmux +sitar +smap +speechd-up +ssdeep +sudosh +svn-ssh-wrappers +tal +texttools-doc +thc-ipv6 +tlswrap +tpm-tools +trapdoor2 +trousers +udev +upgrade-oldest +zfs-fuse +zsh-lovers + +# official Debian packages: +2vcard +3270-common +4g8 +915resolution +9base +9menu +abcde +abook +acct +ace-of-penguins +acl +acpi +acpi-support +acpid +acpidump +acpitail +acpitool +adduser +aespipe +aewan +afio +aggregate +aircrack-ng +airsnort +ajaxterm +alien +alsa-base +alsa-oss +alsa-utils +alsaplayer-alsa +alsaplayer-common +alsaplayer-gtk +alsaplayer-jack +alsaplayer-oss +amanda-client +amanda-common +anacron +antiword +aoetools +apache2-mpm-prefork +apache2-utils +apache2.2-common +apcupsd +apcupsd-cgi +apel +apf-client +apf-server +apg +apmd +apt +apt-dpkg-ref +apt-file +apt-listchanges +apt-show-source +apt-show-versions +apt-spy +apt-src +apt-transport-https +apt-utils +apt-zip +aptitude +aptsh +apwal +ara +archivemail +argus-client +aria2 +arj +arp-scan +arping +arptables +arpwatch +array-info +array-util +arrayprobe +ascii +ascii2binary +asciidoc +ash +asn1c +asr-manpages +astyle +asused +at +aterm +atftpd +athcool +athena-jot +atitvout +atop +atsar +attr +aub +aufs-tools +aumix +auto-apt +autoconf +automake +automake1.4 +automake1.7 +automake1.8 +automake1.9 +autopsy +autossh +autotools-dev +avahi-daemon +aview +away +awesfx +axel +axp +backup-manager +backup2l +backuppc +bacula-common +bacula-console +bacula-fd +balance +base-files +base-passwd +bash +bash-builtins +bash-doc +bash-minimal +bash-static +bastille +bazaar +bb +bbe +bc +bchunk +bcrelay +bcrypt +beep +bfbtester +biabam +bibcursed +biew +bin86 +binclock +bind9 +bind9-host +binfmt-support +binfmtc +bing +binstats +binutils +bison +bitlbee +bittornado +bittorrent +bkhive +blktrace +bluetooth-alsa +bluez-hcidump +bluez-utils +bmon +bonnie++ +bootchart +boxes +bridge-utils +brltty +brltty-flite +bsdgames +bsdiff +bsdmainutils +bsdtar +bsdutils +bsign +btscanner +buffer +build-essential +burn +busybox +bvi +bwm-ng +bzip2 +bzr +c3270 +ca-certificates +cabber +cabextract +caca-utils +cadaver +calcurse +calife +camserv +capiutils +catdoc +catdvi +cbm +cbrowser +ccache +ccal +ccontrol +ccrypt +ccze +cd-discid +cdbackup +cdbs +cdck +cdda2wav +cddb +cdebootstrap +cdecl +cdparanoia +cdpr +cdrbq +cdrdao +cdrecord +cdrskin +cdtool +cedet-common +centericq-common +centerim-common +centerim-utf8 +cfengine2 +cfv +cgdb +check +check +cheops +chkrootkit +chrootuid +clamav +clamav-base +clamav-daemon +clamav-freshclam +clamav-getfiles +clamav-testfiles +clex +clive +cloop-utils +cmatrix +cmus +codeville +colorgcc +compartment +concalc +configure-debian +connect-proxy +conntrack +console-common +console-data +console-terminus +console-tools +conspy +convmv +coreutils +corkscrew +cowdancer +cowsay +cpio +cpipe +cplay +cpp +cpp-2.95 +cpp-4.1 +cproto +cpu +cpuburn +cpufrequtils +cpuid +cpulimit +crack +crack-common +cracklib-runtime +cracklib2 +cramfsprogs +cron +crosshurd +cryopid +cryptcat +cryptsetup +cscope +csh +csstidy +csync2 +ctioga +ctorrent +ctrlproxy +cu +cuetools +cups-pdf +cupsys +cupsys-bsd +cupsys-client +cupsys-common +curl +curlftpfs +cvs +cvs-buildpackage +cvs2cl +cvsconnect +cvsdelta +cw +cwcp +daemon +dante-client +dar +darcs +dares +dares-qt +dash +davfs2 +db4.3-util +dbishell +dbs +dbus +dbus-x11 +dc +dconf +dcraw +dctrl-tools +ddccontrol +ddccontrol-db +ddclient +ddrescue +dds2tar +debarchiver +debconf +debconf-i18n +debconf-utils +debdelta +debhelper +debian-archive-keyring +debian-goodies +debian-reference-common +debian-reference-en +debianutils +debmake +debmirror +debootstrap +deborphan +debsecan +debsigs +debsums +defoma +defrag +detachtty +devio +devscripts +devtodo +dh-kpatches +dh-make +dh-make-perl +dhcp3-client +dhcp3-common +dhcp3-server +dhcpdump +dhcping +di +diakonos +dialog +dict +diction +dictionaries-common +dietlibc +dietlibc-dev +diff +diffstat +dillo +ding +dir2ogg +dirdiff +directvnc +dirmngr +dirvish +disktype +distcc +distmp3 +dlint +dmidecode +dmraid +dmsetup +dns2tcp +dnsmasq +dnsproxy +dnstracer +dnsutils +docbook +docbook-dsssl +docbook-to-man +docbook2odf +dog +doscan +dosfstools +dov4l +doxygen +dpatch +dpkg +dpkg-awk +dpkg-dev +dpkg-ftp +dpkg-multicd +dpkg-repack +dpkg-ruby +dpkg-sig +dput +drbd8-utils +drbdlinks +driftnet +dropbear +dsbltesters +dselect +dsh +dsniff +dstat +dtach +dump +dumputils +duplicity +dupload +durep +dvb-utils +dvd+rw-tools +dvdbackup +dvdisaster +dvi2tty +dvipng +dviutils +dwm +dwm-tools +dynafont +e2fslibs +e2fsprogs +e2tools +e2undel +e3 +ebtables +eciadsl +ecryptfs-utils +ed +edbrowse +eflite +eieio +eject +electric-fence +elfkickers +elfsh +elinks +elmo +elscreen +elvis +elvis-common +emacs +emacs22 +emacs22-bin-common +emacs22-common +emacsen-common +emcast +emelfm +emuga +encfs +enscribe +enscript +equivs +erc +es +esound-common +espeak +espeak-data +eterm +etherwake +ethstatus +ethtool +etpan-ng +ettercap-common +ettercap-gtk +euro-support +evilwm +evms +evms-bootdebug +evms-cli +evms-ncurses +exifprobe +exiftran +exiv2 +expect +ext2resize +exuberant-ctags +faad +facter +fai-client +fai-doc +fai-server +fail2ban +fake +fakechroot +fakeroot +farpd +fatresize +fatsort +fbgrab +fbi +fblogo +fbset +fcrackzip +fdflush +fdupes +fdutils +feh +fetchmail +fgetty +file +file-rc +filepp +filetraq +fileutils +findimagedupes +findutils +finger +firehol +fish +fl-cow +flashrom +flawfinder +flex +flexbackup +flite +fluxbox +fluxconf +fnfx-client +fnfxd +fnord +fondu +fontconfig +fontconfig-config +fonty +foremost +fortune-mod +fortunes-debian-hints +fortunes-min +fping +fprobe +fprobe-ulog +fragroute +freeglut3 +freeradius +freeradius-ldap +freesweep +ftp +ftp-upload +ftpcopy +ftpwatch +fttools +funionfs +funny-manpages +fuse-utils +fusedav +fuseiso +fuseiso9660 +fusesmb +fvwm +fwlogwatch +fxload +g++ +g++-4.1 +gaffitter +gamin +gawk +gcal +gcc +gcc-4.1 +gcc-4.1-base +gcc-4.2-base +gcolor2 +gcom +gdb +gddrescue +gdk-imlib11 +gems +genders +genisoimage +geresh +getmail4 +gettext +gettext-base +gettext-el +gfs-tools +gftp-common +gftp-text +giblib1 +gif2png +giftcurs +git-core +gitweb +gkermit +gkrellm +gkrellm-reminder +gkrellm-volume +gkrellm-x86info +gkrellmd +gkrellmitime +gkrellmwireless +gkrellshoot +gkrellweather +glark +gmailfs +gmrun +gnu-fdisk +gnuhtml2latex +gnupg +gnupg-agent +gnutls-bin +gocr +gpart +gpgsm +gpgv +gphoto2 +gpm +gq +gqcam +gqview +grabc +graphviz +grep +grepmail +groff +groff-base +grub +gs +gs-common +gs-esp +gscanbus +gsfonts +gsfonts-x11 +gtkam +guessnet +gv +gzip +gzrt +habak +hal +hal-info +haproxy +harden-remoteaudit +harden-tools +hasciicam +hddtemp +hdparm +hexedit +hfsplus +hfsprogs +hfsutils +hgsvn +hibernate +hicolor-icon-theme +hnb +honeyd +hostap-utils +hostapd +hostname +hotkey-setup +hotkeys +hotswap-text +hoz +hpijs +hping2 +hping3 +ht +htcheck +html2text +htop +httperf +httping +httptunnel +hunt +hwdata +hwinfo +hwtools +i810switch +i8kutils +ibod +ibritish +icecast2 +icedax +iceweasel +iceweasel-webdeveloper +icheck +icmpush +id3 +id3v2 +idesk +idn +idswakeup +ifenslave-2.6 +ifmetric +ifplugd +ifrename +ifstat +iftop +ifupdown +ifupdown-scripts-zg2 +igal +ihu +ii +iisemulator +ike-scan +im-switch +imagemagick +imapcopy +imapfilter +imediff2 +imlib-base +imlib11 +imsniff +imwheel +inadyn +indent +info +info2www +ingerman +initramfs-tools +initscripts +ink +inotail +inoticoming +inotify-tools +input-utils +ation-report +intltool-debian +iodine +ipcalc +iperf +ipgrab +ipkungfu +ipmitool +ipppd +iprelay +iproute +ipsec-tools +iptables +iptraf +iptstate +iputils-ping +iputils-tracepath +ipv6calc +ipvsadm +ipx +ipxripd +ipython +irb +irb1.8 +ircii +irda-utils +irqbalance +irssi +irssi-plugin-xmpp +irssi-scripts +irssi-text +isakmpd +isdnactivecards +isdnutils-base +isdnvboxclient +isic +ispell +isync +itop +iwatch +jack +jackd +jail +jailer +jailtool +jed +jed-common +jed-extra +jfsutils +jhead +jigit +jigl +jikes +jmon +joe +john +joystick +jp2a +juke +jwm +kanif +kbd-compat +keepalived +kernel-package +ketchup +kexec-tools +keychain +keyutils +kismet +klibc-utils +knockd +knocker +konwert +konwert-filters +kpartx +kqemu-common +krb5-config +krb5-user +ksh +kvm +labrea +lacheck +lanmap +laptop-detect +laptop-mode-tools +latex-beamer +latex-mk +latex-xcolor +latexmk +lbdb +lcap +ld.so.preload-manager +ldap-utils +ldapscripts +ldapvi +lde +leave +less +lft +lftp +libaa-bin +lighttpd +lilo +linda +links +links2 +linneighborhood +lintian +linux-sound-base +linux-wlan-ng +linuxdoc-tools +linuxlogo +listadmin +live-initramfs +lkl +lltag +lm-sensors +loadlin +localepurge +locales +lockfile-progs +loco +log2mail +logapp +login +logrotate +logtools +logwatch +lomoco +loop-aes-utils +lrzsz +lsb-base +lsb-release +lsdvd +lshw +lslk +lsof +lspowertweak +lsscsi +ltrace +lua50 +luasocket +lvm2 +lwatch +lynx +lzma +lzop +m17n-db +m4 +macchanger +macutils +madison-lite +madwifi-tools +magicrescue +mailcheck +maildirsync +mailfilter +mailx +mairix +make +makedev +makejail +makepasswd +man-db +manpages +manpages-dev +markdown +mathomatic +mawk +mb2md +mbmon +mboxcheck +mboxgrep +mbr +mc +mcabber +mcelog +mdadm +mdetect +medusa +memstat +memtest86+ +memtester +menu +menu-xdg +mercurial +mesa-utils +metamail +mg +mgetty +mgp +migrationtools +mii-diag +mikmod +mime-support +minicom +mirrordir +mixmaster +mkcue +mkisofs +mklibs-copy +mknbi +mksh +mktemp +mmv +mobilemesh +moc +modconf +module-assistant +module-init-tools +molly-guard +monit +moosic +moreutils +most +mount +mozilla-imagezoom +mp +mp3blaster +mp3c +mp3gain +mp3info +mp3splt +mp3val +mp3wrap +mpack +mpage +mpc +mpg123-alsa +mpg321 +mplayer +mplayer-skin-blue +mpt-status +mrb +mrxvt +mrxvt-common +ms-sys +msmtp +msort +mt-st +mtd-tools +mtools +mtp-tools +mtpaint +mtr-tiny +multi-aterm +multipath-tools +multitail +multitee +muscletools +mutella +mutt +muttprofile +mysql-client +mysql-client-5.0 +mysql-common +naim +nano +nasm +nast +nbtscan +ncc +ncdu +ncftp +ncmpc +ncpfs +ncurses-base +ncurses-bin +ncurses-term +ndisc6 +ndiswrapper-common +ndiswrapper-utils +ndiswrapper-utils-1.1 +ndiswrapper-utils-1.9 +ne +nedit +nemesis +nessus-plugins +nessusclient +nessusd +net-tools +netbase +netcat +netcat6 +netdiag +netdiscover +nethack-common +nethack-console +nethogs +netmask +netpbm +netpipe-tcp +netpipes +netrik +netris +netsed +netstat-nat +netsurf +netwag +netwox +newsbeuter +nfs-common +nfs-kernel-server +ngrep +nictools-nopci +nictools-pci +nikto +nload +nmap +nmapfe +normalize-audio +noshell +nsd +nstx +ntfs-3g +ntfsprogs +ntlmaps +ntp +ntpdate +nufw +nullidentd +num-utils +nutcpc +nvi +nvidia-xconfig +nvtv +o3read +obconf +obexftp +obexpushd +odt2txt +offlineimap +oinkmaster +olsrd +olsrd-plugins +op +opalmod +open-iscsi +openafs-client +openafs-krb5 +openbox +openbsd-inetd +openipmi +openjade +opensc +openssh-client +openssh-server +openssl +openvpn +ophcrack +opie-client +orange +orpheus +os-prober +osdsh +osiris +oss-compat +p0f +p3nfs +p3scan +p7zip +packeth +packit +pads +paketto +pal +pamusb-tools +par +par2 +paris-traceroute +parted +partimage +partimage-server +passwd +patch +patcher +patchutils +pavuk +pax +pax-utils +paxctl +pbuilder +pbzip2 +pciutils +pcmciautils +pconf-detect +pconsole +pcopy +pcregrep +pcscd +pdfcube +pdfjam +pdksh +pdmenu +pdns-backend-ldap +pdns-backend-pgsql +pdns-backend-pipe +pdns-backend-sqlite +pdns-recursor +pdns-server +pdsh +pdumpfs +pekwm +perforate +perl +perl-base +perl-doc +perl-modules +perl-suid +perl-tk +perlmagick +pfqueue +pgf +pia +pilot-link +pinentry-curses +pinfo +pisg +piuparts +pkg-config +pktstat +playmidi +playmp3list +plptools +pmidi +pmount +pngtools +pnm2ppa +pnputils +po-debconf +podget +podracer +policyrcd-script-zg2 +polipo +pop3browser +pork +portmap +portsentry +posh +poster +postfix +postfix-ldap +postfix-pcre +postgresql-client-8.2 +postgresql-client-common +potion +powermgmt-base +powernowd +powertop +powertweak-gtk +powertweakd +pperl +ppmd +ppp +pppconfig +pppoe +pppoeconf +pppstatus +pptp-linux +pptpd +preload +preview-latex-style +prismstumbler +privbind +privoxy +procinfo +procmail +procmeter3 +procps +proxsmtp +proxychains +proxycheck +psad +pscan +psfontmgr +psh +psmisc +pssh +pstack +pstotext +psutils +pterm +ptunnel +pump +pv +pwgen +pwman3 +pxe +pxfw +pydb +pymacs +python +python-apt +python-cddb +python-celementtree +python-central +python-crypto +python-dbus +python-elementtree +python-eyed3 +python-fuse +python-gnupginterface +python-gobject +python-id3 +python-libgmail +python-minimal +python-pexpect +python-pyao +python-pycallgraph +python-pymad +python-pyogg +python-pysqlite2 +python-pyvorbis +python-scapy +python-setuptools +python-subversion +python-support +python-twisted-bin +python-urwid +python2.4 +python2.4-minimal +python2.5 +python2.5-minimal +pytris +qc-usb-utils +qjackctl +qprof +qpxtool +qtparted +quilt +quota +racoon +radeontool +radio +raggle +rain +rake +randomize-lines +ras +ratmenu +ratpoison +rats +rblcheck +rc +rcov +rcs +rdate +rdesktop +rdiff +rdiff-backup +rdoc +rdoc1.8 +read-edid +readline-common +readpst +realpath +realtime-lsm +recode +recordmydesktop +recover +recoverjpeg +redir +reiser4progs +reiserfsprogs +remind +renameutils +reniced +replicator +reportbug +reprepro +resolvconf +retty +rgpsp +rinetd +rinse +rkhunter +rlwrap +rman +rng-tools +rofs +root-tail +router-audit-tool +rox-filer +rpl +rpm +rrdtool +rsnapshot +rssh +rsync +rt2400 +rt2500 +rtorrent +rubilicious +ruby +ruby-prof +ruby1.8 +ruby1.8-examples +rungetty +rxvt-beta +rxvt-unicode +s3cmd +s3switch +saidar +sam +samba +samba-common +samdump2 +sash +sbm +sc +scalpel +scanlogd +scanmem +scantv +schedtool +scli +scmxx +scons +scponly +screen +screenie +scrot +scsi-idle +scsiadd +scsitools +sdate +sdd +sdparm +secure-delete +secvpn +sed +sendemail +sendfile +sendip +sensord +ser2net +setcd +setserial +sfind +sformat +sg3-utils +sgml-base +sgml-data +sgmltools-lite +sgrep +shaperd +shared-mime-info +sharutils +shc +shorewall +shtool +sic +sigit +sing +sip-tester +sipsak +sitecopy +sjog +sl +slapd +slat +slay +sleepd +sleepenh +sleuthkit +sloccount +slrn +slrnface +slrnpull +slsh +slurm +sm +smake +smartmontools +smb-nat +smbc +smbclient +smbfs +smbldap-tools +smbnetfs +sn +snarf +sniffit +snmp +snoopy +snowdrop +snownews +socat +sound-recorder +sox +sp +speech-dispatcher +speechd-el +speedometer +speex +spell +spellutils +spicctrl +splint +splitvt +sqlite +sqlite3 +squashfs-tools +squid +squid-common +squidview +src2tex +srcinst +ssed +ssh +ssh-askpass +sshfs +ssl-cert +ssldump +ssmping +star +starttls +statgrab +statserial +stealth +stegdetect +steghide +stow +strace +streamripper +stress +stunnel4 +subversion +subversion-tools +sucrack +sudo +sudoku +super +sux +swaks +swapd +swatch +swish++ +symlinks +synergy +syrep +sysfsutils +syslinux +syslog-ng +sysprof +sysstat +systune +sysvinit +sysvinit-utils +t-prot +tagtool +tailor +taktuk +tar +tart +tcc +tcl8.3 +tcl8.4 +tcng +tcpd +tcpdump +tcpick +tcpreen +tcpreplay +tcpspy +tcpstat +tcptrace +tcptraceroute +tcptrack +tcputils +tcpxtract +tcsh +tct +tdl +telak +telnet-ssl +telnetd-ssl +testdisk +tetradraw +tetrinet-client +tex-common +texi2html +texify +texinfo +texlive-base +texlive-base-bin +texlive-common +texlive-doc-base +texlive-fonts-recommended +texlive-lang-german +texlive-latex-base +texlive-latex-recommended +texpower +textdraw +thttpd +tidy +timeout +tin +tinyhoneypot +tinysnmp-tools +tk8.4 +tla +tmpreaper +tn5250 +tnef +tofrodos +toilet +toilet-fonts +tor +toshset +toshutils +tpconfig +tpp +traceproto +traceroute +transfig +trayer +tree +treil +trickle +tshark +tsocks +tspc +tss +ttf-bitstream-vera +ttf-dejavu +tthsum +ttmkfdir +ttysnoop +tweak +twm +twolame +txt2man +txt2pdbdoc +txt2regex +type1inst +tzdata +ucf +udftools +udpcast +udptunnel +ulogd +unace +unclutter +uncrustify +uni2ascii +unicode +unifont +unionfs-tools +unison +unison2.9.1 +units +uniutils +unixcw +unp +unrar-free +unrtf +unzip +unzoo +update-inetd +upstreamdev +upx-ucl +urlscan +urlview +uruk +usbutils +usbview +user-setup +userinfo +uswsusp +util-linux +util-linux-locales +uudeview +v4l-conf +vbetool +vbindiff +vblade +vcdtools +vde2 +vera +vfu +videogen +viewglob +vim +vim-addon-manager +vim-common +vim-gtk +vim-gui-common +vim-latexsuite +vim-python +vim-ruby +vim-runtime +vim-scripts +vim-vimoutliner +vinetto +vkeybd +vlan +vlock +vnc-common +vncommand +vnstat +vobcopy +vorbis-tools +vorbisgain +vpnc +vrfy +vrms +vsftpd +vtgrab +vtun +w3m +w3m-el +w3m-img +w9wm +wacom-tools +wajig +wakeonlan +wamerican-small +wapiti +waproamd +wavemon +wcalc +wdiff +webcam +webcam-server +webcamd +webcheck +webcpp +weblint-perl +weechat +weechat-common +weechat-curses +weechat-plugins +weechat-scripts +weplab +wget +whiptail +whois +whowatch +wiggle +wikipedia2text +wikipediafs +windowlab +wipe +wireless-tools +wireshark +wireshark-common +wmaloader +wmctrl +wmii +wmmisc +wodim +wondershaper +workbone +wpasupplicant +wprint +wput +wwwconfig-common +wyrd +x-ttcidfont-conf +x11-common +x11vnc +x2x +x86info +xar +xautolock +xautomation +xaw3dg +xawtv +xawtv-plugins +xbacklight +xbase-clients +xbitmaps +xcardii +xcb +xclip +xcursor-themes +xdelta +xdelta3 +xdesktopwaves +xdialog +xfaces +xfig +xfonts-100dpi +xfonts-75dpi +xfonts-base +xfonts-biznet-100dpi +xfonts-biznet-75dpi +xfonts-biznet-base +xfonts-bolkhov-cp1251-75dpi +xfonts-bolkhov-cp1251-misc +xfonts-encodings +xfonts-intl-european +xfonts-scalable +xfonts-terminus +xfonts-utils +xfs +xfsdump +xfsprogs +xinetd +xjed +xkb-data +xkbset +xloadimage +xlockmore +xml-core +xmlindent +xmlstarlet +xmms2 +xmms2-client-cli +xmms2-core +xmms2-plugin-alsa +xmms2-plugin-id3v2 +xmms2-plugin-jack +xmms2-plugin-mad +xmms2-plugin-vorbis +xmove +xnee +xnest +xosd-bin +xpdf +xpdf-common +xpdf-reader +xpdf-utils +xprobe +xresprobe +xrsh +xsel +xserver-xorg +xserver-xorg-core +xserver-xorg-input-aiptek +xserver-xorg-input-all +xserver-xorg-input-elo2300 +xserver-xorg-input-elographics +xserver-xorg-input-evdev +xserver-xorg-input-evtouch +xserver-xorg-input-hyperpen +xserver-xorg-input-joystick +xserver-xorg-input-kbd +xserver-xorg-input-mouse +xserver-xorg-input-penmount +xserver-xorg-input-synaptics +xserver-xorg-input-vmmouse +xserver-xorg-input-void +xserver-xorg-input-wacom +xserver-xorg-video-all +xserver-xorg-video-amd +xserver-xorg-video-apm +xserver-xorg-video-ark +xserver-xorg-video-ati +xserver-xorg-video-chips +xserver-xorg-video-cirrus +xserver-xorg-video-cyrix +xserver-xorg-video-dummy +xserver-xorg-video-fbdev +xserver-xorg-video-glint +xserver-xorg-video-i128 +xserver-xorg-video-i740 +xserver-xorg-video-i810 +xserver-xorg-video-imstt +xserver-xorg-video-intel +xserver-xorg-video-ivtv +xserver-xorg-video-mga +xserver-xorg-video-neomagic +xserver-xorg-video-newport +xserver-xorg-video-nsc +xserver-xorg-video-nv +xserver-xorg-video-rendition +xserver-xorg-video-s3 +xserver-xorg-video-s3virge +xserver-xorg-video-savage +xserver-xorg-video-siliconmotion +xserver-xorg-video-sis +xserver-xorg-video-sisusb +xserver-xorg-video-tdfx +xserver-xorg-video-tga +xserver-xorg-video-trident +xserver-xorg-video-tseng +xserver-xorg-video-v4l +xserver-xorg-video-vesa +xserver-xorg-video-vga +xserver-xorg-video-via +xserver-xorg-video-vmware +xserver-xorg-video-voodoo +xsltproc +xsteg +xtail +xterm +xtermcontrol +xtermset +xtrace +xtrlock +xtv +xutils +xutils-dev +xvfb +xvkbd +xvncviewer +xwatchwin +xwit +xzoom +yacpi +yaird +yasr +yeahconsole +yersinia +youtube-dl +ysm +zec +zeroconf +zgv +zile +zip +zlib1g +zoidberg +zsh +zsh-doc +zsh-static +zssh +zsync +zzuf + +# non-free: +abs-guide +agrep +atmel-firmware +bluez-firmware +chntpw +dvdrtools +figlet +firmware-ipw3945 +firmware-iwlwifi +firmware-qlogic +glimpse +iozone3 +ipw3945d +irpas +lha +lmbench +manpages-posix +netperf +nttcp +python-profiler +rar +sl-modem-daemon +tth +unrar +zd1211-firmware + +# x86/32bit (class I386) specific packages: +PACKAGES aptitude I386 + +aufs-modules-2.6.22-grml +drbd8-module-2.6.22-grml +exmap-modules-2.6.22-grml +grml-kerneladdons-2.6.22 +gspca-modules-2.6.22-grml +ipw3945-modules-2.6.22-grml +kqemu-modules-2.6.22-grml +linux-doc-2.6.22-grml +linux-headers-2.6.22-grml +linux-image-2.6.22-grml +linux-kernel-headers-grml +madwifi-modules-2.6.22-grml +misdn-modules-2.6.22-grml +ndiswrapper-modules-2.6.22-grml +openafs-modules-2.6.22-grml +qc-usb-modules-2.6.22-grml +realtime-lsm-module-2.6.22-grml +sl-modem-modules-2.6.22-grml +sysprof-module-2.6.22-grml +tidev-modules-2.6.22-grml +truecrypt-2.6.22-grml diff --git a/etc/grml/fai/grml/grml_cleanup_chroot b/etc/grml/fai/grml/grml_cleanup_chroot index a8c2a38..35a3462 100755 --- a/etc/grml/fai/grml/grml_cleanup_chroot +++ b/etc/grml/fai/grml/grml_cleanup_chroot @@ -257,7 +257,7 @@ einfo "Cleaning and removing some misc files and directories" /etc/lvm/.cache 2>/dev/null rm -rf /tmp/* /var/tmp/* /var/tmp/.* /var/backups/* /.ssh /root/.ssh /home/*/.ssh \ /home/grml/* /home/grml/.??* /var/lib/texmf/ls-R /var/spool/texmf/ls-R \ - /var/lib/mysql /var/log/lilo_log.* 2>/dev/null + /var/lib/mysql /var/log/lilo_log.* /core* 2>/dev/null nuke /var/log /var/cache zero /var/local /var/log /var/spool \ /var/lib/games /var/cache/man \ -- 2.1.4 From 8f2c82bad21f1a2942b5164b1a6080b286ad3e01 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 12:23:55 +0200 Subject: [PATCH 05/16] clean up /usr/src/linux-headers-... in /etc/grml/fai/grml/grml_cleanup_chroot --- etc/grml/fai/grml/grml_cleanup_chroot | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/etc/grml/fai/grml/grml_cleanup_chroot b/etc/grml/fai/grml/grml_cleanup_chroot index 35a3462..73b2ae6 100755 --- a/etc/grml/fai/grml/grml_cleanup_chroot +++ b/etc/grml/fai/grml/grml_cleanup_chroot @@ -64,6 +64,10 @@ einfo "Setting up /etc/inittab" cp /etc/inittab.grml /etc/inittab eend $? +einfo "Cleaning up /usr/src/linux-headers-$KERNEL" +( cd /usr/src && make clean && make symlinks ) +eend $? + if [ -L /usr/include/linux ] ; then einfo "/usr/include/linux is ok" ; eend 0 elif [ -n "$GRML64" ] ; then -- 2.1.4 From f9e99174221e1035d0eec78ff68d0c65bdc3fba4 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 13:12:46 +0200 Subject: [PATCH 06/16] Unify classes --- etc/grml/fai/config/class/GRML_X.var | 21 --------------------- etc/grml/fai/config/class/XORG.var | 21 --------------------- etc/grml/fai/config/package_config/GRML_X | 17 ----------------- etc/grml/fai/config/package_config/XORG | 5 ----- .../config/scripts/{GRML_X => GRMLBASE}/32-xorg | 2 +- .../config/scripts/GRMLBASE/90-update-alternatives | 8 ++++++++ .../fai/config/scripts/GRMLBASE/98-clean-chroot | 14 ++++++++++++++ .../fai/config/scripts/GRML_SMALL/98-clean-chroot | 22 ---------------------- .../config/scripts/GRML_X/90-update-alternatives | 22 ---------------------- 9 files changed, 23 insertions(+), 109 deletions(-) delete mode 100644 etc/grml/fai/config/class/GRML_X.var delete mode 100644 etc/grml/fai/config/class/XORG.var delete mode 100644 etc/grml/fai/config/package_config/GRML_X delete mode 100644 etc/grml/fai/config/package_config/XORG rename etc/grml/fai/config/scripts/{GRML_X => GRMLBASE}/32-xorg (91%) delete mode 100755 etc/grml/fai/config/scripts/GRML_SMALL/98-clean-chroot delete mode 100755 etc/grml/fai/config/scripts/GRML_X/90-update-alternatives diff --git a/etc/grml/fai/config/class/GRML_X.var b/etc/grml/fai/config/class/GRML_X.var deleted file mode 100644 index 5bb0c7a..0000000 --- a/etc/grml/fai/config/class/GRML_X.var +++ /dev/null @@ -1,21 +0,0 @@ -# default values for installation. You can override them in your *.var files - -# allow installation of packages from unsigned repositories -FAI_ALLOW_UNSIGNED=1 - -CONSOLEFONT= -KEYMAP=us-latin1 - -# Set UTC=yes if your system clock is set to UTC (GMT), and UTC=no if not. -UTC=yes -TIMEZONE=Europe/Vienna - -# root password for the new installed linux system; md5 and crypt are possible -# pw is "fai" -ROOTPW='x' - -# MODULESLIST contains modules that will be loaded by the new system, -# not during installation these modules will be written to /etc/modules -# If you need a module during installation, add it to $kernelmodules -# in 20-hwdetect.source. But discover should do most of this job -# MODULESLIST="usbkbd ehci-hcd ohci-hcd uhci-hcd usbhid psmouse" diff --git a/etc/grml/fai/config/class/XORG.var b/etc/grml/fai/config/class/XORG.var deleted file mode 100644 index 5bb0c7a..0000000 --- a/etc/grml/fai/config/class/XORG.var +++ /dev/null @@ -1,21 +0,0 @@ -# default values for installation. You can override them in your *.var files - -# allow installation of packages from unsigned repositories -FAI_ALLOW_UNSIGNED=1 - -CONSOLEFONT= -KEYMAP=us-latin1 - -# Set UTC=yes if your system clock is set to UTC (GMT), and UTC=no if not. -UTC=yes -TIMEZONE=Europe/Vienna - -# root password for the new installed linux system; md5 and crypt are possible -# pw is "fai" -ROOTPW='x' - -# MODULESLIST contains modules that will be loaded by the new system, -# not during installation these modules will be written to /etc/modules -# If you need a module during installation, add it to $kernelmodules -# in 20-hwdetect.source. But discover should do most of this job -# MODULESLIST="usbkbd ehci-hcd ohci-hcd uhci-hcd usbhid psmouse" diff --git a/etc/grml/fai/config/package_config/GRML_X b/etc/grml/fai/config/package_config/GRML_X deleted file mode 100644 index b5efbc2..0000000 --- a/etc/grml/fai/config/package_config/GRML_X +++ /dev/null @@ -1,17 +0,0 @@ -PACKAGES aptitude - -dillo -fluxbox -gkrellm -grml-ddcxinfo -grml-desktop -grml-x -vim-gtk -xfonts-100dpi -xfonts-75dpi -xfonts-base -xorg -xserver-xorg-input-all -xserver-xorg-input-vmmouse -xserver-xorg-video-all -xterm xcursor-themes diff --git a/etc/grml/fai/config/package_config/XORG b/etc/grml/fai/config/package_config/XORG deleted file mode 100644 index cfe06c0..0000000 --- a/etc/grml/fai/config/package_config/XORG +++ /dev/null @@ -1,5 +0,0 @@ -PACKAGES aptitude -xorg xserver-xorg-video-all xserver-xorg-input-all -ttf-freefont type1inst -xscreensaver -xscreensaver-gl diff --git a/etc/grml/fai/config/scripts/GRML_X/32-xorg b/etc/grml/fai/config/scripts/GRMLBASE/32-xorg similarity index 91% rename from etc/grml/fai/config/scripts/GRML_X/32-xorg rename to etc/grml/fai/config/scripts/GRMLBASE/32-xorg index bc89808..60d61dc 100755 --- a/etc/grml/fai/config/scripts/GRML_X/32-xorg +++ b/etc/grml/fai/config/scripts/GRMLBASE/32-xorg @@ -1,5 +1,5 @@ #!/bin/sh -# Filename: /etc/grml/fai/config/scripts/GRML_X/32-xorg +# Filename: /etc/grml/fai/config/scripts/GRMLBASE/32-xorg # Purpose: make sure there does not exist /etc/X11/xorg.conf by default # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ diff --git a/etc/grml/fai/config/scripts/GRMLBASE/90-update-alternatives b/etc/grml/fai/config/scripts/GRMLBASE/90-update-alternatives index ba17d88..7825cab 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/90-update-alternatives +++ b/etc/grml/fai/config/scripts/GRMLBASE/90-update-alternatives @@ -14,5 +14,13 @@ if [ -r $target/usr/bin/vim.basic ] ; then $ROOTCMD update-alternatives --set editor /usr/bin/vim.basic fi +if [ -r $target/usr/bin/xterm ] ; then + $ROOTCMD update-alternatives --set x-terminal-emulator /usr/bin/xterm +fi + +if [ -r $target/etc/X11/cursors/whiteglass.theme ] ; then + $ROOTCMD update-alternatives --set x-cursor-theme /etc/X11/cursors/whiteglass.theme +fi + ## END OF FILE ################################################################# # vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=3 diff --git a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot index 02665f6..e66fcf7 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot +++ b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot @@ -10,6 +10,8 @@ set -u set -e +# TODO: use extra files and class names instead of environment variabes + # supported environment variables for grml_cleanup_chroot: # NOCOLORS: if set it disables colors in (debugging) output # LATEX_CLEANUP: remove some big directories of texlive (/usr/share/doc/texlive-*) @@ -17,6 +19,18 @@ set -e # FAST: skip some longer tasks # REMOVE_DOCS: rm -rf /usr/share/doc + /usr/share/info +if ifclass GRML_SMALL ; then + cp /etc/grml/fai/grml/grml_cleanup_chroot.small $target/root/ + $ROOTCMD sh -c "NOCOLORS=1 /root/grml_cleanup_chroot.small" + rm $target/root/grml_cleanup_chroot.small +fi + +if ifclass REMOVE_DOCS ; then + $ROOTCMD sh -c "NOCOLORS=1 REMOVE_DOCS=1 /root/grml_cleanup_chroot.small" + rm $target/root/grml_cleanup_chroot.small +fi + +# final cleanup cp /etc/grml/fai/grml/grml_cleanup_chroot $target/root/ $ROOTCMD sh -c "NOCOLORS=1 /root/grml_cleanup_chroot" rm $target/root/grml_cleanup_chroot diff --git a/etc/grml/fai/config/scripts/GRML_SMALL/98-clean-chroot b/etc/grml/fai/config/scripts/GRML_SMALL/98-clean-chroot deleted file mode 100755 index 1ff34af..0000000 --- a/etc/grml/fai/config/scripts/GRML_SMALL/98-clean-chroot +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# Filename: /etc/grml/fai/config/scripts/GRML_SMALL/98-clean-chroot -# Purpose: clean up chroot system -# Authors: grml-team (grml.org), (c) Michael Prokop -# Bug-Reports: see http://grml.org/bugs/ -# License: This file is licensed under the GPL v2 or any later version. -# Latest change: Mon Sep 17 17:36:11 CEST 2007 [mika] -################################################################################ - -set -u -set -e - -# supported environment variables of grml_cleanup_chroot.small: -# NOCOLORS: if set it disables colors in (debugging) output -# REMOVE_DOCS: rm -rf /usr/share/doc + /usr/share/info - -cp /etc/grml/fai/grml/grml_cleanup_chroot.small $target/root/ -$ROOTCMD sh -c "NOCOLORS=1 /root/grml_cleanup_chroot.small" -rm $target/root/grml_cleanup_chroot.small - -## END OF FILE ################################################################# -# vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=3 diff --git a/etc/grml/fai/config/scripts/GRML_X/90-update-alternatives b/etc/grml/fai/config/scripts/GRML_X/90-update-alternatives deleted file mode 100755 index 33ac271..0000000 --- a/etc/grml/fai/config/scripts/GRML_X/90-update-alternatives +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# Filename: /etc/grml/fai/config/scripts/GRML_X/90-update-alternatives -# Purpose: set up /etc/alternatives/* according to grml preferences -# Authors: grml-team (grml.org), (c) Michael Prokop -# Bug-Reports: see http://grml.org/bugs/ -# License: This file is licensed under the GPL v2 or any later version. -# Latest change: Sun Sep 16 23:18:02 CEST 2007 [mika] -################################################################################ - -set -u -set -e - -if [ -r $target/usr/bin/xterm ] ; then - $ROOTCMD update-alternatives --set x-terminal-emulator /usr/bin/xterm -fi - -if [ -r $target/etc/X11/cursors/whiteglass.theme ] ; then - $ROOTCMD update-alternatives --set x-cursor-theme /etc/X11/cursors/whiteglass.theme -fi - -## END OF FILE ################################################################# -# vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=3 -- 2.1.4 From aadaee58928e09263952ff90543024c65d426e4f Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 13:44:10 +0200 Subject: [PATCH 07/16] Unify use of /etc/grml/fai/grml/grml_cleanup_chroot --- docs/grml-live.txt | 3 +- .../fai/config/scripts/GRMLBASE/98-clean-chroot | 45 +++++++------ etc/grml/fai/grml/grml_cleanup_chroot | 75 +--------------------- .../fai/grml/grml_cleanup_chroot.latex_cleanup | 22 +++++++ etc/grml/fai/grml/grml_cleanup_chroot.no_online | 38 +++++++++++ etc/grml/fai/grml/grml_cleanup_chroot.remove_docs | 33 ++++++++++ etc/grml/fai/grml/grml_cleanup_chroot.small | 53 --------------- 7 files changed, 122 insertions(+), 147 deletions(-) create mode 100755 etc/grml/fai/grml/grml_cleanup_chroot.latex_cleanup create mode 100755 etc/grml/fai/grml/grml_cleanup_chroot.no_online create mode 100755 etc/grml/fai/grml/grml_cleanup_chroot.remove_docs delete mode 100755 etc/grml/fai/grml/grml_cleanup_chroot.small diff --git a/docs/grml-live.txt b/docs/grml-live.txt index 932e7c6..7a68af8 100644 --- a/docs/grml-live.txt +++ b/docs/grml-live.txt @@ -387,7 +387,8 @@ error processing" [software.log], "FAILED with exit code" [shell.log],...) * support something like a directory /etc/grml/fai/packages to install additional Debian packages without the need for a Debian repository -* document the available classes in more detail +* document the available classes in more detail (GRMLBASE, LATEX_CLEANUP, +NO_ONLINE, REMOVE_DOCS, GRML_SMALL,...) * add a check to make sure $TARGET is mounted rw,suid,dev? diff --git a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot index e66fcf7..88fd997 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot +++ b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot @@ -4,36 +4,43 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Mon Sep 17 17:36:13 CEST 2007 [mika] +# Latest change: Wed Sep 19 13:42:19 CEST 2007 [mika] ################################################################################ -set -u set -e +set -u -# TODO: use extra files and class names instead of environment variabes - -# supported environment variables for grml_cleanup_chroot: -# NOCOLORS: if set it disables colors in (debugging) output -# LATEX_CLEANUP: remove some big directories of texlive (/usr/share/doc/texlive-*) -# NOONLINE: disable functions that require working network setup -# FAST: skip some longer tasks -# REMOVE_DOCS: rm -rf /usr/share/doc + /usr/share/info +# remove some big directories when using class LATEX_CLEANUP: +if ifclass LATEX_CLEANUP ; then + cp /etc/grml/fai/grml/grml_cleanup_chroot.latex_cleanup $target/root/ + $ROOTCMD /root/grml_cleanup_chroot.latex_cleanup + rm $target/root/grml_cleanup_chroot.latex_cleanup +fi -if ifclass GRML_SMALL ; then - cp /etc/grml/fai/grml/grml_cleanup_chroot.small $target/root/ - $ROOTCMD sh -c "NOCOLORS=1 /root/grml_cleanup_chroot.small" - rm $target/root/grml_cleanup_chroot.small +# skip tasks which require only when using class NO_ONLINE: +if ! ifclass NO_ONLINE ; then + cp /etc/grml/fai/grml/grml_cleanup_chroot.no_online $target/root/ + $ROOTCMD /root/grml_cleanup_chroot.no_online + rm $target/root/grml_cleanup_chroot.no_online fi -if ifclass REMOVE_DOCS ; then - $ROOTCMD sh -c "NOCOLORS=1 REMOVE_DOCS=1 /root/grml_cleanup_chroot.small" - rm $target/root/grml_cleanup_chroot.small +# remove /usr/share/doc, /usr/share/info,... only in class REMOVE_DOCS: +if ifclass REMOVE_DOCS: ; then + cp /etc/grml/fai/grml/grml_cleanup_chroot.remove_docs $target/root/ + $ROOTCMD /root/grml_cleanup_chroot.remove_docs + rm $target/root/grml_cleanup_chroot.remove_docs fi -# final cleanup +# misc cleanup: cp /etc/grml/fai/grml/grml_cleanup_chroot $target/root/ -$ROOTCMD sh -c "NOCOLORS=1 /root/grml_cleanup_chroot" +$ROOTCMD /root/grml_cleanup_chroot rm $target/root/grml_cleanup_chroot +# make sure GRML_SMALL uses the appropriate configuration: +if ifclass GRML_SMALL ; then + cp $target/etc/inittab.small $target/etc/inittab + cp $target/etc/runlevel.conf.livecd.small $target/etc/runlevel.conf +fi + ## END OF FILE ################################################################# # vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=3 diff --git a/etc/grml/fai/grml/grml_cleanup_chroot b/etc/grml/fai/grml/grml_cleanup_chroot index 73b2ae6..e93f175 100755 --- a/etc/grml/fai/grml/grml_cleanup_chroot +++ b/etc/grml/fai/grml/grml_cleanup_chroot @@ -4,29 +4,17 @@ # Authors: (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Mon Sep 17 22:14:33 CEST 2007 [mika] +# Latest change: Wed Sep 19 13:38:45 CEST 2007 [mika] ################################################################################ # misc stuff umask 022 - [ -n "$NOCOLORS" ] || . /etc/grml_colors . /etc/grml/lsb-functions || exit 6 [ -x /lib64 ] && GRML64=yes || GRML64='' # detect kernel version, assume newest kernel version KERNEL=$(ls -1 /lib/modules/ | sort -r -u | head -1) -if [ -n "$LATEX_CLEANUP" ] ; then - rm -rf /usr/share/doc/texlive-latex-recommended/latex/ \ - /usr/share/doc/texlive-latex-base/latex/ \ - /usr/share/doc/texlive-base-bin/pdftex/thanh/ \ - /usr/share/doc/texlive-latex-base/latex/base/ \ - /usr/share/doc/texlive-latex-base/latex/hyperref/ \ - /usr/share/doc/texlive-latex-base/generic/babel/ \ - /usr/share/doc/texlive-latex-recommended/latex/koma-script/ \ - /usr/share/doc/texmf/pgf/pgfmanual.pdf.gz -fi - if [ -f /usr/share/fonts/X11/misc/artwiz-cursor.pcf.gz ] ; then if dpkg-divert --list artwiz-cursor | grep -q /usr/share/fonts/X11/misc/cursor.pcf.gz ; then eerror "Broken diversion of artwiz-cursor, see #341397, trying to fix it" @@ -221,36 +209,6 @@ else ewarn "depmod not installed" ; eend 0 fi -if [ -n "$NOONLINE" ] ; then - einfo "\$NOONLINE is set, skipping online tasks" ; eend 0 -else - -if [ -x /usr/bin/freshclam ] ; then - einfo "Updating clamav database via running freshclam" - /usr/bin/freshclam ; eend $? -else - ewarn "freshclam not installed" ; eend 0 -fi - -if [ -x /usr/bin/update-pciids ] ; then - einfo "Updating PCI- and USB-ids" - update-pciids - update-usbids - eend $? -else - ewarn "update-pciids/update-usbids not installed" ; eend 0 -fi - -if [ -x /usr/sbin/nessus-update-plugins ] ; then - einfo "Updating nessus-plugins" - nessus-update-plugins - eend $? -else - ewarn "nessus-update-plugins not installed" ; eend 0 -fi - -fi # end of $NOONLINE-check - einfo "Cleaning and removing some misc files and directories" rm -f /etc/sysconfig/* /etc/motd.dpkg-new /etc/auto.master.distrib.dpkg-new \ /etc/samba/*.SID /etc/samba/*.tdb /dev/mouse* /dev/cdrom* /dev/cdwriter* \ @@ -281,11 +239,6 @@ else ewarn "update-ca-certificates not installed" ; eend 0 fi -# some stuff does not have to run every single time... -if [ -n "$FAST" ] ; then - einfo "\$FAST is set, skipping some tasks" ; eend 0 -else - # regenerate module dependencies and ls.so.cache if [ -x /sbin/ldconfig ] ; then einfo "Updating ld.so.cache" @@ -320,30 +273,6 @@ else ewarn "mandb not installed" ; eend 0 fi -if [ -n "$REMOVE_DOCS" ] ; then - einfo "Cleaning documentation directories..." - if [ -d /usr/share/doc/grml-docs ] ; then - mv /usr/share/doc/grml-docs /tmp/ - fi - - rm -rf /usr/share/doc - mkdir /usr/share/doc - - if [ -d /tmp/grml-docs ] ; then - mv /tmp/grml-docs /usr/share/doc/grml-docs - fi - - rm -rf /usr/share/gtk-doc/ - rm -rf /usr/share/man/ - rm -rf /usr/man - rm -rf /usr/share/info - eend $? - - einfo "Creating /usr/share/info/..." - mkdir -p /usr/share/info/ - eend $? -fi - if [ -d /var/lib/clamav/ ] ; then einfo "Cleaning /var/lib/clamav/" rm -f /var/lib/clamav/clamav-* ; eend $? @@ -386,8 +315,6 @@ else ewarn "updatedb not installed" ; eend 0 fi -fi # end of $FAST-check - einfo "Unmounting all filesystems" umount -a eend $? diff --git a/etc/grml/fai/grml/grml_cleanup_chroot.latex_cleanup b/etc/grml/fai/grml/grml_cleanup_chroot.latex_cleanup new file mode 100755 index 0000000..abea847 --- /dev/null +++ b/etc/grml/fai/grml/grml_cleanup_chroot.latex_cleanup @@ -0,0 +1,22 @@ +#!/bin/bash +# Filename: /etc/grml/fai/grml/grml_cleanup_chroot_latex_cleanup +# Purpose: remove some large LaTeX directories +# Authors: (c) Michael Prokop +# Bug-Reports: see http://grml.org/bugs/ +# License: This file is licensed under the GPL v2. +# Latest change: Wed Sep 19 13:38:49 CEST 2007 [mika] +################################################################################ + +# misc stuff + . /etc/grml/lsb-functions || exit 6 + +rm -rf /usr/share/doc/texlive-latex-recommended/latex/ \ + /usr/share/doc/texlive-latex-base/latex/ \ + /usr/share/doc/texlive-base-bin/pdftex/thanh/ \ + /usr/share/doc/texlive-latex-base/latex/base/ \ + /usr/share/doc/texlive-latex-base/latex/hyperref/ \ + /usr/share/doc/texlive-latex-base/generic/babel/ \ + /usr/share/doc/texlive-latex-recommended/latex/koma-script/ \ + /usr/share/doc/texmf/pgf/pgfmanual.pdf.gz + +## END OF FILE ################################################################# diff --git a/etc/grml/fai/grml/grml_cleanup_chroot.no_online b/etc/grml/fai/grml/grml_cleanup_chroot.no_online new file mode 100755 index 0000000..637c71b --- /dev/null +++ b/etc/grml/fai/grml/grml_cleanup_chroot.no_online @@ -0,0 +1,38 @@ +#!/bin/bash +# Filename: /etc/grml/fai/grml/grml_cleanup_chroot_no_online +# Purpose: execute tasks that require network access +# Authors: (c) Michael Prokop +# Bug-Reports: see http://grml.org/bugs/ +# License: This file is licensed under the GPL v2. +# Latest change: Wed Sep 19 13:38:54 CEST 2007 [mika] +################################################################################ + +# misc stuff + umask 022 + . /etc/grml/lsb-functions || exit 6 + +if [ -x /usr/bin/freshclam ] ; then + einfo "Updating clamav database via running freshclam" + /usr/bin/freshclam ; eend $? +else + ewarn "freshclam not installed" ; eend 0 +fi + +if [ -x /usr/bin/update-pciids ] ; then + einfo "Updating PCI- and USB-ids" + update-pciids + update-usbids + eend $? +else + ewarn "update-pciids/update-usbids not installed" ; eend 0 +fi + +if [ -x /usr/sbin/nessus-update-plugins ] ; then + einfo "Updating nessus-plugins" + nessus-update-plugins + eend $? +else + ewarn "nessus-update-plugins not installed" ; eend 0 +fi + +## END OF FILE ################################################################# diff --git a/etc/grml/fai/grml/grml_cleanup_chroot.remove_docs b/etc/grml/fai/grml/grml_cleanup_chroot.remove_docs new file mode 100755 index 0000000..a4531ea --- /dev/null +++ b/etc/grml/fai/grml/grml_cleanup_chroot.remove_docs @@ -0,0 +1,33 @@ +#!/bin/bash +# Filename: /etc/grml/fai/grml/grml_cleanup_chroot_remove_docs +# Purpose: remove docs in grml chroot +# Authors: (c) Michael Prokop +# License: This file is licensed under the GPL v2. +# Latest change: Wed Sep 19 13:38:58 CEST 2007 [mika] +################################################################################ + +. /etc/grml/lsb-functions || exit 6 + +einfo "Cleaning documentation directories..." +if [ -d /usr/share/doc/grml-docs ] ; then + mv /usr/share/doc/grml-docs /tmp/ +fi + +rm -rf /usr/share/doc +mkdir /usr/share/doc + +if [ -d /tmp/grml-docs ] ; then + mv /tmp/grml-docs /usr/share/doc/grml-docs +fi + +rm -rf /usr/share/gtk-doc/ +rm -rf /usr/share/man/ +rm -rf /usr/man +rm -rf /usr/share/info +eend $? + +einfo "Creating /usr/share/info/..." +mkdir -p /usr/share/info/ +eend $? + +## END OF FILE ################################################################# diff --git a/etc/grml/fai/grml/grml_cleanup_chroot.small b/etc/grml/fai/grml/grml_cleanup_chroot.small deleted file mode 100755 index a96a581..0000000 --- a/etc/grml/fai/grml/grml_cleanup_chroot.small +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -# Filename: /etc/grml/fai/grml/grml_cleanup_chroot.small -# Purpose: clean up grml chroot (adjusted for grml-small) -# Authors: (c) Michael Prokop -# License: This file is licensed under the GPL v2. -# Latest change: Mon Sep 17 17:34:47 CEST 2007 [mika] -################################################################################ - -# misc stuff - umask 022 - [ -n "$NOCOLORS" ] || . /etc/grml_colors - . /etc/grml/lsb-functions || exit 6 - -einfo "Setting up /etc/inittab" -cp /etc/inittab.small /etc/inittab -eend $? - -einfo "Copying original runlevel.conf to /etc/runlevel.conf" -cp /etc/runlevel.conf.livecd.small /etc/runlevel.conf -eend $? - -if [ -n "$REMOVE_DOCS" ] ; then -# einfo "Cleaning up /etc/skel..." -# rm -rf /etc/skel/.fluxbox -# rm -rf /etc/skel/.gkrellm2 -# rm -rf /etc/skel/.idesktop -# rm -rf /etc/skel/.pekwm -# eend $? - - einfo "Cleaning documentation directories..." - if [ -d /usr/share/doc/grml-docs ] ; then - mv /usr/share/doc/grml-docs /tmp/ - fi - - rm -rf /usr/share/doc - mkdir /usr/share/doc - - if [ -d /tmp/grml-docs ] ; then - mv /tmp/grml-docs /usr/share/doc/grml-docs - fi - - rm -rf /usr/share/gtk-doc/ - rm -rf /usr/share/man/ - rm -rf /usr/man - rm -rf /usr/share/info - eend $? - - einfo "Creating /usr/share/info/..." - mkdir -p /usr/share/info/ - eend $? -fi - -## END OF FILE ################################################################# -- 2.1.4 From b139bfc533a62c3d9dd33cf60ca3320ebff73088 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 14:09:56 +0200 Subject: [PATCH 08/16] Add check for make stuff to /etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot --- etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot | 3 +-- etc/grml/fai/grml/grml_cleanup_chroot | 8 +++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot index 88fd997..88345d5 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot +++ b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot @@ -4,11 +4,10 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Wed Sep 19 13:42:19 CEST 2007 [mika] +# Latest change: Wed Sep 19 13:51:05 CEST 2007 [mika] ################################################################################ set -e -set -u # remove some big directories when using class LATEX_CLEANUP: if ifclass LATEX_CLEANUP ; then diff --git a/etc/grml/fai/grml/grml_cleanup_chroot b/etc/grml/fai/grml/grml_cleanup_chroot index e93f175..be7bc6b 100755 --- a/etc/grml/fai/grml/grml_cleanup_chroot +++ b/etc/grml/fai/grml/grml_cleanup_chroot @@ -52,9 +52,11 @@ einfo "Setting up /etc/inittab" cp /etc/inittab.grml /etc/inittab eend $? -einfo "Cleaning up /usr/src/linux-headers-$KERNEL" -( cd /usr/src && make clean && make symlinks ) -eend $? +if [ -x /usr/bin/make -a -r /usr/src/Makefile ] ; then + einfo "Cleaning up /usr/src/linux-headers-$KERNEL" + ( cd /usr/src && make clean && make symlinks ) + eend $? +fi if [ -L /usr/include/linux ] ; then einfo "/usr/include/linux is ok" ; eend 0 -- 2.1.4 From f684e9577f54be351e2c3dcdbc4414101433bb10 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 17:18:18 +0200 Subject: [PATCH 09/16] Bugfix for REMOVE_DOCS class; implement log-check --- docs/grml-live.txt | 4 ---- etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot | 2 +- grml-live | 9 +++++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/docs/grml-live.txt b/docs/grml-live.txt index 7a68af8..0b21b58 100644 --- a/docs/grml-live.txt +++ b/docs/grml-live.txt @@ -380,10 +380,6 @@ a mail: Known TODOs ----------- -* "fai dirinstall" does not seem to always exit according to what happend during -the build; make sure to exit on any error (check logs for stuff like "dpkg: -error processing" [software.log], "FAILED with exit code" [shell.log],...) - * support something like a directory /etc/grml/fai/packages to install additional Debian packages without the need for a Debian repository diff --git a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot index 88345d5..9af8da1 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot +++ b/etc/grml/fai/config/scripts/GRMLBASE/98-clean-chroot @@ -24,7 +24,7 @@ if ! ifclass NO_ONLINE ; then fi # remove /usr/share/doc, /usr/share/info,... only in class REMOVE_DOCS: -if ifclass REMOVE_DOCS: ; then +if ifclass REMOVE_DOCS ; then cp /etc/grml/fai/grml/grml_cleanup_chroot.remove_docs $target/root/ $ROOTCMD /root/grml_cleanup_chroot.remove_docs rm $target/root/grml_cleanup_chroot.remove_docs diff --git a/grml-live b/grml-live index 956f8b4..8ff93f9 100755 --- a/grml-live +++ b/grml-live @@ -176,12 +176,13 @@ else umount $CHROOT_TARGET/sys 2>/dev/null || /bin/true [ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" # notice: 'fai dirinstall' does not seem to exit appropriate -> - # we need better error handling - if [ -r "$CHROOT_TARGET"/etc/grml_cd ] ; then - echo " [*] Finished execution of stage 'fai dirinstall'" - else + if grep -q 'dpkg: error processing' /var/log/fai/dirinstall/$HOSTNAME/software.log || \ + grep -q 'FAILED with exit code' /var/log/fai/dirinstall/$HOSTNAME/shell.log ; then echo " [!] There was an error during execution of stage 'fai dirinstall'" + echo " Check out /var/log/fai/dirinstall/$HOSTNAME/... for details" exit 1 + else + echo " [*] Finished execution of stage 'fai dirinstall'" fi fi # }}} -- 2.1.4 From ada9ee0154c453dc6f1236527e1a7ed82890ba4b Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 21:36:11 +0200 Subject: [PATCH 10/16] Improve error handling; make scripts re-executable --- etc/grml/fai/config/scripts/GRMLBASE/21-usersetup | 17 +++++++++++++---- etc/grml/fai/config/scripts/GRMLBASE/31-motd | 6 ++++-- etc/grml/fai/grml/grml_cleanup_chroot.no_online | 8 ++++---- grml-live | 17 ++++++++++++----- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/etc/grml/fai/config/scripts/GRMLBASE/21-usersetup b/etc/grml/fai/config/scripts/GRMLBASE/21-usersetup index fc71e2f..ce42a3c 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/21-usersetup +++ b/etc/grml/fai/config/scripts/GRMLBASE/21-usersetup @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Mon Sep 17 15:12:21 CEST 2007 [mika] +# Latest change: Wed Sep 19 20:27:03 CEST 2007 [mika] ################################################################################ set -u @@ -14,10 +14,19 @@ USERNAME='' [ -r /etc/grml/grml-live.conf ] && . /etc/grml/grml-live.conf [ -n "$USERNAME" ] || USERNAME=grml -$ROOTCMD addgroup --gid 1000 $USERNAME -$ROOTCMD useradd -d /home/$USERNAME -m -s /bin/zsh -g 1000 $USERNAME +if grep -q "$USERNAME:x:1000" $target/etc/group ; then + echo "group $USERNAME exists already, skipping" +else + $ROOTCMD addgroup --gid 1000 $USERNAME +fi -sed -i 's/^root::/root:*:/' $target/etc/shadow +if grep -q "$USERNAME:x:1000" $target/etc/passwd ; then + echo "user $USERNAME exists already, skipping" +else + $ROOTCMD useradd -d /home/$USERNAME -m -s /bin/zsh -g 1000 $USERNAME +fi + +sed -i 's/^root::/root:*:/' $target/etc/shadow sed -i "s/^$USERNAME:!:/$USERNAME:*:/" $target/etc/shadow $ROOTCMD chsh -s /bin/zsh root diff --git a/etc/grml/fai/config/scripts/GRMLBASE/31-motd b/etc/grml/fai/config/scripts/GRMLBASE/31-motd index 2d20b0a..05d7b01 100755 --- a/etc/grml/fai/config/scripts/GRMLBASE/31-motd +++ b/etc/grml/fai/config/scripts/GRMLBASE/31-motd @@ -4,13 +4,15 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Sun Sep 16 23:00:35 CEST 2007 [mika] +# Latest change: Wed Sep 19 20:13:01 CEST 2007 [mika] ################################################################################ set -u set -e -$ROOTCMD mv /etc/motd.dpkg-new /var/run/motd +if [ -f $target/etc/motd.dpkg-new ] ; then + $ROOTCMD mv /etc/motd.dpkg-new /var/run/motd +fi ## END OF FILE ################################################################# # vim:ft=sh expandtab ai tw=80 tabstop=4 shiftwidth=3 diff --git a/etc/grml/fai/grml/grml_cleanup_chroot.no_online b/etc/grml/fai/grml/grml_cleanup_chroot.no_online index 637c71b..7d277eb 100755 --- a/etc/grml/fai/grml/grml_cleanup_chroot.no_online +++ b/etc/grml/fai/grml/grml_cleanup_chroot.no_online @@ -4,7 +4,7 @@ # Authors: (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Wed Sep 19 13:38:54 CEST 2007 [mika] +# Latest change: Wed Sep 19 20:07:43 CEST 2007 [mika] ################################################################################ # misc stuff @@ -20,8 +20,8 @@ fi if [ -x /usr/bin/update-pciids ] ; then einfo "Updating PCI- and USB-ids" - update-pciids - update-usbids + update-pciids || echo "Warning: update-pciids was not successfull">&2 + update-usbids || echo "Warning: update-usbids was not successfull">&2 eend $? else ewarn "update-pciids/update-usbids not installed" ; eend 0 @@ -29,7 +29,7 @@ fi if [ -x /usr/sbin/nessus-update-plugins ] ; then einfo "Updating nessus-plugins" - nessus-update-plugins + nessus-update-plugins || echo "Warning: nessus-update-plugins was not successfull">&2 eend $? else ewarn "nessus-update-plugins not installed" ; eend 0 diff --git a/grml-live b/grml-live index 8ff93f9..0b22840 100755 --- a/grml-live +++ b/grml-live @@ -164,7 +164,7 @@ fi [ -n "$CHROOT_TARGET" ] || CHROOT_TARGET="$TARGET/grml_chroot" if [ -d "$CHROOT_TARGET" ] ; then - echo " [x] $CHROOT_TARGET exists already, skipping the stage 'fai dirnstall'" + echo " [x] $CHROOT_TARGET exists already, skipping the stage 'fai dirinstall'" else mkdir -p "$CHROOT_TARGET" || bailout 5 "Problem with creating $CHROOT_TARGET for FAI" if [ -n "${MIRROR_DIRECTORY}" ] ; then @@ -175,11 +175,18 @@ else umount $CHROOT_TARGET/proc 2>/dev/null || /bin/true umount $CHROOT_TARGET/sys 2>/dev/null || /bin/true [ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" - # notice: 'fai dirinstall' does not seem to exit appropriate -> - if grep -q 'dpkg: error processing' /var/log/fai/dirinstall/$HOSTNAME/software.log || \ - grep -q 'FAILED with exit code' /var/log/fai/dirinstall/$HOSTNAME/shell.log ; then + + # notice: 'fai dirinstall' does not seem to exit appropriate, so: + ERROR='' + [ -r "/var/log/fai/dirinstall/$HOSTNAME/software.log" ] && + grep -q 'dpkg: error processing' /var/log/fai/dirinstall/$HOSTNAME/software.log && ERROR=1 + + [ -r "/var/log/fai/dirinstall/$HOSTNAME/shell.log" ] && + grep -q 'FAILED with exit code' /var/log/fai/dirinstall/$HOSTNAME/shell.log && ERROR=2 + + if [ -n "$ERROR" ] ; then echo " [!] There was an error during execution of stage 'fai dirinstall'" - echo " Check out /var/log/fai/dirinstall/$HOSTNAME/... for details" + echo " Check out /var/log/fai/dirinstall/$HOSTNAME/... for details. [exit ${ERROR}]" exit 1 else echo " [*] Finished execution of stage 'fai dirinstall'" -- 2.1.4 From 1e57a2a5cdc5c979ebd5e2633502db23d9ea37ee Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Wed, 19 Sep 2007 23:42:06 +0200 Subject: [PATCH 11/16] Implement template system for boot/isolinux --- etc/grml/grml-live.conf | 13 ++- grml-live | 169 ++++++++++++++++++++++++++------- i386_files/boot/isolinux/boot-beep.msg | 2 +- i386_files/boot/isolinux/boot.msg | 2 +- i386_files/boot/isolinux/f3 | 8 +- 5 files changed, 151 insertions(+), 43 deletions(-) diff --git a/etc/grml/grml-live.conf b/etc/grml/grml-live.conf index 6d31354..ef01da4 100644 --- a/etc/grml/grml-live.conf +++ b/etc/grml/grml-live.conf @@ -57,8 +57,11 @@ CLASSES="GRMLBASE,I386" # ... and the sources.list entry for the directory: # MIRROR_SOURCES="deb file:///mnt/mirror/debian sid main contrib non-free" -# Directory of configuration files for grml-live's FAI: -GRML_FAI_CONFIG=/etc/grml/fai +# Version number of ISO (limited to 5 chars): +VERSION="0.0-1" + +# Codename of the release (limited to 30 chars): +CODENAME="grml-live just rocks!" # Specify hostname of the live-system: HOSTNAME=grml @@ -66,9 +69,15 @@ HOSTNAME=grml # Specify user with UID 1000 on live-system: USERNAME=grml +# Directory of configuration files for grml-live's FAI: +GRML_FAI_CONFIG=/etc/grml/fai + # Do you want to pass any additional arguments to FAI? # FAI_ARGS="" +# Where do you want to store grml-live.log? +# LOGDIR="/var/log/fai/dirinstall/$HOSTNAME" + # Which architecture do you want to build? # It defaults to output of 'dpkg --print-architecture' # ARCH="i386" diff --git a/grml-live b/grml-live index 0b22840..f476726 100755 --- a/grml-live +++ b/grml-live @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Tue Sep 18 22:46:28 CEST 2007 [mika] +# Latest change: Wed Sep 19 23:41:52 CEST 2007 [mika] ################################################################################ # read configuration files, set some misc variables {{{ @@ -25,6 +25,15 @@ fi VERBOSE='' FORCE='' +if [ -r /etc/grml/lsb-functions ] ; then + . /etc/grml/lsb-functions +else + einfo() { echo " [*] $*" ;} + eerror() { echo " [!] $*">&2 ;} + ewarn() { echo " [x] $*" ;} + eend() { return 0 ; } +fi + # source main configuration file: LIVE_CONF=/etc/grml/grml-live.conf . $LIVE_CONF @@ -38,7 +47,7 @@ bailout() { # rm -f "$TMPFILE" [ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" [ -n "$1" ] && EXIT="$1" || EXIT="1" - [ -n "$2" ] && echo "$2">&2 + [ -n "$2" ] && eerror "$2">&2 exit "$EXIT" } trap bailout 1 2 3 15 @@ -50,6 +59,62 @@ trap bailout 1 2 3 15 [ -n "$USERNAME" ] || USERNAME=grml [ -n "$CLASSES" ] || CLASSES="GRML,I386" [ -n "$TARGET" ] || bailout 1 "${PN}: \$TARGET not specified. Please adjust $LIVE_CONF. Exiting." + +[ -n "$VERSION" ] || VERSION="0.1" +[ -n "$CODENAME" ] || CODENAME="grml-live rocks" + +[ -n "$LOGDIR" ] || LOGDIR="/var/log/fai/dirinstall/$HOSTNAME" +[ -d "$LOGDIR" ] || mkdir $LOGDIR +LOGFILE="$LOGDIR/grml-live.conf" +# }}} + +# some important functions {{{ + +# log output: +# usage: log "string to log" +log() { echo "$*" >> $LOGFILE ; } + +# cut string at character number int = $1 +# usage: cut_string 5 "1234567890" will output "12345" +cut_string() { + [ -n "$2" ] || return 1 + echo "$2" | head -c "$1"; echo -ne "\n" +} + +# prepend int = $1 spaces before string = $2 +# usage: extend_string_begin 5 "123" will output " 123" +extend_string_begin() { + [ -n "$2" ] || return 1 + local COUNT="$(echo $2 | wc -c)" + local FILL="$(expr $COUNT - $1)" + while [ "$FILL" -gt 1 ] ; do + echo -n " " + local FILL=$(expr $FILL - 1) + done + while [ "$FILL" -lt 1 ] ; do + echo -n " " + local FILL=$(expr $FILL + 1) + done + echo "$2" | head -c "$1"; echo -ne "\n" +} + +# append int = $1 spaces to string = $2 +# usage: extend_string_begin 5 "123" will output "123 " +extend_string_end() { + [ -n "$2" ] || return 1 + echo -n "$2" | head -c "$1" + local COUNT="$(echo $2 | wc -c)" + local FILL="$(expr $COUNT - $1)" + while [ "$FILL" -gt 1 ] ; do + echo -n " " + local FILL=$(expr $FILL - 1) + done + while [ "$FILL" -lt 1 ] ; do + echo -n " " + local FILL=$(expr $FILL + 1) + done + echo -ne "\n" +} # }}} # usage information {{{ @@ -79,11 +144,12 @@ http://grml.org/bugs/ # command line parsing {{{ -while getopts "c:s:t:Fhv" opt; do +while getopts "c:i:s:t:Fhv" opt; do case "$opt" in c) CLASSES="$OPTARG" ;; F) FORCE=1 ;; h) usage ; bailout 0 ;; + i) ISO_NAME="$OPTARG" ;; s) SUITE="$OPTARG" ;; t) TARGET="$OPTARG" CHROOT_TARGET="$TARGET/grml_chroot" @@ -108,7 +174,7 @@ specify it on the command line using the -t|--target option." # ask user whether the setup is ok {{{ if [ -z "$FORCE" ] ; then echo - echo "$PN - check your configuration (or invoke using -F to force execution without prompting):" + echo "${PN}: check your configuration (or use -F to force execution without prompting):" echo echo " FAI classes: $CLASSES" echo " main directory: $TARGET" @@ -125,13 +191,18 @@ if [ -z "$FORCE" ] ; then bailout 1 "Exiting as requested." fi echo + + start_seconds=$(cut -d . -f 1 /proc/uptime) + log "------------------------------------------------------------------------------" + log "Starting grml-live run [$(date)]" fi # }}} # on-the-fly configuration {{{ if [ -n "$MIRROR_DIRECTORY" ] ; then if ! [ -d "$MIRROR_DIRECTORY/debian" ] ; then - echo "Sorry, $MIRROR_DIRECTORY/debian does not seem to exist. Exiting.">&2 + eerror "Sorry, $MIRROR_DIRECTORY/debian does not seem to exist. Exiting." + log "Sorry, $MIRROR_DIRECTORY/debian does not seem to exist. Exiting. [$(date)]" bailout 1 fi echo "$MIRROR_SOURCES" > /etc/grml/fai/apt/sources.list @@ -163,33 +234,38 @@ fi # CHROOT_TARGET - execute FAI {{{ [ -n "$CHROOT_TARGET" ] || CHROOT_TARGET="$TARGET/grml_chroot" -if [ -d "$CHROOT_TARGET" ] ; then - echo " [x] $CHROOT_TARGET exists already, skipping the stage 'fai dirinstall'" +if [ -d "$CHROOT_TARGET/bin" ] ; then + ewarn "$CHROOT_TARGET exists already, skipping stage 'fai dirinstall'" ; eend 0 + log "$CHROOT_TARGET exists already, skipping stage 'fai dirinstall'" else mkdir -p "$CHROOT_TARGET" || bailout 5 "Problem with creating $CHROOT_TARGET for FAI" if [ -n "${MIRROR_DIRECTORY}" ] ; then mkdir -p "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" mount --bind "${MIRROR_DIRECTORY}" "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" fi - fai $VERBOSE -C "$GRML_FAI_CONFIG" -c"$CLASSES" dirinstall "$CHROOT_TARGET" $FAI_ARGS + fai $VERBOSE -C "$GRML_FAI_CONFIG" -c"$CLASSES" dirinstall "$CHROOT_TARGET" $FAI_ARGS | tee -a $LOGFILE umount $CHROOT_TARGET/proc 2>/dev/null || /bin/true umount $CHROOT_TARGET/sys 2>/dev/null || /bin/true [ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" # notice: 'fai dirinstall' does not seem to exit appropriate, so: ERROR='' - [ -r "/var/log/fai/dirinstall/$HOSTNAME/software.log" ] && - grep -q 'dpkg: error processing' /var/log/fai/dirinstall/$HOSTNAME/software.log && ERROR=1 + if [ -r "/var/log/fai/dirinstall/$HOSTNAME/software.log" ] ; then + grep 'dpkg: error processing' /var/log/fai/dirinstall/$HOSTNAME/software.log >> $LOGFILE && ERROR=1 + fi - [ -r "/var/log/fai/dirinstall/$HOSTNAME/shell.log" ] && - grep -q 'FAILED with exit code' /var/log/fai/dirinstall/$HOSTNAME/shell.log && ERROR=2 + if [ -r "/var/log/fai/dirinstall/$HOSTNAME/shell.log" ] ; then + grep 'FAILED with exit code' /var/log/fai/dirinstall/$HOSTNAME/shell.log >> $LOGFILE && ERROR=2 + fi if [ -n "$ERROR" ] ; then - echo " [!] There was an error during execution of stage 'fai dirinstall'" + eerror "There was an error during execution of stage 'fai dirinstall'" echo " Check out /var/log/fai/dirinstall/$HOSTNAME/... for details. [exit ${ERROR}]" - exit 1 + log "There was an error during execution of stage 'fai dirinstall' [$(date)]" + eend 1 ; exit 1 else - echo " [*] Finished execution of stage 'fai dirinstall'" + einfo "Finished execution of stage 'fai dirinstall'" + log "Finished execution of stage 'fai dirinstall' [$(date)]" fi fi # }}} @@ -202,12 +278,12 @@ mkdir -p "$BUILD_TARGET" || bailout 6 "Problem with creating $BUILD_TARGET for s [ -n "$ARCH" ] || ARCH="$(dpkg --print-architecture)" if [ "$ARCH" = i386 ] ; then if [ -d "$BUILD_TARGET"/boot/isolinux ] ; then - echo " [x] $BUILD_TARGET/boot/isolinux exists already - skipping stage 'boot/isolinux'" - continue + ewarn "$BUILD_TARGET/boot exists already, skipping stage 'boot/isolinux'" ; eend 0 + log "$BUILD_TARGET/boot exists already, skipping stage 'boot/isolinux'" else # booting stuff: mkdir -p "$BUILD_TARGET"/boot/isolinux - mkdir "$BUILD_TARGET"/GRML + [ -d "$BUILD_TARGET"/GRML ] || mkdir "$BUILD_TARGET"/GRML cp /boot/memtest86+.bin "$BUILD_TARGET"/boot/isolinux/memtest cp "$CHROOT_TARGET"/boot/initrd* "$BUILD_TARGET"/boot/isolinux/initrd.gz cp "$CHROOT_TARGET"/boot/vmlinuz* "$BUILD_TARGET"/boot/isolinux/linux26 @@ -223,6 +299,20 @@ if [ "$ARCH" = i386 ] ; then cp /usr/share/grml-live/i386_files/boot/isolinux/isolinux.cfg "$BUILD_TARGET"/boot/isolinux/ cp /usr/share/grml-live/i386_files/boot/isolinux/logo.16 "$BUILD_TARGET"/boot/isolinux/ cp /usr/share/grml-live/i386_files/boot/isolinux/syslinux.cfg "$BUILD_TARGET"/boot/isolinux/ + + # adjust boot splash information: + ISO_DATE="$(date +%Y-%m-%d)" + VERSION="$(cut_string 5 "$VERSION")" ; VERSION="$(extend_string_end 5 "$VERSION")" + CODENAME="$(cut_string 30 "$CODENAME")" ; CODENAME="$(extend_string_end 30 "$CODENAME")" + + sed -i "s/%VERSION%/$VERSION/" "$BUILD_TARGET"/boot/isolinux/boot.msg + sed -i "s/%CODENAME%/$CODENAME/" "$BUILD_TARGET"/boot/isolinux/boot.msg + sed -i "s/%DATE%/$ISO_DATE/" "$BUILD_TARGET"/boot/isolinux/boot.msg + + sed -i "s/%VERSION%/$VERSION/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg + sed -i "s/%CODENAME%/$CODENAME/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg + sed -i "s/%DATE%/$ISO_DATE/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg + # autostart for Windows: cp /usr/share/grml-live/windows/autostart/autorun.bat "$BUILD_TARGET"/ cp /usr/share/grml-live/windows/autostart/autorun.inf "$BUILD_TARGET"/ @@ -230,58 +320,67 @@ if [ "$ARCH" = i386 ] ; then cp /usr/share/grml-live/windows/autostart/cdrom.ico "$BUILD_TARGET"/ # windows-binaries: if [ -n "$WINDOWS_BINARIES" ] ; then - if [ -d "$BUILD_TARGET"/windows ] ; then - echo " [x] $BUILD_TARGET/windows exists already - skipping stage 'WINDOWS_BINARIES'" - return 0 + if [ -f "$BUILD_TARGET"/windows/putty.exe ] ; then + ewarn "$BUILD_TARGET/windows exists already, skipping stage 'WINDOWS_BINARIES'" ; eend 0 + log "$BUILD_TARGET/windows exists already, skipping stage 'WINDOWS_BINARIES'" else mkdir "$BUILD_TARGET"/windows ( cd "$BUILD_TARGET"/windows for file in pageant plink pscp psftp putty puttygen ; do - wget ${WINDOWS_BINARIES}/${file}.exe + wget -O ${file}.exe ${WINDOWS_BINARIES}/${file}.exe done ) fi - echo " [*] Finished execution of stage 'WINDOWS_BINARIES'" + einfo "Finished execution of stage 'WINDOWS_BINARIES'" ; eend 0 + log "Finished execution of stage 'WINDOWS_BINARIES' [$(date)]" fi - echo " [*] Finished execution of stage 'boot/isolinux'" + einfo "Finished execution of stage 'boot/isolinux'" ; eend 0 fi # amd64: elif [ "$ARCH" = amd64 ] ; then - echo 'Warning: gebi, it is your turn. :)'>&2 + ewarn 'Warning: gebi, it is your turn. :)'>&2 # ppc: elif [ "$ARCH" = powerpc ] ; then - echo 'Warning: formorer, it is your turn. :)'>&2 + ewarn 'Warning: formorer, it is your turn. :)'>&2 # unsuported: else - echo 'Warning: Unsupported ARCH, sorry. Want to support it? Contribute!'>&2 + eerror 'Error: Unsupported ARCH, sorry. Want to support it? Contribute!' ; eend 1 fi -if [ -d "$BUILD_TARGET"/live ] ; then - echo " [x] $BUILD_TARGET/live exists already, skipping stage 'squashfs'" +if [ -f "$BUILD_TARGET"/live/grml.squashfs ] ; then + ewarn "$BUILD_TARGET/live exists already, skipping stage 'squashfs'" ; eend 0 + log "$BUILD_TARGET/live exists already, skipping stage 'squashfs'" else mkdir "$BUILD_TARGET"/live mksquashfs $CHROOT_TARGET/* $BUILD_TARGET/live/grml.squashfs -noappend + einfo "Finished execution of stage 'squashfs'" ; eend 0 + log "Finished execution of stage 'squashfs' [$(date)]" fi -echo " [*] Finished execution of stage 'squashfs'" # }}} # ISO_TARGET - mkisofs {{{ [ -n "$ISO_TARGET" ] || ISO_TARGET="$TARGET/grml_isos" if [ -d "$ISO_TARGET" ] ; then - echo " [x] $ISO_TARGET exists already, skipping the stage 'iso build'" + ewarn "$ISO_TARGET exists already, skipping stage 'iso build'" ; eend 0 + log "$ISO_TARGET exists already, skipping stage 'iso build'" else mkdir -p "$ISO_TARGET" || bailout 6 "Problem with creating $ISO_TARGET for stage 'iso build'" + [ -n "$ISO_NAME" ] || ISO_NAME="grml_0.0-1.iso" ( cd "$BUILD_TARGET" && - mkisofs -V "Debian/etch grml" -publisher 'Michael Prokop ' \ + mkisofs -V "Debian/etch grml" -publisher 'grml-live | grml.org' \ -l -r -J -no-emul-boot -boot-load-size 4 -boot-info-table \ -c boot/isolinux/boot.cat -b boot/isolinux/isolinux.bin \ - -o "$ISO_TARGET"/grml_0.0-1.iso . + -o "${ISO_TARGET}"/"${ISO_NAME}" . ) - echo " [*] Finished execution of stage 'iso build'" + einfo "Finished execution of stage 'iso build'" ; eend 0 + log "Finished execution of stage 'iso build' [$(date)]" fi # }}} # finalize {{{ -echo " [*] Sucessfully finished execution of $PN" +SECONDS="$[$(cut -d . -f 1 /proc/uptime)-$start_seconds]" +einfo "Sucessfully finished execution of $PN [running ${SECONDS} seconds]" ; eend 0 +log "Sucessfully finished execution of $PN [running ${SECONDS} seconds]" +log "------------------------------------------------------------------------------" bailout 0 # }}} diff --git a/i386_files/boot/isolinux/boot-beep.msg b/i386_files/boot/isolinux/boot-beep.msg index 950ad26..7e906b6 100644 --- a/i386_files/boot/isolinux/boot-beep.msg +++ b/i386_files/boot/isolinux/boot-beep.msg @@ -1,5 +1,5 @@ 17 logo.16 Some information and boot options available via keys F2 - F10. http://grml.org/ -grml 0.0-1 - Release Codename "grml-live rocks! http://grml.org - 2007-09-15 +grml %VERSION% - Release Codename %CODENAME% %DATE%  diff --git a/i386_files/boot/isolinux/boot.msg b/i386_files/boot/isolinux/boot.msg index f52777a..efb308e 100644 --- a/i386_files/boot/isolinux/boot.msg +++ b/i386_files/boot/isolinux/boot.msg @@ -1,4 +1,4 @@ 17 logo.16 Some information and boot options available via keys F2 - F10. http://grml.org/ -grml 0.0-1 - Release Codename "grml-live rocks! http://grml.org - 2007-09-15 +grml %VERSION% - Release Codename %CODENAME% %DATE% diff --git a/i386_files/boot/isolinux/f3 b/i386_files/boot/isolinux/f3 index 188b387..c6484a2 100644 --- a/i386_files/boot/isolinux/f3 +++ b/i386_files/boot/isolinux/f3 @@ -1,9 +1,8 @@  grml - Linux for sysadmins and users of texttools 09F307 -70 This edition of grml boots with kernel 2.6.22-grml by default. - The following options can be used at the boot:-prompt: +70 The following options can be used at the boot:-prompt: - grml [options, list via F4-F10] grml default running 2.6.22 + grml [options, list via F4-F10] boot grml default memtest memtest86+ (memory test program) fb1280x1024, fb1024x768 or fb800x600 use framebuffer mode (e.g. notebooks) nofb disable framebuffer mode @@ -15,7 +14,8 @@ debug get interactive shells during startup process grub start GRand Unified Bootloader (GRUB) dos start FreeDOS 1.0 - vmware boot with special options for use in VMware + qemu boot with special options for use in Qemu + vmware boot with special options for use in VMware A list with all supported boot options can be found at the CD at /cdrom/GRML/grml-cheatcodes.txt -- 2.1.4 From 201df31e812c709b38316fb106cad8da54d0ff73 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Thu, 20 Sep 2007 00:03:55 +0200 Subject: [PATCH 12/16] Support setting releasename, version number; renamed verbose option from -v to -V --- docs/grml-live.txt | 46 ++++++++++++++++++++++++---------- etc/grml/grml-live.conf | 6 ++--- grml-live | 45 +++++++++++++++++---------------- i386_files/boot/isolinux/boot-beep.msg | 2 +- i386_files/boot/isolinux/boot.msg | 2 +- 5 files changed, 62 insertions(+), 39 deletions(-) diff --git a/docs/grml-live.txt b/docs/grml-live.txt index 0b21b58..a25fab4 100644 --- a/docs/grml-live.txt +++ b/docs/grml-live.txt @@ -10,7 +10,8 @@ Linux Live system (CD/ISO) Synopsis -------- -grml-live [-c ] [-t ] [-s ] [-Fvh] +grml-live [-c ] [-i ] [-r ] +[-s ] [-t ] [-v ] [-Fvh] ******************************************************************************* Important! This document is growing as requested. If you have questions which @@ -57,6 +58,24 @@ Specify the CLASSES to be used for building the ISO via FAI. By default only the classes GRMLBASE and I386 are assumed, resulting in a small base system (being about ~150MB total ISO size) for x86 (32bit). + -F:: + +Force execution and do not prompt for acknowledgment of configuration. + + -h:: + +Display short usage information and exit. + + -i **ISO_NAME**:: + +Specify name of ISO which will be available inside $TARGET_DIRECTORY/grml_isos +by default. + + -r **RELEASENAME**:: + +Specify name of the release. (Notice: the output of the release name is limited +to 30 characters.) + -s **SUITE**:: Specify the Debian suite you want to use for your live-system. Defaults to @@ -70,20 +89,18 @@ inside this target directory, being: grml_cd (where the files for creating the ISO are located, including the compressed squashfs file), grml_chroot (the chroot system) and grml_isos (where the resulting ISO is stored). - -F:: - -Force execution and do not prompt for acknowledgment of configuration. - - -h:: + -v **VERSION_NUMBER**:: -Display short usage information and exit. +Specify version number of the release. (Notice: the output of the version number +is limited to 5 characters. So "1.0-1" is fine, but "1.0.0.1" will be stripped +to "1.0.0" then.) - -v:: + -V:: Increase verbosity in the build process. -How to get your own Live-CD - the easy, fast and simple way ------------------------------------------------------------ +Usage examples +-------------- To get a small, Debian-stable and grml-based Live-CD using /grml/grml-live as build and output directory just run: @@ -95,6 +112,12 @@ To get a small Debian-unstable and grml-small based Live-CD using # grml-live -c GRMLBASE,GRML_SMALL,I386 -t /home/mika/grml-live +To get a smal, Debian-unstable and grml-based Live-CD using /tmp as build and +output directory and use grml_0.0-3.iso as ISO name (placed inside +/tmp/grml_isos) just invoke: + + # grml-live -t /tmp -c GRMLBASE,I386 -s sid -v -i grml_0.0-3.iso + [NOTE] If you have about 700MB of free space inside /dev/shm (being a tmpfs, usually @@ -397,9 +420,6 @@ grml and grml-small (done), each for x86, amd64 and ppc) * support signed apt repositories (currently it's deactivated via FAI's FAI_ALLOW_UNSIGNED=1 for some packages in the toolchain) -* support setting stuff like ISO name, version,... on-the-fly (especially for -stuff inside boot/isolinux/*) - * support "final builds" (including stuff like generating md5sums, gpg,... - create a grml_release-directory including all the details about the build process like dpkg selection, logs,...) diff --git a/etc/grml/grml-live.conf b/etc/grml/grml-live.conf index ef01da4..372c56f 100644 --- a/etc/grml/grml-live.conf +++ b/etc/grml/grml-live.conf @@ -57,11 +57,11 @@ CLASSES="GRMLBASE,I386" # ... and the sources.list entry for the directory: # MIRROR_SOURCES="deb file:///mnt/mirror/debian sid main contrib non-free" -# Version number of ISO (limited to 5 chars): +# Version number of ISO (limited to 5 chars!): VERSION="0.0-1" -# Codename of the release (limited to 30 chars): -CODENAME="grml-live just rocks!" +# Name of the release (limited to 30 chars!): +RELEASENAME="grml-live just rocks!" # Specify hostname of the live-system: HOSTNAME=grml diff --git a/grml-live b/grml-live index f476726..ae0e99e 100755 --- a/grml-live +++ b/grml-live @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Wed Sep 19 23:41:52 CEST 2007 [mika] +# Latest change: Wed Sep 19 23:59:48 CEST 2007 [mika] ################################################################################ # read configuration files, set some misc variables {{{ @@ -28,10 +28,10 @@ FORCE='' if [ -r /etc/grml/lsb-functions ] ; then . /etc/grml/lsb-functions else - einfo() { echo " [*] $*" ;} + einfo() { echo " [*] $*" ;} eerror() { echo " [!] $*">&2 ;} - ewarn() { echo " [x] $*" ;} - eend() { return 0 ; } + ewarn() { echo " [x] $*" ;} + eend() { return 0 ;} fi # source main configuration file: @@ -39,12 +39,10 @@ LIVE_CONF=/etc/grml/grml-live.conf . $LIVE_CONF PN=$(basename $0) -# TMPFILE=$(mktemp) # }}} # clean exit {{{ bailout() { - # rm -f "$TMPFILE" [ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_TARGET}/${MIRROR_DIRECTORY}" [ -n "$1" ] && EXIT="$1" || EXIT="1" [ -n "$2" ] && eerror "$2">&2 @@ -60,8 +58,8 @@ trap bailout 1 2 3 15 [ -n "$CLASSES" ] || CLASSES="GRML,I386" [ -n "$TARGET" ] || bailout 1 "${PN}: \$TARGET not specified. Please adjust $LIVE_CONF. Exiting." -[ -n "$VERSION" ] || VERSION="0.1" -[ -n "$CODENAME" ] || CODENAME="grml-live rocks" +[ -n "$VERSION" ] || VERSION="0.0.1" +[ -n "$RELEASENAME" ] || RELEASENAME="grml-live rocks" [ -n "$LOGDIR" ] || LOGDIR="/var/log/fai/dirinstall/$HOSTNAME" [ -d "$LOGDIR" ] || mkdir $LOGDIR @@ -123,7 +121,8 @@ usage() echo " $PN - build process script for generating a (grml based) Linux Live-ISO -Usage: $PN [-c ] [-t ] [-s [-Fvh] +Usage: $PN [-c ] [-i ] [-r ] \\ + [-s ] [-t ] [-v ] [-Fvh] Usage examples: @@ -131,7 +130,8 @@ Usage examples: $PN -c GRMLBASE,GRML_X,I386 -t /grml/ $PN -c GRMLBASE,I386 -t /dev/shm/grml $PN -c GRMLBASE,GRML_SMALL,I386 - $PN -s sid -c GRMLBASE,I386 + $PN -c GRMLBASE,I386 -v -i grml_0.0-1.iso + $PN -c GRMLBASE,I386 -s sid More details: man grml-live /usr/share/doc/grml-live/grml-live.html @@ -144,19 +144,21 @@ http://grml.org/bugs/ # command line parsing {{{ -while getopts "c:i:s:t:Fhv" opt; do +while getopts "c:i:r:s:t:v:FhV" opt; do case "$opt" in c) CLASSES="$OPTARG" ;; - F) FORCE=1 ;; - h) usage ; bailout 0 ;; i) ISO_NAME="$OPTARG" ;; + r) RELEASENAME="$OPTARG" ;; s) SUITE="$OPTARG" ;; t) TARGET="$OPTARG" CHROOT_TARGET="$TARGET/grml_chroot" BUILD_TARGET="$TARGET/grml_cd" ISO_TARGET="$TARGET/grml_isos" ;; - v) VERBOSE="-v" ;; + v) VERSION="$OPTARG" ;; + F) FORCE=1 ;; + h) usage ; bailout 0 ;; + V) VERBOSE="-v" ;; ?) echo "invalid option -$OPTARG" >&2; bailout 1 ;; esac done @@ -303,14 +305,14 @@ if [ "$ARCH" = i386 ] ; then # adjust boot splash information: ISO_DATE="$(date +%Y-%m-%d)" VERSION="$(cut_string 5 "$VERSION")" ; VERSION="$(extend_string_end 5 "$VERSION")" - CODENAME="$(cut_string 30 "$CODENAME")" ; CODENAME="$(extend_string_end 30 "$CODENAME")" + RELEASENAME="$(cut_string 30 "$RELEASENAME")" ; RELEASENAME="$(extend_string_end 30 "$RELEASENAME")" sed -i "s/%VERSION%/$VERSION/" "$BUILD_TARGET"/boot/isolinux/boot.msg - sed -i "s/%CODENAME%/$CODENAME/" "$BUILD_TARGET"/boot/isolinux/boot.msg + sed -i "s/%RELEASENAME%/$RELEASENAME/" "$BUILD_TARGET"/boot/isolinux/boot.msg sed -i "s/%DATE%/$ISO_DATE/" "$BUILD_TARGET"/boot/isolinux/boot.msg sed -i "s/%VERSION%/$VERSION/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg - sed -i "s/%CODENAME%/$CODENAME/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg + sed -i "s/%RELEASENAME%/$RELEASENAME/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg sed -i "s/%DATE%/$ISO_DATE/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg # autostart for Windows: @@ -359,17 +361,18 @@ fi # ISO_TARGET - mkisofs {{{ [ -n "$ISO_TARGET" ] || ISO_TARGET="$TARGET/grml_isos" -if [ -d "$ISO_TARGET" ] ; then +[ -n "$ISO_NAME" ] || ISO_NAME="grml_${VERSION}.iso" + +if [ -f "${ISO_TARGET}/${ISO_NAME}" ] ; then ewarn "$ISO_TARGET exists already, skipping stage 'iso build'" ; eend 0 log "$ISO_TARGET exists already, skipping stage 'iso build'" else mkdir -p "$ISO_TARGET" || bailout 6 "Problem with creating $ISO_TARGET for stage 'iso build'" - [ -n "$ISO_NAME" ] || ISO_NAME="grml_0.0-1.iso" ( cd "$BUILD_TARGET" && - mkisofs -V "Debian/etch grml" -publisher 'grml-live | grml.org' \ + mkisofs -V "grml $VERSION" -publisher 'grml-live | grml.org' \ -l -r -J -no-emul-boot -boot-load-size 4 -boot-info-table \ -c boot/isolinux/boot.cat -b boot/isolinux/isolinux.bin \ - -o "${ISO_TARGET}"/"${ISO_NAME}" . + -o "${ISO_TARGET}/${ISO_NAME}" . ) einfo "Finished execution of stage 'iso build'" ; eend 0 log "Finished execution of stage 'iso build' [$(date)]" diff --git a/i386_files/boot/isolinux/boot-beep.msg b/i386_files/boot/isolinux/boot-beep.msg index 7e906b6..ae09864 100644 --- a/i386_files/boot/isolinux/boot-beep.msg +++ b/i386_files/boot/isolinux/boot-beep.msg @@ -1,5 +1,5 @@ 17 logo.16 Some information and boot options available via keys F2 - F10. http://grml.org/ -grml %VERSION% - Release Codename %CODENAME% %DATE% +grml %VERSION% - Release Codename %RELEASENAME% %DATE%  diff --git a/i386_files/boot/isolinux/boot.msg b/i386_files/boot/isolinux/boot.msg index efb308e..994db1e 100644 --- a/i386_files/boot/isolinux/boot.msg +++ b/i386_files/boot/isolinux/boot.msg @@ -1,4 +1,4 @@ 17 logo.16 Some information and boot options available via keys F2 - F10. http://grml.org/ -grml %VERSION% - Release Codename %CODENAME% %DATE% +grml %VERSION% - Release Codename %RELEASENAME% %DATE% -- 2.1.4 From 64160df70c57e1404ca3cfd27cfaf0a3928baf78 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Thu, 20 Sep 2007 13:26:46 +0200 Subject: [PATCH 13/16] Support grub as bootloader --- debian/copyright | 5 +++ etc/grml/grml-live.conf | 4 +++ grml-live | 32 ++++++++++--------- i386_files/boot/grub/menu.lst | 56 ++++++++++++++++++++++++++++++++++ i386_files/boot/grub/splash.xpm.gz | Bin 0 -> 16141 bytes i386_files/boot/grub/stage2_eltorito | Bin 0 -> 108296 bytes i386_files/boot/isolinux/isolinux.cfg | 44 +++----------------------- i386_files/boot/isolinux/syslinux.cfg | 44 +++----------------------- 8 files changed, 91 insertions(+), 94 deletions(-) create mode 100644 i386_files/boot/grub/menu.lst create mode 100644 i386_files/boot/grub/splash.xpm.gz create mode 100644 i386_files/boot/grub/stage2_eltorito diff --git a/debian/copyright b/debian/copyright index aca79c2..7199f16 100644 --- a/debian/copyright +++ b/debian/copyright @@ -9,6 +9,11 @@ Copyright: Copyright 2007++ Michael Prokop + Copyright of /usr/share/grml-live/i386_files/boot/grub/splash.xpm.gz by + Robin Bakels , which is licensed under "GPL v2 or higher" + and hase been taken from Debian package grub-splashimages + (file /boot/grub/splashimages/fiesta.xpm.gz). + License: This package is free software; you can redistribute it and/or modify diff --git a/etc/grml/grml-live.conf b/etc/grml/grml-live.conf index 372c56f..8c1fe24 100644 --- a/etc/grml/grml-live.conf +++ b/etc/grml/grml-live.conf @@ -69,6 +69,10 @@ HOSTNAME=grml # Specify user with UID 1000 on live-system: USERNAME=grml +# Which bootloader do you want to use? Default: isolinux +# Supported values: isolinux, grub +# BOOT_METHOD='isolinux' + # Directory of configuration files for grml-live's FAI: GRML_FAI_CONFIG=/etc/grml/fai diff --git a/grml-live b/grml-live index ae0e99e..9fc2d26 100755 --- a/grml-live +++ b/grml-live @@ -4,7 +4,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2 or any later version. -# Latest change: Wed Sep 19 23:59:48 CEST 2007 [mika] +# Latest change: Thu Sep 20 13:25:31 CEST 2007 [mika] ################################################################################ # read configuration files, set some misc variables {{{ @@ -279,9 +279,9 @@ mkdir -p "$BUILD_TARGET" || bailout 6 "Problem with creating $BUILD_TARGET for s # i386: [ -n "$ARCH" ] || ARCH="$(dpkg --print-architecture)" if [ "$ARCH" = i386 ] ; then - if [ -d "$BUILD_TARGET"/boot/isolinux ] ; then - ewarn "$BUILD_TARGET/boot exists already, skipping stage 'boot/isolinux'" ; eend 0 - log "$BUILD_TARGET/boot exists already, skipping stage 'boot/isolinux'" + if [ -d "$BUILD_TARGET"/boot ] ; then + ewarn "$BUILD_TARGET/boot exists already, skipping stage 'boot'" ; eend 0 + log "$BUILD_TARGET/boot exists already, skipping stage 'boot'" else # booting stuff: mkdir -p "$BUILD_TARGET"/boot/isolinux @@ -293,14 +293,9 @@ if [ "$ARCH" = i386 ] ; then cp /usr/lib/syslinux/isolinux.bin "$BUILD_TARGET"/boot/isolinux/ cp /usr/lib/syslinux/memdisk "$BUILD_TARGET"/boot/isolinux/ cp /usr/lib/syslinux/menu.c32 "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/allinone.img "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/balder10.imz "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/boot-beep.msg "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/boot.msg "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/f* "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/isolinux.cfg "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/logo.16 "$BUILD_TARGET"/boot/isolinux/ - cp /usr/share/grml-live/i386_files/boot/isolinux/syslinux.cfg "$BUILD_TARGET"/boot/isolinux/ + cp /usr/share/grml-live/i386_files/boot/isolinux/* "$BUILD_TARGET"/boot/isolinux/ + cp /usr/share/grml-live/i386_files/boot/isolinux/* "$BUILD_TARGET"/boot/isolinux/ + cp -a /usr/share/grml-live/i386_files/boot/grub "$BUILD_TARGET"/boot/ # adjust boot splash information: ISO_DATE="$(date +%Y-%m-%d)" @@ -315,6 +310,8 @@ if [ "$ARCH" = i386 ] ; then sed -i "s/%RELEASENAME%/$RELEASENAME/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg sed -i "s/%DATE%/$ISO_DATE/" "$BUILD_TARGET"/boot/isolinux/boot-beep.msg + sed -i "s/%VERSION%/$VERSION/" "$BUILD_TARGET"/boot/grub/menu.lst + # autostart for Windows: cp /usr/share/grml-live/windows/autostart/autorun.bat "$BUILD_TARGET"/ cp /usr/share/grml-live/windows/autostart/autorun.inf "$BUILD_TARGET"/ @@ -335,7 +332,7 @@ if [ "$ARCH" = i386 ] ; then einfo "Finished execution of stage 'WINDOWS_BINARIES'" ; eend 0 log "Finished execution of stage 'WINDOWS_BINARIES' [$(date)]" fi - einfo "Finished execution of stage 'boot/isolinux'" ; eend 0 + einfo "Finished execution of stage 'boot'" ; eend 0 fi # amd64: elif [ "$ARCH" = amd64 ] ; then @@ -363,6 +360,13 @@ fi [ -n "$ISO_TARGET" ] || ISO_TARGET="$TARGET/grml_isos" [ -n "$ISO_NAME" ] || ISO_NAME="grml_${VERSION}.iso" +[ -n "$BOOT_METHOD" ] || BOOT_METHOD='isolinux' +if [ "$BOOT_METHOD" = "isolinux" ] ; then + BOOT_FILE="boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat" +elif [ "$BOOT_METHOD" = "grub" ] ; then + BOOT_FILE="boot/grub/stage2_eltorito" +fi + if [ -f "${ISO_TARGET}/${ISO_NAME}" ] ; then ewarn "$ISO_TARGET exists already, skipping stage 'iso build'" ; eend 0 log "$ISO_TARGET exists already, skipping stage 'iso build'" @@ -371,7 +375,7 @@ else ( cd "$BUILD_TARGET" && mkisofs -V "grml $VERSION" -publisher 'grml-live | grml.org' \ -l -r -J -no-emul-boot -boot-load-size 4 -boot-info-table \ - -c boot/isolinux/boot.cat -b boot/isolinux/isolinux.bin \ + -b $BOOT_FILE \ -o "${ISO_TARGET}/${ISO_NAME}" . ) einfo "Finished execution of stage 'iso build'" ; eend 0 diff --git a/i386_files/boot/grub/menu.lst b/i386_files/boot/grub/menu.lst new file mode 100644 index 0000000..3a46406 --- /dev/null +++ b/i386_files/boot/grub/menu.lst @@ -0,0 +1,56 @@ +# menu.lst - See: grub(8), info grub, update-grub(8) +# grub-install(8), grub-floppy(8), +# grub-md5-crypt, /usr/share/doc/grub +# and /usr/share/doc/grub-doc/. + +# misc options: +timeout 30 +root (cd) +# color red/blue green/black +splashimage=/boot/grub/splash.xpm.gz +foreground = 000000 +background = FFCC33 + +# define entries: +title grml %VERSION% - Default boot (using 1024x768 framebuffer) +kernel /boot/isolinux/linux26 lang=us apm=power-off vga=791 quiet boot=live nomce +initrd /boot/isolinux/initrd.gz + +title grml %VERSION% - without framebuffer +kernel /boot/isolinux/linux26 lang=us apm=power-off vga=normal video=ofonly quiet initrd=initrd.gz boot=live nomce +initrd /boot/isolinux/initrd.gz + +title grml %VERSION% - with 1280x1024 framebuffer +kernel /boot/isolinux/linux26 lang=us apm=power-off vga=794 quiet initrd=initrd.gz boot=live nomce +initrd /boot/isolinux/initrd.gz + +title grml %VERSION% - with 800x600 framebuffer +kernel /boot/isolinux/linux26 lang=us apm=power-off vga=788 quiet initrd=initrd.gz boot=live nomce +initrd /boot/isolinux/initrd.gz + +title grml %VERSION% - failsafe boot +kernel /boot/isolinux/linux26 vga=normal lang=us boot=live noautoconfig atapicd noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia maxcpus=1 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm +initrd /boot/isolinux/initrd.gz + +title grml %VERSION% - debug mode +kernel /boot/isolinux/linux26 lang=us apm=power-off vga=791 verbose debug=vc debug initrd=initrd.gz boot=live initcall_debug nomce +initrd /boot/isolinux/initrd.gz + +title grml %VERSION% - forensic mode +kernel /boot/isolinux/linux26 vga=791 lang=us nofstab noraid nolvm noautoconfig noswap raid=noautodetect quiet initrd=initrd.gz boot=live +initrd /boot/isolinux/initrd.gz + +title grml %VERSION% - serial mode +kernel /boot/isolinux/linux26 lang=us apm=power-off vga=normal video=vesafb:off quiet initrd=initrd.gz boot=live nomce +initrd /boot/isolinux/initrd.gz + +title Run memtest86+ +kernel /boot/isolinux/memtest + +title Boot FreeDOS +kernel /boot/isolinux/memdisk +initrd /boot/isolinux/balder10.imz + +title grml %VERSION% - old boot method +kernel /boot/isolinux/linux26 ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 nomce quiet grml_dir="live" grml_name="grml.squashfs" +initrd /boot/isolinux/minirt26.gz diff --git a/i386_files/boot/grub/splash.xpm.gz b/i386_files/boot/grub/splash.xpm.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c34906f97bb4e279cb36140b06b0c38a0f7b414 GIT binary patch literal 16141 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 UIe)7XeGKepX22|NM|}6c02{U|fdBvi literal 0 HcmV?d00001 diff --git a/i386_files/boot/grub/stage2_eltorito b/i386_files/boot/grub/stage2_eltorito new file mode 100644 index 0000000000000000000000000000000000000000..a726b51915013405e66675bc40f523fedc88f3d8 GIT binary patch literal 108296 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

`UbW< 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 literal 0 HcmV?d00001 diff --git a/i386_files/boot/isolinux/isolinux.cfg b/i386_files/boot/isolinux/isolinux.cfg index d4aa1c8..5dab5f1 100644 --- a/i386_files/boot/isolinux/isolinux.cfg +++ b/i386_files/boot/isolinux/isolinux.cfg @@ -22,7 +22,7 @@ F10 f10 # MENU HIDE # KERNEL menu.c32 -MENU TITLE grml 1.0 - Boot Menu +MENU TITLE grml - Boot Menu LABEL grml MENU LABEL grml - Standard Bootup @@ -31,16 +31,10 @@ KERNEL linux26 APPEND lang=us apm=power-off vga=791 quiet initrd=initrd.gz boot=live nomce # APPEND lang=us apm=power-off vga=791 live-media-path=/GRML quiet initrd=initrd.gz boot=live nomce -LABEL live -MENU LABEL live -MENU DEFAULT -KERNEL linux26 -APPEND lang=us apm=power-off vga=791 initrd=initrd.gz boot=live nomce - LABEL old MENU LABEL old KERNEL linux26 -APPEND ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 initrd=minirt26.gz nomce quiet BOOT_IMAGE=grml +APPEND ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 nomce quiet grml_dir="live" grml_name="grml.squashfs" LABEL splash MENU LABEL grml - Bootsplash @@ -77,21 +71,11 @@ MENU LABEL grmlx KERNEL linux26 APPEND lang=us apm=power-off startx=wm-ng vga=791 quiet initrd=initrd.gz boot=live nomce -LABEL initng -MENU LABEL initng -KERNEL linux26 -APPEND init=/sbin/initng lang=us apm=power-off vga=791 quiet initrd=initrd.gz boot=live nomce - LABEL nofb MENU LABEL grml without framebuffer KERNEL linux26 APPEND lang=us apm=power-off vga=normal video=ofonly quiet initrd=initrd.gz boot=live nomce -LABEL expert -MENU LABEL expert -KERNEL linux26 -APPEND lang=us apm=power-off vga=791 verbose initrd=initrd.gz boot=live nomce - LABEL linux26 MENU LABEL linux26 KERNEL linux26 @@ -117,35 +101,15 @@ MENU LABEL fb800x600 KERNEL linux26 APPEND lang=us apm=power-off vga=788 quiet initrd=initrd.gz boot=live nomce -LABEL mika -MENU LABEL mika -KERNEL linux26 -APPEND lang=us vga=791 quiet initrd=initrd.gz boot=live nomce gmt tz=Europe/Vienna - -LABEL jimmy -MENU LABEL jimmy -KERNEL linux26 -APPEND lang=us vga=791 quiet initrd=initrd.gz boot=live scandelay=3 nomce gmt tz=Europe/Vienna - LABEL failsafe MENU LABEL failsafe KERNEL linux26 -APPEND vga=normal video=ofonly noautoconfig lang=us atapicd noacpi nomodules acpi=off noagent nousb nohotplug noacpi noapm nopcmcia nosmp noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noautoconfig quiet initrd=initrd.gz boot=live - -LABEL failsafe2 -MENU LABEL failsafe2 -KERNEL linux26 -APPEND lang=us atapicd nosound noacpi noautoconfig acpi=off noscsi nodma ide=nodma noapm nousb nopcmcia nofirewire noagp nomce nodhcp xmodule=vesa quiet initrd=initrd.gz boot=live +APPEND initrd=initrd.gz vga=normal lang=us boot=live noautoconfig atapicd noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia maxcpus=1 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm LABEL forensic MENU LABEL forensic KERNEL linux26 -APPEND vga=791 lang=us nofstab noraid noautoconfig noswap raid=noautodetect quiet initrd=initrd.gz boot=live - -LABEL m23 -MENU LABEL m23 -KERNEL m23 -APPEND devfs=nomount load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=25000 initrd=m23rt.gz root=/dev/ram0 rw +APPEND vga=791 lang=us nofstab noraid nolvm noautoconfig noswap raid=noautodetect quiet initrd=initrd.gz boot=live LABEL grub MENU LABEL grub diff --git a/i386_files/boot/isolinux/syslinux.cfg b/i386_files/boot/isolinux/syslinux.cfg index bbfc86e..21ef563 100644 --- a/i386_files/boot/isolinux/syslinux.cfg +++ b/i386_files/boot/isolinux/syslinux.cfg @@ -22,7 +22,7 @@ F10 f10 # MENU HIDE # KERNEL menu.c32 -MENU TITLE grml 1.0 - Boot Menu +MENU TITLE grml - Boot Menu LABEL grml MENU LABEL grml - Standard Bootup @@ -31,16 +31,10 @@ KERNEL linux26 APPEND lang=us apm=power-off vga=791 quiet initrd=initrd.gz boot=live nomce # APPEND lang=us apm=power-off vga=791 live-media-path=/GRML quiet initrd=initrd.gz boot=live nomce -LABEL live -MENU LABEL live -MENU DEFAULT -KERNEL linux26 -APPEND lang=us apm=power-off vga=791 initrd=initrd.gz boot=live nomce - LABEL old MENU LABEL old KERNEL linux26 -APPEND ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 initrd=minirt26.gz nomce quiet BOOT_IMAGE=grml +APPEND ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 nomce quiet grml_dir="live" grml_name="grml.squashfs" LABEL splash MENU LABEL grml - Bootsplash @@ -77,21 +71,11 @@ MENU LABEL grmlx KERNEL linux26 APPEND lang=us apm=power-off startx=wm-ng vga=791 quiet initrd=initrd.gz boot=live nomce -LABEL initng -MENU LABEL initng -KERNEL linux26 -APPEND init=/sbin/initng lang=us apm=power-off vga=791 quiet initrd=initrd.gz boot=live nomce - LABEL nofb MENU LABEL grml without framebuffer KERNEL linux26 APPEND lang=us apm=power-off vga=normal video=ofonly quiet initrd=initrd.gz boot=live nomce -LABEL expert -MENU LABEL expert -KERNEL linux26 -APPEND lang=us apm=power-off vga=791 verbose initrd=initrd.gz boot=live nomce - LABEL linux26 MENU LABEL linux26 KERNEL linux26 @@ -117,35 +101,15 @@ MENU LABEL fb800x600 KERNEL linux26 APPEND lang=us apm=power-off vga=788 quiet initrd=initrd.gz boot=live nomce -LABEL mika -MENU LABEL mika -KERNEL linux26 -APPEND lang=us vga=791 quiet initrd=initrd.gz boot=live nomce gmt tz=Europe/Vienna - -LABEL jimmy -MENU LABEL jimmy -KERNEL linux26 -APPEND lang=us vga=791 quiet initrd=initrd.gz boot=live scandelay=3 nomce gmt tz=Europe/Vienna - LABEL failsafe MENU LABEL failsafe KERNEL linux26 -APPEND vga=normal video=ofonly noautoconfig lang=us atapicd noacpi nomodules acpi=off noagent nousb nohotplug noacpi noapm nopcmcia nosmp noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noautoconfig quiet initrd=initrd.gz boot=live - -LABEL failsafe2 -MENU LABEL failsafe2 -KERNEL linux26 -APPEND lang=us atapicd nosound noacpi noautoconfig acpi=off noscsi nodma ide=nodma noapm nousb nopcmcia nofirewire noagp nomce nodhcp xmodule=vesa quiet initrd=initrd.gz boot=live +APPEND initrd=initrd.gz vga=normal lang=us boot=live noautoconfig atapicd noacpi acpi=off nomodules nofirewire noudev nousb nohotplug noapm nopcmcia maxcpus=1 noscsi noagp nodma ide=nodma noswap nofstab nosound nogpm nosyslog nodhcp nocpu nodisc nomodem xmodule=vesa noraid nolvm LABEL forensic MENU LABEL forensic KERNEL linux26 -APPEND vga=791 lang=us nofstab noraid noautoconfig noswap raid=noautodetect quiet initrd=initrd.gz boot=live - -LABEL m23 -MENU LABEL m23 -KERNEL m23 -APPEND devfs=nomount load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=25000 initrd=m23rt.gz root=/dev/ram0 rw +APPEND vga=791 lang=us nofstab noraid nolvm noautoconfig noswap raid=noautodetect quiet initrd=initrd.gz boot=live LABEL grub MENU LABEL grub -- 2.1.4 From 2b3a5ce00c87e60d581acd2db7f252f74fe99e50 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Thu, 20 Sep 2007 16:11:14 +0200 Subject: [PATCH 14/16] Show boot-method in configuration summary --- grml-live | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/grml-live b/grml-live index 9fc2d26..407cc17 100755 --- a/grml-live +++ b/grml-live @@ -56,6 +56,7 @@ trap bailout 1 2 3 15 [ -n "$HOSTNAME" ] || HOSTNAME=grml [ -n "$USERNAME" ] || USERNAME=grml [ -n "$CLASSES" ] || CLASSES="GRML,I386" +[ -n "$BOOT_METHOD" ] || BOOT_METHOD='isolinux' [ -n "$TARGET" ] || bailout 1 "${PN}: \$TARGET not specified. Please adjust $LIVE_CONF. Exiting." [ -n "$VERSION" ] || VERSION="0.0.1" @@ -184,6 +185,7 @@ if [ -z "$FORCE" ] ; then [ -n "$BUILD_TARGET" ] && echo " build target: $BUILD_TARGET" [ -n "$ISO_TARGET" ] && echo " ISO target: $ISO_TARGET" [ -n "$SUITE" ] && echo " Debian suite: $SUITE" + [ -n "$BOOT_METHOD" ] && echo " Boot method: $BOOT_METHOD" [ -n "$FAI_ARGS" ] && echo " additional arguments for FAI: $FAI_ARGS" [ -n "$VERBOSE" ] && echo " Using VERBOSE mode." echo @@ -360,7 +362,6 @@ fi [ -n "$ISO_TARGET" ] || ISO_TARGET="$TARGET/grml_isos" [ -n "$ISO_NAME" ] || ISO_NAME="grml_${VERSION}.iso" -[ -n "$BOOT_METHOD" ] || BOOT_METHOD='isolinux' if [ "$BOOT_METHOD" = "isolinux" ] ; then BOOT_FILE="boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat" elif [ "$BOOT_METHOD" = "grub" ] ; then -- 2.1.4 From 9600310bd173ef1a1b30b03c8b2da30247466cb6 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Thu, 20 Sep 2007 17:29:41 +0200 Subject: [PATCH 15/16] Depend on acpi-support in class GRMLBASE --- etc/grml/fai/config/package_config/GRMLBASE | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/grml/fai/config/package_config/GRMLBASE b/etc/grml/fai/config/package_config/GRMLBASE index 2e505c6..01b6e2f 100644 --- a/etc/grml/fai/config/package_config/GRMLBASE +++ b/etc/grml/fai/config/package_config/GRMLBASE @@ -1,5 +1,6 @@ PACKAGES aptitude +acpi-support aumix alsa-utils busybox bzip2 -- 2.1.4 From 901463b585051f487e6d895698fc650033c8da72 Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Thu, 20 Sep 2007 17:53:24 +0200 Subject: [PATCH 16/16] Added tag 0.0.1 for changeset 3a72d3ddb864 --- .hgtags | 1 + 1 file changed, 1 insertion(+) create mode 100644 .hgtags diff --git a/.hgtags b/.hgtags new file mode 100644 index 0000000..ee573b0 --- /dev/null +++ b/.hgtags @@ -0,0 +1 @@ +3a72d3ddb864f3ee3c023643bd876453357aa361 0.0.1 -- 2.1.4