Inhaltsverzeichnis
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.
