wok-tiny annotate 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
rev   line source
pascal@0 1 #!/bin/sh
pascal@0 2
pascal@0 3 launch_init()
pascal@0 4 {
pascal@0 5 umount /proc
pascal@0 6 echo -e "\\033[70G[ \\033[1;33mOK\\033[0;39m ]"
pascal@0 7 exec /sbin/switch_root mnt /sbin/init
pascal@0 8 }
pascal@0 9
pascal@0 10 failed()
pascal@0 11 {
pascal@0 12 umount /proc
pascal@0 13 echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]"
pascal@0 14 conspy -d 1 > /init.log
pascal@0 15 }
pascal@0 16
pascal@0 17 try_init()
pascal@0 18 {
pascal@0 19 if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then
pascal@0 20 modprobe dm-mod
pascal@0 21 modprobe dm-crypt
pascal@0 22 modprobe aes-i586
pascal@0 23 root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@0 24 dev=${root#/dev/}
pascal@0 25 dmlabel=crypto-$dev
pascal@0 26 if cryptsetup isLuks $root 2> /dev/null; then
pascal@0 27 cryptsetup luksOpen $root $dmlabel
pascal@0 28 else
pascal@0 29 read -s -t 60 -p "Pass phrase : " passphrase
pascal@0 30 key=$(echo $passphrase | hashalot -x -n 32 sha512)
pascal@0 31 blocks=$(cat $(find /sys/block | grep /$dev/size))
pascal@0 32 echo 0 $blocks crypt aes-plain $key 0 $root 0 | \
pascal@0 33 dmsetup create $dmlabel
pascal@0 34 fi
pascal@0 35 mount /dev/mapper/$dmlabel /mnt
pascal@0 36 fi
pascal@0 37 if [ -d /mnt/etc ]; then
pascal@0 38 umount /sys
pascal@0 39 [ -n "$1" ] && for i in $@ ; do
pascal@0 40 cp -a $i /mnt$(dirname $i)
pascal@0 41 done
pascal@0 42 mount /mnt -o remount,ro
pascal@0 43 launch_init
pascal@0 44 fi
pascal@0 45 failed
pascal@0 46 }
pascal@0 47
pascal@0 48 mount_mapper()
pascal@0 49 {
pascal@0 50 mount $root /mnt
pascal@0 51 try_init /dev/mapper $@
pascal@0 52 }
pascal@0 53
pascal@0 54 lvmsetup()
pascal@0 55 {
pascal@0 56 grep -q lvmroot= /proc/cmdline || return 1
pascal@0 57 modprobe dm-mod
pascal@0 58 vgscan --ignorelockingfailure
pascal@0 59 vgchange -ay --ignorelockingfailure
pascal@0 60 root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@0 61 return 0
pascal@0 62 }
pascal@0 63
pascal@0 64 load_raid()
pascal@0 65 {
pascal@0 66 while read line; do
pascal@0 67 case "$line" in
pascal@0 68 *raid10*) modprobe raid10 ;;
pascal@0 69 *raid0*) modprobe raid0 ;;
pascal@0 70 *raid1*) modprobe raid1 ;;
pascal@0 71 *raid[456]*) modprobe raid456 ;;
pascal@0 72 esac
pascal@0 73 done
pascal@0 74 }
pascal@0 75
pascal@0 76 mount -t proc proc /proc
pascal@0 77 mount -t sysfs sysfs /sys
pascal@0 78 if grep -q dmraid= /proc/cmdline; then
pascal@0 79 root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@0 80 echo -n "Switching / to dmraid $root..."
pascal@0 81 dmraid -s | grep ^type | awk '{ print $3 }' | load_raid
pascal@0 82 case "$root" in
pascal@0 83 /dev/*);;
pascal@0 84 *) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};;
pascal@0 85 esac
pascal@0 86 dmraid -ay
pascal@0 87 lvmsetup
pascal@0 88 mount_mapper
pascal@0 89 fi
pascal@0 90 if grep -q softraid= /proc/cmdline; then
pascal@0 91 root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@0 92 echo -n "Switching / to softraid $root..."
pascal@0 93 mdadm --examine --scan --config=partitions > /etc/mdadm.conf
pascal@0 94 grep -qs " $root " /etc/mdadm.conf ||
pascal@0 95 root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf)
pascal@0 96 grep level=raid /etc/mdadm.conf | load_raid
pascal@0 97 mdadm --assemble --scan
pascal@0 98 lvmsetup
pascal@0 99 mount_mapper /etc/mdadm.conf
pascal@0 100 fi
pascal@0 101 if lvmsetup; then
pascal@0 102 echo -n "Switching / to lvm $root..."
pascal@0 103 mount_mapper
pascal@0 104 fi
pascal@0 105 if grep -q mount= /proc/cmdline; then
pascal@0 106 root="$(sed 's/.*mount=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@0 107 dev=$(blkid | grep $root | sed 's/:.*//;q')
pascal@0 108 echo -n "Mounting $dev ($root) ..."
pascal@0 109 if ! mount $dev /mnt; then
pascal@0 110 if echo $dev | grep -q "/dev/sd"; then
pascal@0 111 delay=`cat /sys/module/usb_storage/parameters/delay_use`
pascal@0 112 delay=$((1+$delay))
pascal@0 113 echo -n "sleep for $delay seconds..."
pascal@0 114 sleep $delay
pascal@0 115 fi
pascal@0 116 mount $dev /mnt
pascal@0 117 fi
pascal@0 118 fi
pascal@0 119 if grep -q loopfs= /proc/cmdline; then
pascal@0 120 loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@0 121 echo -n "Switching / to loop $loopfs..."
pascal@0 122 losetup /dev/loop0 /mnt/$loopfs
pascal@0 123 mount /dev/loop0 /mnt 2> /dev/null
pascal@0 124 fi
pascal@0 125 grep -q cryptoroot= /proc/cmdline && try_init
pascal@0 126 umount /sys
pascal@0 127 if grep -q subroot= /proc/cmdline; then
pascal@0 128 subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)" &&
pascal@0 129 if [ -s /usr/share/boot/busybox-static ]; then
pascal@0 130 mv /usr/share/boot/busybox-static .
pascal@0 131 /busybox-static rm -rf /etc /lib /*bin /usr /var
pascal@0 132 exec /busybox-static chroot /mnt$subroot /sbin/init
pascal@0 133 else
pascal@0 134 exec chroot /mnt$subroot /sbin/init
pascal@0 135 fi
pascal@0 136 fi
pascal@0 137 echo -n "Switching / to tmpfs..."
pascal@0 138 size="$(grep rootfssize= < /proc/cmdline | \
pascal@0 139 sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')"
pascal@0 140 free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }')
pascal@0 141 umount /proc
pascal@0 142 [ -n "$size" ] || size="-o size=90%"
pascal@0 143 if [ $free -lt 100 ] || ! mount -t tmpfs $size tmpfs /mnt; then
pascal@0 144 echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]"
pascal@0 145 umount /proc
pascal@0 146 exec /sbin/init
pascal@0 147 fi
pascal@0 148 for i in $(ls -a /); do
pascal@0 149 case "$i" in
pascal@0 150 .|..) ;;
pascal@0 151 mnt) mkdir /mnt/mnt;;
pascal@0 152 *) if ! cp -a /$i /mnt 2> /dev/null; then
pascal@0 153 failed
pascal@0 154 umount /mnt
pascal@0 155 exec /sbin/init
pascal@0 156 fi;;
pascal@0 157 esac
pascal@0 158 done
pascal@0 159 launch_init