From 5e18777691c6224ef66d2d4843c3735eb33b407c Mon Sep 17 00:00:00 2001 From: Ramakrishnan G Date: Tue, 15 Jul 2014 21:36:11 +0530 Subject: [PATCH] Add virtual media boot support in ramdisk element. This change adds support in ramdisk element for recognising boot from virtual media cdrom and read the parameters from the configuration file in virtual media floppy. Change-Id: I28ca888b4ead4905f7141b38ed4b9a3614d00d26 Closes-Bug: #1321564 --- .../ramdisk/extra-data.d/scripts/d/init-func | 68 ++++++++++++++++--- elements/ramdisk/extra-data.d/scripts/init | 47 ++++++++----- 2 files changed, 90 insertions(+), 25 deletions(-) diff --git a/elements/ramdisk/extra-data.d/scripts/d/init-func b/elements/ramdisk/extra-data.d/scripts/d/init-func index 251e0c08..6cb636f7 100755 --- a/elements/ramdisk/extra-data.d/scripts/d/init-func +++ b/elements/ramdisk/extra-data.d/scripts/d/init-func @@ -13,22 +13,72 @@ # License for the specific language governing permissions and limitations # under the License. +function configure_vmedia_dir() { + VMEDIA_MOUNT_POINT="/vfloppy_mnt" + VMEDIA_DIR="/vfloppy" + VMEDIA_CONFIG_FILE="parameters.txt" + + SYSFS_DEVICE_MODELS="/sys/class/block/*/device/model" + SYSFS_VMEDIA_DEVICE_MODEL="virtual media" + + # Wait for some seconds for kernel to finish initializing the + # virtual media devices. + wait_for 5 1 "grep -q -i \"$SYSFS_VMEDIA_DEVICE_MODEL\" $SYSFS_DEVICE_MODELS" + if [[ $? != 0 ]]; then + echo "Error finding the virtual floppy device on the node." + troubleshoot + fi + + # Find the virtual media device from the kernel sysfs file system. + VMEDIA_DEVICE=$(grep -l -i "$SYSFS_VMEDIA_DEVICE_MODEL" $SYSFS_DEVICE_MODELS | awk -F'/' '{print $5}') + if [[ -z $VMEDIA_DEVICE ]]; then + echo "Error finding the virtual floppy device on the node." + troubleshoot + fi + + # Mount the virtual media device + VMEDIA_DEVICE_FILE="/dev/$VMEDIA_DEVICE" + mkdir -p $VMEDIA_MOUNT_POINT + mount $VMEDIA_DEVICE_FILE $VMEDIA_MOUNT_POINT + if [[ $? != 0 ]]; then + echo "Error mounting virtual media device $VMEDIA_DEVICE_FILE" + troubleshoot + fi + + # Copy the contents of the virtual media to a directory in root + # filesystem so that we can unmount virtual media soon. + cp -rf $VMEDIA_MOUNT_POINT $VMEDIA_DIR + umount $VMEDIA_MOUNT_POINT +} + function get_kernel_parameter() { - local name=$1 - for i in `cat /proc/cmdline`; do + if [ "$BOOT_METHOD" = "$VMEDIA_BOOT_TAG" ]; then + echo $(find_parameter_from_file $1 "$VMEDIA_DIR/$VMEDIA_CONFIG_FILE") + else + echo $(find_parameter_from_file $1 "/proc/cmdline") + fi +} + +function find_parameter_from_file() { + + local paramname=$1 + local filename=$2 + + for i in `cat $filename`; do case "$i" in - ${name}=*) - echo "${i#${name}=}" - return 0 + ${paramname}=*) + echo "${i#${paramname}=}" + return 0 ;; - ${name}) - echo "" - return 0 + ${paramname}) + echo "" + return 0 ;; - *) + *) ;; esac done + echo "" return 1 } diff --git a/elements/ramdisk/extra-data.d/scripts/init b/elements/ramdisk/extra-data.d/scripts/init index 2f4eb9c0..51d62b85 100755 --- a/elements/ramdisk/extra-data.d/scripts/init +++ b/elements/ramdisk/extra-data.d/scripts/init @@ -31,22 +31,6 @@ mkdir -p /proc /sys /dev /boot /etc /mnt /lib/modules mount -t proc proc /proc -readonly _BOOTIF_=$(get_kernel_parameter BOOTIF) -readonly _IP_=$(get_kernel_parameter ip) -readonly BOOT_MAC_ADDRESS=$(echo "$_BOOTIF_" | sed -e "s/-/:/g" | sed -e "s/^01://g" | tr 'a-f' 'A-F') -readonly BOOT_SERVER=$(echo "$_IP_" | cut -d':' -f2) - -# IP address and other parameters may be set later in the init script -BOOT_IP_ADDRESS=$(echo "$_IP_" | cut -d':' -f1) -BOOT_NETMASK=$(echo "$_IP_" | cut -d':' -f4) -BOOT_GATEWAY=$(echo "$_IP_" | cut -d':' -f3) - -readonly DISK=$(get_kernel_parameter disk) - -readonly DEPLOYMENT_ID=$(get_kernel_parameter deployment_id) -readonly DEPLOYMENT_KEY=$(get_kernel_parameter deployment_key) -readonly ISCSI_TARGET_IQN=$(get_kernel_parameter iscsi_target_iqn) -TROUBLESHOOT=$(get_kernel_parameter troubleshoot) FIRST_ERR_MSG= mount -t sysfs none /sys @@ -102,3 +86,34 @@ $UDEVD --daemon --resolve-names=never echo "load modules" load_modules_by_udev + +# To identify that the node has booted from virtual media, a kernel +# command-line argument boot_method=vmedia is added in the iso bootloader +# configuration file (like isolinux.cfg for isolinux). +VMEDIA_BOOT_TAG="vmedia" +BOOT_METHOD=$(get_kernel_parameter boot_method) + +if [ "$BOOT_METHOD" = "$VMEDIA_BOOT_TAG" ]; then + + # If the node booted from virtual media cdrom, the arguments for the + # installation are provided in virtual media floppy. Find out + # the virtual media device, mount it and get the information. + configure_vmedia_dir +fi + +readonly _BOOTIF_=$(get_kernel_parameter BOOTIF) +readonly _IP_=$(get_kernel_parameter ip) +readonly BOOT_MAC_ADDRESS=$(echo "$_BOOTIF_" | sed -e "s/-/:/g" | \ + sed -e "s/^01://g" | tr 'a-f' 'A-F') +readonly BOOT_IP_ADDRESS=$(echo "$_IP_" | cut -d':' -f1) +readonly BOOT_SERVER=$(echo "$_IP_" | cut -d':' -f2) +readonly BOOT_NETMASK=$(echo "$_IP_" | cut -d':' -f4) +readonly BOOT_GATEWAY=$(echo "$_IP_" | cut -d':' -f3) + +readonly DISK=$(get_kernel_parameter disk) + +readonly DEPLOYMENT_ID=$(get_kernel_parameter deployment_id) +readonly DEPLOYMENT_KEY=$(get_kernel_parameter deployment_key) +readonly ISCSI_TARGET_IQN=$(get_kernel_parameter iscsi_target_iqn) +TROUBLESHOOT=$(get_kernel_parameter troubleshoot) +