Bug#699434: grub-installer: support for Intel Matrix Raid
Hello Miquel,
On 31 January 2013 12:40, Miquel van Smoorenburg <miquels@debian.org> wrote:
> This is by far the most intrusive patch - all the others are trivial.
> Description:
>
> - move make_device_map() upwards so that we can call it earlier
> in the script. Also, if $md_bootdev is set, add a (otherwise
> unused) "(md/0)" entry to device.map - otherwise grub-probe
> freaks out on upgrades.
> - add is_mdraid_bootable(). It checks if the device is a Intel
> Matrix Raid device, in RAID1 mode. If not it returns false.
> Otherwise it sets $md_dev, $md_devs, $md_super and $md_level,
> and returns true.
Why is it limited to only imsm && raid1 ?
mdadm supports "imsm" superblock format levels 0,1,5,10 & "ddf"
superblock format levels 0,1,3,4,5,1E,5E,5EE,6 with extensions of
there off (stripped, mirrored, concatenated and spanned).
Would it not be best to simply check for "imsm" || "ddf" superblock
types? Given that mdadm supports most of the above RAID levels.
All other changes look good.
Regards,
Dmitrijs.
> - if installing on an lvm device, it finds the underlying device,
> and checks if it's a single mdraid array. If so $disc_under_lvm
> is set.
> - if we're installing on a mdraid device and is_mdraid_bootable()
> is true, we set $disc_offered to the mdraid device, and set
> the $default_bootdev variable to all the underlying real disks.
> - when installing on an mdraid device, always create the grub device.map
> - do not try to guess the bootdevice if we already set $default_bootdev
>
> Note that effectively this patch does NOT change any existing
> behaviour if you are not trying to install on an Intel Matrix Raid
> RAID1 array. As that wasn't supported before anyway, there is
> no chance on regression.
>
> Thanks
>
> diff -ruN 00-ORIG/grub-installer-1.83/debian/changelog grub-installer-1.83/debian/changelog
> --- 00-ORIG/grub-installer-1.83/debian/changelog 2012-10-27 06:07:35.000000000 +0000
> +++ grub-installer-1.83/debian/changelog 2013-01-29 15:03:58.462971942 +0000
> @@ -1,3 +1,12 @@
> +grub-installer (1.83+1) unstable; urgency=low
> +
> + * Support for mdadm fakeraid (currently only IMSM formatted disks):
> + - also detect mdadm fakeraid underneath lvm, if it's just one array
> + - install grub on each disk of the underlying array
> + - add md/0 entry to device.map so grub-probe works (for upgrades etc)
> +
> + -- Miquel van Smoorenburg <miquels@debian.org> Tue, 29 Jan 2013 15:50:37 +0100
> +
> grub-installer (1.83) unstable; urgency=low
>
> [ Milan Kupcevic ]
> diff -ruN 00-ORIG/grub-installer-1.83/grub-installer grub-installer-1.83/grub-installer
> --- 00-ORIG/grub-installer-1.83/grub-installer 2012-10-25 01:01:57.000000000 +0000
> +++ grub-installer-1.83/grub-installer 2013-01-29 14:56:40.103337917 +0000
> @@ -217,6 +217,69 @@
> echo "$ids"
> }
>
> +make_device_map () {
> + # If you're preseeding (hd0) et al, stop - preseed OS device names
> + # instead. However, for backward compatibility we ensure that a
> + # device.map exists if you do this.
> + [ "$grub_version" = grub2 ] || return 0
> + [ ! -e "$device_map" ] || return 0
> + local no_floppy
> + case $1 in
> + \(fd*|fd*)
> + no_floppy=
> + ;;
> + *)
> + no_floppy=--no-floppy
> + ;;
> + esac
> + $chroot $ROOT grub-mkdevicemap $no_floppy
> + if [ -n "$md_bootdev" ]
> + then
> + # This is lame- shouldn't need this, but otherwise
> + # grub-probe freaks out.
> + echo "(md/0) $md_bootdev" >> $ROOT/boot/grub/device.map
> + fi
> +}
> +
> +is_mdraid_bootable () {
> + local device="$1"
> + local mddisk=${device#/dev/}
> + local super
> + local level="`cat /sys/block/$mddisk/md/level 2>/dev/null ||:`"
> + local array_metadata="`cat /sys/block/$mddisk/md/metadata_version 2>/dev/null ||:`"
> + case "$array_metadata" in
> + external:/md*)
> + local ctdisk=${array_metadata#external:/}
> + ctdisk=${ctdisk%/*}
> + super="`cat /sys/block/$ctdisk/md/metadata_version 2>/dev/null ||:`"
> + super=${super#external:}
> + ;;
> + esac
> + # Right now mdadm only supports imsm fakeraid, and grub doesn't know
> + # about it at all but raid1 works regardless. So restrict to imsm + raid1.
> + if [ "$level" = raid1 ] && [ "$super" = "imsm" ]
> + then
> + # Find the disks that make up the array to that grub can
> + # be installed onto all of them. As soon as grub supports
> + # imsm raid we should be able to install directly to the
> + # md device instead.
> + local mddisks="`echo /sys/block/$mddisk/md/dev-* |
> + sed -ne 's!/sys/block/md[0-9]\+/md/dev-\([^ \*]\+\)!/dev/\1!pg'`"
> + if [ -n "$mddisks" ]; then
> + md_devs="$mddisks"
> + md_super=$super
> + md_level=$level
> + for i in /dev/disk/by-id/md-*; do
> + if [ "`mapdevfs $i ||:`" = $device ]; then
> + md_dev=$i
> + fi
> + done
> + return 0
> + fi
> + fi
> + return 1
> +}
> +
> rootfs=$(findfs /)
> bootfs=$(findfs /boot)
> [ -n "$bootfs" ] || bootfs="$rootfs"
> @@ -240,7 +303,7 @@
>
> case $prefix in
> /dev/md)
> - disc_offered_devfs="$bootfs"
> + disc_offered_devfs="${bootfs%p[0-9]}"
> ;;
> /dev/mapper)
> disc_offered_devfs="$bootfs"
> @@ -294,6 +357,29 @@
> # Don't set frdev/frdisk here, otherwise you'll end up in different
> # code paths below ...
> frtype=lvm
> + # See if underlying device is a single MD disk
> + d_under=
> + devno=`ls -lL ${disc_offered} | sed -ne 's/^.* \([0-9]\+\), *\([0-9]\+\) .*$/\1:\2/p'`
> + for d_under_iter in /sys/dev/block/$devno/slaves/*; do
> + if [ -n "$d_under" ]; then
> + d_under=
> + break
> + fi
> + d_under=${d_under_iter#/sys/*/slaves/}
> + done
> + case "$d_under" in
> + md[0-9]*p[0-9])
> + prefix="/dev/md"
> + disc_under_lvm=/dev/${d_under%p[0-9]}
> + ;;
> + esac
> +fi
> +
> +if [ "$prefix" = /dev/md ] && is_mdraid_bootable ${disc_under_lvm:-$disc_offered}
> +then
> + disc_offered="$md_dev"
> + md_bootdev="$md_dev"
> + default_bootdev="$md_devs"
> fi
>
> info "Identified partition label for $bootfs: $bootfslabel"
> @@ -455,6 +541,10 @@
>
> grub_debian_version="$($chroot $ROOT dpkg-query -W -f '${Version}' $inst_package)"
>
> +if [ -n "$md_bootdev" ]; then
> + make_device_map
> +fi
> +
> db_progress STEP 1
> db_progress INFO grub-installer/progress/step_os-probe
> os-prober > /tmp/os-probed || true
> @@ -537,11 +627,14 @@
>
> # Try to avoid using (hd0) as a boot device name. Something which can be
> # turned into a stable by-id name is better.
> -default_bootdev_os="$($chroot $ROOT grub-mkdevicemap --no-floppy -m - | head -n1 | cut -f2)"
> -if [ "$default_bootdev_os" ]; then
> - default_bootdev="$($chroot $ROOT readlink -f "$default_bootdev_os")"
> -else
> - default_bootdev="(hd0)"
> +if [ -z "$default_bootdev" ]; then
> + default_bootdev_os="$($chroot $ROOT grub-mkdevicemap --no-floppy -m - | head -n1 | cut -f2)"
> + if [ "$default_bootdev_os" ]; then
> + default_bootdev="$($chroot $ROOT readlink -f "$default_bootdev_os")"
> + else
> + default_bootdev="(hd0)"
> + fi
> + default_bootdev_guessed=1
> fi
>
> # Set a sensible default boot device, so that we aren't installing GRUB to
> @@ -566,6 +659,7 @@
> (([ -n "$cdfs" ] && [ "$cdfs" != "iso9660" ]) || \
> [ "$hybrid" = true ])) || \
> ([ "$default_bootdev" != '(hd0)' ] && \
> + [ -n "$default_bootdev_guessed" ] && \
> ! partmap "$default_bootdev" >/dev/null && \
> ! grub_probe -t fs -d "$default_bootdev" >/dev/null); then
> db_fget grub-installer/bootdev seen
> @@ -758,24 +852,6 @@
> echo "$disk $part"
> }
>
> -make_device_map () {
> - # If you're preseeding (hd0) et al, stop - preseed OS device names
> - # instead. However, for backward compatibility we ensure that a
> - # device.map exists if you do this.
> - [ "$grub_version" = grub2 ] || return 0
> - [ ! -e "$device_map" ] || return 0
> - local no_floppy
> - case $1 in
> - \(fd*|fd*)
> - no_floppy=
> - ;;
> - *)
> - no_floppy=--no-floppy
> - ;;
> - esac
> - $chroot $ROOT grub-mkdevicemap $no_floppy
> -}
> -
> make_active_partition () {
> bootdisk=
> bootpart=
>
>
> --
> To UNSUBSCRIBE, email to debian-boot-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
> Archive: http://lists.debian.org/20130131124039.GA13519@xs4all.net
>
Reply to: