slitaz-boot-scripts view init @ rev 321

init: fix loopfs case (thanks xjjx)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Oct 18 18:20:28 2012 +0200 (2012-10-18)
parents a4e4a4784e45
children 445b02a1da07
line source
1 #!/bin/sh
3 fail()
4 {
5 echo -e '\033[70G[ \033[1;3'${1:-1mFailed}'\033[0;39m ]'
6 }
8 quit()
9 {
10 [ -d /mnt$4/etc ] || return
11 [ -n "$4" ] || mount /mnt -o remount,ro
12 mount --move /run /mnt/${1:-run}
13 cat>/run/init<<EOT
14 $2
15 x=/sbin/switch_root
16 [ -x \$x ] && exec \$x mnt $3 /sbin/init
17 EOT
18 fail 2mDone
19 exit
20 }
22 arg()
23 {
24 grep -q $1 /proc/cmdline
25 }
27 got()
28 {
29 arg $1= && root="$(sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline)"
30 }
32 msg()
33 {
34 echo "Switching / to $1..."
35 }
37 use()
38 {
39 got $1 && msg "$1 $root"
40 }
42 mnt()
43 {
44 r=${root#/dev/}
45 r=/dev/${r%%/*}
46 d=${root#*$r}
47 mount $r $1 && return
48 w=$(cat /sys/module/usb_storage/parameters/delay_use)
49 w=$((1+${w:-2}))
50 echo -n "Sleep $w seconds..."
51 sleep $w
52 mount $r $1
53 }
55 mod()
56 {
57 modprobe $1 2>/dev/null || insmod $(find /lib/modules|sed "/$1.ko/!dq")
58 }
60 tryinit()
61 {
62 if [ ! -d /mnt/etc ] && got cryptoroot
63 then mod dm-mod
64 mod dm-crypt
65 mod aes-i586
66 d=${root#/dev/}
67 l=crypto-$d
68 if cryptsetup isLuks $root 2>/dev/null; then
69 cryptsetup luksOpen $root $l
70 else
71 read -st 60 -p "Pass phrase : " p
72 k=$(echo $p|hashalot -x -n 32 sha512)
73 echo 0 $(cat $(find /sys/block|grep /$d/size))\
74 crypt aes-plain $k 0 $root 0|dmsetup create $l
75 fi
76 mount /dev/mapper/$l /mnt
77 fi
78 got subroot && return
79 got loopfs && return
80 if [ -d /mnt/etc ]
81 then for i in $@; do cp -a $i /mnt$(dirname $i); done
82 quit
83 fi
84 fail
85 }
87 trylvm()
88 {
89 use lvmroot || return
90 mod dm-mod
91 vgscan --ignorelockingfailure
92 vgchange -ay --ignorelockingfailure
93 mount /dev/mapper/$root /mnt
94 tryinit /dev/mapper $1
95 }
97 ldraid()
98 {
99 while read l
100 do case "$l" in
101 *raid10*) mod raid10;;
102 *raid0*) mod raid0;;
103 *raid1*) mod raid1;;
104 *raid*) mod raid456;;
105 *mirror*) mod dm-mirror
106 esac
107 done
108 }
110 if [ "$1" != "log" ]
111 then mount -t proc proc /proc
112 mount -t sysfs sys /sys
113 mount -t tmpfs tmpfs /run
114 x=/sbin/init; echo "[ -x $x ] && exec $x" >/run/init
115 $0 log 2>&1 | tee /run/boot.log
116 umount /proc
117 umount /sys
118 . /run/init
119 sh
120 fi
121 ln -s $(sed '/name/!ds/.*:[^a-z]*//' /proc/sys/dev/cdrom/info) /dev/cdrom
122 if use dmraid
123 then dmraid -s|sed '/^type/!ds/.*: *//'|ldraid
124 [ ${root:0:4} = /dev ] ||
125 root=/dev/mapper/$(dmraid -s|sed '/^name/!ds/.*: *//')p${root#p}
126 dmraid -ay
127 fi
128 if use softraid
129 then mdadm -E -s -c partitions>/etc/mdadm.conf
130 grep -qs " $root " /etc/mdadm.conf ||
131 root=$(awk '/dev.md/{print $2;exit}'</etc/mdadm.conf)
132 grep level=raid /etc/mdadm.conf|ldraid
133 for i in 1 2 3 4 5 6 7 8 9
134 do sleep $i
135 mdadm -A -s
136 grep -qs ': act' /proc/mdstat && break
137 done
138 trylvm /etc/mdadm.conf
139 fi
140 trylvm
141 if got mount
142 then dev=$root
143 x=$(blkid|grep $dev|sed 's/:.*//;q')
144 root=${x:-$dev}
145 [ "$dev" = "$root" ] || dev="$root ($dev)"
146 echo "Mount $dev..."
147 mnt /mnt
148 arg posixovl && echo "And posixovl..." && mount.posixovl /mnt
149 fi
150 got loopfs && echo "Into file $root..." &&
151 losetup /dev/loop0 /mnt/$root && mount /dev/loop0 /mnt
152 got bindfs && echo "Bind ${root/,/ to }..." &&
153 mount --bind /mnt/${root%,*} /mnt/${root/,//}
154 arg cryptoroot= && tryinit
155 if use subroot
156 then cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so /usr/sbin/chroot | sed\
157 's|.*=> \(/lib/l[^ ]*\).*|\1|;/^\//!d') /usr/sbin/chroot /run
158 r=$root/run
159 quit $r "export LD_LIBRARY_PATH=$r:/lib"\
160 "$root$(ls /run/ld-*) $r/chroot $root" "/$root"
161 fi
162 quit
163 msg tmpfs
164 root=100
165 got tmpram
166 r=$root
167 root=90%
168 got rootfssize
169 [ $(busybox free|busybox awk '/Mem:/{print int(($4*100)/$3)}') -ge $r ] &&
170 mount -t tmpfs -o size=$root tmpfs /mnt &&
171 for i in $(ls -ar /)
172 do case "$i" in
173 .*|cdrom) ;;
174 mnt|proc|sys) mkdir /mnt/$i;;
175 usr|var|rootfs*) mv /$i /mnt;;
176 *) cp -a /$i /mnt 2>/dev/null && continue
177 fail
178 umount /mnt
179 exit
180 esac
181 done || fail 3mSkipped
182 quit
183 msg aufs
184 br=/mnt/.rw
185 mkdir $br
186 got rwdev && mnt $br && br=$br$d
187 o=
188 p=
189 c=/mnt/.cdrom
190 if [ -z "$(ls /mnt/rootfs* 2>/dev/null)" ]
191 then root=cdrom/fs
192 got rodev
193 mkdir -p $c /mnt$c /mnt/.rw$c
194 mnt $c
195 o="-o 124"
196 p=/.cdrom/boot
197 c=$c$d
198 fi
199 l=0
200 mod squashfs
201 r=
202 got isofs || for i in /mnt$p/rootfs?*.gz
203 do fs=${i#*root}
204 r=$r:/mnt/.$fs
205 mkdir -p /mnt/.rw/mnt/.$fs /mnt/.$fs
206 losetup $o /dev/loop$l $i
207 mount -o ro -t squashfs /dev/loop$((l++)) /mnt/.$fs
208 done
209 mod aufs
210 mount -t aufs -o br=$br${r:-:$c} none /mnt
211 quit