wok-tiny diff busybox/stuff/init @ rev 176

busybox: fix modules order
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Jul 14 19:16:39 2021 +0000 (2021-07-14)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/busybox/stuff/init	Wed Jul 14 19:16:39 2021 +0000
     1.3 @@ -0,0 +1,159 @@
     1.4 +#!/bin/sh
     1.5 +
     1.6 +launch_init()
     1.7 +{
     1.8 +	umount /proc
     1.9 +	echo -e "\\033[70G[ \\033[1;33mOK\\033[0;39m ]"
    1.10 +	exec /sbin/switch_root mnt /sbin/init
    1.11 +}
    1.12 +
    1.13 +failed()
    1.14 +{
    1.15 +	umount /proc
    1.16 +	echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]"
    1.17 +	conspy -d 1 > /init.log
    1.18 +}
    1.19 +
    1.20 +try_init()
    1.21 +{
    1.22 +	if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then
    1.23 +		modprobe dm-mod
    1.24 +		modprobe dm-crypt
    1.25 +		modprobe aes-i586
    1.26 +		root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
    1.27 +		dev=${root#/dev/}
    1.28 +		dmlabel=crypto-$dev
    1.29 +		if cryptsetup isLuks $root 2> /dev/null; then
    1.30 +			cryptsetup luksOpen $root $dmlabel
    1.31 +		else
    1.32 +			read -s -t 60 -p "Pass phrase : " passphrase
    1.33 +			key=$(echo $passphrase | hashalot -x -n 32 sha512)
    1.34 +			blocks=$(cat $(find /sys/block | grep /$dev/size))
    1.35 +			echo 0 $blocks crypt aes-plain $key 0 $root 0 | \
    1.36 +				dmsetup create $dmlabel
    1.37 +		fi
    1.38 +		mount /dev/mapper/$dmlabel /mnt
    1.39 +	fi
    1.40 +	if [ -d /mnt/etc ]; then
    1.41 +		umount /sys
    1.42 +		[ -n "$1" ] && for i in $@ ; do
    1.43 +			cp -a $i /mnt$(dirname $i)
    1.44 +		done
    1.45 +		mount /mnt -o remount,ro
    1.46 +		launch_init
    1.47 +	fi
    1.48 +	failed
    1.49 +}
    1.50 +
    1.51 +mount_mapper()
    1.52 +{
    1.53 +	mount $root /mnt
    1.54 +	try_init /dev/mapper $@
    1.55 +}
    1.56 +
    1.57 +lvmsetup()
    1.58 +{
    1.59 +	grep -q lvmroot= /proc/cmdline || return 1
    1.60 +	modprobe dm-mod
    1.61 +	vgscan --ignorelockingfailure
    1.62 +	vgchange -ay --ignorelockingfailure
    1.63 +	root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
    1.64 +	return 0
    1.65 +}
    1.66 +
    1.67 +load_raid()
    1.68 +{
    1.69 +while read line; do
    1.70 +	case "$line" in
    1.71 +	*raid10*)	modprobe raid10 ;;
    1.72 +	*raid0*)	modprobe raid0 ;;
    1.73 +	*raid1*)	modprobe raid1 ;;
    1.74 +	*raid[456]*)	modprobe raid456 ;;
    1.75 +	esac
    1.76 +done
    1.77 +}
    1.78 +
    1.79 +mount -t proc proc /proc
    1.80 +mount -t sysfs sysfs /sys
    1.81 +if grep -q dmraid= /proc/cmdline; then
    1.82 +	root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
    1.83 +	echo -n "Switching / to dmraid $root..."
    1.84 +	dmraid -s | grep ^type | awk '{ print $3 }' | load_raid
    1.85 +	case "$root" in
    1.86 +	/dev/*);;
    1.87 +	*) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};;
    1.88 +	esac
    1.89 +	dmraid -ay
    1.90 +	lvmsetup 
    1.91 +	mount_mapper
    1.92 +fi
    1.93 +if grep -q softraid= /proc/cmdline; then
    1.94 +	root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
    1.95 +	echo -n "Switching / to softraid $root..."
    1.96 +	mdadm --examine --scan --config=partitions > /etc/mdadm.conf
    1.97 +	grep -qs " $root " /etc/mdadm.conf ||
    1.98 +		root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf)
    1.99 +	grep level=raid /etc/mdadm.conf | load_raid
   1.100 +	mdadm --assemble --scan
   1.101 +	lvmsetup 
   1.102 +	mount_mapper /etc/mdadm.conf
   1.103 +fi
   1.104 +if lvmsetup; then
   1.105 +	echo -n "Switching / to lvm $root..."
   1.106 +	mount_mapper
   1.107 +fi
   1.108 +if grep -q mount= /proc/cmdline; then
   1.109 +	root="$(sed 's/.*mount=\([^ ]*\).*/\1/' < /proc/cmdline)"
   1.110 +	dev=$(blkid | grep $root | sed 's/:.*//;q')
   1.111 +	echo -n "Mounting $dev ($root) ..."
   1.112 +	if ! mount $dev /mnt; then
   1.113 +		if echo $dev | grep -q "/dev/sd"; then
   1.114 +			delay=`cat /sys/module/usb_storage/parameters/delay_use`
   1.115 +			delay=$((1+$delay))
   1.116 +			echo -n "sleep for $delay seconds..."
   1.117 +			sleep $delay
   1.118 +		fi
   1.119 +		mount $dev /mnt
   1.120 +	fi
   1.121 +fi
   1.122 +if grep -q loopfs= /proc/cmdline; then
   1.123 +	loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
   1.124 +	echo -n "Switching / to loop $loopfs..."
   1.125 +	losetup /dev/loop0 /mnt/$loopfs
   1.126 +	mount /dev/loop0 /mnt 2> /dev/null
   1.127 +fi
   1.128 +grep -q cryptoroot= /proc/cmdline && try_init
   1.129 +umount /sys
   1.130 +if grep -q subroot= /proc/cmdline; then
   1.131 +	subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)" &&
   1.132 +	if [ -s /usr/share/boot/busybox-static ]; then
   1.133 +		mv /usr/share/boot/busybox-static .
   1.134 +		/busybox-static rm -rf /etc /lib /*bin /usr /var
   1.135 +		exec /busybox-static chroot /mnt$subroot /sbin/init
   1.136 +	else
   1.137 +		exec chroot /mnt$subroot /sbin/init
   1.138 +	fi
   1.139 +fi
   1.140 +echo -n "Switching / to tmpfs..."
   1.141 +size="$(grep rootfssize= < /proc/cmdline | \
   1.142 +	sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')"
   1.143 +free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }')
   1.144 +umount /proc
   1.145 +[ -n "$size" ] || size="-o size=90%"
   1.146 +if [ $free -lt 100 ] || ! mount -t tmpfs $size tmpfs /mnt; then
   1.147 +	echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]"
   1.148 +	umount /proc
   1.149 +	exec /sbin/init
   1.150 +fi
   1.151 +for i in $(ls -a /); do
   1.152 +	case "$i" in
   1.153 +	.|..)	;;
   1.154 +	mnt)	mkdir /mnt/mnt;;
   1.155 +	*)	if ! cp -a /$i /mnt 2> /dev/null; then
   1.156 +			failed
   1.157 +			umount /mnt
   1.158 +			exec /sbin/init
   1.159 +		fi;;
   1.160 +	esac
   1.161 +done
   1.162 +launch_init