Hey Christoph,

On 04/11/2010 Christoph Anton Mitterer wrote:
> I haven't fully looked at this so perhaps it's unrelated,...
> 
> But one main problem I see here (that may be related), is that lvm's
> init-scripts are simply wrong, and abusing some things.
> I've already told Bastian this and there are even several bugs open.
> 
> The problem is that lvm's init script simply doesn't to an lvchange -ay
> but try to detect the LV holding root.
> And it does this in a wrong way by using the root= kernel param (which
> is the final device, containing the root-fs)
> 
> Most lvm/dm-crypt realted I've seen were simply solvable by letting the
> lvm initscript just do an lvchange -ay (thereby making all LVs
> available) and then using dmcrypt/cryptsetup as normal.

while this bug is not related to init scripts at all, your suggestions
makes a lot of sense to me. after all, i don't see a reason to detect
the volume group with complicated dmsetup, sed and lvdisplay invokations
instead of just activating all volume groups globally in the initramfs.

attached patch removes any vg-guessing magic from the initramfs
cryptroot script, just invoking 'lvm vgchange -ay' instead.

thanks for the comment, Christoph!

greetings,
 jonas
--- /usr/share/initramfs-tools/scripts/local-top/cryptroot.orig
+++ /usr/share/initramfs-tools/scripts/local-top/cryptroot
@@ -141,46 +141,31 @@
 
 activate_vg()
 {
-	local vg
-	vg="${1#/dev/mapper/}"
-
 	# Sanity checks
 	if [ ! -x /sbin/lvm ]; then
 		message "cryptsetup: lvm is not available"
 		return 1
- 	elif [ "$vg" = "$1" ]; then
-		message "cryptsetup: lvm device name ($vg) does not begin with /dev/mapper/"
-		return 1
 	fi
 
-	# Make sure that the device contains at least one dash
-	if [ "${vg%%-*}" = "$vg" ]; then
-		message "cryptsetup: lvm device name ($vg) does not contain a dash"
+	# Detect available volume groups
+	vgs=$(lvm vgs --noheadings -o vg_name | sed -e "s/^[ \t]*\(.*\)[ \t]*$/\1/g")
+	if [ -z "$vgs" ]; then
+		message "cryptsetup: no lvm volume groups found"
 		return 1
 	fi
 
-	# Split volume group from logical volume.
-	vg=$(echo ${vg} | sed -e 's#\(.*\)\([^-]\)-[^-].*#\1\2#')
-
-	# Reduce padded --'s to -'s
-	vg=$(echo ${vg} | sed -e 's#--#-#g')
-
-	lvm vgchange -ay ${vg}
+	lvm vgchange -ay
 	return $?
 }
 
 activate_evms()
 {
 	local dev module
-	dev="${1#/dev/evms/}"
 
 	# Sanity checks
 	if [ ! -x /sbin/evms_activate ]; then
 		message "cryptsetup: evms_activate is not available"
 		return 1
-	elif [ "$dev" = "$1" ]; then
-		message "cryptsetup: evms device name ($vg) does not begin with /dev/evms/"
-		return 1
 	fi
 
 	# Load modules used by evms
@@ -219,8 +204,8 @@
 
 	# Make sure the cryptsource device is available
 	if [ ! -e $cryptsource ]; then
-		activate_vg $cryptsource
-		activate_evms $cryptsource
+		activate_vg
+		activate_evms
 	fi
 
 	# If the encrypted source device hasn't shown up yet, give it a
@@ -320,7 +305,7 @@
 			if [ -z "$cryptlvm" ]; then
 				message "cryptsetup: lvm fs found but no lvm configured"
 				return 1
-			elif ! activate_vg "/dev/mapper/$cryptlvm"; then
+			elif ! activate_vg; then
 				# disable error message, LP: #151532
 				#message "cryptsetup: failed to setup lvm device"
 				return 1

Attachment: signature.asc
Description: Digital signature

Reply via email to