diff options
author | Michael Tokarev <mjt@tls.msk.ru> | 2012-08-21 11:27:46 +0400 |
---|---|---|
committer | Michael Tokarev <mjt@tls.msk.ru> | 2012-08-23 21:53:21 +0400 |
commit | ea9f34c0b34f4c595010ba2ce61a3a6e423f2235 (patch) | |
tree | 73d87743945edc6103fd7fff01b81af3e6dd0f48 /debian | |
parent | cfe0c9acd3f76e9da7a3c44617fce46134905d70 (diff) |
fixes for initramfs integration (#644389, #678262, #685161)
Diffstat (limited to 'debian')
-rw-r--r-- | debian/changelog | 5 | ||||
-rw-r--r-- | debian/initramfs/hook | 73 | ||||
-rw-r--r-- | debian/initramfs/script.local-top | 31 |
3 files changed, 38 insertions, 71 deletions
diff --git a/debian/changelog b/debian/changelog index d0bb8f13..2053f8a8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,6 +14,11 @@ mdadm (3.2.5-2) UNRELEASED; urgency=low - change --help printing and shorten/simplify the text - make --quiet cumulative and stop documenting --real-quiet - do not prduce help in case of incorrect usage, and exit with 1 + * fixes for initramfs integration (Closes: #644389, #678262, #685161): + - check INITRDSTART=none early + - do not explicitly load raid level modules (modprobe/kmod does this) + - do not collect needed raid levels (we include all modules anyway) + - load md_mod explicitly since we need to change global parameter [ Dmitrijs Ledkovs ] * Use dh_installinit with --no-restart-on-upgrade, which will start diff --git a/debian/initramfs/hook b/debian/initramfs/hook index 8181946f..42fa9d48 100644 --- a/debian/initramfs/hook +++ b/debian/initramfs/hook @@ -1,6 +1,7 @@ #!/bin/sh # -# Copyright © 2006-2008 Martin F. Krafft <madduck@debian.org> +# Copyright © 2006-2008 Martin F. Krafft <madduck@debian.org>, +# 2012 Michael Tokarev <mjt@tls.msk.ru> # based on the scripts in the initramfs-tools package. # released under the terms of the Artistic Licence. # @@ -74,7 +75,7 @@ INITRDSTART=all [ -z "$INITRDSTART" ] && INITRDSTART=none DESTMDADMCONF=$DESTDIR/etc/mdadm/mdadm.conf -DESTCONFIG=$DESTDIR/conf/conf.d/md +DESTCONFIG=$DESTDIR/conf/mdadm if [ -f $CONFIG ]; then homehost="$(sed -ne 's,^[[:space:]]*HOMEHOST[[:space:]]*,,p' $CONFIG)" @@ -163,8 +164,9 @@ elif ! grep -q '^ARRAY' $DESTMDADMCONF; then info "letting initramfs assemble auto-detected arrays." exit 0 else - # obtain dev:level pairs from config file, honouring multiline entries - devpairs="$( + # obtain devices list from config file, honouring multiline entries + devices="$( + dev= while read line; do case "$line" in (ARRAY*) :;; @@ -173,21 +175,12 @@ else for atom in $line; do case "$atom" in (/dev*) dev=$atom;; - (level=raid*|level=linear|level=multipath) level=${atom#level=};; - (level=*) - err "invalid level specified in ARRAY statement in $CONFIG:" - err " $line" - err "levels should be either raid*, linear, or multipath." - warn "falling back to emergency procedure in initramfs." - exit 1 - ;; - (*) :;; esac done - [ -n "${dev:-}" ] || continue # /dev/mdX and /dev/md/X are the same, really case "$dev" in + "") continue ;; (/dev/md/*) alt=/dev/md${dev##*/};; (/dev/md*) alt=/dev/md/${dev#/dev/md};; (*) @@ -200,32 +193,20 @@ else dev="$alt" fi - echo -n "${dev}:" - if [ -n "${level:-}" ]; then - echo -n "$level" - else - echo -n "$($MDADM --detail $dev | sed -rne 's,[[:space:]]+Raid Level : ,,p')" - fi - echo -n ' ' + echo "$dev" done < $DESTMDADMCONF)" || exit $? fi -uniquify() -{ - for i in $@; do echo "$i"; done | sort -u -} +if [ "$INITRDSTART" != none ] && [ -n "$devices" ]; then -if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then - echo "MD_DEVPAIRS='${devpairs% }'" >> $DESTCONFIG - - devs= levels= - for i in $devpairs; do - dev=${i%:*} - level=${i##*:} - case "$INITRDSTART" in - all|*${dev}*) - devs="${devs:+$devs }$dev" - levels="${levels:+$levels }$level" + devs= + for dev in $devices; do + case "$INITRDSTART " in + all|*${dev}[[:space:]]*) + case "$devs " in # uniquiness + (*${dev}\ *) :;; + (*) devs="${devs:+$devs }$dev" ;; + esac ;; *) :;; esac @@ -244,7 +225,7 @@ if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then done for i in $INITRDSTART; do - case "$INITRDSTART" in all|none|'') break;; *) :;; esac + case "$INITRDSTART" in all) break;; *) :;; esac case "$devs" in *${i}*) continue;; *) :;; @@ -257,29 +238,12 @@ if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then break done - echo "MD_LEVELS='$levels'" >> $DESTCONFIG if [ "$INITRDSTART" = all ]; then echo "MD_DEVS=all" >> $DESTCONFIG else echo "MD_DEVS='$devs'" >> $DESTCONFIG fi - # handle module synonyms - modules="$(echo $levels \ - | sed -re 's,\<[[:digit:]]+\>,raid&,g; # prefix digits with raid - s,stripe,raid0,g; # striping is raid0 - s,mirror,raid1,g; # mirroring is raid1 - s,raid4,raid5,g; # use raid5 to handle raid4 - s,mp,multipath,g # mp is multipath - ')" - - # if raid456 module is present, use it for raid[456] - modprobe --set-version="$version" --show-depends raid456 >/dev/null 2>&1 \ - && modules="$(echo $modules | sed -e 's,raid[456],raid456,g')" - - modules="$(uniquify $modules | tr '\n' ' ')" - echo "MD_MODULES='${modules% }'" >> $DESTCONFIG - if [ "$INITRDSTART" = all ]; then info "will start all available MD arrays from the initial ramdisk." else @@ -299,7 +263,6 @@ if [ "$INITRDSTART" != none ] && [ -n "$devpairs" ]; then else echo "MD_DEVS=none" >> $DESTCONFIG - echo "MD_MODULES=''" >> $DESTCONFIG info "no MD arrays will be started from the initial ramdisk." fi diff --git a/debian/initramfs/script.local-top b/debian/initramfs/script.local-top index 7ef6d4fb..53341e8b 100644 --- a/debian/initramfs/script.local-top +++ b/debian/initramfs/script.local-top @@ -1,6 +1,7 @@ #!/bin/sh # -# Copyright © 2006-2008 Martin F. Krafft <madduck@debian.org> +# Copyright © 2006-2008 Martin F. Krafft <madduck@debian.org>, +# 2012 Michael Tokarev <mjt@tls.msk.ru> # based on the scripts in the initramfs-tools package. # released under the terms of the Artistic Licence. # @@ -32,24 +33,25 @@ verbose() } MD_DEVS=all -MD_MODULES='linear multipath raid0 raid1 raid456 raid5 raid6 raid10' -[ -s /conf/conf.d/md ] && . /conf/conf.d/md +[ -s /conf/md ] && . /conf/md -verbose && log_begin_msg Loading MD modules -for module in ${MD_MODULES:-}; do - if modprobe -q "$module"; then - verbose && log_success_msg "loaded module ${module}." - else - log_failure_msg "failed to load module ${module}." - fi -done -log_end_msg +if [ "$MD_DEVS" = none ]; then + verbose && + log_warning_msg "INITRDSTART set to \"none\" in /etc/default/mdadm, not assembling raid arrays" + exit 0 +fi +if [ ! -f /proc/mdstat ] && ! modprobe -q md_mod; then + verbose && log_failure_msg "failed to load module md_mod." +fi if [ ! -f /proc/mdstat ]; then verbose && panic "cannot initialise MD subsystem (/proc/mdstat missing)" exit 1 fi +# prevent writes/syncs so that resuming works (#415441). +echo 1 > /sys/module/md_mod/parameters/start_ro + # handle /dev/md/X nodes mkdir -p /dev/md @@ -69,9 +71,6 @@ if [ ! -e $CONFIG ]; then MD_DEVS=all fi -# prevent writes/syncs so that resuming works (#415441). -echo 1 > /sys/module/md_mod/parameters/start_ro - if [ "$MD_DEVS" = all ]; then verbose && log_begin_msg "Assembling all MD arrays" @@ -84,7 +83,7 @@ if [ "$MD_DEVS" = all ]; then fi verbose && log_end_msg -elif [ "$MD_DEVS" != none ]; then +else for dev in $MD_DEVS; do verbose && log_begin_msg "Assembling MD array $dev" |