slitaz-boot-scripts view init @ rev 302

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