RFC - Encrypted overlay and help with boot ordering
Peter Naulls
peter at chocky.org
Mon Dec 5 12:20:04 PST 2022
I've been experimenting with making the overlay encrypted as part of our
security requirements.
There are a couple of things needed to make this work - first, cryptsetup and
other kernel modules need to be brought in. This also needs the upstream kernel
patch to block2mtd that I posted last week that allows for a custom label.
Finally, in the OpenWrt kernel patch to the partition split logic, I renamed
"rootfs_data" to "rootfs_image.
Then I added the following file as /lib/preinit/80_mount_prepare. Note that this
is carefully named so it appears after 80_lvm2 and before 80_mount_root.
Running the steps manually after boot (I shut down as much as possible), the
process is OK, but during boot, things are not quite right:
[ 21.397406] mount_root: Could not open mtd device: /dev/mtd8
[ 21.408913] mount_root: reading rootfs_data failed
[ 21.420865] mount_root: Could not open mtd device: /dev/mtd5
[ 21.432353] mount_root: reading rootfs failed
[ 21.441237] mount_root: mounting /dev/root
It appears that the device nodes are not ready at this point. In my setup, mtd5
is the old "rootfs_image" and mtd8 is the mtd created by block2mtd.
In any case, feedback on this whole setup and what's going on here welcome.
This is obviously very experimental in nature.
do_prepare_rootfs() {
echo " Preparing rootfs"
encrypt_name=rootfs_image
data_name=rootfs_data
mtd=$(cat /proc/mtd | grep ${encrypt_name} | cut -d : -f 1)
if [ -z "${mtd}" ] ; then
echo "${encrypt_name} not found" 1>&2
exit 1
fi
block=$(echo $mtd | sed s#mtd#mtdblock#)
pass=test
echo "Trying to open partition /dev/{$block} as is"
if ! echo -n "${pass}" | cryptsetup luksOpen /dev/${block} rootfs
2>/dev/null; then
echo "Formatting parititon /dev/${block}"
echo -n "${pass}" | cryptsetup -q luksFormat /dev/${block}
echo "Complete, opening again"
echo -n "${pass}" | cryptsetup luksOpen /dev/${block} rootfs
fi
insmod block2mtd block2mtd=/dev/mapper/rootfs,32KiB,${data_name}
data=$(cat /proc/mtd | grep ${data_name} | cut -d : -f 1)
if [ -z "${data}" ] ; then
echo "${data_name} not found"
exit 1
fi
# Now rely upon mount_root to check partition and setup for jffs2
}
[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_prepare_rootfs
More information about the openwrt-devel
mailing list