Ben Hutchings wrote:
> (...)
> ...which is a linear mapping, not encrypted.
>
> However, that in turn depends on 253:9, which is sda8_crypt.
>
> So it looks like this script needs to keep following dependencies until
> it finds a non-mapped device or encrypted mapping, rather than just
> looking at the first level as it does now.
>
Ok, so I've taken a stab at debugging this thing and got it to work; see
the attached patches; some of them also contain changes which I needed
to be able to run the script with set -eu. I think it would make sense
to apply these, too, so I'm attaching them as well. I'm not squashing
together the patches 1 and 5, and patches 6 and 8, since I think it may
show the difficulties more clear.
You can get the same patches also from the git repository at:
http://christianjaeger.ch/dyn/pubgit/gitweb?p=cryptroot-debugging.git;a=summary
This git repository also contains my whole debugging history in the
"debugging" branch, in case you're interested in more details. (It also
contains a patch for usage under set -eu to the hook-functions file from
the initramfs-tools.)
Christian.
>From 030d49bbacadc03ef604478be7d0582bd2703cf7 Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Wed, 10 Dec 2008 23:04:43 +0100
Subject: [PATCH] Fix: recurse for non crypt nodes
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index cc0bd24..51ca537 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -142,7 +142,8 @@ get_lvm_deps() {
continue
fi
if [ "$(dmsetup table $depnode 2> /dev/null | cut -d' ' -f3)" != "crypt" ]; then
- continue
+ get_lvm_deps $depnode # no quoting here as above there isn't either, and it contains appended whitespace
+ # continue or not?
fi
echo "$depnode"
done
--
1.6.0.5
>From 9890015baef3b353f143f4fddde7510eed89540d Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Wed, 10 Dec 2008 23:07:07 +0100
Subject: [PATCH] Fix: quote parameters to get_device_opts
Or, when using set -eu, get_device_opts would stop with
$2: unbound variable
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index 51ca537..815b133 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -348,7 +348,7 @@ add_device() {
fi
# Get crypttab root options
- if ! get_device_opts $node $opts; then
+ if ! get_device_opts "$node" "$opts"; then
continue
fi
echo "$OPTIONS" >> "$DESTDIR/conf/conf.d/cryptroot"
--
1.6.0.5
>From 6c6213edc0bde1bedcc4b364b7befcb156a220e4 Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Wed, 10 Dec 2008 23:11:06 +0100
Subject: [PATCH] Fix: initialize HASH_FOUND and LUKS_FOUND to ""
Instead of unset'ing them, which would make things fail with set -eu.
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index 815b133..9e25d09 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -200,8 +200,8 @@ get_device_opts() {
# We have all the basic options, let's go trough them
OPTIONS="target=$target,source=$source,key=$key"
local IFS=", "
- unset HASH_FOUND
- unset LUKS_FOUND
+ HASH_FOUND=""
+ LUKS_FOUND=""
for opt in $rootopts; do
case $opt in
cipher=*)
--
1.6.0.5
>From e13108d4be405bfd6fba91ddd0832e446a8e6dde Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Wed, 10 Dec 2008 23:15:38 +0100
Subject: [PATCH] Fix?: mkdir -p "$DESTDIR/conf/conf.d"
Note that this seems only be needed because I'm testing with the
cryptroot script alone, possibly in real usage this directory already
exists?
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index 9e25d09..096c5bb 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -351,6 +351,7 @@ add_device() {
if ! get_device_opts "$node" "$opts"; then
continue
fi
+ mkdir -p "$DESTDIR/conf/conf.d"
echo "$OPTIONS" >> "$DESTDIR/conf/conf.d/cryptroot"
# If we have a keyscript, make sure it is included
--
1.6.0.5
>From 1f881a48e173968cbd83892808b7992bd4d765ab Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Wed, 10 Dec 2008 23:24:40 +0100
Subject: [PATCH] Need to still 'continue' (meaning, stop looping) after recursion (?)
I'm not sure why, but otherwise, we get this:
++ for node in '$nodes'
++ '[' 2 -eq 2 ']'
++ '[' -z '' ']'
++ opts=lvm=main-root
++ get_device_opts main-root-real lvm=main-root
++ local target source link extraopts rootopts opt
++ target=main-root-real
++ extraopts=lvm=main-root
++ KEYSCRIPT=
++ OPTIONS=
++ '[' -z main-root-real ']'
+++ grep '^main-root-real' /etc/crypttab
+++ head -1
+++ sed 's/[[:space:]]\+/ /g'
++ opt=
+++ echo
+++ cut -d ' ' -f2
++ source=
+++ echo
+++ cut -d ' ' -f3
++ key=
+++ echo
+++ cut -d ' ' -f4-
++ rootopts=
++ '[' -z '' ']'
++ echo 'cryptsetup: WARNING: invalid line in /etc/crypttab - '
cryptsetup: WARNING: invalid line in /etc/crypttab -
++ return 1
++ continue
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index 096c5bb..f8b197e 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -143,7 +143,7 @@ get_lvm_deps() {
fi
if [ "$(dmsetup table $depnode 2> /dev/null | cut -d' ' -f3)" != "crypt" ]; then
get_lvm_deps $depnode # no quoting here as above there isn't either, and it contains appended whitespace
- # continue or not?
+ continue
fi
echo "$depnode"
done
--
1.6.0.5
>From 8dabdde5608fb43430a3d0ec6a2d402f81f5bbd7 Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Wed, 10 Dec 2008 23:55:54 +0100
Subject: [PATCH] Fix attempt: search in kernel/drivers/ too
But as long as mod is 'dm_mod' and the kernel (2.6.27.7 in my case)
provides dm-mod, it still won't be found.
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index f8b197e..3243ebd 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -413,6 +413,15 @@ add_crypto_modules() {
found="yes"
done
+ if [ -z "$found" ]; then
+ for file in $(find "$MODULESDIR/kernel/drivers/" -name "$mod-*.ko"); do
+ altmod="${file##*/}"
+ altmod="${altmod%.ko}"
+ manual_add_modules "$altmod"
+ found="yes"
+ done
+ fi
+
for file in $(find "$MODULESDIR/kernel/crypto/" -name "${mod}_generic.ko"); do
altmod="${file##*/}"
altmod="${altmod%.ko}"
--
1.6.0.5
>From a26bef986721585b9affd5ffe73d8940fe4e0808 Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Thu, 11 Dec 2008 00:02:11 +0100
Subject: [PATCH] Fix attempt: tr _ - in the module name and try again
But it still doesn't work (yet)
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index 3243ebd..1e30b50 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -440,7 +440,12 @@ add_crypto_modules() {
fi
if [ -z "$found" ]; then
- return 1
+ if echo "$mod"|grep -q _; then
+ add_crypto_modules "$(echo "$mod"|tr _ -)"
+ return $?
+ else
+ return 1
+ fi
fi
return 0
--
1.6.0.5
>From 3688373eeea018c7b0d240b705c874793b6136cb Mon Sep 17 00:00:00 2001
Message-Id: <[EMAIL PROTECTED]>
In-Reply-To: <[EMAIL PROTECTED]>
References: <[EMAIL PROTECTED]>
From: Christian Jaeger <[EMAIL PROTECTED]>
Date: Thu, 11 Dec 2008 00:05:24 +0100
Subject: [PATCH] Fix fix: search these without -* appendix.
Still, I don't know whether this is the proper solution. But at least
it works for me.
Signed-off-by: Christian Jaeger <[EMAIL PROTECTED]>
---
debian/initramfs/cryptroot-hook | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/debian/initramfs/cryptroot-hook b/debian/initramfs/cryptroot-hook
index 1e30b50..263edf4 100644
--- a/debian/initramfs/cryptroot-hook
+++ b/debian/initramfs/cryptroot-hook
@@ -414,7 +414,7 @@ add_crypto_modules() {
done
if [ -z "$found" ]; then
- for file in $(find "$MODULESDIR/kernel/drivers/" -name "$mod-*.ko"); do
+ for file in $(find "$MODULESDIR/kernel/drivers/" -name "${mod}.ko"); do
altmod="${file##*/}"
altmod="${altmod%.ko}"
manual_add_modules "$altmod"
--
1.6.0.5