slitaz-modular view initramfs/init @ rev 173

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