From 0b031803d6dac439c13da92a83cbde301bbce9f3 Mon Sep 17 00:00:00 2001 From: Ulrich Dangel Date: Mon, 13 Jun 2011 01:19:09 +0200 Subject: [PATCH 1/1] Determine dependency for target device Try to get all dependencies for the specified device. This will help to support arbitrary stacked devices like lvm on raid, raid on lvm or lvm on raid on raid --- 42_grml | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/42_grml b/42_grml index 6e82b90..08108a4 100755 --- a/42_grml +++ b/42_grml @@ -21,6 +21,58 @@ if [ -r /etc/default/grml-rescueboot ] ; then . /etc/default/grml-rescueboot fi +resolve_dm_name() { + retval="$1" + base=${1##*/} + for block in /sys/block /sys/class/block ; do + [ ! -d ${block}/${base}/dm ] && continue + retval="/dev/mapper/$(cat ${block}/${base}/dm/name)" + break + done + case "$retval" in + /dev/dm-*) + minor=${retval##*-} + retval="/dev/mapper/$(dmsetup info -C --noheadings -o name -j 253 -m $minor)" + ;; + esac + + echo "$retval" +} + +get_dependencies() { + device=${1} + if [ -z ${device} ] ; then + return + fi + device=$(readlink -f ${device}) + case "$device" in + /dev/mapper/*) + device="/dev/dm-$(dmsetup info -C --noheadings -o minor "$device")" + ;; + esac + + base=${device##*/} + dependencies="" + additional_dependencies="" + for block in /sys/block /sys/class/block ; do + [ ! -d ${block}/${base}/slaves ] && continue + for file in ${block}/${base}/slaves/* ; do + dep_name="/dev/${file##*/}" + dep_name=$(resolve_dm_name ${dep_name}) + + # resolve recursively all dependencies + additional_dependencies=$(get_dependencies ${dep_name}) + + dependencies="$dependencies $additional_dependencies $dep_name" + done + break + done + echo $dependencies + +} + + + iso_list="" for file in "${ISO_LOCATION}"/*.iso ; do if grub_file_is_not_garbage "$file" ; then @@ -36,9 +88,15 @@ for grmliso in $iso_list ; do additional_param="" case "$device" in - /dev/mapper*|/dev/md*) - additional_param="live-media=$device" - ;; + /dev/mapper*|/dev/md*) + dependencies=$(get_dependencies ${device}) + dep_string="" + for dep in $dependencies $device ; do + dep_string="$dep_string,$dep" + done + dep_string=${dep_string#,} + additional_param="live-media=$dep_string" + ;; esac echo "Found Grml ISO image: $grmliso" >&2 -- 2.1.4