source: MondoRescue/branches/2.2.5/mindi/rootfs/sbin/init@ 1716

Last change on this file since 1716 was 1716, checked in by Bruno Cornec, 16 years ago

Adds udev support (mandatory for newest distributions to avoid remapping of devices in a different way as on the original system)

  • Property svn:keywords set to Id
File size: 17.2 KB
Line 
1#!/bin/sh
2#
3# $Id: init 1716 2007-10-28 01:03:30Z bruno $
4#
5# init script launched during the restore process
6#------------------------------------------------------------
7
8
9CaughtSoftReset() {
10 trap SIGTERM
11 reboot
12}
13
14
15ConfigureLoggingDaemons() {
16 echo -en "Running klogd..."
17 klogd -c 2 > /dev/null 2> /dev/null
18 echo -en "Done.\nRunning syslogd..."
19 syslogd > /dev/null 2> /dev/null
20 echo "Done."
21 LogIt "klogd and syslogd have been started."
22}
23
24
25
26CopyBootDevEntry() {
27 local outfile devfile
28 devfile=/dev/boot_device
29 outfile=`cat /BOOTLOADER.DEVICE 2> /dev/null`
30 [ ! "$outfile" ] && return 0
31 echo -en "Copying boot device to $outfile..."
32 if [ -e "$outfile" ] ; then
33 echo "OK."
34 return 0
35 fi
36 mkdir -p $outfile
37 rmdir $outfile
38 cp -pRdf $devfile $outfile
39 if [ "$?" -ne "0" ] ; then
40 echo "Failed."
41 return 1
42 else
43 echo "OK."
44 return 0
45 fi
46}
47
48
49
50Die() {
51 LogIt "Fatal error! $1" 1
52 exit 1
53}
54
55
56
57ExtractDevTarballs() {
58 cd /
59 for fname in ataraid.tgz ida.tgz i2o.tgz rd.tgz raw.tgz cciss.tgz nst.tgz dm.tgz vc.tgz ; do
60 if [ ! -e "/$fname" ] ; then
61 LogIt "/$fname not found; cannot extract to /." 1
62 else
63 echo -en "\rExtracting /$fname... "
64 tar -zxf /$fname || LogIt "Error occurred while extracting /$fname"
65 fi
66 done
67 echo -en "\r"
68 LogIt "Extracted additional /dev entries OK. " 1
69}
70
71
72
73LaunchTerminals() {
74 openvt 2 /bin/sh
75 openvt 3 /bin/sh
76 openvt 4 /bin/sh
77 openvt 5 /bin/sh
78 openvt 6 /bin/sh
79 openvt 7 /bin/sh /sbin/wait-for-petris
80}
81
82
83LoadKeymap() {
84 local fname
85 fname=`cat /tmp/KEYMAP-LIVES-HERE 2> /dev/null`
86 [ "$fname" = "" ] && return
87 if which loadkeys > /dev/null 2> /dev/null ; then
88 loadkeys $fname
89# loadkmap != loadkeys
90# elif which loadkmap > /dev/null 2> /dev/null ; then
91# loadkmap < $fname
92 else
93 LogIt "Using default keyboard map." 1
94 fi
95}
96
97
98UntarTapeStuff() {
99 local old_pwd res
100 old_pwd=`pwd`
101 cd $GROOVY
102 [ "$1" != "" ] && tapedev=$1
103 [ ! "$tapedev" ] && tapedev=`grep media-dev /tmp/mondo-restore.cfg | tr -s ' ' ' ' | cut -d' ' -f2`
104# tar -zxf $tapedev
105 dd if=$tapedev bs=32k count=1024 | tar -zx
106 res=$?
107 if [ "$res" -eq "0" ] ; then
108 grep -v media-dev /tmp/mondo-restore.cfg > /tmp/mr.cfg
109 echo "media-dev $tapedev" >> /tmp/mr.cfg
110 cp -f /tmp/mr.cfg /tmp/mondo-restore.cfg
111 fi
112 cd $old_pwd
113 return $res
114}
115
116HandleTape() {
117 local res tapedev
118 tapedev="" ; # will be set by UntarTapeStuff()
119 cd $GROOVY
120 UntarTapeStuff $tapedev || UntarTapeStuff /dev/st0 || UntarTapeStuff /dev/osst0 || UntarTapeStuff /dev/ht0
121 res=$?
122 while [ "$res" -ne "0" ] ; do
123 LogIt "$tapedev failed to act as extended data disk for booting." 1
124 LogIt "Please specify an alternate tape device," 1
125 LogIt "or hit <Enter> to boot from CD/floppies." 1
126 echo -en "---> "
127 read tapedev
128 if [ "$tapedev" ] ; then
129 LogIt "User specified $tapedev instead"
130 UntarTapeStuff $tapedev
131 res=$?
132 else
133 LogIt "User opted not to specify an alternate tapedev"
134 res=1
135 break
136 fi
137 done
138
139 if [ "$res" -ne "0" ] ; then
140 cd /
141 LogIt "Failed to use tape as extended datadisk. Reverting to floppies." 1
142 HandleCDROMorFloppies
143 res=$?
144 else
145# clear
146 LogIt "Using tape as extended datadisk. Good." 3
147 echo "Using tape as extd ddisk." > /tmp/TAPEDEV-HAS-DATA-DISKS
148 res=0
149 CD_MOUNTED_OK=yes
150 fi
151 return $res
152}
153
154
155
156HandleCDROMorFloppies() {
157 find-and-mount-cdrom
158 res=$?
159 if [ "$res" -ne "0" ] ; then
160 LogIt "First call to find-and-mount-cdrom failed." 1
161 LogIt "Sleeping for 3 seconds and trying again." 1
162 sleep 3
163 find-and-mount-cdrom
164 res=$?
165 fi
166 if [ "$res" -eq "0" ] ; then
167 LogIt "OK, I am running on a CD-ROM. Good." 3
168 CD_MOUNTED_OK=yes
169 elif [ "$res" -eq "1" ] ; then
170 LogIt "OK, I am running on floppies. Good." 3
171 CD_MOUNTED_OK=""
172 else
173 LogIt "OK, I am falling back to floppy mode." 3
174 LogIt "That means you'll have to copy the data disk images from" 3
175 LogIt "the CD/hard disk/whatever to physical 1.44MB disks and" 3
176 LogIt "insert them, one after the other. Please see the manual." 3
177 LogIt "The images are in /images on the CD, or /root/images/mindi" 3
178 LogIt "on your hard disk. Your archives are probably fine but" 3
179 LogIt "your tape streamer and/or CD-ROM drive are eccentric. :-)" 3
180 CD_MOUNTED_OK=""
181 fi
182 return 0
183}
184
185
186HowMuchFreeSpaceOnRamdisk() {
187 df -m -P | grep /dev/ram | head -n1 | tr -s '\t' ' ' | cut -d' ' -f4
188}
189
190
191
192InsertEssentialModules() {
193# Load the VIA IDE module first thing if it exists (requires ide-core).
194# This is to ensure that DMA is working for VIA chipsets with 2.6 kernels.
195 for module in /ide-core.ko /via82cxxx.ko; do
196 [ -f "$module" ] && MyInsmod $module > /dev/null 2> /dev/null
197 done
198# Then load the remaining modules in normal (i.e. arbitrary) order.
199 for j in 1 2 3 4 5 ; do
200 for i in `ls /*.*o* 2> /dev/null` ; do
201 [ -f "$i" ] && MyInsmod $i > /dev/null 2> /dev/null
202 done
203 done
204}
205
206
207
208PauseForRaids() {
209 if [ "`dmesg | grep -i "RAID Controller"`" != "" ] || [ "`dmesg | grep -i "Vendor: 3ware"`" != "" ] ; then
210 LogIt "RAID controller(s) detected. Pausing 10 seconds to let them warm up." 1
211 echo -en "Pausing..."
212 for i in 1 2 3 4 5 6 7 8 9 10 ; do
213 sleep 1
214 echo -en "$(($i*10))%..."
215 done
216 echo "Done."
217 fi
218}
219
220
221# 06/13/2002 --- DuckX's & Hugo's new routine
222# 10/11/2003 --- added a simple devfsd.conf file
223# 01/24/2005 --- cater for arbitrary locations of devfsd.conf by using the
224# config file path compiled into devfsd
225RunDevfsd() {
226 loc=`which devfsd 2> /dev/null`
227 if [ "$loc" != "" ] ; then
228 LogIt "Devfs found. Testing kernel support..."
229 if [ ! -e "/dev/.devfsd" ] ; then
230 mount -t devfs devfs /dev 2>> $LOGFILE
231 if [ "$?" -ne "0" ] ; then
232 LogIt "Error while trying to mount devfs"
233 else
234 LogIt "Devfs mounted OK"
235 fi
236 fi
237 #check if the kernel supports devfs
238 if [ -e "/dev/.devfsd" ] ; then
239 [ -d "/proc/1" ] || mount -n /proc
240 LogIt "Kernel support found. Creating config file and starting devfsd"
241 conffile=`strings $loc | grep -E "devfsd.conf$"`
242 [ "$conffile" ] || conffile="/etc/devfsd.conf"
243 confpath=`echo $conffile | sed "s/\/devfsd\.conf$//"`
244 [ -d "$confpath" ] || mkdir -p $confpath
245 echo -en "REGISTER .* MKOLDCOMPAT\nUNREGISTER .* RMOLDCOMPAT\n" > $conffile
246 devfsd /dev &
247 sleep 5
248 else
249 LogIt "No devfs kernel support."
250 fi
251 fi
252}
253
254RunUdevd() {
255 # Inspiration from LFS docs
256 mkdir -p /lib/udev/devices &&
257 mknod -m0666 /lib/udev/devices/null c 1 3
258 ln -sf /proc/self/fd /lib/udev/devices/fd &&
259 ln -sf /proc/self/fd/0 /lib/udev/devices/stdin &&
260 ln -sf /proc/self/fd/1 /lib/udev/devices/stdout &&
261 ln -sf /proc/self/fd/2 /lib/udev/devices/stderr &&
262 ln -sf /proc/kcore /lib/udev/devices/core &&
263 mkdir -p /lib/udev/devices/{pts,shm}
264 cp -R /lib/udev/devices/* /dev
265 udevd --daemon
266}
267
268
269
270
271
272
273#RunDevfsd() {
274# loc=`which devfsd 2> /dev/null`
275# if [ "$loc" != "" ] ; then
276# LogIt "Starting devfsd"
277# devfsd /dev &
278# sleep 5
279# fi
280#}
281
282
283
284SpaceTests() {
285 [ -e "/tmp/filelist.full" ] && cp /tmp/filelist.full /tmp/FLF
286 if [ "`HowMuchFreeSpaceOnRamdisk`" -le "3" ] ; then
287 LogIt "Ramdisk is a bit smaller than I would like." 1
288 LogIt "Please re-run Mondo/Mindi but edit /usr/local/mindi first" 1
289 LogIt "and set EXTRA_SPACE to something high, e.g. 8000" 1
290 Die "Aborting. Please reboot."
291 fi
292 rm -f /tmp/FLF
293}
294
295
296
297StartLvms() {
298 if [ -e "/tmp/i-want-my-lvm" ] ; then
299 LogIt "Scanning LVM's..." 1
300 if which lvm ; then
301 MyInsmod dm-mod
302 MyInsmod dm_mod
303 lvm vgscan --mknodes
304 else
305 vgscan
306 fi
307 grep -E "^#.*vgchange" /tmp/i-want-my-lvm | sed "s/^#[ ]*//" > /tmp/start-lvm
308 chmod +x /tmp/start-lvm
309 echo -en "Starting LVM's..."
310 /tmp/start-lvm &
311 for i in 1 2 3 4 5 ; do
312 echo -en "."
313 sleep 1
314 done
315 echo "Done."
316 fi
317# If necessary, cannibalize 'analyze-my-lvm'; copy some of its code here,
318# pipe vgscan's output, strip it, run 'vgchange' on its output, etc.etc.
319 LogIt "LVM's have been started."
320}
321
322
323StartRaids() {
324 local raid_devices i
325
326 raid_devices=`grep /dev/md /tmp/mountlist.txt | cut -d' ' -f1`
327 if which raidstart > /dev/null 2> /dev/null ; then
328 for i in $raid_devices ; do
329 if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
330 LogIt "$i is started already; no need to run 'raidstart $i'" 1
331 else
332 LogIt "Running 'raidstart $i'" 1
333 raidstart $i
334 fi
335 done
336 elif which mdrun > /dev/null 2> /dev/null ; then
337 LogIt "Running 'mdrun'" 1
338 mdrun
339 elif which mdadm > /dev/null 2> /dev/null ; then
340 LogIt "Running 'mdadm'" 1
341 for i in $raid_devices ; do
342 if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
343 LogIt "$i is started already; no need to run 'mdadm $i'" 1
344 else
345 if [ -f /etc/mdadm.conf ] ; then
346 LogIt "Running 'mdadm $i' with user supplied /etc/mdadm.conf" 1
347 mdadm -A $i -c /etc/mdadm.conf
348 elif [ -f /etc/mdadm/mdadm.conf ] ; then
349 LogIt "Running 'mdadm $i' with user supplied /etc/mdadm/mdadm.conf" 1
350 mdadm -A $i -c /etc/mdadm/mdadm.conf
351 else
352 LogIt "Running 'mdadm $i'" 1
353 mdadm -Ac partitions -m dev $i
354 fi
355 fi
356 done
357 else
358 LogIt "Warning: Neither 'raidstart' nor 'mdrun''found. RAID devices may not have started." 1
359 fi
360
361}
362
363
364TryAgainToFindCD() {
365 local res
366 mount | grep /mnt/cdrom && return 0
367 [ "`grep "backup_media_type" /tmp/mondo-restore.cfg | grep "cdstream"`" ] && return
368 LogIt "Trying to mount CD-ROM a 2nd time..."
369 find-and-mount-cdrom --second-try
370 res=$?
371 if [ "$res" -eq "0" ] ; then
372 CD_MOUNTED_OK=yes
373 LogIt "CD-ROM drive mounted successfully." 1
374 else
375 LogIt "I still cannot find or mount the CD-ROM drive, by the way."
376 fi
377}
378
379
380
381UseTmpfs()
382{
383 local mount_cmd
384 echo -en "Mounting /tmp/tmpfs..."
385 mkdir -p /tmp/tmpfs
386# For technical reasons, some sets are as large as 16MB.
387# I am allowing 32MB because selective restore occupies a lot of space.
388 for size in 64m 48m 40m 32m ; do
389 mount_cmd="mount /dev/shm -t tmpfs -o size=$size" ; # was 34m until 04/2003
390 LogIt "Trying '$mount_cmd'"
391 $mount_cmd /tmp/tmpfs 2>> $LOGFILE
392 res=$?
393 [ "$res" -eq "0" ] && break
394 done
395 if [ "$res" -ne "0" ] ; then
396 LogIt "Failed. I could not run '$mount_cmd /tmp/tmpfs'. Your kernel is BROKEN or you do not have enough RAM." 1
397 umount /tmp/tmpfs > /dev/null 2> /dev/null
398 rmdir /tmp/tmpfs
399 ln -sf /mnt/RESTORING/tmp /tmp/tmpfs; # used by mondo-restore
400 LogIt "Failed to mount /tmp/tmpfs; using ugly softlink instead"
401 else
402 LogIt "Great. Pivot succeeded w/ size=$size" 1
403 echo -en "Pivoting /tmp..."
404 umount /tmp/tmpfs
405 mkdir -p /tmp.old
406 mv -f /tmp/* /tmp.old/
407 $mount_cmd /tmp
408 mv /tmp.old/* /tmp/
409 rmdir /tmp.old
410 mkdir -p /tmp/tmpfs
411 mkdir -p $GROOVY
412 echo "Done."
413 LogIt "Successfully mounted dynamic /tmp ramdisk"
414# mkdir -p /tmp/tmpfs/var
415# mv -f /var/log /tmp/tmpfs/var/log
416# ln -sf /tmp/tmpfs/var/log /var/log
417 fi
418}
419
420
421WelcomeMessage()
422{
423 echo "********************************************************************"
424 echo "MINDI-LINUX by Mondo Dev Team - web site: http://www.mondorescue.org"
425 echo "Boot disk based on AlfaLinux & Trinux. BusyBox by Erik Andersen."
426which petris > /dev/null 2> /dev/null && echo "Petris was written by Peter Seidler <p.seidler@mail1.stofanet.dk>."
427 echo "Executables and source code are covered by the GNU GPL. No warranty."
428 echo "running on $ARCH"
429 echo "********************************************************************"
430}
431
432
433EnableCcissIfAppropriate() {
434 local i fname
435 for i in 0 1 2 3 ; do
436 fname="/proc/driver/cciss/cciss$i"
437 if [ -e "$fname" ] ; then
438 LogIt "Engaging $fname"
439 echo "engage scsi" > $fname
440 LogIt "...result=$?"
441 fi
442 done
443}
444
445
446ExtractDataDisksAndLoadModules() {
447 echo "Installing additional tools ..."
448 install-additional-tools
449 echo "Inserting modules ..."
450 insert-all-my-modules >> $LOGFILE 2>> $LOGFILE
451}
452
453# ------------------------ main -----------------------
454
455MINDI_VER=PBVER
456MINDI_REV=PBREV
457trap CaughtSoftReset SIGTERM
458LOGFILE=/var/log/mondorestore.log
459PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
460GROOVY=/tmp/groovy-stuff
461USER=root
462export PATH GROOVY USER LOGFILE
463
464echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV})"
465
466mount -o remount rw /
467[ ! "$GROOVY" ] && Die "I'm not groovy!"
468for i in $GROOVY /mnt/floppy /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
469 mkdir -p $i
470done
471#/bin/update
472mount /proc/ /proc -v -t proc
473mkdir /sys 2> /dev/null
474mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
475rm -f /foozero
476
477echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
478
479if [ -e "/tmp/USE-UDEV" ] ; then
480 RunUdevfsd
481fi
482echo "Starting potential Raid/LVMs ..."
483ExtractDevTarballs
484LaunchTerminals
485InsertEssentialModules
486EnableCcissIfAppropriate
487#-------------------------------
488#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
489#-------------------------------
490UseTmpfs
491if [ ! -e "/tmp/mondo-restore.cfg" ] ; then
492 LogIt "Warning - /tmp/mondo-restore.cfg not found"
493fi
494
495if [ "`grep -i 'tape ' /tmp/mondo-restore.cfg`" ] || [ "`grep -i udev /tmp/mondo-restore.cfg`" ]; then
496 HandleTape
497 ExtractDataDisksAndLoadModules
498elif [ "`grep -i pxe /proc/cmdline`" ]; then
499 # We need to get here exported variables from start-nfs
500 . /sbin/start-nfs
501
502 # Simulate a local CD
503 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
504 CD_MOUNTED_OK=yes
505 ExtractDataDisksAndLoadModules
506elif [ "`grep -i usb= /proc/cmdline`" ] || [ "`grep -i usb /tmp/mondo-restore.cfg | grep media-type`" ]; then
507 # We need to get here exported variables from start-nfs
508 . /sbin/start-usb
509
510 # Simulate a local CD
511 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
512 CD_MOUNTED_OK=yes
513 ExtractDataDisksAndLoadModules
514else
515 HandleCDROMorFloppies
516 ExtractDataDisksAndLoadModules
517 # We need to get here exported variables from start-nfs
518 . /sbin/start-nfs
519fi
520res=$?
521ConfigureLoggingDaemons
522if [ -e "/tmp/USE-DEVFS" ] ; then
523 umount /mnt/cdrom 2> /dev/null
524 mv /dev/cdrom /cdrom.lnk 2> /dev/null
525 CD_MOUNTED_OK=""
526 RunDevfsd
527fi
528echo "Starting potential Raid/LVMs ..."
529PauseForRaids
530StartRaids
531StartLvms
532CopyBootDevEntry
533LoadKeymap
534mkdir -p /tmp/tmpfs
535sleep 2
536#clear
537if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ /tmp/mountlist.txt`" != "" ] ; then
538 LogIt "Creating /dev/md/* softlinks just in case." 1
539 mkdir -p /dev/md
540 cp -af /dev/md0 /dev/md/0 2> /dev/null
541 cp -af /dev/md1 /dev/md/1 2> /dev/null
542 cp -af /dev/md2 /dev/md/2 2> /dev/null
543fi
544export ARCH=`uname -m`
545WelcomeMessage
546# SpaceTests; # Mandrake Linux 8.1 doesn't like this
547[ -e "/tmp/mountlist.txt" ] && cp -f /tmp/mountlist.txt /tmp/mountlist.original
548
549if ! [ "`grep -i "pxe" /proc/cmdline`" ] ; then
550 res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
551 [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
552 [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
553 [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
554 #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
555fi
556hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
557openvt 8 /usr/bin/tail -f $LOGFILE
558
559# Log some useful info
560LogIt "init (from mindi v$MINDI_VER-r${MINDI_REV}"
561LogIt "/proc/cmdline is:"
562cat /proc/cmdline >> $LOGFILE
563LogIt "df result:"
564LogIt "----------"
565df >> $LOGFILE
566LogIt "-------------"
567LogIt "mount result:"
568LogIt "-------------"
569mount >> $LOGFILE
570LogIt "-------------"
571LogIt "lsmod result:"
572LogIt "-------------"
573lsmod >> $LOGFILE
574LogIt "-------------"
575LogIt "dmesg result:"
576LogIt "-------------"
577dmesg >> $LOGFILE
578
579#-------------------------------
580#ABSORBENTANDYELLOWANDPOROUSISHE#;# --- don't touch this either :)
581#-------------------------------
582
583#ctrlaltdel soft
584for path in /usr.bin /usr/bin ; do
585 fname=$path/nano
586 [ -e "$fname" ] && ln -sf $fname /usr/bin/pico
587done
588res=`which nano 2> /dev/null`
589[ "$res" ] && ln -sf /usr/bin/
590for i in null stdout stdin stderr ; do
591 cp -af /dev/$i /tmp
592done
593if grep "backup-media-type" /tmp/mondo-restore.cfg > /dev/null 2> /dev/null ; then
594 LogIt "backup-media-type is specified in config file - great."
595 LogIt "Calling post-init $mountlist"
596 post-init
597else
598 LogIt "backup-media-type is not specified in config file."
599 LogIt "I think this CD/floppy has no archives on it."
600fi
601if grep "RESTORE" /proc/cmdline > /dev/null 2> /dev/null ; then
602 echo "Rebooting in 10 seconds automatically as per reboot order"
603 echo -en "Press ^C to interrupt if you have to ..."
604 for i in 1 2 3 4 5 6 7 8 9 10 ; do
605 sleep 1
606 echo -en "."
607 done
608 echo "Boom."
609 sleep 1
610else
611 echo -en "Type 'exit' to reboot the PC\n"
612 umount /mnt/cdrom 2> /dev/null
613 mount / -o rw,remount > /dev/null 2> /dev/null
614 LogIt "Launching Shell"
615 sh
616fi
617CaughtSoftReset
618# reboot
Note: See TracBrowser for help on using the repository browser.