From b3312f86061a0d887233f5068cbc335aa2612bed Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Wed, 6 May 2015 18:13:52 +0200 Subject: current state: udev disk detection still not done! also improved module structure and code commentary --- testModule/hooks/cmdline/enable-sysrq.sh | 2 + testModule/hooks/cmdline/expand-kcl-ip.sh | 20 +++++++++ testModule/hooks/cmdline/mark-root-device.sh | 9 ++++ testModule/hooks/mount/mount-root-device.sh | 4 ++ testModule/hooks/pre-mount/mount-qcow.sh | 49 ++++++++++++++++++++++ testModule/hooks/pre-pivot/mount-tmp.sh | 38 +++++++++++++++++ .../hooks/pre-udev/load-dnbd3-nbd-modules.sh | 32 ++++++++++++++ 7 files changed, 154 insertions(+) create mode 100755 testModule/hooks/cmdline/enable-sysrq.sh create mode 100755 testModule/hooks/cmdline/expand-kcl-ip.sh create mode 100755 testModule/hooks/cmdline/mark-root-device.sh create mode 100755 testModule/hooks/mount/mount-root-device.sh create mode 100755 testModule/hooks/pre-mount/mount-qcow.sh create mode 100755 testModule/hooks/pre-pivot/mount-tmp.sh create mode 100755 testModule/hooks/pre-udev/load-dnbd3-nbd-modules.sh (limited to 'testModule/hooks') diff --git a/testModule/hooks/cmdline/enable-sysrq.sh b/testModule/hooks/cmdline/enable-sysrq.sh new file mode 100755 index 00000000..f779aa7a --- /dev/null +++ b/testModule/hooks/cmdline/enable-sysrq.sh @@ -0,0 +1,2 @@ +# enables magic sysrq keys +echo 1 > /proc/sys/kernel/sysrq diff --git a/testModule/hooks/cmdline/expand-kcl-ip.sh b/testModule/hooks/cmdline/expand-kcl-ip.sh new file mode 100755 index 00000000..8be1c718 --- /dev/null +++ b/testModule/hooks/cmdline/expand-kcl-ip.sh @@ -0,0 +1,20 @@ +# fakes the cmdline to fix the ip parsing when using +# syslinux's IPAPPEND 1 mask +[ -d /fake ] || mkdir /fake + +# need to be a tmpfs for the hack to work +mount -t tmpfs tmpfs /fake + +# append ':hiwi:eth0:none' to the 'ip=' parameter we got +# from syslinux's IPAPPEND 1 +sed 's/\(ip=\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}:\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}:\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}:\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)/\1:hiwi:eno1:none/' /proc/cmdline > /fake/cmdline + +# bind mount it. Can we trust mount return codes here? +# # if so, we should check what we get in $? +mount -o bind /fake/cmdline /proc/cmdline + +# check if it worked +if ! grep 'hiwi:eth0:none' /proc/cmdline; then + command -v warn >/dev/null || . /lib/dracut-lib.sh + warn 'Haxing cmdline did not work :( sad pandaz...' +fi diff --git a/testModule/hooks/cmdline/mark-root-device.sh b/testModule/hooks/cmdline/mark-root-device.sh new file mode 100755 index 00000000..b7282521 --- /dev/null +++ b/testModule/hooks/cmdline/mark-root-device.sh @@ -0,0 +1,9 @@ +# set rootok and root as dracut expects them to be set by +# the module preparing the root filesystem. +# +# Once the root filesystem is mounted per dnbd3 and +# exported as qcow2 per nbd, /dev/root will be a symlink +# to /dev/nbd0 as this is then our rootfs-device +rootok=1 +root=block:/dev/root + diff --git a/testModule/hooks/mount/mount-root-device.sh b/testModule/hooks/mount/mount-root-device.sh new file mode 100755 index 00000000..d02f9002 --- /dev/null +++ b/testModule/hooks/mount/mount-root-device.sh @@ -0,0 +1,4 @@ +# this rudimentary script just mounts the rootfs device that was symlinked to +# /dev/root to dracut's $NEWROOT (usually /sysroot). + +mount /dev/root $NEWROOT diff --git a/testModule/hooks/pre-mount/mount-qcow.sh b/testModule/hooks/pre-mount/mount-qcow.sh new file mode 100755 index 00000000..d70492bf --- /dev/null +++ b/testModule/hooks/pre-mount/mount-qcow.sh @@ -0,0 +1,49 @@ +############################################################################### +# CHECKS +# + +SETUP_ROOTFS_SCRIPT="/sbin/setup-qcow2" + +if [ ! -e "${SETUP_ROOTFS_SCRIPT}" ]; then + warn "No such file of directory: ${SETUP_ROOTFS_SCRIPT}" + emergency_shell -n "Error in $0" + return 1 +fi + +if [ ! -x "${SETUP_ROOTFS_SCRIPT}" ]; then + warn "Cannot execute: ${SETUP_ROOTFS_SCRIPT}" + emergency_shell -n "Error in $0" + return 1 +fi + +# +# END CHECKS +############################################################################### + +############################################################################### +# MAIN CODE +# + +# ok, let's source the setup script +if ! . ${SETUP_ROOTFS_SCRIPT} ; then + warn "Could not source: ${SETUP_ROOTFS_SCRIPT}" + emergency_shell -n "Error in $0" + return 1 +fi + +# just go over the functions in the right order ;-) +for fun in connect_dnbd3 create_qcow export_qcow connect_qcow; do + if ! $fun; then + # something failed, drop a shell for debugging + warn "'$fun' failed with: $?" + emergency_shell -n "Error in $fun" + return 1 + fi +done + +# all good, we are done +return 0 + +# +# END MAIN CODE +############################################################################### diff --git a/testModule/hooks/pre-pivot/mount-tmp.sh b/testModule/hooks/pre-pivot/mount-tmp.sh new file mode 100755 index 00000000..152c844e --- /dev/null +++ b/testModule/hooks/pre-pivot/mount-tmp.sh @@ -0,0 +1,38 @@ +# This script only checks if we found a usable partition for the +# future /tmp. The discovery of that partition is done by udev during +# the initqueue. If a valid partition is found (either GPT with the label +# OPENSLX_TMP or MBR with the type 0x44) its path will be written to +# /tmp/openslx.tmpdisk +OPENSLX_TMP_DISK_FLAG="/tmp/openslx.tmpdisk" + +if [ ! -e "$OPENSLX_TMP_DISK_FLAG" ]; then + warn "'$OPENSLX_TMP_DISK_FLAG' not found!" + warn "Systemd will manage $NEWROOT/tmp on its own." + # no partition for the future /tmp found, just + # let systemd manage it then (probably a tmpfs) + return 1 +fi + +# in /tmp/openslx.disk.tmp is the name of the device +# to mount as /tmp in the real system +# meaning we need to mount it to /sysroot/tmp here. + +OPENSLX_TMP_DISK_DEV="$(cat $OPENSLX_TMP_DISK_FLAG)" + +# sanity check: is the content a block device? +if [ ! -b "$OPENSLX_TMP_DISK_DEV" ]; then + warn "'$OPENSLX_TMP_DISK_DEV' appears not to be a block device!" + warn "Systemd will manage $NEWROOT/tmp on its own." + return 1 +fi + +# all good, keep on +if ! mount -t auto "$OPENSLX_TMP_DISK_DEV" /sysroot/tmp; then + # something else went wrong :( + warn "Mounting '$OPENSLX_TMP_DISK_DEV' to '/sysroot/tmp' failed with: $!" + warn "Systemd will manage $NEWROOT/tmp on its own." + return 1 +fi + +# still here? mount worked wohoo +return 0 diff --git a/testModule/hooks/pre-udev/load-dnbd3-nbd-modules.sh b/testModule/hooks/pre-udev/load-dnbd3-nbd-modules.sh new file mode 100755 index 00000000..29f9f210 --- /dev/null +++ b/testModule/hooks/pre-udev/load-dnbd3-nbd-modules.sh @@ -0,0 +1,32 @@ +# include dracut-lib.sh to use 'warn' +command -v warn >/dev/null || . /lib/dracut-lib.sh + +NBD_MOD_PATH="/usr/lib/modules/current/extra/nbd.ko" +DNBD3_MOD_PATH="/usr/lib/modules/current/extra/dnbd3.ko" + +# do we actually have our modules? +if [ ! -e "${NBD_MOD_PATH}" ]; then + warn "No such file of directory: ${NBD_MOD_PATH}" + emergency_shell -n "Error in $0" + return 1 +fi +if [ ! -e "${DNBD3_MOD_PATH}" ]; then + warn "No such file of directory: ${DNBD3_MOD_PATH}" + emergency_shell -n "Error in $0" + return 1 +fi + +# load the kernel modules for dnbd3 and nbd +if ! insmod "${DNBD3_MOD_PATH}"; then + warn "Failed to load DNBD3 kernel module..." + emergency_shell -n "Error in $0" + return 1 +fi + +if ! insmod "${NBD_MOD_PATH}"; then + warn "Failed to load NBD kernel module..." + emergency_shell -n "Error in $0" + return 1 +fi + +return 0 -- cgit v1.2.3-55-g7522 From f0629e71b6cd2d557826e1dd7d5d16266c6aada2 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Wed, 6 May 2015 18:18:44 +0200 Subject: oops --- testModule/hooks/cmdline.sh | 22 --------------------- testModule/hooks/mount.sh | 3 --- testModule/hooks/nbd-cmdline.sh | 5 ----- testModule/hooks/pre-mount.sh | 9 --------- testModule/hooks/pre-udev.sh | 44 ----------------------------------------- 5 files changed, 83 deletions(-) delete mode 100755 testModule/hooks/cmdline.sh delete mode 100755 testModule/hooks/mount.sh delete mode 100755 testModule/hooks/nbd-cmdline.sh delete mode 100755 testModule/hooks/pre-mount.sh delete mode 100755 testModule/hooks/pre-udev.sh (limited to 'testModule/hooks') diff --git a/testModule/hooks/cmdline.sh b/testModule/hooks/cmdline.sh deleted file mode 100755 index b1f06ea6..00000000 --- a/testModule/hooks/cmdline.sh +++ /dev/null @@ -1,22 +0,0 @@ -echo 1 > /proc/sys/kernel/sysrq - -# fakes the cmdline to fix the ip parsing when using -# syslinux's IPAPPEND 1 mask -[ -d /fake ] || mkdir /fake - -# need to be a tmpfs for the hack to work -mount -t tmpfs tmpfs /fake - -# append ':hiwi:eth0:none' to the 'ip=' parameter we got -# from syslinux's IPAPPEND 1 -sed 's/\(ip=\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}:\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}:\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}:\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)/\1:hiwi:eno1:none/' /proc/cmdline > /fake/cmdline - -# bind mount it. Can we trust mount return codes here? -# if so, we should check what we get in $? -mount -o bind /fake/cmdline /proc/cmdline - -# check if it worked -if ! grep 'hiwi:eth0:none' /proc/cmdline; then - command -v warn >/dev/null || . /lib/dracut-lib.sh - warn 'Haxing cmdline did not work :( sad pandaz...' -fi diff --git a/testModule/hooks/mount.sh b/testModule/hooks/mount.sh deleted file mode 100755 index e893642d..00000000 --- a/testModule/hooks/mount.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -mount /dev/root $NEWROOT diff --git a/testModule/hooks/nbd-cmdline.sh b/testModule/hooks/nbd-cmdline.sh deleted file mode 100755 index 6464646f..00000000 --- a/testModule/hooks/nbd-cmdline.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -rootok=1 -root=block:/dev/root - diff --git a/testModule/hooks/pre-mount.sh b/testModule/hooks/pre-mount.sh deleted file mode 100755 index b22cdc35..00000000 --- a/testModule/hooks/pre-mount.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/bash - -while ! /sbin/setup-qcow2; do - sleep 0.5 -done - -while ! /sbin/setup-nbdroot; do - sleep 0.5 -done diff --git a/testModule/hooks/pre-udev.sh b/testModule/hooks/pre-udev.sh deleted file mode 100755 index 578169e9..00000000 --- a/testModule/hooks/pre-udev.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/bash - -# include dracut-lib.sh to use 'warn' -command -v warn >/dev/null || . /lib/dracut-lib.sh - -SETUP_SCRIPT="/sbin/setup-qcow2" -NBDROOT_SCRIPT="/sbin/setup-nbdroot" -NBD_MOD_PATH="/usr/lib/modules/current/extra/nbd.ko" -DNBD3_MOD_PATH="/usr/lib/modules/current/extra/dnbd3.ko" - -# sanity checks -if [ ! -e "${SETUP_SCRIPT}" ]; then - warn "No such file of directory: ${SETUP_SCRIPT}" - emergency_shell -n "Error in $0" - return 1 -fi -if [ ! -e "${NBD_MOD_PATH}" ]; then - warn "No such file of directory: ${NBD_MOD_PATH}" - emergency_shell -n "Error in $0" - return 1 -fi -if [ ! -e "${DNBD3_MOD_PATH}" ]; then - warn "No such file of directory: ${DNBD3_MOD_PATH}" - emergency_shell -n "Error in $0" - return 1 -fi - -# load the kernel modules for dnbd3 and nbd -if ! insmod /usr/lib/modules/current/extra/dnbd3.ko; then - warn "Failed to load DNBD3 kernel module..." - emergency_shell -n "Error in $0" - return 1 -fi - -if ! insmod /usr/lib/modules/current/extra/nbd.ko; then - warn "Failed to load NBD kernel module..." - emergency_shell -n "Error in $0" - return 1 -fi - -# now let's "install" the setup script in the initqueue -#/sbin/initqueue --settled --unique "${SETUP_SCRIPT}" -#/sbin/initqueue --settled --unique "${NBDROOT_SCRIPT}" -#/sbin/initqueue --settled --unique "/sbin/retry-nbdroot" -- cgit v1.2.3-55-g7522 From c50dd3c817814d7d8e3be66efe1ade9a11fac636 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Wed, 6 May 2015 18:24:51 +0200 Subject: minor - flag names ... --- testModule/hooks/pre-pivot/mount-tmp.sh | 2 +- testModule/scripts/prepare-disks | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) (limited to 'testModule/hooks') diff --git a/testModule/hooks/pre-pivot/mount-tmp.sh b/testModule/hooks/pre-pivot/mount-tmp.sh index 152c844e..3fa24cce 100755 --- a/testModule/hooks/pre-pivot/mount-tmp.sh +++ b/testModule/hooks/pre-pivot/mount-tmp.sh @@ -3,7 +3,7 @@ # the initqueue. If a valid partition is found (either GPT with the label # OPENSLX_TMP or MBR with the type 0x44) its path will be written to # /tmp/openslx.tmpdisk -OPENSLX_TMP_DISK_FLAG="/tmp/openslx.tmpdisk" +OPENSLX_TMP_DISK_FLAG="/tmp/openslx.disk.tmp" if [ ! -e "$OPENSLX_TMP_DISK_FLAG" ]; then warn "'$OPENSLX_TMP_DISK_FLAG' not found!" diff --git a/testModule/scripts/prepare-disks b/testModule/scripts/prepare-disks index 28113cc7..2e7dd673 100755 --- a/testModule/scripts/prepare-disks +++ b/testModule/scripts/prepare-disks @@ -3,7 +3,7 @@ # GLOBALS # -declare -rg FLAG="/tmp/openslx.disks" +declare -rg FLAG="/tmp/openslx.disk" declare -rg OPENSLX_SYS_MOUNT="/opt/openslx/system" # @@ -18,7 +18,7 @@ declare -rg OPENSLX_SYS_MOUNT="/opt/openslx/system" mount_sys_part() { if [ ! -b "$1" ]; then warn "'$1' is not a block device?" - echo "!block: $1" >> /tmp/openslx.disks.log + echo "!block: $1" >> /tmp/openslx.disk.log return 1 fi @@ -26,10 +26,9 @@ mount_sys_part() { mkdir -p ${OPENSLX_SYS_MOUNT} if ! mount -t auto "${OPENSLX_SYS_DEVICE}" "${OPENSLX_SYS_MOUNT}"; then warn "Mounting '${OPENSLX_SYS_DEVICE}' to '${OPENSLX_SYS_MOUNT}' failed." - echo "mount phail" >> /tmp/openslx.disks.log + echo "mount phail" >> /tmp/openslx.disk.log return 1 fi - echo "ZOMG" >> /tmp/openslx.disks.log return 0 } @@ -46,20 +45,20 @@ command -v warn >/dev/null || . /lib/dracut-lib.sh # let check the arguments if [ "$#" -ne 2 ]; then warn "'$0' need 2 arguments: '$0 [OPENSLX_SYS|OPENSLX_TMP] '" - echo "Not enough args!" >> /tmp/openslx.disks.log + echo "Not enough args!" >> /tmp/openslx.disk.log exit 1 fi # $1 sane? if [ "x$1" != "xOPENSLX_SYS" ] && [ "x$1" != "xOPENSLX_TMP" ]; then warn "First arg needs to be either 'OPENSLX_SYS' or 'OPENSLX_TMP'." warn "Given: $1" - echo "OPENSLX? $1" >> /tmp/openslx.disks.log + echo "OPENSLX? $1" >> /tmp/openslx.disk.log exit 1 fi # $2 sane? if [ ! -b "/dev/$2" ]; then warn "Second arg appears not to be a block device!" - echo "block? $2" >> /tmp/openslx.disks.log + echo "block? $2" >> /tmp/openslx.disk.log exit 1 fi @@ -72,7 +71,7 @@ INSTANCES="$(grep "$PART_TYPE" "$FLAG" | busybox wc -l)" if [ "$INSTANCES" -ge 1 ]; then # uhoh we are not alone! warn "'$0' already running for $PART_TYPE ... ignoring." - echo "already running for $PART_TYPE" >> /tmp/openslx.disks.log + echo "already running for $PART_TYPE" >> /tmp/openslx.disk.log exit 1 fi @@ -81,7 +80,7 @@ fi echo "$PART_TYPE.$$" >> "$FLAG" # if we are still here, then we can go on and process the partition -echo "Processing: $PART_TYPE -> $PART_DEV" >> /tmp/openslx.disks.log +echo "Processing: $PART_TYPE -> $PART_DEV" >> /tmp/openslx.disk.log if [ "$PART_TYPE" = "OPENSLX_TMP" ]; then # mark it for later mounting! -- cgit v1.2.3-55-g7522 From 46ba927a27fc6d6b2fc76096e57ae127c41b65b9 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Thu, 7 May 2015 18:12:30 +0200 Subject: started configuration stuff --- testModule/hooks/pre-mount/fetch-config.sh | 12 ++++++++++++ testModule/module-setup.sh | 3 +++ testModule/scripts/setup-qcow2 | 9 ++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100755 testModule/hooks/pre-mount/fetch-config.sh (limited to 'testModule/hooks') diff --git a/testModule/hooks/pre-mount/fetch-config.sh b/testModule/hooks/pre-mount/fetch-config.sh new file mode 100755 index 00000000..013b0058 --- /dev/null +++ b/testModule/hooks/pre-mount/fetch-config.sh @@ -0,0 +1,12 @@ +command -v info >/dev/null || . /lib/dracut-lib.sh + +info "Getting configuration from OPENSLX-Server..." + +WGET="$(busybox which wget)" +if [ -z $WGET ]; then + # do nothing + warn "'wget' not found. Skipping openslx configuration..." + exit 1 +fi +mkdir -p /opt/openslx +$WGET http://10.4.9.51/openslx/config -O /opt/openslx/config diff --git a/testModule/module-setup.sh b/testModule/module-setup.sh index c06435c9..e40069ce 100644 --- a/testModule/module-setup.sh +++ b/testModule/module-setup.sh @@ -79,6 +79,9 @@ install() { inst_hook pre-udev 00 "$moddir/hooks/pre-udev/load-dnbd3-nbd-modules.sh" ## HOOK pre-mount + # this is the configuration hook where the config stuff is wget'ed + inst_hook pre-mount 00 "$moddir/hooks/pre-mount/fetch-config.sh" + # this is the main hook where all the magic is triggered inst_hook pre-mount 10 "$moddir/hooks/pre-mount/mount-qcow.sh" diff --git a/testModule/scripts/setup-qcow2 b/testModule/scripts/setup-qcow2 index 86b69db2..cc74457b 100755 --- a/testModule/scripts/setup-qcow2 +++ b/testModule/scripts/setup-qcow2 @@ -9,10 +9,13 @@ command -v emergency_shell >/dev/null || . /lib/dracut-lib.sh # # TODO make this configurable [ -f /opt/openslx/config ] && . /opt/openslx/config +[ -z $SLX_DNBD3_SERVER ] && SLX_DNBD3_SERVER="132.230.4.1" +[ -z $SLX_STAGE4 ] && SLX_STAGE4="stage4/joe/centos7" +[ -z $SLX_STAGE4_RID ] && SLX_STAGE4_RID="4" +declare -rg DNBD3_SERVER="$SLX_DNBD3_SERVER" +declare -rg DNBD3_IMAGE="$SLX_STAGE4" +declare -rg DNBD3_RID="$SLX_STAGE4_RID" declare -rg DNBD3_DEVICE="/dev/dnbd0" -declare -rg DNBD3_SERVER="132.230.4.1" -declare -rg DNBD3_IMAGE="stage4/joe/centos7" -declare -rg DNBD3_RID="4" declare -rg QCOW_CONTAINER="/opt/openslx/system/system.qcow2" # # END GLOBALS -- cgit v1.2.3-55-g7522