| 1 | beyerle@PS | 1 | #!/bin/ash
 | 
        
           |  |  | 2 | #
 | 
        
           |  |  | 3 | # Original version from http://www.linux-live.org/
 | 
        
           |  |  | 4 | #
 | 
        
           |  |  | 5 | # modified by Urs Beyerle, PSI
 | 
        
           |  |  | 6 | # - to allow LiveCD mounted over NFS
 | 
        
           |  |  | 7 | # - add support for LiveCD on SATA devices
 | 
        
           |  |  | 8 |   | 
        
           |  |  | 9 | export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin
 | 
        
           |  |  | 10 | . liblinuxlive
 | 
        
           |  |  | 11 |   | 
        
           |  |  | 12 |   | 
        
           |  |  | 13 | echolog "mounting /proc and /sys filesystems"
 | 
        
           |  |  | 14 | mount -t proc proc /proc
 | 
        
           |  |  | 15 | mount -t sysfs sysfs /sys
 | 
        
           |  |  | 16 |   | 
        
           |  |  | 17 | # setup DEBUGCMD variable. If debug boot option is present, call debug()
 | 
        
           |  |  | 18 | # function several times during script's execution
 | 
        
           |  |  | 19 | if [ "`cmdline_parameter debug`" ]; then DEBUGCMD="debug"; else DEBUGCMD=""; fi
 | 
        
           |  |  | 20 |   | 
        
           |  |  | 21 | $DEBUGCMD
 | 
        
           |  |  | 22 |   | 
        
           |  |  | 23 | # I have to set these variables very carefully
 | 
        
           |  |  | 24 | UNION=/union
 | 
        
           |  |  | 25 | MEMORY=/memory
 | 
        
           |  |  | 26 | #MOUNTDIR=mnt
 | 
        
           |  |  | 27 | MOUNTDIR=livecd
 | 
        
           |  |  | 28 | CHANGES=$MEMORY/changes
 | 
        
           |  |  | 29 | COPY2RAM=$MEMORY/copy2ram
 | 
        
           |  |  | 30 | IMAGES=$MEMORY/images
 | 
        
           |  |  | 31 | INITRAMDISK=$MOUNTDIR/live
 | 
        
           |  |  | 32 |   | 
        
           |  |  | 33 | # set NFSROOT if nfsroot= in boot parameter 
 | 
        
           |  |  | 34 | NFSROOT="`cmdline_value nfsroot`"
 | 
        
           |  |  | 35 |   | 
        
           |  |  | 36 | # we need cdrom support, isofs support, unionfs support, etc
 | 
        
           |  |  | 37 | modprobe_essential_modules
 | 
        
           |  |  | 38 | setup_dma
 | 
        
           |  |  | 39 |   | 
        
           |  |  | 40 | $DEBUGCMD
 | 
        
           |  |  | 41 |   | 
        
           |  |  | 42 | # load network modules, if NFSROOT is set
 | 
        
           |  |  | 43 | echolog "check for nfsroot"
 | 
        
           |  |  | 44 | if [ "$NFSROOT" != "" ]; then
 | 
        
           |  |  | 45 |    echolog "nfsroot: $NFSROOT"
 | 
        
           |  |  | 46 |    # mii maybe need by NIC
 | 
        
           |  |  | 47 |    echolog "load module mii"
 | 
        
           |  |  | 48 |    modprobe_module mii
 | 
        
           |  |  | 49 |   | 
        
           |  |  | 50 |    # detecting network card
 | 
        
           |  |  | 51 |    PCITABLE=/bin/pcitable
 | 
        
           |  |  | 52 |    NICS=`lspci -n | awk '/Class 0200/ {print $4}' | tr ':' ' ' \
 | 
        
           |  |  | 53 |    | while read x y ; do grep "0x$x.*0x$y" $PCITABLE \
 | 
        
           |  |  | 54 |    | awk '$3 !~ /"unknown"/ {print $3}' | tr -d '"' ; done`
 | 
        
           |  |  | 55 |    echolog "Found network card(s): $NICS"
 | 
        
           |  |  | 56 |   | 
        
           |  |  | 57 |    if [ -n "$NICS" ]; then
 | 
        
           |  |  | 58 |        echo $NICS | while read nic ; do
 | 
        
           |  |  | 59 | 	   echo "Loading module $nic"
 | 
        
           |  |  | 60 | 	   modprobe_module $nic
 | 
        
           |  |  | 61 |        done
 | 
        
           |  |  | 62 |    else
 | 
        
           |  |  | 63 |        echo "ERROR: No network card detected!"
 | 
        
           |  |  | 64 |        echo "Type in your network card driver (e.g. tg3, e1000). "
 | 
        
           |  |  | 65 |        echo "Or ask your system administrator for help."
 | 
        
           |  |  | 66 |        echo -n "Network card driver: "
 | 
        
           |  |  | 67 |        read nic
 | 
        
           |  |  | 68 |        echo "Loading module $nic"
 | 
        
           |  |  | 69 |        modprobe_module $nic
 | 
        
           |  |  | 70 |    fi
 | 
        
           |  |  | 71 | fi
 | 
        
           |  |  | 72 |   | 
        
           |  |  | 73 | $DEBUGCMD
 | 
        
           |  |  | 74 |   | 
        
           |  |  | 75 | # get DHCP lease
 | 
        
           |  |  | 76 | if [ "$NFSROOT" != "" ]; then
 | 
        
           |  |  | 77 |     # create /dev/urandom (needed by udhcpc)
 | 
        
           |  |  | 78 |     mknod /dev/urandom c 1 9
 | 
        
           |  |  | 79 |     echolog "Try to get DHCP lease on eth0"
 | 
        
           |  |  | 80 |     udhcpc --now --quit --interface=eth0 --script=/bin/udhcpc.script
 | 
        
           |  |  | 81 |     if [ $? -ne 0 ]; then
 | 
        
           |  |  | 82 | 	echo "ERROR: couldn't get DHCP lease, trying again"
 | 
        
           |  |  | 83 | 	udhcpc --now --quit --interface=eth0 --script=/bin/udhcpc.script
 | 
        
           |  |  | 84 | 	if [ $? -ne 0 ]; then
 | 
        
           |  |  | 85 | 	    echo "ERROR: couldn't get DHCP lease, trying eth1"
 | 
        
           |  |  | 86 | 	    udhcpc --now --quit --interface=eth1 --script=/bin/udhcpc.script
 | 
        
           |  |  | 87 | 	    if [ $? -ne 0 ]; then
 | 
        
           |  |  | 88 | 		echo "ERROR: couldn't get DHCP lease, trying again eth1"
 | 
        
           |  |  | 89 | 		udhcpc --now --quit --interface=eth1 --script=/bin/udhcpc.script
 | 
        
           |  |  | 90 | 		if [ $? -ne 0 ]; then
 | 
        
           |  |  | 91 | 		    echo "ERROR: can't get DHCP lease on eth0 and eth1"
 | 
        
           |  |  | 92 | 		fi
 | 
        
           |  |  | 93 | 	    fi
 | 
        
           |  |  | 94 | 	fi
 | 
        
           |  |  | 95 |     fi
 | 
        
           |  |  | 96 | fi
 | 
        
           |  |  | 97 |   | 
        
           |  |  | 98 | $DEBUGCMD
 | 
        
           |  |  | 99 |   | 
        
           |  |  | 100 | # we need nfs modules loaded, if NFSROOT is set
 | 
        
           |  |  | 101 | if [ "$NFSROOT" != "" ]; then
 | 
        
           |  |  | 102 |     modprobe_nfs_modules
 | 
        
           |  |  | 103 | fi
 | 
        
           |  |  | 104 |   | 
        
           |  |  | 105 | $DEBUGCMD
 | 
        
           |  |  | 106 |   | 
        
           |  |  | 107 | # $UNION will be used as a root directory, livecd modules will be added soon.
 | 
        
           |  |  | 108 | echolog "setup union on $UNION"
 | 
        
           |  |  | 109 | mkdir -p $UNION
 | 
        
           |  |  | 110 | mkdir -p $MEMORY
 | 
        
           |  |  | 111 |   | 
        
           |  |  | 112 | CHANGESDEV="`cmdline_value changes`"
 | 
        
           |  |  | 113 | if [ "$CHANGESDEV" != "" ]; then
 | 
        
           |  |  | 114 |    echo "mounting $CHANGESDEV to $MEMORY"
 | 
        
           |  |  | 115 |    mount_device $CHANGESDEV $MEMORY
 | 
        
           |  |  | 116 | else false; fi
 | 
        
           |  |  | 117 |   | 
        
           |  |  | 118 | # mount tmpfs only in the case when changes= boot parameter was empty
 | 
        
           |  |  | 119 | # or we were not able to mount the storage device
 | 
        
           |  |  | 120 | if [ $? -ne 0 ]; then mount -t tmpfs -o "size=80%" tmpfs $MEMORY; fi
 | 
        
           |  |  | 121 |   | 
        
           |  |  | 122 | mkdir -p $CHANGES
 | 
        
           |  |  | 123 | mkdir -p $COPY2RAM
 | 
        
           |  |  | 124 | mkdir -p $IMAGES
 | 
        
           |  |  | 125 | mount -t unionfs -o dirs=$CHANGES=rw unionfs $UNION
 | 
        
           |  |  | 126 | if [ $? -ne 0 ]; then fatal "can't setup union in /union directory"; fi
 | 
        
           |  |  | 127 |   | 
        
           |  |  | 128 | $DEBUGCMD
 | 
        
           |  |  | 129 |   | 
        
           |  |  | 130 | # try to find livecd data directory. If not found, try modprobing
 | 
        
           |  |  | 131 | # USB and SATA kernel modules and repeat the find procedure again
 | 
        
           |  |  | 132 | echolog "looking for data modules"
 | 
        
           |  |  | 133 | DATA="`find_live_data_dir $MOUNTDIR`";
 | 
        
           |  |  | 134 | # if [ "$DATA" = "" ]; then modprobe_usb_modules; DATA="`find_live_data_dir $MOUNTDIR`"; fi
 | 
        
           |  |  | 135 | if [ "$DATA" = "" ]; then modprobe_usb_sata_modules; DATA="`find_live_data_dir $MOUNTDIR`"; fi
 | 
        
           |  |  | 136 | if [ "$DATA" = "" ]; then fatal "Data for LiveCD not found. Are you using SCSI?"; fi
 | 
        
           |  |  | 137 | echolog "LiveCD found in: $DATA"
 | 
        
           |  |  | 138 |   | 
        
           |  |  | 139 | $DEBUGCMD
 | 
        
           |  |  | 140 |   | 
        
           |  |  | 141 | # If toram or copy2ram boot parameter is present, copy all .mo modules to RAM.
 | 
        
           |  |  | 142 | # (skip modules from /optional/ which are not listed in load= boot option)
 | 
        
           |  |  | 143 | # Finaly modify DATA variable so it will point to correct directory
 | 
        
           |  |  | 144 | if [ "`cmdline_parameter toram`" != "" -o "`cmdline_parameter copy2ram`" != "" ]; then
 | 
        
           |  |  | 145 |    echolog "copying modules to RAM, this may take some time"
 | 
        
           |  |  | 146 |    copy_to_ram $DATA $COPY2RAM
 | 
        
           |  |  | 147 |    cd_autoeject 1
 | 
        
           |  |  | 148 |    umount $DATA 2>/dev/null
 | 
        
           |  |  | 149 |    if [ $? -ne 0 ]; then umount `dirname $DATA` 2>/dev/null; fi
 | 
        
           |  |  | 150 |    DATA=$COPY2RAM
 | 
        
           |  |  | 151 |    cd_autoeject 0
 | 
        
           |  |  | 152 | fi
 | 
        
           |  |  | 153 |   | 
        
           |  |  | 154 | mkdir -p $UNION/boot
 | 
        
           |  |  | 155 | mount -o bind $DATA $UNION/boot
 | 
        
           |  |  | 156 |   | 
        
           |  |  | 157 | $DEBUGCMD
 | 
        
           |  |  | 158 |   | 
        
           |  |  | 159 | # DATA contains path to the base directory of all .mo images which need
 | 
        
           |  |  | 160 | # to be mounted and inserted into live filesystem. Do it now.
 | 
        
           |  |  | 161 | echolog "inserting all modules and creating live filesystem"
 | 
        
           |  |  | 162 | union_insert_modules $UNION $DATA $IMAGES
 | 
        
           |  |  | 163 |   | 
        
           |  |  | 164 | $DEBUGCMD
 | 
        
           |  |  | 165 |   | 
        
           |  |  | 166 | echo "copying rootchanges"
 | 
        
           |  |  | 167 | copy_rootchanges $DATA $UNION
 | 
        
           |  |  | 168 |   | 
        
           |  |  | 169 | $DEBUGCMD
 | 
        
           |  |  | 170 |   | 
        
           |  |  | 171 | echo "creating /etc/fstab"
 | 
        
           |  |  | 172 | activate_fstab $UNION
 | 
        
           |  |  | 173 |   | 
        
           |  |  | 174 | # More likely these directories aren't there.
 | 
        
           |  |  | 175 | # Even if they are, this won't hurt.
 | 
        
           |  |  | 176 | mkdir -p $UNION/proc
 | 
        
           |  |  | 177 | mkdir -p $UNION/sys
 | 
        
           |  |  | 178 | mkdir -p $UNION/tmp
 | 
        
           |  |  | 179 | mkdir -p $UNION/dev
 | 
        
           |  |  | 180 |   | 
        
           |  |  | 181 | $DEBUGCMD
 | 
        
           |  |  | 182 |   | 
        
           |  |  | 183 | # Union contains all the files and directories unioned from all modules.
 | 
        
           |  |  | 184 | # Change root directory to it, and move initrd's root to /livecd/live/initramdisk
 | 
        
           |  |  | 185 | # Finaly execute /sbin/init to start the distribution.
 | 
        
           |  |  | 186 | echolog "changing root directory..."
 | 
        
           |  |  | 187 | cd $UNION
 | 
        
           |  |  | 188 | mkdir -p $INITRAMDISK
 | 
        
           |  |  | 189 |   | 
        
           |  |  | 190 | umount /sys # we won't need it anymore
 | 
        
           |  |  | 191 | if [ ! -e $UNION/dev/console ]; then mknod $UNION/dev/console c 5 1; fi
 | 
        
           |  |  | 192 |   | 
        
           |  |  | 193 | if [ -x $UNION/usr/sbin/chroot ];
 | 
        
           |  |  | 194 |   then CHROOT=/usr/sbin/chroot
 | 
        
           |  |  | 195 |   else CHROOT=/usr/bin/chroot
 | 
        
           |  |  | 196 | fi
 | 
        
           |  |  | 197 |   | 
        
           |  |  | 198 | echolog "End of linux live scripts"
 | 
        
           |  |  | 199 |   | 
        
           |  |  | 200 | # pure magic ;-)
 | 
        
           |  |  | 201 | cat $UNION/bin/true >/dev/null
 | 
        
           |  |  | 202 |   | 
        
           |  |  | 203 | $DEBUGCMD
 | 
        
           |  |  | 204 |   | 
        
           |  |  | 205 | pivot_root . $INITRAMDISK
 | 
        
           |  |  | 206 | exec $CHROOT . sbin/init <dev/console >dev/console 2>&1; fi
 | 
        
           |  |  | 207 |   | 
        
           |  |  | 208 | header "ERROR!"
 | 
        
           |  |  | 209 | echolog "You are not supposed to be here, something went wrong!"
 | 
        
           |  |  | 210 | echolog "Even Ctrl+Alt+Del won't help you in kernel panic."
 | 
        
           |  |  | 211 |   |