home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 April / Chip_2003-04_cd1.bin / zkuste / mini / download / lnx-bbc-1.618.iso / loadlin / root.bin / root.bin.UNCOMPRESSED / sbin / init
Text File  |  2001-08-14  |  10KB  |  402 lines

  1. #!/bin/ash
  2.  
  3. # BBC init shell script
  4. # Copyright (C) 1999-2001 Linuxcare, Inc.
  5. # Copyright (C) 2001 Seth Schoen
  6.  
  7. # This must run under ash.  Also, it should run with almost no external
  8. # binaries available.  If you need a particular binary here, you need to
  9. # build it in BusyBox and replace the BusyBox in the root filesystem.
  10.  
  11. # Further caveat: the old static ash version 2 I'm currently using does
  12. # not support a lot of standard shell features.  For example, the standard
  13. # "if ! command", the test [ -e ], and shell arithmetic like $((1+1)).
  14.  
  15. PATH="/bin:/usr/bin"
  16. TERM=linux
  17. ignoreeof=10
  18. export PATH DISPLAY TERM ignoreeof 
  19. umask 022
  20.  
  21. mount /proc/ /proc -n -t proc
  22.  
  23. # some people have USB and might be able to benefit from this
  24. # (if it's not in the kernel, it will give an error)
  25. mount -t usbdevfs none /proc/bus/usb
  26.  
  27. # Don't try to probe hardware during boot process (since modprobe is
  28. # not yet available and all usable modules are compiled into kernel)
  29. echo /bin/true > /proc/sys/kernel/modprobe
  30.  
  31. # Are we going to do a Debian install?
  32.  
  33. set `cat /proc/cmdline`
  34.  
  35. DEBINST=false
  36. QUICK=false
  37.  
  38. while [ $# -gt 0 ]
  39. do
  40.     [ x"$1" = xdebinst ] && DEBINST=true
  41.     [ x"$1" = xquick ] && QUICK=true
  42.     [ x"$1" = xdebug ] && set -x
  43.     [ x"$1" = xinteractive ] && exec sh
  44.     shift
  45. done
  46.  
  47. if $DEBINST
  48. then
  49.     echo Loading Debian installer...
  50.     echo Sorry, Debian installer not supported in this version.
  51. fi
  52.  
  53. partition=0
  54.  
  55. for drive in `echo /dev/hd? /dev/scd? /dev/sd?`
  56.  do
  57.    echo "Attempting to mount $drive as CD-ROM"
  58.    if ! mount -r -t iso9660 $drive /mnt/tmp 2>/dev/null
  59.     then continue
  60.     elif [ -f /mnt/tmp/singularity ]
  61.      then
  62.  
  63.       # Debian installer code
  64.       if $DEBINST
  65.       then
  66.           echo "Found the LNX CD-ROM on $drive, mounting under /debinst/cd"
  67.     mkdir /debinst
  68.     mkdir /debinst/cd
  69.     umount /mnt/tmp
  70.     mount -r -t iso9660 $drive /debinst/cd
  71.     echo "Copying rescue image files..."
  72.  
  73.     cd /debinst
  74.     ln -s cd/debian debian
  75.  
  76.     # We do this this way because we are still using the minimalist
  77.     # utilities in busybox, which can't do cp -r right.
  78.  
  79.     cat cd/debian/resc1440.tar.gz | zcat | star
  80.  
  81.     echo "Transferring control to Debian installer..."
  82.     umount /proc
  83.  
  84.     # debchroot.lnx is a static binary which does chroot("/debinst")
  85.     # and then exec("/sbin/init")
  86.  
  87.     exec debchroot.lnx
  88.     echo "exec of Debian rescue system failed!"
  89.     exec ash
  90.     echo "exec of ash failed!"
  91.     exit 1
  92.      fi
  93.  
  94.  
  95.       # Normal LNX rescue system code
  96.  
  97.       echo "Found the LNX CD-ROM on $drive, mounting under /mnt/cdrom-real"
  98.       umount /mnt/tmp
  99.       mount -r -t iso9660 $drive /mnt/cdrom-real 2>/dev/null
  100.  
  101.       # cloop mount happens here!
  102.  
  103.       if [ -f /mnt/cdrom-real/singularity ]
  104.       then
  105.         echo "Found compressed ext2 filesystem in /mnt/cdrom-real, loading cloop driver"
  106.     cd /mnt/cdrom-real
  107.  
  108.     
  109.     # Uses Klaus's cloop-0.6 
  110.     ./insmod cloop.o file=/mnt/cdrom-real/singularity
  111.         echo "Mounting compressed blockdevice /dev/cloop under /mnt/cdrom"
  112.     mount -o ro -t ext2 /dev/cloop /mnt/cdrom
  113.     
  114.       else
  115.         echo "Uh-oh, can't find compressed ext2 filesystem!"
  116.       fi
  117.  
  118.      # cloop mount done
  119.  
  120.      else echo "Found a CD-ROM here, but it's not LNX!"
  121.           echo "Mounting under /mnt/$partition"
  122.           umount /mnt/tmp 
  123.           mkdir /mnt/$partition
  124.           mount -r -t iso9660 $drive /mnt/$partition 2>/dev/null
  125.           partition=$(expr $partition + 2)
  126.    fi
  127. done
  128.  
  129. if [ ! -d /mnt/cdrom/etc ]
  130. then
  131.     cat <<ALAS
  132.  
  133. Sorry, I could not mount the compressed loopback filesystem.  Thus, you will
  134. not have access to most of the software on this CD-ROM.
  135.  
  136. The most likely explanations for this are:
  137.  
  138. - You have too little RAM (less than about 16 MB).
  139. - You have an unusual or non-standard CD-ROM drive (especially on certain
  140.   laptops, which require you to pass parameters to the kernel at boot time).
  141. - You have a corrupt or damaged CD-ROM image.
  142.  
  143. If you know what you are doing, you can try to fix the problem from this
  144. shell prompt.  When you are done, reboot by pressing Ctrl-Alt-Delete.
  145.  
  146. If you believe that your system should be supported and you do not
  147. understand why you are seeing this message, you may report the problem
  148. to the lnx-bbc mailing list.  Please see
  149.  
  150.     http://zork.net/mailman/listinfo/lnx-bbc/
  151.  
  152. for more information.
  153.  
  154. ALAS
  155.     exec /bin/ash
  156. fi
  157.  
  158.  
  159. # So far, so good
  160.  
  161.  
  162. # Get the dynamic linker in place in /lib, where dynamic binaries are
  163. # hard-coded to look for it.  All other shared libraries will be in
  164. # /usr/lib, which is the same as /mnt/cdrom/usr/lib because /usr in the
  165. # RAM disk is a link to /mnt/cdrom/usr.
  166.  
  167. cp /mnt/cdrom/lib/ld-linux.so.2 /lib/
  168.  
  169. # Running ldconfig (a static binary in /usr/bin) updates the dynamic
  170. # linker cache, to make all of the shared libraries (like glibc) visible
  171. # when we run dynamic libraries from now on.
  172. ldconfig
  173. hostname lnx-bbc
  174.  
  175. # The /usr/bin here runs the version in /usr/bin instead of the version in
  176. # /bin.  This was needed when /bin/mv used to be dynamically linked (I
  177. # think /bin/mv would have stopped working after the ldconfig command or
  178. # something like that).
  179. /usr/bin/mv /bin /bin.defunct
  180. /usr/bin/mv /sbin /sbin.defunct
  181.  
  182. ln -s /mnt/cdrom/bin /bin
  183. ln -s /bin /sbin
  184.  
  185. if ! $QUICK
  186. then
  187.  
  188.  
  189.  
  190. #########
  191. ######### Old "find partions" stanza
  192. #########
  193.  
  194. # Try to mount found partitions.
  195.  
  196. for drive in $(cat /proc/partitions | awk '/[0-9]$/ {print $4}')
  197.  do
  198.    echo "Attempting to mount $drive as an ext2 partition"
  199.    if ! mount -r -t ext2 /dev/$drive /mnt/tmp 2>/dev/null
  200.     then continue
  201.     else
  202.      echo "Found an ext2fs on /dev/$drive, mounting under /mnt/$partition"
  203.      umount /mnt/tmp
  204.      mkdir /mnt/$partition
  205.      mount -r -t ext2 /dev/$drive /mnt/$partition 2>/dev/null
  206.      partition=$(expr $partition + 1)
  207.    fi
  208. done
  209.  
  210. # begin Klaus's partitions.sh
  211. # Scan partitions with 
  212. # if [ -f /proc/partitions ]; then
  213. # partitions=""
  214. # while read a b c p; do
  215. # case $p in
  216. #  hd?|sd?) partitions="$partitions /dev/$p"
  217. #   *) ;;
  218. #   esac
  219. #   done < /proc/partitions
  220. #   if [ -n "$partitions" ]
  221. #   then
  222. #   foundp="$(fdisk -l $partitions 2>/dev/null)"
  223. #   for p in `echo "$foundp" | awk '/^\/dev\//{if($NF!~/[Ss]wap/&&$NF!~/[Ee]xtended/
  224. #   ){print $1}}'`
  225. #   do
  226. #   #d="/mnt/${p##*/}"
  227. #   #  - or -
  228. #   d="/mnt/$(basename $p)"
  229. #   [ -d "$d" ] || mkdir -p $d
  230. #   new="$p $d  auto   user,auto,exec,ro 0 0"
  231. #   grep -q "$new" /etc/fstab || echo "$new" >> /etc/fstab
  232. #   done
  233. #   fi
  234. #   fi
  235. #   
  236. # end Klaus's partitions.sh
  237.  
  238. # this fi is needed from far above
  239. fi
  240.  
  241. cp -a /mnt/cdrom/etc/* /etc
  242.  
  243. # Let's make a fresh ssh host key, so that it will be safe for the user
  244. # to run sshd later on.  This requires availability of /dev/random.
  245. # Also requires /etc/passwd to avoid "you don't exist, go away" error.
  246.  
  247. host-key &
  248.  
  249. # Convention that _all and only_ documentation text files in /mnt/cdrom at
  250. # top level inside cloop have names starting with capital letters.  These
  251. # should appear in / because people may not look for them in /mnt/cdrom.
  252.  
  253. # This convention is violated by System.map
  254. cp -a /mnt/cdrom/[A-R]* /
  255.  
  256. # mkdir /bin
  257. # ln -s /usr/bin/sh /bin/sh
  258. # ln -s /usr/bin/sh /bin/bash
  259. # ln -s /usr/bin/login /bin/login
  260. # ln -s /bin.defunct/reboot /bin/reboot
  261.  
  262. export PATH="/usr/bin:/bin"
  263.  
  264. # Add loopback route
  265.  
  266. ifconfig lo inet 127.0.0.1
  267. route add -host 127.0.0.1 lo
  268.  
  269. # Now allow modprobing again
  270. echo /sbin/modprobe > /proc/sys/kernel/modprobe
  271.  
  272. # Get /dev/pts filesytem
  273.  
  274. mount /dev/pts /dev/pts -t devpts
  275.  
  276. # eepro100 was taken out of our kernel, but we don't want to confuse people
  277. # who expect it to be automatically present (you can rmmod if you need
  278. # to pass options)
  279.  
  280. # This has been moved into trivial-net-setup
  281. #modprobe eepro100
  282.  
  283.  
  284. # While that's going on, make the file-list.gz for "locate" script and start 
  285. # appending files to it.
  286.  
  287. touch /var/cache/file-list.gz
  288.  
  289. (find / -xdev; find /mnt/cdrom -xdev; find /mnt/cdrom-real -xdev; echo /etc/ssh_host_dsa_key; echo /etc/ssh_host_dsa_key.pub; echo /etc/ssh_host_key; echo /etc/ssh_host_key.pub) | gzip -9 -c >> /var/cache/file-list.gz
  290.  
  291. # wait for host-key to finish
  292.  
  293. wait
  294.  
  295. # Optionally run a script on the CD to complete boot-time configuration
  296. # (useful for people making customized bootable CDs based on our BBC).
  297.  
  298. [ -x /mnt/cdrom-real/auto/config ] && /mnt/cdrom-real/auto/config
  299.  
  300. # Optionally run a script on the CD _INSTEAD OF_ completing normal init
  301. # (useful for people making customized bootable CDs based on our BBC).
  302.  
  303. [ -x /mnt/cdrom-real/auto/init ] && exec /mnt/cdrom-real/auto/init
  304.  
  305. # Get ready for the X
  306. echo
  307. echo
  308.  
  309. if ! $QUICK
  310. then
  311.  
  312. echo
  313. echo
  314. echo
  315. echo
  316. echo
  317. echo
  318. echo
  319. echo
  320. echo
  321. echo
  322. echo
  323. echo
  324. echo
  325. echo
  326. echo
  327. echo
  328. echo
  329. echo
  330. echo
  331. echo
  332.  
  333. # VGA splash screen has been REMOVED due to conflicts with some video cards
  334. # (it was linuxcare.vga)
  335.  
  336.     # ANSI text splash screen
  337.     cat /etc/lnx.spl
  338.  
  339.     # Let the glory of the lnX-bbc sink in
  340.     sleep 5
  341.  
  342. fi
  343.  
  344. export PS1='\u@\h:\w# '
  345.  
  346. rm -rf /bin.defunct
  347.  
  348. ## Begin respawning of gettys
  349. AGETTY="/usr/bin/agetty 57600"
  350.  
  351. # This is a silly way of doing respawning, but we _are_ in a shell script
  352. # here, so doing it the right way is a little inconvenient.  This way works
  353. # and we avoid excessive system load by sleeping three seconds in between
  354. # checks for whether something should be respawned.
  355. A=/fake
  356. B=/oh
  357. C=/well
  358. D=/whatever
  359. E=/nevermind
  360.  
  361. while :
  362.  do
  363.   if [ ! -d $A ] 
  364.   then
  365.     $AGETTY tty1 &
  366.     A=/proc/$!
  367.   fi
  368.   if [ ! -d $B ] 
  369.   then
  370.     $AGETTY tty2 &
  371.     B=/proc/$!
  372.   fi
  373.   if [ ! -d $C ] 
  374.   then
  375.     $AGETTY tty3 &
  376.     C=/proc/$!
  377.   fi
  378.   if [ ! -d $D ]
  379.   then
  380.     $AGETTY tty4 &
  381.     D=/proc/$!
  382.   fi
  383.   if [ ! -d $E ]
  384.   then
  385.     /usr/bin/agetty -L ttyS0 9600 linux &
  386.     E=/proc/$!
  387.   fi
  388.   
  389.  while [ -d $A -a -d $B -a -d $C -a -d $D ]
  390.   do
  391.      sleep3    # i.e. "sleep 3"
  392.   done
  393. done
  394.  
  395. # NOTREACHED
  396. exec /bin/ash
  397.