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

Last change on this file since 859 was 859, checked in by Bruno Cornec, 18 years ago

remove a partial patch for x86_64: ldconfig is not needed. What is missing are the library files (symlinks). So rewrite of ProcessLDD.
deplost.txt updated accordingly.
LocateFile in mindi has been replaced by readlink for all the usages linked to symlinks.

  • Property svn:keywords set to Id
File size: 15.2 KB
Line 
1#!/bin/sh
2#
3# $Id: init 859 2006-09-29 21:52:57Z 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=`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# clear
168 LogIt "OK, I am running on a CD-ROM. Good." 3
169 CD_MOUNTED_OK=yes
170 elif [ "$res" -eq "1" ] ; then
171# clear
172 LogIt "OK, I am running on floppies. Good." 3
173 CD_MOUNTED_OK=""
174 else
175 LogIt "OK, I am falling back to floppy mode." 3
176 LogIt "That means you'll have to copy the data disk images from" 3
177 LogIt "the CD/hard disk/whatever to physical 1.44MB disks and" 3
178 LogIt "insert them, one after the other. Please see the manual." 3
179 LogIt "The images are in /images on the CD, or /root/images/mindi" 3
180 LogIt "on your hard disk. Your archives are probably fine but" 3
181 LogIt "your tape streamer and/or CD-ROM drive are eccentric. :-)" 3
182 CD_MOUNTED_OK=""
183 fi
184 return 0
185}
186
187
188HowMuchFreeSpaceOnRamdisk() {
189 df -m -P | grep /dev/ram | head -n1 | tr -s '\t' ' ' | cut -d' ' -f4
190}
191
192
193
194InsertEssentialModules() {
195# Load the VIA IDE module first thing if it exists (requires ide-core).
196# This is to ensure that DMA is working for VIA chipsets with 2.6 kernels.
197 for module in /ide-core.ko /via82cxxx.ko; do
198 [ -f "$module" ] && MyInsmod $module > /dev/null 2> /dev/null
199 done
200# Then load the remaining modules in normal (i.e. arbitrary) order.
201 for j in 1 2 3 4 5 ; do
202 for i in `ls /*.*o* 2> /dev/null` ; do
203 [ -f "$i" ] && MyInsmod $i > /dev/null 2> /dev/null
204 done
205 done
206}
207
208
209
210PauseForRaids() {
211 if [ "`dmesg | grep -i "RAID Controller"`" != "" ] || [ "`dmesg | grep -i "Vendor: 3ware"`" != "" ] ; then
212 LogIt "RAID controller(s) detected. Pausing 10 seconds to let them warm up." 1
213 echo -en "Pausing..."
214 for i in 1 2 3 4 5 6 7 8 9 10 ; do
215 sleep 1
216 echo -en "$(($i*10))%..."
217 done
218 echo "Done."
219 fi
220}
221
222
223# 06/13/2002 --- DuckX's & Hugo's new routine
224# 10/11/2003 --- added a simple devfsd.conf file
225# 01/24/2005 --- cater for arbitrary locations of devfsd.conf by using the
226# config file path compiled into devfsd
227RunDevfsd() {
228 loc=`which devfsd 2> /dev/null`
229 if [ "$loc" != "" ] ; then
230 LogIt "Devfs found. Testing kernel support..."
231 if [ ! -e "/dev/.devfsd" ] ; then
232 mount -t devfs devfs /dev 2>> $LOGFILE
233 if [ "$?" -ne "0" ] ; then
234 LogIt "Error while trying to mount devfs"
235 else
236 LogIt "Devfs mounted OK"
237 fi
238 fi
239 #check if the kernel supports devfs
240 if [ -e "/dev/.devfsd" ] ; then
241 [ -d "/proc/1" ] || mount -n /proc
242 LogIt "Kernel support found. Creating config file and starting devfsd"
243 conffile=`strings $loc | grep "devfsd.conf$"`
244 [ "$conffile" ] || conffile="/etc/devfsd.conf"
245 confpath=`echo $conffile | sed "s/\/devfsd\.conf$//"`
246 [ -d "$confpath" ] || mkdir -p $confpath
247 echo -en "REGISTER .* MKOLDCOMPAT\nUNREGISTER .* RMOLDCOMPAT\n" > $conffile
248 devfsd /dev &
249 sleep 5
250 else
251 LogIt "No devfs kernel support."
252 fi
253 fi
254}
255
256
257
258
259
260
261#RunDevfsd() {
262# loc=`which devfsd 2> /dev/null`
263# if [ "$loc" != "" ] ; then
264# LogIt "Starting devfsd"
265# devfsd /dev &
266# sleep 5
267# fi
268#}
269
270
271
272SpaceTests() {
273 [ -e "/tmp/filelist.full" ] && cp /tmp/filelist.full /tmp/FLF
274 if [ "`HowMuchFreeSpaceOnRamdisk`" -le "3" ] ; then
275 LogIt "Ramdisk is a bit smaller than I would like." 1
276 LogIt "Please re-run Mondo/Mindi but edit /usr/local/mindi first" 1
277 LogIt "and set EXTRA_SPACE to something high, e.g. 8000" 1
278 Die "Aborting. Please reboot."
279 fi
280 rm -f /tmp/FLF
281}
282
283
284
285StartLvms() {
286 if [ -e "/tmp/i-want-my-lvm" ] ; then
287 LogIt "Scanning LVM's..." 1
288 if which lvm ; then
289 MyInsmod dm-mod
290 MyInsmod dm_mod
291 lvm vgscan --mknodes
292 else
293 vgscan
294 fi
295 grep -E "^#.*vgchange" /tmp/i-want-my-lvm | sed "s/^#[ ]*//" > /tmp/start-lvm
296 chmod +x /tmp/start-lvm
297 echo -en "Starting LVM's..."
298 /tmp/start-lvm &
299 for i in 1 2 3 4 5 ; do
300 echo -en "."
301 sleep 1
302 done
303 echo "Done."
304 fi
305# If necessary, cannibalize 'analyze-my-lvm'; copy some of its code here,
306# pipe vgscan's output, strip it, run 'vgchange' on its output, etc.etc.
307 LogIt "LVM's have been started."
308}
309
310
311StartRaids() {
312 local raid_devices i
313 if which raidstart > /dev/null 2> /dev/null ; then
314 raid_devices=`grep /dev/md /tmp/mountlist.txt | cut -d' ' -f1`
315 for i in $raid_devices ; do
316 if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
317 LogIt "$i is started already; no need to run 'raidstart $i'" 1
318 else
319 LogIt "Running 'raidstart $i'" 1
320 raidstart $i
321 fi
322 done
323 elif which mdrun > /dev/null 2> /dev/null ; then
324 LogIt "Running 'mdrun'" 1
325 mdrun
326 else
327 LogIt "Warning: Neither 'raidstart' nor 'mdrun''found. RAID devices may not have started." 1
328 fi
329
330}
331
332
333SwapTheMountExecs() {
334 if [ -e "/bin/mount.libc5" ] ; then
335 LogIt "Swapping busybox's mount with libc5 mount"
336 mv /bin/mount /bin/mount.bb
337 mv /bin/mount.libc5 /bin/mount
338 sync
339 fi
340}
341
342
343TryAgainToFindCD() {
344 local res
345 mount | grep /mnt/cdrom && return 0
346 [ "`grep "backup_media_type" /tmp/mondo-restore.cfg | grep "cdstream"`" ] && return
347 LogIt "Trying to mount CD-ROM a 2nd time..."
348 find-and-mount-cdrom --second-try
349 res=$?
350 if [ "$res" -eq "0" ] ; then
351 CD_MOUNTED_OK=yes
352 LogIt "CD-ROM drive mounted successfully." 1
353 else
354 LogIt "I still cannot find or mount the CD-ROM drive, by the way."
355 fi
356}
357
358
359
360UseTmpfs()
361{
362 local mount_cmd
363 echo -en "Mounting /tmp/tmpfs..."
364 mkdir -p /tmp/tmpfs
365# For technical reasons, some sets are as large as 16MB.
366# I am allowing 32MB because selective restore occupies a lot of space.
367 for size in 64m 48m 40m 32m ; do
368 mount_cmd="mount /dev/shm -t tmpfs -o size=$size" ; # was 34m until 04/2003
369 LogIt "Trying '$mount_cmd'"
370 $mount_cmd /tmp/tmpfs 2>> /$LOGFILE
371 res=$?
372 [ "$res" -eq "0" ] && break
373 done
374 if [ "$res" -ne "0" ] ; then
375 LogIt "Failed. I could not run '$mount_cmd /tmp/tmpfs'. Your kernel is BROKEN or you do not have enough RAM." 1
376 umount /tmp/tmpfs > /dev/null 2> /dev/null
377 rmdir /tmp/tmpfs
378 ln -sf /mnt/RESTORING/tmp /tmp/tmpfs; # used by mondo-restore
379 LogIt "Failed to mount /tmp/tmpfs; using ugly softlink instead"
380 else
381 LogIt "Great. Pivot succeeded w/ size=$size" 1
382 echo -en "Pivoting /tmp..."
383 umount /tmp/tmpfs
384 mkdir -p /tmp.old
385 mv -f /tmp/* /tmp.old/
386 $mount_cmd /tmp
387 mv /tmp.old/* /tmp/
388 rmdir /tmp.old
389 mkdir -p /tmp/tmpfs
390 mkdir -p $GROOVY
391 echo "Done."
392 LogIt "Successfully mounted dynamic /tmp ramdisk"
393# mkdir -p /tmp/tmpfs/var
394# mv -f /var/log /tmp/tmpfs/var/log
395# ln -sf /tmp/tmpfs/var/log /var/log
396 fi
397}
398
399
400WelcomeMessage()
401{
402 echo "********************************************************************"
403 echo "MINDI-LINUX by Mondo Dev Team - web site: http://www.mondorescue.org"
404 echo "Boot disk based on AlfaLinux & Trinux. BusyBox by Erik Andersen."
405which petris > /dev/null 2> /dev/null && echo "Petris was written by Peter Seidler <p.seidler@mail1.stofanet.dk>."
406 echo "Executables and source code are covered by the GNU GPL. No warranty."
407 echo "running on $ARCH"
408 echo "********************************************************************"
409}
410
411
412EnableCcissIfAppropriate() {
413 local i fname
414 for i in 0 1 2 3 ; do
415 fname="/proc/driver/cciss/cciss$i"
416 if [ -e "$fname" ] ; then
417 LogIt "Engaging $fname"
418 echo "engage scsi" > $fname
419 LogIt "...result=$?"
420 fi
421 done
422}
423
424
425ExtractDataDisksAndLoadModules() {
426 echo "Installing additional tools ..."
427 install-additional-tools
428 echo "Inserting modules ..."
429 insert-all-my-modules > $LOGFILE 2> $LOGFILE
430}
431
432# ------------------------ main -----------------------
433
434trap CaughtSoftReset SIGTERM
435LOGFILE=/tmp/mondo-restore.log
436PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/local/mondo:/usr/local/mindi:.
437GROOVY=/tmp/groovy-stuff
438USER=root
439export PATH GROOVY USER
440
441mount -o remount rw /
442[ ! "$GROOVY" ] && Die "I'm not groovy!"
443for i in $GROOVY /mnt/floppy /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
444 mkdir -p $i
445done
446#/bin/update
447mount /proc/ /proc -v -t proc
448mkdir /sys 2> /dev/null
449mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
450rm -f /foozero
451
452echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
453
454ExtractDevTarballs
455LaunchTerminals
456InsertEssentialModules
457EnableCcissIfAppropriate
458#-------------------------------
459#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
460#-------------------------------
461UseTmpfs
462if [ ! -e "/tmp/mondo-restore.cfg" ] ; then
463 LogIt "Warning - /tmp/mondo-restore.cfg not found"
464fi
465
466if [ "`grep -i 'tape ' /tmp/mondo-restore.cfg`" ] || [ "`grep -i udev /tmp/mondo-restore.cfg`" ] ; then
467 HandleTape
468 ExtractDataDisksAndLoadModules
469elif [ "`grep -i pxe /proc/cmdline`" ]; then
470 /sbin/start-nfs
471
472 # Simulate a local CD
473 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
474 CD_MOUNTED_OK=yes
475 ExtractDataDisksAndLoadModules
476else
477 HandleCDROMorFloppies
478 ExtractDataDisksAndLoadModules
479 /sbin/start-nfs
480fi
481res=$?
482SwapTheMountExecs
483ConfigureLoggingDaemons
484if [ -e "/tmp/USE-DEVFS" ] ; then
485 umount /mnt/cdrom 2> /dev/null
486 mv /dev/cdrom /cdrom.lnk 2> /dev/null
487 CD_MOUNTED_OK=""
488 RunDevfsd
489fi
490echo "Starting potential Raid/LVMs ..."
491PauseForRaids
492StartRaids
493StartLvms
494CopyBootDevEntry
495LoadKeymap
496mkdir -p /tmp/tmpfs
497sleep 2
498#clear
499if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ /tmp/mountlist.txt`" != "" ] ; then
500 LogIt "Creating /dev/md/* softlinks just in case." 1
501 mkdir -p /dev/md
502 cp -af /dev/md0 /dev/md/0 2> /dev/null
503 cp -af /dev/md1 /dev/md/1 2> /dev/null
504 cp -af /dev/md2 /dev/md/2 2> /dev/null
505fi
506export ARCH=`uname -m`
507WelcomeMessage
508# SpaceTests; # Mandrake Linux 8.1 doesn't like this
509[ -e "/tmp/mountlist.txt" ] && cp -f /tmp/mountlist.txt /tmp/mountlist.original
510
511if ! [ "`grep -i "pxe" /proc/cmdline`" ] ; then
512 res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
513 [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
514 [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
515 [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
516 #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
517fi
518hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
519openvt 8 /usr/bin/tail -f $LOGFILE
520
521#-------------------------------
522#ABSORBENTANDYELLOWANDPOROUSISHE#;# --- don't touch this either :)
523#-------------------------------
524
525lsmod > /tmp/ramdisk-lsmod.txt 2> /dev/null
526cut -d' ' -f1 /tmp/original-lsmod.txt /tmp/original-lsmod.txt /tmp/ramdisk-lsmod.txt | sort | uniq -d > /tmp/missing-modules.txt
527echo "Warning - these modules did not make it onto the ramdisk" >> $LOGFILE
528cat /tmp/missing-modules.txt >> $LOGFILE
529
530#ctrlaltdel soft
531for path in /usr.bin /usr/bin ; do
532 fname=$path/nano
533 [ -e "$fname" ] && ln -sf $fname /usr/bin/pico
534done
535res=`which nano 2> /dev/null`
536[ "$res" ] && ln -sf /usr/bin/
537for i in null stdout stdin stderr ; do
538 cp -af /dev/$i /tmp
539done
540if grep "backup-media-type" /tmp/mondo-restore.cfg > /dev/null 2> /dev/null ; then
541 LogIt "backup-media-type is specified in config file - great."
542 LogIt "Calling post-init $mountlist"
543 post-init
544else
545 LogIt "backup-media-type is not specified in config file."
546 LogIt "I think this CD/floppy has no archives on it."
547fi
548echo -en "Type 'exit' to reboot the PC\r"
549umount /mnt/cdrom 2> /dev/null
550mount / -o rw,remount > /dev/null 2> /dev/null
551sh
552CaughtSoftReset
553# reboot
Note: See TracBrowser for help on using the repository browser.