slitaz-modular view initramfs/init @ rev 13

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