slitaz-boot-scripts view init @ rev 276

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