slitaz-modular view initramfs/init @ rev 166

initramfs: Updated init and linuxrc.
author Christopher Rogers <slaxemulator@gmail.com>
date Fri Feb 24 18:58:07 2012 -0500 (2012-02-24)
parents 8d1e18c4e499
children d31b9a880249
line source
1 #!/bin/sh
3 success()
4 {
5 cat > /tmp/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 [ -d /proc/sys ] && umount /proc
23 echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]"
24 }
26 launch_init_modular()
27 {
28 echo -e "\\033[70G[ \\033[1;32mOK\\033[0;39m ]"
29 [ -d /mnt/initramfs ] || mkdir -p /mnt/initramfs
30 SYS_DIR="dev bin etc boot lib sbin home root run usr var"
31 for dir in $SYS_DIR; do
32 cp -a /$dir /mnt/initramfs
33 done
34 MK_DIR="sys proc tmp media mnt"
35 for dir1 in $MK_DIR; do
36 mkdir -p /mnt/initramfs/$dir1
37 done
38 mount --move /dev /mnt/dev
39 [ -f /mnt/dev/sdc ] || mknod /mnt/dev/sdc b 8 32
40 [ -f /mnt/dev/sdc1 ] || mknod /mnt/dev/sdc1 b 8 33
41 mount --move /run /mnt/run
42 mkdir -p /mnt/dev/pts
43 mount --move /dev/pts /mnt/dev/pts
44 mkdir -p /mnt/dev/shm
45 mount --move /dev/shm /mnt/dev/shm
46 success <<EOT
47 exec /sbin/switch_root mnt /linuxrc
48 EOT
49 }
51 try_init()
52 {
53 if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then
54 modprobe dm-mod
55 modprobe dm-crypt
56 modprobe aes-i586
57 root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
58 dev=${root#/dev/}
59 dmlabel=crypto-$dev
60 if cryptsetup isLuks $root 2> /dev/null; then
61 cryptsetup luksOpen $root $dmlabel
62 else
63 read -s -t 60 -p "Pass phrase : " passphrase
64 key=$(echo $passphrase | hashalot -x -n 32 sha512)
65 blocks=$(cat $(find /sys/block | grep /$dev/size))
66 echo 0 $blocks crypt aes-plain $key 0 $root 0 | \
67 dmsetup create $dmlabel
68 fi
69 mount /dev/mapper/$dmlabel /mnt
70 fi
71 if [ -d /mnt/etc ]; then
72 umount /sys
73 [ -n "$1" ] && for i in $@ ; do
74 cp -a $i /mnt$(dirname $i)
75 done
76 mount /mnt -o remount,ro
77 launch_init
78 fi
79 failed
80 }
82 mount_mapper()
83 {
84 mount $root /mnt
85 try_init /dev/mapper $@
86 }
88 lvmsetup()
89 {
90 grep -q lvmroot= /proc/cmdline || return 1
91 modprobe dm-mod
92 vgscan --ignorelockingfailure
93 vgchange -ay --ignorelockingfailure
94 root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
95 return 0
96 }
98 load_raid()
99 {
100 while read line; do
101 case "$line" in
102 *raid10*) modprobe raid10 ;;
103 *raid0*) modprobe raid0 ;;
104 *raid1*) modprobe raid1 ;;
105 *raid[456]*) modprobe raid456 ;;
106 esac
107 done
108 }
110 if [ "$1" != "logged" ]; then
111 mount -t devpts devpts /dev/pts
112 mount -t tmpfs tmpfs /dev/shm
113 script -qc '/init logged' /dev/shm/boot.log
114 . /tmp/init
115 else
116 mountpoint -q /proc || mount -t proc proc /proc -o nosuid,noexec,nodev
117 mountpoint -q /sys || mount -t sysfs sys /sys -o nosuid,noexec,nodev
118 mountpoint -q /run || mount -t tmpfs run /run -o mode=0755,nosuid,nodev
119 mountpoint -q /dev || mount -t devtmpfs dev /dev -o mode=0755,nosuid
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 shm=$subroot/dev/shm
185 mount --move /dev/shm /mnt$shm &&
186 if mv /usr/share/boot/busybox-static /mnt$shm 2> /dev/null; then
187 success <<EOT
188 exec /sbin/switch_root mnt $shm/busybox-static chroot $subroot /sbin/init
189 EOT
190 else
191 success <<EOT
192 exec chroot /mnt$subroot /sbin/init
193 EOT
194 fi
195 fi
196 echo -n "Switching / to tmpfs"
197 size="$(grep rootfssize= < /proc/cmdline | \
198 sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')"
199 free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }')
200 umount /proc
201 [ -n "$size" ] || size="-o size=90%"
202 echo "exec /sbin/init" > /tmp/init
203 if [ $free -lt 50 ] || ! mount -t tmpfs $size tmpfs /mnt; then
204 echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]"
205 exit
206 fi
207 for i in $(ls -ar /); do
208 case "$i" in
209 .|..) ;;
210 mnt) mkdir /mnt/mnt;;
211 *) if ! cp -a /$i /mnt 2> /dev/null; then
212 failed
213 umount /mnt
214 exec /sbin/init
215 fi;;
216 esac
217 done
218 launch_init_modular
219 fi