====== openQRM - PXE-Kernel ====== - Base - Components - Kernels - 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.