CRUX-ARM : Home

Home :: Documentation :: Download :: Development :: Community :: Ports :: Packages :: Bugs :: Links :: About :: Donors
Cleanup for 'init' script
[initramfs.git] / init
CommitLineData
be3fa5e6 1#!/bin/sh
1d7b9c8a 2
be3fa5e6 3#
1d7b9c8a 4# initramfs /init (busybox ash)
be3fa5e6
JB
5#
6
1d7b9c8a
JB
7# color codes and some predefined texts
8BOLD="\033[1m"
9NORM="\033[0m"
10RED="\033[31m"
11GREEN="\033[32m"
12YELLOW="\033[33m"
13BLUE="\033[34m"
14OK="${BOLD}${GREEN}OK${NORM}"
15FAILED="${BOLD}${RED}FAILED${NORM}"
16
17# helper functions
18
19# check an exit value and print a colored status
20checkReturn() {
21 if [ $? -ne 0 ]
22 then
23 echo -e $FAILED
24 else
25 echo -e $OK
26 fi
27}
be3fa5e6 28
1d7b9c8a
JB
29# search for and mount the crux media, populate a tmpfs from it,
30# and prepare /newroot for switch_root at the end of the script
31find_and_mount_media() {
4357bb11
JB
32 echo -e -n " ${BOLD}${BLUE}*${NORM} Creating and mounting tmpfs... "
33 mkdir /.tmpfs
34 mount -t tmpfs tmpfs /.tmpfs
35 checkReturn
36
1d7b9c8a 37 echo -e " ${BOLD}${BLUE}*${NORM} Searching for the CRUX media..."
4357bb11 38 mkdir -p /.tmpfs/.media
1d7b9c8a 39 CRUXMEDIA=""
2cbc0e64 40 CDROM_DEVICES="`grep 'drive name:' /proc/sys/dev/cdrom/info | awk '{ print $3 }'`"
1d7b9c8a
JB
41 MMC_DEVICES="`grep -E 'mmcblk' /proc/partitions | awk '{ print $4 }'`"
42 BLOCK_DEVICES="`grep -E '[sh]d' /proc/partitions | awk '{ print $4 }'`"
4357bb11 43 for DEV in $CDROM_DEVICES $MMC_DEVICES $BLOCK_DEVICES
1d7b9c8a
JB
44 do
45 DEV="/dev/$DEV"
4357bb11 46 mount -r $DEV /.tmpfs/.media 2> /dev/null
1d7b9c8a 47 if [ $? -eq 0 ]
4357bb11 48 then
1d7b9c8a 49 echo -e -n " ${BOLD}${GREEN}*${NORM} Found media on $DEV"
4357bb11 50 if [ -e /.tmpfs/.media/crux-media ]
1d7b9c8a
JB
51 then
52 echo ", CRUX media."
53 CRUXMEDIA=$DEV
1d7b9c8a
JB
54 break
55 else
56 echo ", but it's not the CRUX media."
4357bb11 57 umount /.tmpfs/.media
1d7b9c8a
JB
58 fi
59 else
60 echo -e " ${BOLD}${YELLOW}*${NORM} No media found on $DEV."
61 fi
62 done
be3fa5e6 63
1d7b9c8a 64 # check if the media was mounted properly. if not, spawn a shell
4357bb11 65 if [ ! -e /.tmpfs/.media/crux-media ]
1d7b9c8a 66 then
1d7b9c8a
JB
67 echo -e " ${BOLD}${RED}*${NORM} The CRUX media was not properly mounted!"
68 echo " Spawning a shell for you to attempt to fix this problem. If"
69 echo " you are able to find the correct device, mount it at"
4357bb11 70 echo " /.tmpfs/.media and then log out of this shell to continue."
1d7b9c8a
JB
71 echo " If you are NOT able to fix the problem, installation will"
72 echo " not be possible."
73 echo
74 /bin/sh
75 fi
be3fa5e6 76
1d7b9c8a 77 # check again and stop if it's still not there
4357bb11 78 if [ ! -e /.tmpfs/.media/crux-media ]
1d7b9c8a 79 then
1d7b9c8a
JB
80 echo -e " ${BOLD}${RED}*${NORM} The CRUX media still appears not to be"
81 echo " found and installation will not continue."
82 echo
4357bb11
JB
83 sleep 99999
84 exit 1
1d7b9c8a 85 fi
4357bb11
JB
86
87 echo -e " ${BOLD}${BLUE}*${NORM} Populating root filesystem..."
88 mkdir -p /newroot
89 echo -e -n " ${BOLD}${BLUE}*${NORM} Mounting new root filesystem... "
90 mount -t tmpfs tmpfs /newroot
91 checkReturn
92 echo -e -n " ${BOLD}${BLUE}*${NORM} Copying files from rootfs.tar.xz... "
93 tar -xpf /.tmpfs/.media/rootfs.tar.xz -C /newroot
94 checkReturn
95 echo -e -n " ${BOLD}${BLUE}*${NORM} Copying devices from rootfs... "
2cbc0e64 96 cp -af /dev/* /newroot/dev/
4357bb11
JB
97 checkReturn
98 mkdir -p /newroot/dev/pts /newroot/media
99
100 # the media gets unmounted here and remounted after switch_root
101 umount /.tmpfs/.media
102 rmdir /.tmpfs/.media
103 sed -i -e "s,#CRUXMEDIA#,${CRUXMEDIA}," /newroot/etc/fstab
104
105 echo -e -n " ${BOLD}${BLUE}*${NORM} Unmounting tmpfs... "
106 umount /.tmpfs
107 checkReturn
108 rmdir /.tmpfs
1d7b9c8a
JB
109}
110
55f11ffe
JB
111/bin/busybox --install -s /bin
112
1d7b9c8a 113# main script
be3fa5e6 114
1d7b9c8a
JB
115echo ""
116echo -e "${BOLD}CRUX-ARM 2.7.1 - ${BLUE}http://crux-arm.nu/${NORM}"
117echo ""
be3fa5e6 118
1d7b9c8a
JB
119exec >/dev/console </dev/console 2>&1
120
55f11ffe
JB
121echo -e -n " ${BOLD}${BLUE}*${NORM} Mounting "
122echo -e -n "${BOLD}${GREEN}/proc${NORM}"
123mount -t proc proc /proc
124
125PRINTK="`cat /proc/sys/kernel/printk`"
126echo "0" > /proc/sys/kernel/printk
127
128echo -e ", ${BOLD}${GREEN}/sys${NORM}."
129mount -t sysfs sysfs /sys
1d7b9c8a
JB
130
131echo -e -n " ${BOLD}${BLUE}*${NORM} Populating /dev via mdev... "
132mdev -s
133checkReturn
2cbc0e64 134echo -e -n " ${BOLD}${BLUE}*${NORM} Registering mdev as hotplug agent... "
be3fa5e6 135echo "/bin/mdev" > /proc/sys/kernel/hotplug
1d7b9c8a
JB
136checkReturn
137
4357bb11
JB
138if [ -d /lib/modules ]
139then
140 echo -e -n " ${BOLD}${BLUE}*${NORM} Loading modules... "
141 # TODO
142else
143 echo -e " ${BOLD}${YELLOW}*${NORM} No modules were found in the initial RAM filesystem."
144fi
be3fa5e6 145
55f11ffe
JB
146grep -q "devicetimeout=*" /proc/cmdline
147if [ $? -eq 0 ]
148then
149 for opt in `cat /proc/cmdline`
150 do
151 echo "$opt" | grep -q "devicetimeout="
152 if [ $? -eq 0 ]
153 then
154 DEVTIMEOUT=`echo $opt | cut -d'=' -f2`
155 fi
156 done
157else
158 DEVTIMEOUT=10
159fi
160echo -e " ${BOLD}${BLUE}*${NORM} Waiting $DEVTIMEOUT seconds for devices to settle..."
161sleep $DEVTIMEOUT
162
163# if root=/dev/XXX was specified on the command line, use that as the new root
2cbc0e64
JB
164# instead of searching for the media and using it. if it fails, fall back to
165# the media
55f11ffe
JB
166grep -q "root=/dev/*" /proc/cmdline
167if [ $? -eq 0 ]
168then
169 for opt in `cat /proc/cmdline`
170 do
171 echo "$opt" | grep -q "root="
172 if [ $? -eq 0 ]
173 then
174 ROOTDEV=`echo $opt | cut -d'=' -f2`
175 fi
176 done
177 mkdir -p /newroot
178 # check the specified root device to see if it has an init
179 mount $ROOTDEV /newroot
180 if [ $? -ne 0 ]
181 then
182 echo -e " ${BOLD}${RED}*${NORM} Unable to mount the specified root device! Falling back to the live media."
183 find_and_mount_media
184 else
185 if [ -x /newroot/sbin/init ]
186 then
187 echo -e " ${BOLD}${BLUE}*${NORM} Mounted root device $ROOTDEV."
188 else
189 echo -e " ${BOLD}${RED}*${NORM} The specified root device ($ROOTDEV) does not appear to be usable! Falling back to the live media."
190 umount /newroot
191 find_and_mount_media
192 fi
193 fi
194else
195 find_and_mount_media
196fi
197
2cbc0e64 198echo -e " ${BOLD}${BLUE}*${NORM} Switching root.\n"
55f11ffe
JB
199echo "$PRINTK" > /proc/sys/kernel/printk
200echo > /proc/sys/kernel/hotplug
201umount /sys
202umount /proc
203exec /bin/switch_root /newroot /sbin/init
204
205echo "Something's broken, here's a shell."
206exec /bin/sh
be3fa5e6
JB
207
208# End of file