wok view busybox/stuff/init @ rev 7817

busybox/init: add subroot= parameter
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Dec 25 15:12:42 2010 +0100 (2010-12-25)
parents 0b7c86ee9c76
children 7b3b7e2a569d
line source
1 #!/bin/sh
3 launch_init()
4 {
5 echo -e "\\033[70G[ \\033[1;33mOK\\033[0;39m ]"
6 subroot=
7 grep -q subroot= /proc/cmdline &&
8 subroot="/$(sed 's/.*subroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
9 exec /sbin/switch_root mnt$subroot /sbin/init
10 }
12 failed()
13 {
14 echo -e "\\033[70G[ \\033[1;31mFailed\\033[0;39m ]"
15 }
17 try_init()
18 {
19 if [ ! -d /mnt/etc ] && grep -q cryptoroot= /proc/cmdline; then
20 modprobe dm-mod
21 modprobe dm-crypt
22 modprobe aes-i586
23 root="$(sed 's/.*cryptoroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
24 dev=${root#/dev/}
25 dmlabel=crypto-$dev
26 if cryptsetup isLuks $root 2> /dev/null; then
27 cryptsetup luksOpen $root $dmlabel
28 else
29 read -s -t 60 -p "Pass phrase : " passphrase
30 key=$(echo $passphrase | hashalot -x -n 32 sha512)
31 blocks=$(cat $(find /sys/block | grep /$dev/size))
32 echo 0 $blocks crypt aes-plain $key 0 $root 0 | \
33 dmsetup create $dmlabel
34 fi
35 mount /dev/mapper/$dmlabel /mnt
36 fi
37 if [ -d /mnt/etc ]; then
38 umount /sys
39 [ -n "$1" ] && for i in $@ ; do
40 cp -a $i /mnt$(dirname $i)
41 done
42 umount /proc
43 launch_init
44 fi
45 failed
46 }
48 mount_mapper()
49 {
50 mount $root /mnt
51 try_init /dev/mapper $@
52 }
54 lvmsetup()
55 {
56 if grep -q lvmroot= /proc/cmdline; then
57 modprobe dm-mod
58 vgscan --ignorelockingfailure
59 vgchange -ay --ignorelockingfailure
60 root="/dev/mapper/$(sed 's/.*lvmroot=\([^ ]*\).*/\1/' < /proc/cmdline)"
61 return 0
62 fi
63 return 1
64 }
66 load_raid()
67 {
68 while read line; do
69 case "$line" in
70 *raid10*) modprobe raid10 ;;
71 *raid0*) modprobe raid0 ;;
72 *raid1*) modprobe raid1 ;;
73 *raid[456]*) modprobe raid456 ;;
74 esac
75 done
76 }
78 mount -t proc proc /proc
79 mount -t sysfs sysfs /sys
80 if grep -q dmraid= /proc/cmdline; then
81 root="$(sed 's/.*dmraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
82 echo -n "Switching / to dmraid $root..."
83 dmraid -s | grep ^type | awk '{ print $3 }' | load_raid
84 case "$root" in
85 /dev/*);;
86 *) root=/dev/mapper/$(dmraid -s|grep ^name|awk '{print $3}')p${root#p};;
87 esac
88 dmraid -ay
89 lvmsetup
90 mount_mapper
91 fi
92 if grep -q softraid= /proc/cmdline; then
93 root="$(sed 's/.*softraid=\([^ ]*\).*/\1/' < /proc/cmdline)"
94 echo -n "Switching / to softraid $root..."
95 mdadm --examine --scan --config=partitions > /etc/mdadm.conf
96 grep -qs " $root " /etc/mdadm.conf ||
97 root=$(awk '/dev.md/ { print $2; exit }' < /etc/mdadm.conf)
98 grep level=raid /etc/mdadm.conf | load_raid
99 mdadm --assemble --scan
100 lvmsetup
101 mount_mapper /etc/mdadm.conf
102 fi
103 if lvmsetup; then
104 echo -n "Switching / to lvm $root..."
105 mount_mapper
106 fi
107 if grep -q loopfs= /proc/cmdline; then
108 loopfs="$(sed 's/.*loopfs=\([^ ]*\).*/\1/' < /proc/cmdline)"
109 dev=${loopfs%,*}
110 loopfs=${loopfs#*,}
111 echo -n "Switching / to loop $loopfs on $dev..."
112 if ! mount $dev /mnt; then
113 if echo $dev | grep -q "/dev/sd"; then
114 delay=`cat /sys/module/usb_storage/parameters/delay_use`
115 delay=$((1+$delay))
116 echo -n "sleep for $delay seconds..."
117 sleep $delay
118 fi
119 mount $dev /mnt || loopfs=""
120 fi
121 if [ -n "$loopfs" ]; then
122 losetup /dev/loop0 /mnt/$loopfs
123 mount /dev/loop0 /mnt 2> /dev/null
124 fi
125 try_init
126 fi
127 grep -q cryptoroot= /proc/cmdline && try_init
128 if grep -q rootuuid= /proc/cmdline; then
129 root="$(sed 's/.*rootuuid=\([^ ]*\).*/\1/' < /proc/cmdline)"
130 mount $(blkid | grep $root | sed 's/:.*//') /mnt && try_init
131 fi
132 umount /sys
133 echo -n "Switching / to tmpfs..."
134 size="$(grep rootfssize= < /proc/cmdline | \
135 sed 's/.*rootfssize=\([0-9]*[kmg%]\).*/-o size=\1/')"
136 free=$(busybox free | busybox awk '/Mem:/ { print int(($4*100)/$3) }')
137 umount /proc
138 [ -n "$size" ] || size="-o size=90%"
139 if [ $free -lt 100 ] || ! mount -t tmpfs $size tmpfs /mnt; then
140 echo -e "\\033[70G[ \\033[1;33mSkipped\\033[0;39m]"
141 exec /sbin/init
142 fi
143 for i in $(ls -a /); do
144 case "$i" in
145 .|..) ;;
146 mnt) mkdir /mnt/mnt;;
147 *) if ! cp -a /$i /mnt 2> /dev/null; then
148 failed
149 umount /mnt
150 exec /sbin/init
151 fi;;
152 esac
153 done
154 launch_init