source: MondoRescue/branches/stable/mindi/rootfs/sbin/init@ 1272

Last change on this file since 1272 was 1272, checked in by Bruno Cornec, 17 years ago

On CentOS 4.4 mdrun isn't available anymore so init should use mdadm instead.
(based on a patch of Momtchil Momtchev <momtchil.momtchev_at_linagora.com>)

  • Property svn:keywords set to Id
File size: 15.5 KB
Line 
1#!/bin/sh
2#
3# $Id: init 1272 2007-03-26 17:35:06Z 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 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=`grep keymap-lives-here /tmp/mondo-restore.cfg | cut -d'=' -f2 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 /var/cache/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
254
255
256
257
258
259#RunDevfsd() {
260# loc=`which devfsd 2> /dev/null`
261# if [ "$loc" != "" ] ; then
262# LogIt "Starting devfsd"
263# devfsd /dev &
264# sleep 5
265# fi
266#}
267
268
269
270SpaceTests() {
271 [ -e "/tmp/filelist.full" ] && cp /tmp/filelist.full /tmp/FLF
272 if [ "`HowMuchFreeSpaceOnRamdisk`" -le "3" ] ; then
273 LogIt "Ramdisk is a bit smaller than I would like." 1
274 LogIt "Please re-run Mondo/Mindi but edit mindi first" 1
275 LogIt "and set EXTRA_SPACE to something high, e.g. 8000" 1
276 Die "Aborting. Please reboot."
277 fi
278 rm -f /tmp/FLF
279}
280
281
282
283StartLvms() {
284 if [ -e "/tmp/i-want-my-lvm" ] ; then
285 LogIt "Scanning LVM's..." 1
286 if which lvm ; then
287 MyInsmod dm-mod
288 MyInsmod dm_mod
289 lvm vgscan --mknodes
290 else
291 vgscan
292 fi
293 grep -E "^#.*vgchange" /tmp/i-want-my-lvm | sed "s/^#[ ]*//" > /tmp/start-lvm
294 chmod +x /tmp/start-lvm
295 echo -en "Starting LVM's..."
296 /tmp/start-lvm &
297 for i in 1 2 3 4 5 ; do
298 echo -en "."
299 sleep 1
300 done
301 echo "Done."
302 fi
303# If necessary, cannibalize 'analyze-my-lvm'; copy some of its code here,
304# pipe vgscan's output, strip it, run 'vgchange' on its output, etc.etc.
305 LogIt "LVM's have been started."
306}
307
308
309StartRaids() {
310 local raid_devices i
311
312 raid_devices=`grep /dev/md /tmp/mountlist.txt | cut -d' ' -f1`
313 if which raidstart > /dev/null 2> /dev/null ; then
314 for i in $raid_devices ; do
315 if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
316 LogIt "$i is started already; no need to run 'raidstart $i'" 1
317 else
318 LogIt "Running 'raidstart $i'" 1
319 raidstart $i
320 fi
321 done
322 elif which mdrun > /dev/null 2> /dev/null ; then
323 LogIt "Running 'mdrun'" 1
324 mdrun
325 elif which mdadm > /dev/null 2> /dev/null ; then
326 LogIt "Running 'mdadm'" 1
327 for i in $raid_devices ; do
328 if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
329 LogIt "$i is started already; no need to run 'mdadm $i'" 1
330 else
331 LogIt "Running 'mdadm $i'" 1
332 mdadm -Ac partitions -m dev $i
333 fi
334 done
335 else
336 LogIt "Warning: Neither 'raidstart' nor 'mdrun''found. RAID devices may not have started." 1
337 fi
338
339}
340
341
342TryAgainToFindCD() {
343 local res
344 mount | grep /mnt/cdrom && return 0
345 [ "`grep "backup_media_type" /tmp/mondo-restore.cfg | grep "cdstream"`" ] && return
346 LogIt "Trying to mount CD-ROM a 2nd time..."
347 find-and-mount-cdrom --second-try
348 res=$?
349 if [ "$res" -eq "0" ] ; then
350 CD_MOUNTED_OK=yes
351 LogIt "CD-ROM drive mounted successfully." 1
352 else
353 LogIt "I still cannot find or mount the CD-ROM drive, by the way."
354 fi
355}
356
357
358
359UseTmpfs()
360{
361 local mount_cmd
362 echo -en "Mounting /tmp/tmpfs..."
363 mkdir -p /tmp/tmpfs
364# For technical reasons, some sets are as large as 16MB.
365# I am allowing 32MB because selective restore occupies a lot of space.
366 for size in 64m 48m 40m 32m ; do
367 mount_cmd="mount /dev/shm -t tmpfs -o size=$size" ; # was 34m until 04/2003
368 LogIt "Trying '$mount_cmd'"
369 $mount_cmd /tmp/tmpfs 2>> /$LOGFILE
370 res=$?
371 [ "$res" -eq "0" ] && break
372 done
373 if [ "$res" -ne "0" ] ; then
374 LogIt "Failed. I could not run '$mount_cmd /tmp/tmpfs'. Your kernel is BROKEN or you do not have enough RAM." 1
375 umount /tmp/tmpfs > /dev/null 2> /dev/null
376 rmdir /tmp/tmpfs
377 ln -sf /mnt/RESTORING/tmp /tmp/tmpfs; # used by mondo-restore
378 LogIt "Failed to mount /tmp/tmpfs; using ugly softlink instead"
379 else
380 LogIt "Great. Pivot succeeded w/ size=$size" 1
381 echo -en "Pivoting /tmp..."
382 umount /tmp/tmpfs
383 mkdir -p /tmp.old
384 mv -f /tmp/* /tmp.old/
385 $mount_cmd /tmp
386 mv /tmp.old/* /tmp/
387 rmdir /tmp.old
388 mkdir -p /tmp/tmpfs
389 mkdir -p $GROOVY
390 echo "Done."
391 LogIt "Successfully mounted dynamic /tmp ramdisk"
392# mkdir -p /tmp/tmpfs/var
393# mv -f /var/log /tmp/tmpfs/var/log
394# ln -sf /tmp/tmpfs/var/log /var/log
395 fi
396}
397
398
399WelcomeMessage()
400{
401 echo "********************************************************************"
402 echo "MINDI-LINUX by Mondo Dev Team - web site: http://www.mondorescue.org"
403 echo "Boot disk based on AlfaLinux & Trinux. BusyBox by Erik Andersen."
404which petris > /dev/null 2> /dev/null && echo "Petris was written by Peter Seidler <p.seidler@mail1.stofanet.dk>."
405 echo "Executables and source code are covered by the GNU GPL. No warranty."
406 echo "running on $ARCH"
407 echo "********************************************************************"
408}
409
410
411EnableCcissIfAppropriate() {
412 local i fname
413 for i in 0 1 2 3 ; do
414 fname="/proc/driver/cciss/cciss$i"
415 if [ -e "$fname" ] ; then
416 LogIt "Engaging $fname"
417 echo "engage scsi" > $fname
418 LogIt "...result=$?"
419 fi
420 done
421}
422
423
424ExtractDataDisksAndLoadModules() {
425 echo "Installing additional tools ..."
426 install-additional-tools
427 echo "Inserting modules ..."
428 insert-all-my-modules > $LOGFILE 2> $LOGFILE
429}
430
431# ------------------------ main -----------------------
432
433MINDI_VER=VVV
434MINDI_REV=RRR
435trap CaughtSoftReset SIGTERM
436LOGFILE=/tmp/mondo-restore.log
437PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
438GROOVY=/tmp/groovy-stuff
439USER=root
440export PATH GROOVY USER
441
442echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV}"
443
444mount -o remount rw /
445[ ! "$GROOVY" ] && Die "I'm not groovy!"
446for i in $GROOVY /mnt/floppy /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
447 mkdir -p $i
448done
449#/bin/update
450mount /proc/ /proc -v -t proc
451mkdir /sys 2> /dev/null
452mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
453rm -f /foozero
454
455echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
456
457ExtractDevTarballs
458LaunchTerminals
459InsertEssentialModules
460EnableCcissIfAppropriate
461#-------------------------------
462#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
463#-------------------------------
464UseTmpfs
465if [ ! -e "/tmp/mondo-restore.cfg" ] ; then
466 LogIt "Warning - /tmp/mondo-restore.cfg not found"
467fi
468
469if [ "`grep -i 'tape ' /tmp/mondo-restore.cfg`" ] || [ "`grep -i udev /tmp/mondo-restore.cfg`" ] ; then
470 HandleTape
471 ExtractDataDisksAndLoadModules
472elif [ "`grep -i pxe /proc/cmdline`" ]; then
473 # We need to get here exported variables from start-nfs
474 . /sbin/start-nfs
475
476 # Simulate a local CD
477 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
478 CD_MOUNTED_OK=yes
479 ExtractDataDisksAndLoadModules
480else
481 HandleCDROMorFloppies
482 ExtractDataDisksAndLoadModules
483 # We need to get here exported variables from start-nfs
484 . /sbin/start-nfs
485fi
486res=$?
487ConfigureLoggingDaemons
488if [ -e "/tmp/USE-DEVFS" ] ; then
489 umount /mnt/cdrom 2> /dev/null
490 mv /dev/cdrom /cdrom.lnk 2> /dev/null
491 CD_MOUNTED_OK=""
492 RunDevfsd
493fi
494echo "Starting potential Raid/LVMs ..."
495PauseForRaids
496StartRaids
497StartLvms
498CopyBootDevEntry
499LoadKeymap
500mkdir -p /tmp/tmpfs
501sleep 2
502#clear
503if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ /tmp/mountlist.txt`" != "" ] ; then
504 LogIt "Creating /dev/md/* softlinks just in case." 1
505 mkdir -p /dev/md
506 cp -af /dev/md0 /dev/md/0 2> /dev/null
507 cp -af /dev/md1 /dev/md/1 2> /dev/null
508 cp -af /dev/md2 /dev/md/2 2> /dev/null
509fi
510export ARCH=`uname -m`
511WelcomeMessage
512# SpaceTests; # Mandrake Linux 8.1 doesn't like this
513[ -e "/tmp/mountlist.txt" ] && cp -f /tmp/mountlist.txt /tmp/mountlist.original
514
515if ! [ "`grep -i "pxe" /proc/cmdline`" ] ; then
516 res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
517 [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
518 [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
519 [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
520 #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
521fi
522hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
523openvt 8 /usr/bin/tail -f $LOGFILE
524
525#-------------------------------
526#ABSORBENTANDYELLOWANDPOROUSISHE#;# --- don't touch this either :)
527#-------------------------------
528
529lsmod > /tmp/ramdisk-lsmod.txt 2> /dev/null
530cut -d' ' -f1 /tmp/original-lsmod.txt /tmp/original-lsmod.txt /tmp/ramdisk-lsmod.txt | sort | uniq -d > /tmp/missing-modules.txt
531echo "Warning - these modules did not make it onto the ramdisk" >> $LOGFILE
532cat /tmp/missing-modules.txt >> $LOGFILE
533
534#ctrlaltdel soft
535for path in /usr.bin /usr/bin ; do
536 fname=$path/nano
537 [ -e "$fname" ] && ln -sf $fname /usr/bin/pico
538done
539res=`which nano 2> /dev/null`
540[ "$res" ] && ln -sf /usr/bin/
541for i in null stdout stdin stderr ; do
542 cp -af /dev/$i /tmp
543done
544if grep "backup-media-type" /tmp/mondo-restore.cfg > /dev/null 2> /dev/null ; then
545 LogIt "backup-media-type is specified in config file - great."
546 LogIt "Calling post-init $mountlist"
547 post-init
548else
549 LogIt "backup-media-type is not specified in config file."
550 LogIt "I think this CD/floppy has no archives on it."
551fi
552echo -en "Type 'exit' to reboot the PC\n"
553umount /mnt/cdrom 2> /dev/null
554mount / -o rw,remount > /dev/null 2> /dev/null
555sh
556CaughtSoftReset
557# reboot
Note: See TracBrowser for help on using the repository browser.