Hello Miquel, On 31 January 2013 12:40, Miquel van Smoorenburg <miqu...@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 <miqu...@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-requ...@lists.debian.org > with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org > Archive: http://lists.debian.org/20130131124039.ga13...@xs4all.net > -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org