slitaz-modular view initramfs/init @ rev 132

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