[projects/geninitrd] Allow usage of UUID/LABEL in /etc/crypttab.

arekm arekm at pld-linux.org
Mon Nov 9 13:02:55 CET 2015


commit 52c1e558745ccaa5f8222da05959e1cd2341392d
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Mon Nov 9 13:02:48 2015 +0100

    Allow usage of UUID/LABEL in /etc/crypttab.

 functions   | 64 ++++++++++++++++++++++++++++++++++++-------------------------
 mod-luks.sh |  3 +++
 2 files changed, 41 insertions(+), 26 deletions(-)
---
diff --git a/functions b/functions
index f4d9acb..9015cc3 100644
--- a/functions
+++ b/functions
@@ -2,45 +2,30 @@
 #
 # geninitrd functions
 
-# Find root device from fstab.
-#
-# @param	string	$fstab location of /etc/fstab
+# Get device name from UUID/LABEL
+# @param	string	device path or UUID/LABEL name
 # @return	false on failure
 #
-# Sets global variables:
-# - $rootdev
-# - $rootdev_add
-# - $rootFS
-#
-find_root() {
-	local fstab="$1"
-	local function="${PROGRAM:+$PROGRAM: }find_root"
-	local rootopt
+find_devname() {
+	local outname name="$1"
+	local function="${PROGRAM:+$PROGRAM: }find_devname"
 
-	eval $(awk '!/^[\t ]*#/ && $2 == "/" {printf("rootdev=\"%s\"\nrootFs=\"%s\"\nrootopt=\"%s\"\n", $1, $3, $4)}' $fstab)
-	if [ -z "$rootdev" ]; then
-		echo >&2 "$function: can't find fstab entry for root mountpoint"
-		return 1
-	fi
-
-	# additional devices needed (xfs logdev)
-	rootdev_add=$(echo "$rootopt" | awk -F',' '{ for (i=1; i<=NF; i++) { if ($i ~ /^logdev=/) { gsub(/^logdev=/, NIL, $i); print $i; } } }')
-
-	case $rootdev in
+	outname="$name"
+	case $name in
 	LABEL=*)
 		if [ ! -x /sbin/blkid ]; then
 			echo >&2 "$function: /sbin/blkid is missing"
 			return 2
 		fi
 
-		local label=${rootdev#"LABEL="}
+		local label=${name#"LABEL="}
 		local dev=$(/sbin/blkid -l -t LABEL="$label" -o device)
 		if [ "$dev" ]; then
 			if [ ! -r "$dev" ]; then
 				echo >&2 "$function: blkid returned device $dev which doesn't exist"
 				return 2
 			fi
-			rootdev=$dev
+			outname=$dev
 		fi
 		;;
 
@@ -50,7 +35,7 @@ find_root() {
 			return 2
 		fi
 
-		local uuid=${rootdev#"UUID="}
+		local uuid=${name#"UUID="}
 		local dev=$(/sbin/blkid -l -t UUID="$uuid" -o device)
 
 		if [ "$dev" ]; then
@@ -58,11 +43,38 @@ find_root() {
 				echo >&2 "$function: blkid returned device $dev which doesn't exist"
 				return 2
 			fi
-			rootdev=$dev
+			outname=$dev
 		fi
 		;;
 	esac
+	echo $outname
+}
+
+# Find root device from fstab.
+#
+# @param	string	$fstab location of /etc/fstab
+# @return	false on failure
+#
+# Sets global variables:
+# - $rootdev
+# - $rootdev_add
+# - $rootFS
+#
+find_root() {
+	local fstab="$1"
+	local function="${PROGRAM:+$PROGRAM: }find_root"
+	local rootopt
+
+	eval $(awk '!/^[\t ]*#/ && $2 == "/" {printf("rootdev=\"%s\"\nrootFs=\"%s\"\nrootopt=\"%s\"\n", $1, $3, $4)}' $fstab)
+	if [ -z "$rootdev" ]; then
+		echo >&2 "$function: can't find fstab entry for root mountpoint"
+		return 1
+	fi
+
+	# additional devices needed (xfs logdev)
+	rootdev_add=$(echo "$rootopt" | awk -F',' '{ for (i=1; i<=NF; i++) { if ($i ~ /^logdev=/) { gsub(/^logdev=/, NIL, $i); print $i; } } }')
 
+	rootdev=$(find_devname "$rootdev")
 	case $rootdev in
 	/dev/dm-*)
 		local node
diff --git a/mod-luks.sh b/mod-luks.sh
index 43bdcaa..09e31d3 100644
--- a/mod-luks.sh
+++ b/mod-luks.sh
@@ -38,6 +38,7 @@ is_luks() {
 
 	dev=$(awk -vdm_name="$dm_name" '$1 == dm_name { print $2 }' /etc/crypttab)
 	if [ "$dev" ]; then
+		dev=$(find_devname "$dev")
 		/sbin/cryptsetup isLuks $dev
 		rc=$?
 	else
@@ -70,6 +71,7 @@ find_modules_luks() {
 	# recurse
 	dev=$(awk -vLUKSNAME="$LUKSNAME" '$1 == LUKSNAME { print $2 }' /etc/crypttab)
 	if [ -n "$dev" ]; then
+		dev=$(find_devname "$dev")
 		find_modules_for_devpath $dev
 		have_luks=yes
 	else
@@ -130,6 +132,7 @@ luks_crypttab() {
 			key=""
 		fi
 
+		src=$(find_devname "$src")
 		if /sbin/cryptsetup isLuks "$src" 2>/dev/null; then
 			if key_is_random "$key"; then
 				die "$dst: LUKS requires non-random key, skipping"
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/projects/geninitrd.git/commitdiff/52c1e558745ccaa5f8222da05959e1cd2341392d



More information about the pld-cvs-commit mailing list