slitaz-boot-scripts annotate init @ rev 301

Added tag 5.0 for changeset 1dbfd813e21e
author Christophe Lincoln <pankso@slitaz.org>
date Wed May 02 17:03:41 2012 +0200 (2012-05-02)
parents 7c84d54e514b
children 6ea85ee8bde8
rev   line source
pascal@276 1 #!/bin/sh
pascal@276 2
pascal@278 3 success()
pascal@278 4 {
pascal@278 5 cat > /dev/shm/init
pascal@278 6 [ -d /proc/sys ] && umount /proc
pascal@278 7 echo -e "\\033[70G[ \\033[1;32mOK\\033[0;39m ]"
pascal@278 8 exit
pascal@278 9 }
pascal@278 10
pascal@276 11 launch_init()
pascal@276 12 {
pascal@278 13 mount --move /dev/pts /mnt/dev/pts
pascal@278 14 mount --move /dev/shm /mnt/dev/shm
pascal@278 15 success <<EOT
pascal@276 16 exec /sbin/switch_root mnt /sbin/init
pascal@276 17 EOT
pascal@276 18 }
pascal@276 19
pascal@276 20 failed()
pascal@276 21 {
pascal@276 22 umount /proc
pascal@276 23 echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]"
pascal@276 24 }
pascal@276 25
pascal@276 26 try_init()
pascal@276 27 {
pascal@276 28 if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then
pascal@276 29 modprobe dm-mod
pascal@276 30 modprobe dm-crypt
pascal@276 31 modprobe aes-i586
pascal@276 32 root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@276 33 dev=${root#/dev/}
pascal@276 34 dmlabel=crypto-$dev
pascal@276 35 if cryptsetup isLuks $root 2> /dev/null; then
pascal@276 36 cryptsetup luksOpen $root $dmlabel
pascal@276 37 else
pascal@276 38 read -s -t 60 -p "Pass phrase : " passphrase
pascal@276 39 key=$(echo $passphrase | hashalot -x -n 32 sha512)
pascal@276 40 blocks=$(cat $(find /sys/block | grep /$dev/size))
pascal@276 41 echo 0 $blocks crypt aes-plain $key 0 $root 0 | \
pascal@276 42 dmsetup create $dmlabel
pascal@276 43 fi
pascal@276 44 mount /dev/mapper/$dmlabel /mnt
pascal@276 45 fi
pascal@284 46 grep -q subroot= /proc/cmdline && return
pascal@284 47 grep -q loopfs= /proc/cmdline && return
pascal@276 48 if [ -d /mnt/etc ]; then
pascal@276 49 umount /sys
pascal@276 50 [ -n "$1" ] && for i in $@ ; do
pascal@276 51 cp -a $i /mnt$(dirname $i)
pascal@276 52 done
pascal@276 53 mount /mnt -o remount,ro
pascal@276 54 launch_init
pascal@276 55 fi
pascal@276 56 failed
pascal@276 57 }
pascal@276 58
pascal@276 59 mount_mapper()
pascal@276 60 {
pascal@276 61 mount $root /mnt
pascal@276 62 try_init /dev/mapper $@
pascal@276 63 }
pascal@276 64
pascal@276 65 lvmsetup()
pascal@276 66 {
pascal@276 67 grep -q lvmroot= /proc/cmdline || return 1
pascal@276 68 modprobe dm-mod
pascal@276 69 vgscan --ignorelockingfailure
pascal@276 70 vgchange -ay --ignorelockingfailure
pascal@276 71 root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@276 72 return 0
pascal@276 73 }
pascal@276 74
pascal@276 75 load_raid()
pascal@276 76 {
pascal@276 77 while read line; do
pascal@276 78 case "$line" in
pascal@276 79 *raid10*) modprobe raid10 ;;
pascal@276 80 *raid0*) modprobe raid0 ;;
pascal@293 81 *raid1*) modprobe raid1 ;;
pascal@276 82 *raid[456]*) modprobe raid456 ;;
pascal@293 83 *mirror*) modprobe dm-mirror ;;
pascal@276 84 esac
pascal@276 85 done
pascal@276 86 }
pascal@276 87
pascal@276 88 if [ "$1" != "logged" ]; then
pascal@276 89 mount -t devpts devpts /dev/pts
pascal@276 90 mount -t tmpfs tmpfs /dev/shm
pascal@276 91 script -qc '/init logged' /dev/shm/boot.log
pascal@276 92 . /dev/shm/init
pascal@276 93 else
pascal@276 94 mount -t proc proc /proc
pascal@276 95 mount -t sysfs sysfs /sys
pascal@276 96 if grep -q dmraid= /proc/cmdline; then
pascal@276 97 root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@278 98 echo -n "Switching / to dmraid $root..."
pascal@276 99 dmraid -s | grep ^type | awk '{ print $3 }' | load_raid
pascal@276 100 case "$root" in
pascal@276 101 /dev/*);;
pascal@276 102 *) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};;
pascal@276 103 esac
pascal@276 104 dmraid -ay
pascal@276 105 lvmsetup
pascal@276 106 mount_mapper
pascal@276 107 fi
pascal@276 108 if grep -q softraid= /proc/cmdline; then
pascal@276 109 root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@278 110 echo -n "Switching / to softraid $root..."
pascal@276 111 mdadm --examine --scan --config=partitions > /etc/mdadm.conf
pascal@276 112 grep -qs " $root " /etc/mdadm.conf ||
pascal@276 113 root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf)
pascal@276 114 grep level=raid /etc/mdadm.conf | load_raid
pascal@276 115 for i in 1 2 3 4 5 6 7 8 9; do
pascal@276 116 sleep $i
pascal@276 117 mdadm --assemble --scan
pascal@276 118 grep -qs ': active' /proc/mdstat && break
pascal@276 119 done
pascal@276 120 lvmsetup
pascal@276 121 mount_mapper /etc/mdadm.conf
pascal@276 122 fi
pascal@276 123 if lvmsetup; then
pascal@278 124 echo -n "Switching / to lvm $root..."
pascal@276 125 mount_mapper
pascal@276 126 fi
pascal@276 127 if grep -q mount= /proc/cmdline; then
pascal@276 128 root="$(sed 's/.*mount=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@276 129 dev=$(blkid | grep $root | sed 's/:.*//;q')
pascal@292 130 [ "$dev" = "$root" ] || root="$dev ($root)"
pascal@292 131 echo "Mounting $root ..."
pascal@276 132 if ! mount $dev /mnt; then
pascal@276 133 if echo $dev | grep -q "/dev/sd"; then
pascal@276 134 delay=`cat /sys/module/usb_storage/parameters/delay_use`
pascal@276 135 delay=$((1+$delay))
pascal@276 136 echo -n "sleep for $delay seconds..."
pascal@276 137 sleep $delay
pascal@276 138 fi
pascal@276 139 mount $dev /mnt
pascal@276 140 fi
pascal@278 141 grep -q posixovl /proc/cmdline &&
pascal@278 142 echo "Mounting posixovl.." &&
pascal@278 143 mount.posixovl /mnt
pascal@276 144 fi
pascal@276 145 if grep -q loopfs= /proc/cmdline; then
pascal@276 146 loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@278 147 echo "Into loop file $loopfs..."
pascal@276 148 losetup /dev/loop0 /mnt/$loopfs
pascal@276 149 mount /dev/loop0 /mnt 2> /dev/null
pascal@276 150 fi
pascal@276 151 if grep -q bindfs= /proc/cmdline; then
pascal@276 152 bind="$(sed 's/.*bindfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
pascal@278 153 echo "Binding ${bind/,/ to } ..."
pascal@276 154 mount --bind /mnt/${bind%,*} /mnt/${bind%,*}/${bind#*,}
pascal@276 155 fi
pascal@276 156 grep -q cryptoroot= /proc/cmdline && try_init
pascal@276 157 umount /sys
pascal@276 158 if grep -q subroot= /proc/cmdline; then
pascal@276 159 subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)" &&
pascal@278 160 echo -n "Chrooting to $subroot..."
pascal@278 161 mount --move /dev/pts /mnt$subroot/dev/pts
pascal@278 162 shm=$subroot/dev/shm
pascal@278 163 mount --move /dev/shm /mnt$shm
pascal@288 164 cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so /usr/sbin/chroot | sed \
pascal@288 165 's|.*=> \(/lib/l[^ ]*\).*|\1|;/^\//!d') /usr/sbin/chroot /mnt$shm
pascal@288 166 success <<EOT
pascal@288 167 export LD_LIBRARY_PATH=$shm:/lib
pascal@288 168 exec /sbin/switch_root mnt $shm/$(cd /mnt$shm ; ls ld-*) $shm/chroot $subroot /sbin/init
pascal@278 169 EOT
pascal@276 170 fi
pascal@278 171 echo -n "Switching / to tmpfs"
pascal@276 172 size="$(grep rootfssize= < /proc/cmdline | \
pascal@276 173 sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')"
pascal@276 174 free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }')
pascal@276 175 umount /proc
pascal@276 176 [ -n "$size" ] || size="-o size=90%"
pascal@276 177 echo "exec /sbin/init" > /dev/shm/init
pascal@295 178 if [ $free -lt 100 ] || ! mount -t tmpfs $size tmpfs /mnt; then
pascal@276 179 echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]"
pascal@276 180 exit
pascal@276 181 fi
pascal@278 182 for i in $(ls -ar /); do
pascal@276 183 case "$i" in
pascal@276 184 .|..) ;;
pascal@276 185 mnt) mkdir /mnt/mnt;;
pascal@278 186 usr|var) mv /$i /mnt ;;
pascal@276 187 *) if ! cp -a /$i /mnt 2> /dev/null; then
pascal@276 188 failed
pascal@276 189 umount /mnt
pascal@276 190 exit
pascal@276 191 fi;;
pascal@276 192 esac
pascal@276 193 done
pascal@276 194 launch_init
pascal@276 195 fi