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
This commit is contained in:
Ramakrishnan G 2014-07-15 21:36:11 +05:30
parent 22cf8e824b
commit 5e18777691
2 changed files with 90 additions and 25 deletions

View File

@ -13,22 +13,72 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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() { function get_kernel_parameter() {
local name=$1 if [ "$BOOT_METHOD" = "$VMEDIA_BOOT_TAG" ]; then
for i in `cat /proc/cmdline`; do 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 case "$i" in
${name}=*) ${paramname}=*)
echo "${i#${name}=}" echo "${i#${paramname}=}"
return 0 return 0
;; ;;
${name}) ${paramname})
echo "" echo ""
return 0 return 0
;; ;;
*) *)
;; ;;
esac esac
done done
echo "" echo ""
return 1 return 1
} }

View File

@ -31,22 +31,6 @@ mkdir -p /proc /sys /dev /boot /etc /mnt /lib/modules
mount -t proc proc /proc 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= FIRST_ERR_MSG=
mount -t sysfs none /sys mount -t sysfs none /sys
@ -102,3 +86,34 @@ $UDEVD --daemon --resolve-names=never
echo "load modules" echo "load modules"
load_modules_by_udev 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)