Benutzer-Werkzeuge

Webseiten-Werkzeuge


openqrm_-_pxe-kernel

openQRM - PXE-Kernel

  1. Base
    1. Components
      1. Kernels
        1. New:

PXE-Kernel erweitern

# vi /usr/share/openqrm/include/openqrm-server-functions

Wenn man zusätzliche Module in den PXE-Kernel rein haben möchte, dann muss man sich zuerst diese Position suchen:

# --------------------------------------------------------------------
# ------------------------- kernel functions -------------------------
# --------------------------------------------------------------------


# function to create kernels
# param 1     : kernel name
# param 2     : kernel-version
# param 3     : path-to-kernel-files
function openqrm_server_create_kernel() {
      OPENQRM_SERVER_KERNEL_NAME=$1
      OPENQRM_SERVER_KERNEL_VERSION=$2
      OPENQRM_SERVER_KERNEL_LOCATION=$3
      # OPENQRM_SERVER_KERNEL_TYPE can be "ext2" or "initramfs"
      OPENQRM_SERVER_KERNEL_TYPE=$4
      OPENQRM_SERVER_INITRD_TEMPLATE=$5
      
      if [ "$OPENQRM_SERVER_KERNEL_TYPE" == "" ]; then
              export OPENQRM_SERVER_KERNEL_TYPE="ext2"
      fi
      if [ "$OPENQRM_SERVER_INITRD_TEMPLATE" == "" ]; then
              export OPENQRM_SERVER_INITRD_TEMPLATE=$OPENQRM_DEFAULT_INITRD_TEMPLATE
      fi
      
      echo "Creating kernel $OPENQRM_SERVER_KERNEL_NAME version $OPENQRM_SERVER_KERNEL_VERSION ($OPENQRM_SERVER_KERNEL_TYPE initrd)"
      # copy kernel + System-map
      cp -a $OPENQRM_SERVER_KERNEL_LOCATION/boot/vmlinuz-$OPENQRM_SERVER_KERNEL_VERSION $OPENQRM_SERVER_BASE_DIR/openqrm/tftpboot/boot/vmlinuz-$OPENQRM_SERVER_KERNEL_NAME
      cp -a $OPENQRM_SERVER_KERNEL_LOCATION/boot/System.map-$OPENQRM_SERVER_KERNEL_VERSION $OPENQRM_SERVER_BASE_DIR/openqrm/tftpboot/boot/System.map-$OPENQRM_SERVER_KERNEL_NAME
      # modules
      tar -C $OPENQRM_SERVER_KERNEL_LOCATION/ -czf $OPENQRM_SERVER_BASE_DIR/openqrm/tftpboot/boot/modules-$OPENQRM_SERVER_KERNEL_NAME.tgz lib/modules/$OPENQRM_SERVER_KERNEL_VERSION
      # initrd
      mkdir -p $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME
      mkdir -p $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION
      for MODULE in `find $OPENQRM_SERVER_KERNEL_LOCATION/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION/kernel/drivers/net -type f | grep -v wireless`; do
              MODULE_NAME=`echo $MODULE | sed -e "s/.*\///"`
              if ! echo $OPENQRM_UNWANTED_MODULES | grep $MODULE_NAME 1>/dev/null; then
                      /bin/cp -f $MODULE $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION
              fi
      done

Jetzt kleben wir einfach unseren Teil darunter:

      mkdir -p $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION

      # DCA
      for MODULE in `find $OPENQRM_SERVER_KERNEL_LOCATION/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION/kernel/drivers/ -type f -print | grep dca`; do
              MODULE_NAME=`echo $MODULE | sed -e "s/.*\///"`
              if ! echo $OPENQRM_UNWANTED_MODULES | grep $MODULE_NAME 1>/dev/null; then
                      /bin/cp -f $MODULE $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION
              fi
      done
      # mdio
      for MODULE in `find $OPENQRM_SERVER_KERNEL_LOCATION/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION/kernel/drivers/ -type f -print | grep mdio`; do
              MODULE_NAME=`echo $MODULE | sed -e "s/.*\///"`
              if ! echo $OPENQRM_UNWANTED_MODULES | grep $MODULE_NAME 1>/dev/null; then
                      /bin/cp -f $MODULE $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION
              fi
      done
      # USB 
      for MODULE in `find $OPENQRM_SERVER_KERNEL_LOCATION/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION/kernel/drivers/hid -type f -print | grep hid`; do
              MODULE_NAME=`echo $MODULE | sed -e "s/.*\///"`
              if ! echo $OPENQRM_UNWANTED_MODULES | grep $MODULE_NAME 1>/dev/null; then
                      /bin/cp -f $MODULE $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/modules/$OPENQRM_SERVER_KERNEL_VERSION
              fi
      done

    # take firmware from kernel-location
        rm -rf   $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/firmware
        mkdir -p $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/firmware/bnx2
        mkdir -p $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/firmware/$OPENQRM_SERVER_KERNEL_VERSION/bnx2
        for FIRMWARE in `find $OPENQRM_SERVER_KERNEL_LOCATION/lib/firmware/$OPENQRM_SERVER_KERNEL_VERSION -name bnx*`; do
                FIRMWARE_NAME=`echo $FIRMWARE | sed -e "s/.*\///"`
              echo "copy $FIRMWARE"
                [ -f $FIRMWARE ] && /bin/cp -f $FIRMWARE $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/firmware/$OPENQRM_SERVER_KERNEL_VERSION/bnx2/
                [ -f $FIRMWARE ] && /bin/cp -f $FIRMWARE $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/firmware/bnx2/
                [ -f $FIRMWARE ] && /bin/cp -f $FIRMWARE $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/lib/firmware/
        done

      find /lib/modules/${BOOT_IMAGE_VERSION}/ -type f | egrep 'mptbase|mptsas|mptscsih|scsi_transport_sas|jfs' | while read MODULPFAD
      do
              tar cf - ${MODULPFAD} | tar xvf - -C $OPENQRM_TEMP_DIR/bootimage/$OPENQRM_SERVER_KERNEL_NAME/
      done

Erweiterungen in der openqrm-linuxrc

# vi /usr/share/openqrm/etc/templates/openqrm-linuxrc

Als erstes suchen wir uns in der Sektion "main" die Stelle, an der "depmod" zwei mal hintereinander aufgerufen wird.

Hinter dieser Position können noch zusätzliche Module geladen werden:

# need to run depmod 2 times as experienced
depmod -a
depmod -a
modprobe mptsas
modprobe jfs

In diesem Fall habe ich das Modul für den DEL/SAS-RAID-Controller von LSI und das JFS-Modul laden lassen.

PXE-Kernel bauen

# /usr/share/openqrm/bin/openqrm kernel add -n name -v version -u username -p password [-l location] [-i initramfs/ext2] [-t path-to-initrd-template-file]
# /usr/share/openqrm/bin/openqrm kernel add -n $(awk '{sub("[ ]","_");gsub("[.]","");print $2}' /etc/issue) -v $(uname -r) -u username -p password [-l location] [-i initramfs/ext2] [-t path-to-initrd-template-file]

zB.:

# /usr/share/openqrm/bin/openqrm kernel add -n $(awk '{sub("[ ]","_");gsub("[.]","");print $1}' /etc/issue) -v $(uname -r) -u openqrm -p openqrm -l / -t /usr/share/openqrm/etc/templates/openqrm-initrd-template.ubuntu.x86_64.tgz

zum Default-Kernel machen

Zum Schluss darf nicht vergessen werden, dass dieser Kernel unter "Base / Components / Kernels" auch zum Default-Kernel gemacht wird!

jfsutils

Soll ein Netzwerk-Boot von einer "unsauberen", lokalen JFS-Partition durchgeführt werden, dann schlägt das fehl, denn die initrd, die openQRM dem PXE-Boot zur verfühgung stellt, enthält keine "jfsutils" und kann deshalb keine nicht-"ext*"-Partition bereinigen.

Deshalb bauen wir uns ein kleines Paket mit den Binärdateien aus dem Paket "jfsutils":

# tar cf /usr/share/openqrm/web/action/jfsutils.tar /sbin/*jfs*

Dann kann man sich dieses Paket im Notfall holen und das Dateisystem bereinigen:

# wget http://10.10.5.80/openqrm/action/jfsutils.tar
# tar xvf jfsutils.tar -C /
# jfs_fsck /dev/sda1
# reboot

Und damit das auch automatisch geht, tragen wir das nich in den PXE-Kernel ein:

# vi /usr/share/openqrm/etc/templates/openqrm-linuxrc

zuerst suchen wir diese Stelle (in 4.6 ist das ca. in Zeile 400)

...
        # mount ro (provided by the deployment plugin)
        ###############################################################
        # DEPLOYMENT PLUGIN HOOK ######################################
        ###############################################################
        mount_rootfs
...

Dann kommen die folgenden Zeilen über den oben gezeigten Bereich!

        ### JFS-Utils
        rm -f jfsutils.tar
        $WGET -q "$openqrm_web_protocol://$OPENQRM_SERVER_IP_ADDRESS/openqrm/action/jfsutils.tar"
        tar xvf jfsutils.tar -C /
        for JFSVOL in $(blkid -o device -l -t TYPE="jfs")
        do      
                /sbin/jfs_fsck ${JFSVOL}
        done    

… jetzt muss der PXE-Kernel einmal neu gebaut werden:

# /usr/share/openqrm/bin/openqrm kernel add -n $(awk '{sub("[ ]","_");gsub("[.]","");print $1}' /etc/issue) -v $(uname -r) -u openqrm -p openqrm -l / -t /usr/share/openqrm/etc/templates/openqrm-initrd-template.ubuntu.x86_64.tgz

Und zum Schluss muss dieser Kernel unter "Base / Components / Kernels" noch zum Standard gemacht werden.

/home/http/wiki/data/pages/openqrm_-_pxe-kernel.txt · Zuletzt geändert: von 127.0.0.1