wok rev 4545

busybox/init: add loop & crypto support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 03 17:58:06 2009 +0100 (2009-12-03)
parents bc79e85a1561
children 1348f91a1c62
files busybox/stuff/init
line diff
     1.1 --- a/busybox/stuff/init	Thu Dec 03 15:09:30 2009 +0100
     1.2 +++ b/busybox/stuff/init	Thu Dec 03 17:58:06 2009 +0100
     1.3 @@ -1,18 +1,46 @@
     1.4  #!/bin/sh
     1.5  
     1.6 +launch_init()
     1.7 +{
     1.8 +	echo -e "\\033[70G[ \\033[1;33mOK\\033[0;39m ]"
     1.9 +	exec /sbin/switch_root mnt /sbin/init
    1.10 +}
    1.11 +
    1.12 +try_init()
    1.13 +{
    1.14 +	if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then
    1.15 +		modprobe dm-mod
    1.16 +		modprobe dm-crypt
    1.17 +		modprobe aes-i586
    1.18 +		root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
    1.19 +		dev=${root#/dev/}
    1.20 +		dmlabel=crypto-$dev
    1.21 +		if cryptsetup isLuks $root 2> /dev/null; then
    1.22 +			cryptsetup luksOpen $root $dmlabel
    1.23 +		else
    1.24 +			read -s -t 60 -p "Pass phrase : " passphrase
    1.25 +			key=$(echo $passphrase | hashalot -x -n 32 sha512)
    1.26 +			blocks=$(cat $(find /sys/block | grep /$dev/size))
    1.27 +			echo 0 $blocks crypt aes-plain $key 0 $root 0 | \
    1.28 +				dmsetup create $dmlabel
    1.29 +		fi
    1.30 +		mount /dev/mapper/$dmlabel /mnt
    1.31 +	fi
    1.32 +	if [ -d /mnt/etc ]; then
    1.33 +		umount /sys
    1.34 +		[ -n "$1" ] && for i in $@ ; do
    1.35 +			cp -a $i /mnt$i
    1.36 +		done
    1.37 +		umount /proc
    1.38 +		launch_init
    1.39 +	fi
    1.40 +	echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]"
    1.41 +}
    1.42 +
    1.43  mount_mapper()
    1.44  {
    1.45  	mount $root /mnt
    1.46 -	if [ -d /mnt/etc ]; then
    1.47 -		umount /sys
    1.48 -		for i in /dev/mapper $@ ; do
    1.49 -			cp -a $i /mnt$i
    1.50 -		done
    1.51 -		umount /proc
    1.52 -		echo -e "\\033[70G[ \\033[1;33mOK\\033[0;39m ]"
    1.53 -		exec /sbin/switch_root mnt /sbin/init
    1.54 -	fi
    1.55 -	echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]"
    1.56 +	try_init /dev/mapper $@
    1.57  }
    1.58  
    1.59  mount -t proc proc /proc
    1.60 @@ -32,7 +60,8 @@
    1.61  	esac
    1.62  	dmraid -ay
    1.63  	mount_mapper
    1.64 -elif grep -q softraid= /proc/cmdline; then
    1.65 +fi
    1.66 +if grep -q softraid= /proc/cmdline; then
    1.67  	root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
    1.68  	echo -n "Switching / to softraid $root..."
    1.69  	mdadm --examine --scan --config=partitions > /etc/mdadm.conf
    1.70 @@ -45,6 +74,27 @@
    1.71  	mdadm --assemble --scan
    1.72  	mount_mapper /etc/mdadm.conf
    1.73  fi
    1.74 +if grep -q loopfs= /proc/cmdline; then
    1.75 +	loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
    1.76 +	dev=${loopfs%,*}
    1.77 +	loopfs=${loopfs#*,}
    1.78 +	echo -n "Switching / to loop $loopfs on $dev..."
    1.79 +	if ! mount $dev /mnt; then
    1.80 +		if echo $dev | grep -q "/dev/sd"; then
    1.81 +			delay=`cat /sys/module/usb_storage/parameters/delay_use`
    1.82 +			delay=$((1+$delay))
    1.83 +			echo -n "sleep for $delay seconds..."
    1.84 +			sleep $delay
    1.85 +		fi
    1.86 +		mount $dev /mnt || loopfs=""
    1.87 +	fi
    1.88 +	if [ -n "$loopfs" ]; then
    1.89 +		losetup /dev/loop0 /mnt/$loopfs
    1.90 +		mount /dev/loop0 /mnt 2> /dev/null
    1.91 +	fi
    1.92 +	try_init
    1.93 +fi
    1.94 +grep -q cryptoroot= /proc/cmdline && try_init
    1.95  umount /sys
    1.96  echo -n "Switching / to tmpfs..."
    1.97  size="$(grep rootfssize= < /proc/cmdline | \
    1.98 @@ -67,5 +117,4 @@
    1.99  		fi;;
   1.100  	esac
   1.101  done
   1.102 -echo -e "\\033[70G[ \\033[1;33mOK\\033[0;39m ]"
   1.103 -exec /sbin/switch_root mnt /sbin/init
   1.104 +launch_init