slitaz-boot-scripts view init @ rev 278

init: fix subdir case
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Jan 26 09:24:31 2012 +0100 (2012-01-26)
parents 9650e8bd017e
children 11f87b20a969
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 if [ -d /mnt/etc ]; then
47 umount /sys
48 [ -n "$1" ] && for i in $@ ; do
49 cp -a $i /mnt$(dirname $i)
50 done
51 mount /mnt -o remount,ro
52 launch_init
53 fi
54 failed
55 }
57 mount_mapper()
58 {
59 mount $root /mnt
60 try_init /dev/mapper $@
61 }
63 lvmsetup()
64 {
65 grep -q lvmroot= /proc/cmdline || return 1
66 modprobe dm-mod
67 vgscan --ignorelockingfailure
68 vgchange -ay --ignorelockingfailure
69 root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
70 return 0
71 }
73 load_raid()
74 {
75 while read line; do
76 case "$line" in
77 *raid10*) modprobe raid10 ;;
78 *raid0*) modprobe raid0 ;;
79 *raid1*) modprobe raid1 ;;
80 *raid[456]*) modprobe raid456 ;;
81 esac
82 done
83 }
85 if [ "$1" != "logged" ]; then
86 mount -t devpts devpts /dev/pts
87 mount -t tmpfs tmpfs /dev/shm
88 script -qc '/init logged' /dev/shm/boot.log
89 . /dev/shm/init
90 else
91 mount -t proc proc /proc
92 mount -t sysfs sysfs /sys
93 if grep -q dmraid= /proc/cmdline; then
94 root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
95 echo -n "Switching / to dmraid $root..."
96 dmraid -s | grep ^type | awk '{ print $3 }' | load_raid
97 case "$root" in
98 /dev/*);;
99 *) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};;
100 esac
101 dmraid -ay
102 lvmsetup
103 mount_mapper
104 fi
105 if grep -q softraid= /proc/cmdline; then
106 root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
107 echo -n "Switching / to softraid $root..."
108 mdadm --examine --scan --config=partitions > /etc/mdadm.conf
109 grep -qs " $root " /etc/mdadm.conf ||
110 root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf)
111 grep level=raid /etc/mdadm.conf | load_raid
112 for i in 1 2 3 4 5 6 7 8 9; do
113 sleep $i
114 mdadm --assemble --scan
115 grep -qs ': active' /proc/mdstat && break
116 done
117 lvmsetup
118 mount_mapper /etc/mdadm.conf
119 fi
120 if lvmsetup; then
121 echo -n "Switching / to lvm $root..."
122 mount_mapper
123 fi
124 if grep -q mount= /proc/cmdline; then
125 root="$(sed 's/.*mount=\([^ ]*\).*/\1/' < /proc/cmdline)"
126 dev=$(blkid | grep $root | sed 's/:.*//;q')
127 echo "Mounting $dev ($root) ..."
128 if ! mount $dev /mnt; then
129 if echo $dev | grep -q "/dev/sd"; then
130 delay=`cat /sys/module/usb_storage/parameters/delay_use`
131 delay=$((1+$delay))
132 echo -n "sleep for $delay seconds..."
133 sleep $delay
134 fi
135 mount $dev /mnt
136 fi
137 grep -q posixovl /proc/cmdline &&
138 echo "Mounting posixovl.." &&
139 mount.posixovl /mnt
140 fi
141 if grep -q loopfs= /proc/cmdline; then
142 loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
143 echo "Into loop file $loopfs..."
144 losetup /dev/loop0 /mnt/$loopfs
145 mount /dev/loop0 /mnt 2> /dev/null
146 fi
147 if grep -q bindfs= /proc/cmdline; then
148 bind="$(sed 's/.*bindfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
149 echo "Binding ${bind/,/ to } ..."
150 mount --bind /mnt/${bind%,*} /mnt/${bind%,*}/${bind#*,}
151 fi
152 grep -q cryptoroot= /proc/cmdline && try_init
153 umount /sys
154 if grep -q subroot= /proc/cmdline; then
155 subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)" &&
156 echo -n "Chrooting to $subroot..."
157 mount --move /dev/pts /mnt$subroot/dev/pts
158 shm=$subroot/dev/shm
159 mount --move /dev/shm /mnt$shm
160 if mv /usr/share/boot/busybox-static /mnt$shm 2> /dev/null; then
161 success <<EOT
162 exec /sbin/switch_root mnt $shm/busybox-static chroot $subroot /sbin/init
163 EOT
164 else
165 success <<EOT
166 exec chroot /mnt$subroot /sbin/init
167 EOT
168 fi
169 fi
170 echo -n "Switching / to tmpfs"
171 size="$(grep rootfssize= < /proc/cmdline | \
172 sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')"
173 free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }')
174 umount /proc
175 [ -n "$size" ] || size="-o size=90%"
176 echo "exec /sbin/init" > /dev/shm/init
177 if [ $free -lt 50 ] || ! mount -t tmpfs $size tmpfs /mnt; then
178 echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]"
179 exit
180 fi
181 for i in $(ls -ar /); do
182 case "$i" in
183 .|..) ;;
184 mnt) mkdir /mnt/mnt;;
185 usr|var) mv /$i /mnt ;;
186 *) if ! cp -a /$i /mnt 2> /dev/null; then
187 failed
188 umount /mnt
189 exit
190 fi;;
191 esac
192 done
193 launch_init
194 fi