#!/bin/bash # isntallmodule - instalar módulo de kernel en Initrd de cliente ogLive. # Uso: installmodule tarfile # Nota: tarfile es un fichero tar.gz con el fichero .ko del módulo y un fichero "module.conf" # para configuración de instalación (debe incluir nombre, fichero y camino del módulo). # Autor: Ramón M. Gómez # Fecha: 2015-12-03 # Variables. PROG=$(basename $0) OPENGNSYS=/opt/opengnsys INITRD=$OPENGNSYS/tftpboot/ogclient/oginitrd.img TARFILE=$(realpath $1 2>/dev/null) tmpmod=/tmp/module$$ tmpinit=/tmp/initrd$$ # Comprobar errores. if [ $# -ne 1 ]; then echo "$PROG: Incorrect operand. Format: $PROG moduletarfile" >&2 exit 1 fi if [ "$USER" != "root" ]; then echo "$PROG: Need to be root." >&2 exit 1 fi # Mostrar ayuda. if [ "$1" == "help" ]; then cat << EOT $PROG: installs kernel module into ogLive image (initrd). Format: $PROG moduletarfile moduletarfile must be a tar.gz archive with 2 files: - *.ko: compiled module - module.conf: configuration file Configuration file format: module=ModuleName file=ModuleFile path=ModulePath ModuleName must be a single word. ModuleFile must be a kernel compiled module file (*.ko). ModulePath must be the kernel target directory, started by "kernel/". EOT exit 0 fi # Comprobar acceso al fichero de módulos. if [ ! -r "$TARFILE" ]; then echo "$PROG: Cannot access module file." >&2 exit 1 fi pushd /tmp >/dev/null # Borrar al salir del programa. trap "popd 2>/dev/null; rm -fr $tmpmod $tmpinit" 0 1 2 3 6 9 15 # Descompresión de módulos para el ogLive actual. mkdir -p $tmpmod cd $tmpmod tar xvzf $TARFILE >/dev/null || exit # Fichero de configuración. source module.conf || exit [ -z "$module" ] && echo "Module not detected." && exit 1 # Descomprimir Initrd. mkdir -p $tmpinit cd $tmpinit COMPRESS=$(file -b "$INITRD" | awk '{print tolower($1);}') $COMPRESS -dc "$INITRD" | cpio -im 2>/dev/null # Versión del Kernel del Initrd. KERNEL=$(ls -d lib/modules/[0-9]* | head -1) [ -z "$KERNEL" ] && echo "Kernel not detected." && exit 1 # Avisar si el Kernel del módulo es distinto del del Initred. echo "$(basename $KERNEL) $(modinfo -F vermagic $tmpmod/$file | cut -f1 -d' ')" | awk '$1!=$2 {print "WARNING: installing module for Kernel",$1,"on Kernel",$2}' # Copiar módulo y reconstruir dependencias. echo "Installing module: $module" cp -a $tmpmod/$file $KERNEL/$path depmod -b . -a $(basename $KERNEL) # Recomponer el Initrd. find . | cpio -H newc -oa | gzip -9c >$INITRD md5sum $INITRD | cut -f1 -d" " > $INITRD.sum cp -a $INITRD $INITRD.sum $OPENGNSYS/tftpboot # Limpiar. popd >/dev/null rm -fr $tmpmod $tmpinit