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 |
|