summaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
Diffstat (limited to 'init')
-rwxr-xr-xinit66
1 files changed, 66 insertions, 0 deletions
diff --git a/init b/init
new file mode 100755
index 0000000..acf61d1
--- /dev/null
+++ b/init
@@ -0,0 +1,66 @@
+#!/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
+