Bug#351183: [Yaird-devel] Bug#351183: --run does not fix the disk
renaming problem
dean gaudet
dean at arctic.org
Sat Jun 17 21:39:40 UTC 2006
On Wed, 7 Jun 2006, Jonas Smedegaard wrote:
> Then I'll just lean back and wait for you to do the hard work :-D
ok i've got a partial solution... see below.
i say "partial" because the following scenario is not quite ideal:
- md initially on /dev/sda1 /dev/sdb1 ... build initrd
- another disk without a partition table is inserted so that sdb is
renamed sdc -- sdb exists, but there's no sdb1
- on reboot the mkbdev /dev/sdb1 will fail... and we'll be dropped to dash
- ^D will finish the reboot anyhow but it required operator intervention
since mdadm (>= 2.2) is capable of creating the device node it needs
anyhow we don't even need to "mkbdev /dev/sdb1". i tried removing that
but there's several ways to do it and i'm not sure what you'd prefer...
if i suppress the addDevicePlan for the component device then the parent
isn't added either and the modprobes never occur and the devices aren't
loaded for md to find them.
there are probably some configurations where the components might take a
while to show up (i.e. nbd component)... so in many ways testing for the
component is a good thing...
the patch below is an improvement regardless -- it enables the system to
handle many sorts of renames without trouble. i deliberately chose 2.2 as
the version cutoff because i was anticipating some solution which wouldn't
require the ^D (which requires 2.2 ... whereas 1.10 is good enough to just
get -Ac partitions working -- you might have to manually construct a
device node for versions earlier than 2.2).
-dean
--- usr/lib/yaird/perl/Plan.pm.orig 2006-06-06 22:19:18.000000000 +0000
+++ usr/lib/yaird/perl/Plan.pm 2006-06-17 21:19:52.000000000 +0000
@@ -355,6 +355,35 @@
return 1;
}
+my $mdadm_version_check_complete;
+my $mdadm_supports_device_renaming;
+
+sub checkMdadmSupport() {
+ return 0 if defined($mdadm_version_check_complete);
+
+ my $ver = `mdadm --version 2>&1`;
+
+ # mdadm -Ac partitions is broken prior to 1.10 (and sarge has 1.9)
+ # also mdadm 2.2 and later will create devices as appropriate based
+ # on information in /proc/partitions.
+ #
+ # we require 2.2 or later in order to use "-Ac partitions". technically
+ # we could survive with 1.10 -- but we'd need to create the renamed devices
+ # appropriately.
+ my ($major, $minor);
+ if ((($major, $minor) = $ver =~ /^mdadm - v(\d+)\.(\d+)/)
+ and ($major > 2 or ($major == 2 and $minor >= 2))) {
+ $mdadm_supports_device_renaming = 1;
+ }
+ else {
+ Base::warning ("consider upgrading to mdadm 2.2 or newer to support changes in device boot ordering");
+ $mdadm_supports_device_renaming = 0;
+ }
+
+ $mdadm_version_check_complete = 1;
+ 0;
+}
+
#
# tryRaid -- To start an md raid device, start the underlying hardware,
@@ -369,6 +398,8 @@
return 0;
}
+ checkMdadmSupport();
+
my $rd = RaidTab::findByDevno ($devno);
if (! defined ($rd)) {
Base::fatal ("Can't find Raid info for $name");
@@ -391,6 +422,7 @@
minor => $minor,
uuid => $uuid,
components => $components,
+ supports_device_renaming => $mdadm_supports_device_renaming,
);
return 1;
}
--- etc/yaird/Templates.cfg.orig 2006-06-06 22:19:18.000000000 +0000
+++ etc/yaird/Templates.cfg 2006-06-17 20:26:40.000000000 +0000
@@ -315,8 +315,12 @@
SCRIPT "/init"
BEGIN
!mknod <TMPL_VAR NAME=target> b <TMPL_VAR NAME=major> <TMPL_VAR NAME=minor>
- !mdadm --assemble <TMPL_VAR NAME=target> --run --uuid <TMPL_VAR NAME=uuid> \
- ! <TMPL_LOOP NAME=components> <TMPL_VAR NAME=dev></TMPL_LOOP>
+ !<TMPL_IF NAME=supports_device_renaming>
+ ! mdadm -Ac partitions <TMPL_VAR NAME=target> --run --uuid <TMPL_VAR NAME=uuid>
+ !<TMPL_ELSE>
+ ! mdadm --assemble <TMPL_VAR NAME=target> --run --uuid <TMPL_VAR NAME=uuid> \
+ ! <TMPL_LOOP NAME=components> <TMPL_VAR NAME=dev></TMPL_LOOP>
+ !</TMPL_IF>
END SCRIPT
END TEMPLATE
More information about the Yaird-devel
mailing list