#!/bin/busybox sh #set -x ROOT=/dev/disk/by-label/rootfs HOME=/dev/disk/by-uuid/092fdc4a-4356-47d9-9272-9a5f58e33bbf prep_dev() { for opt in `cat /proc/cmdline`; do name=$(echo $opt | cut -d'=' -f 1) if [ $name == "root" ] || [ $name == "resume" ] || [ $name == "crypt_part" ]; then type=$(echo $opt | cut -d'=' -f 2) id=$(echo $opt | cut -d'=' -f 3) if [ $type == LABEL ]; then prefix="/dev/disk/by-label"; elif [ $type == UUID ]; then prefix="/dev/disk/by-uuid" fi mkdir -p $prefix full="$prefix/$id" if [ ! -e $full ]; then ln -s $(findfs "$type=$id") $full fi fi done } rescue_shell() { echo "Something went wrong. Dropping you to a shell." busybox --install -s exec /bin/sh } cryptsetup_do() { echo "cryptsetup $1 $2" cryptsetup -T 3 luksOpen $1 $2 } mount_root() { echo "mount root $1" mount -o ro $1 /newroot } # Mount the /dev, /proc and /sys filesystems. mount -t devtmpfs none /dev mount -t proc none /proc mount -t sysfs none /sys # Do your stuff here. prep_dev cryptsetup_do $HOME home resume mount_root $ROOT || rescue_shell # Clean up. umount /dev umount /proc umount /sys # Boot the real thing. exec switch_root /newroot /sbin/init