1 #!/bin/sh
2
3 #
4 # initramfs /init (busybox ash)
5 #
6
7 # color codes and some predefined texts
8 BOLD="\033[1m"
9 NORM="\033[0m"
10 RED="\033[31m"
11 GREEN="\033[32m"
12 YELLOW="\033[33m"
13 BLUE="\033[34m"
14 OK="${BOLD}${GREEN}OK${NORM}"
15 FAILED="${BOLD}${RED}FAILED${NORM}"
16 DONE="${BOLD}${GREEN}DONE${NORM}"
17
18 # helper functions
19
20 # check an exit value and print a colored status
21 checkReturn() {
22 if [ $? -ne 0 ]
23 then
24 echo -e $FAILED
25 else
26 echo -e $OK
27 fi
28 }
29
30 # print a colored done status
31 echoDone() {
32 echo -e $DONE
33 }
34
35 # search for and mount the crux media, populate a tmpfs from it,
36 # and prepare /newroot for switch_root at the end of the script
37 find_and_mount_media() {
38 echo -e -n " ${BOLD}${BLUE}*${NORM} Creating and mounting tmpfs... "
39 mkdir /.tmpfs
40 mount -t tmpfs tmpfs /.tmpfs
41 checkReturn
42
43 grep -q "prefix=*" /proc/cmdline
44 if [ $? -eq 0 ]
45 then
46 for opt in `cat /proc/cmdline`
47 do
48 echo $opt | grep -q "prefix="
49 if [ $? -eq 0 ]
50 then
51 PREFIX=`echo $opt | cut -d= -f2`
52 fi
53 done
54 fi
55 MEDIAMNT=/.tmpfs/.media
56
57 echo -e " ${BOLD}${BLUE}*${NORM} Searching for the CRUX media..."
58 mkdir -p ${MEDIAMNT}
59 CRUXMEDIA=""
60 CDROM_DEVICES="`awk '/drive name:/ { for (i=3;i<=NF;i++) { printf("%s ", $i) } }' /proc/sys/dev/cdrom/info`"
61 BLOCK_DEVICES="`grep -E '[sh]d' /proc/partitions | awk '{ print $4 }'`"
62 for DEV in $CDROM_DEVICES $BLOCK_DEVICES
63 do
64 DEV="/dev/$DEV"
65 mount -r $DEV ${MEDIAMNT} 2> /dev/null
66 if [ $? -eq 0 ]
67 then
68 echo -e -n " ${BOLD}${GREEN}*${NORM} Found media on $DEV"
69 if [ -e ${MEDIAMNT}/${PREFIX}/crux-media ]
70 then
71 echo ", CRUX media."
72 CRUXMEDIA=$DEV
73 break
74 else
75 echo ", but it's not the CRUX media."
76 umount ${MEDIAMNT}
77 fi
78 else
79 echo -e " ${BOLD}${YELLOW}*${NORM} No media found on $DEV."
80 fi
81 done
82
83 # check if the media was mounted properly. if not, spawn a shell
84 if [ ! -e ${MEDIAMNT}/${PREFIX}/crux-media ]
85 then
86 echo -e " ${BOLD}${RED}*${NORM} The CRUX media was not properly mounted!"
87 echo " Spawning a shell for you to attempt to fix this problem. If"
88 echo " you are able to find the correct device, mount it at"
89 echo " ${MEDIAMNT} and then log out of this shell to continue."
90 echo " If you are NOT able to fix the problem, installation will"
91 echo " not be possible."
92 echo
93 /bin/sh
94 fi
95
96 # check again and stop if it's still not there
97 if [ ! -e ${MEDIAMNT}/${PREFIX}/crux-media ]
98 then
99 echo -e " ${BOLD}${RED}*${NORM} The CRUX media still appears not to be"
100 echo " found and installation will not continue."
101 echo
102 sleep 99999
103 exit 1
104 fi
105
106 echo -e " ${BOLD}${BLUE}*${NORM} Populating root filesystem..."
107 mkdir -p /newroot
108 echo -e -n " ${BOLD}${BLUE}*${NORM} Mounting new root filesystem... "
109 mount -t tmpfs tmpfs /newroot
110 checkReturn
111 echo -e -n " ${BOLD}${BLUE}*${NORM} Copying files from rootfs.tar.xz... "
112 tar -xpf ${MEDIAMNT}/${PREFIX}/rootfs.tar.xz -C /newroot
113 checkReturn
114 echo -e -n " ${BOLD}${BLUE}*${NORM} Copying devices from rootfs... "
115 cp -af /dev/* /newroot/dev/
116 checkReturn
117 mkdir -p /newroot/dev/pts /newroot/media
118
119 # the media gets unmounted here and remounted after switch_root
120 umount ${MEDIAMNT}
121 rmdir ${MEDIAMNT}
122 sed -i -e "s,#CRUXMEDIA#,${CRUXMEDIA}," /newroot/etc/fstab
123
124 echo -e -n " ${BOLD}${BLUE}*${NORM} Unmounting tmpfs... "
125 umount /.tmpfs
126 checkReturn
127 rmdir /.tmpfs
128 }
129
130 /bin/busybox --install -s /bin
131
132 # main script
133 echo ""
134 echo -e "${BOLD}CRUX 2.8 - ${BLUE}http://crux.nu/${NORM}"
135 echo ""
136
137 exec >/dev/console </dev/console 2>&1
138
139 echo -e -n " ${BOLD}${BLUE}*${NORM} Mounting "
140 echo -e -n "${BOLD}${GREEN}/proc${NORM}"
141 mount -t proc proc /proc
142
143 PRINTK="`cat /proc/sys/kernel/printk`"
144 echo "0" > /proc/sys/kernel/printk
145
146 echo -e ", ${BOLD}${GREEN}/sys${NORM}."
147 mount -t sysfs sysfs /sys
148
149 grep -q "debug" /proc/cmdline
150 if [ $? -eq 0 ]
151 then
152 DEBUG=1
153 fi
154
155 echo -e -n " ${BOLD}${BLUE}*${NORM} Populating /dev via mdev... "
156 mdev -s
157 checkReturn
158 echo -e -n " ${BOLD}${BLUE}*${NORM} Registering mdev as hotplug agent... "
159 echo "/bin/mdev" > /proc/sys/kernel/hotplug
160 checkReturn
161
162 if [ -d /lib/modules ]
163 then
164 echo -e -n " ${BOLD}${BLUE}*${NORM} Loading modules... "
165
166 # filesystem
167 load_fs_modules() {
168 # no notification for fs modules since they're generic
169 #echo -e -n "${BOLD}${BLUE}File Systems${NORM}"
170 for mod in isofs ext2 ext3 ext4 reiserfs xfs jfs vfat msdos \
171 crc32c libcrc32c btrfs
172 do
173 if [ ! -z "$DEBUG" ]
174 then
175 echo -n " $mod"
176 fi
177 modprobe $mod
178 done
179 #echo -n ", "
180 }
181
182 # cdrom
183 load_cdrom_modules() {
184 # no notification for cdrom modules since they're generic
185 #echo -e -n "${BOLD}${BLUE}CDROM${NORM}"
186 # there's only one cdrom module for now but the loop allows for adding
187 # more if ever needed
188 for mod in cdrom
189 do
190 if [ ! -z "$DEBUG" ]
191 then
192 echo -n " $mod"
193 fi
194 modprobe $mod
195 done
196 #echo -n ", "
197 }
198
199 # SCSI
200 load_scsi_modules() {
201 echo -e -n "${BOLD}${BLUE}SCSI${NORM}"
202 for mod in scsi_mod sr_mod sd_mod scsi_transport_fc scsi_transport_iscsi \
203 scsi_transport_sas scsi_transport_spi 3w-9xxx 3w-xxxx 53c700 BusLogic \
204 NCR53c406a a100u2w aacraid advansys aha152x aha1542 aha1740 aic79xx \
205 aic7xxx aic94xx arcmsr atp870u dc395x dmx3191d dpt_i2o dtc eata fdomain \
206 gdth hptiop in2000 initio ipr ips lpfc megaraid megaraid_mbox megaraid_sas \
207 nsp32 pas16 psi240i qla1280 qla2xxx qla4xxx qlogicfas qlogicfas408 seagate \
208 sim710 stex sym53c416 sym53c8xx t128 tmscsim u14-34f ultrastor \
209 wd7000 mptsas mptspi hpsa
210 do
211 if [ ! -z "$DEBUG" ]
212 then
213 echo -n " $mod"
214 fi
215 modprobe $mod > /dev/null 2>&1
216 done
217 echo -n ", "
218 }
219
220 # USB
221 load_usb_modules() {
222 echo -e -n "${BOLD}${BLUE}USB${NORM}"
223 for mod in ehci-hcd ohci-hcd uhci-hcd usb-storage usbhid
224 do
225 if [ ! -z "$DEBUG" ]
226 then
227 echo -n " $mod"
228 fi
229 modprobe $mod
230 done
231 echo -n ", "
232 }
233
234 # ATA
235 load_ata_modules() {
236 echo -e -n "${BOLD}${BLUE}ATA${NORM}"
237 for mod in libata libahci ahci sata_promise sata_sil sata_svw sata_via \
238 sata_mv sata_nv sata_sil24 sata_sx4 sata_sis sata_uli \
239 sata_vsc sata_qstor sata_inic162x ata_piix pata_mpiix \
240 pata_pdc2027x pata_radisys pata_sil680 pata_rz1000 pata_cmd640 \
241 pata_efar pata_cmd64x pata_hpt366 pata_hpt37x pata_hpt3x3 \
242 pata_opti pata_optidma pata_it8213 pata_ninja32 pata_it821x \
243 pata_artop pata_cypress pata_serverworks pata_ns87410 \
244 pata_ns87415 pata_ali pata_amd pdc_adma ata_generic \
245 pata_atiixp pata_triflex pata_sc1200 \
246 pata_netcell pata_sch pata_sis pata_hpt3x2n pata_marvell \
247 pata_jmicron pata_via pata_cs5520 pata_cs5530 pata_cs5535 \
248 pata_cs5536 pata_sl82c105
249 do
250 if [ ! -z "$DEBUG" ]
251 then
252 echo -n " $mod"
253 fi
254 modprobe $mod
255 done
256 echo -n ", "
257 }
258
259 # FireWire
260 load_firewire_modules() {
261 echo -e -n "${BOLD}${BLUE}FireWire${NORM}"
262 for mod in core ohci sbp2
263 do
264 if [ ! -z "$DEBUG" ]
265 then
266 echo -n " $mod"
267 fi
268 modprobe firewire-$mod
269 done
270 echo -n ", "
271 }
272
273 MODORDER="fs cdrom ata scsi usb firewire"
274
275 for MODS in $MODORDER
276 do
277 grep -q "no$MODS" /proc/cmdline
278 [ $? -ne 0 ] && load_${MODS}_modules
279 done
280
281 echoDone
282 else
283 echo -e " ${BOLD}${YELLOW}*${NORM} No modules were found in the initial RAM filesystem."
284 fi
285
286 grep -q "devicetimeout=*" /proc/cmdline
287 if [ $? -eq 0 ]
288 then
289 for opt in `cat /proc/cmdline`
290 do
291 echo $opt | grep -q "devicetimeout"
292 if [ $? -eq 0 ]
293 then
294 DEVTIMEOUT=`echo $opt | cut -d= -f2`
295 fi
296 done
297 else
298 DEVTIMEOUT=10
299 fi
300 echo -e " ${BOLD}${BLUE}*${NORM} Waiting $DEVTIMEOUT seconds for devices to settle..."
301 sleep $DEVTIMEOUT
302
303 # if root=/dev/XXX was specified on the command line, use that as the new root
304 # instead of searching for the media and using it. if it fails, fall back to
305 # the media
306 grep -q "root=/dev/*" /proc/cmdline
307 if [ $? -eq 0 ]
308 then
309 #echo "root= was specified"
310 for opt in `cat /proc/cmdline`
311 do
312 echo "$opt" | grep -q root=
313 if [ $? -eq 0 ]
314 then
315 ROOTDEV=`echo $opt | cut -d= -f2`
316 fi
317 done
318 mkdir -p /newroot
319 # check the specified root device to see if it has an init
320 mount $ROOTDEV /newroot
321 if [ $? -ne 0 ]
322 then
323 echo -e " ${BOLD}${RED}*${NORM} Unable to mount the specified root device! Falling back to the live media."
324 find_and_mount_media
325 else
326 if [ -x /newroot/sbin/init ]
327 then
328 echo -e " ${BOLD}${BLUE}*${NORM} Mounted root device $ROOTDEV."
329 else
330 echo -e " ${BOLD}${RED}*${NORM} The specified root device ($ROOTDEV) does not appear to be usable! Falling back to the live media."
331 umount /newroot
332 find_and_mount_media
333 fi
334 fi
335 else
336 find_and_mount_media
337 fi
338
339 # copy busybox for debugging
340 if [ ! -z "${DEBUG}" ]
341 then
342 cp /bin/busybox /newroot/bin/
343 fi
344
345 echo -e " ${BOLD}${BLUE}*${NORM} Switching root.\n"
346 echo "$PRINTK" > /proc/sys/kernel/printk
347 echo > /proc/sys/kernel/hotplug
348 umount /sys
349 umount /proc
350 exec /bin/switch_root /newroot /sbin/init
351
352 echo "Something's broken, here's a shell."
353 exec /bin/sh
|