Subversion Repositories livecd

Rev

Rev 243 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 243 Rev 248
1
#!/bin/ash
1
#!/bin/ash
2
#
2
#
3
# Original version from http://www.linux-live.org/
3
# Original version from http://www.linux-live.org/
4
#
4
#
5
# modified by Urs Beyerle
5
# modified by Urs Beyerle
6
# - to allow LiveCD mounted over NFS
6
# - to allow LiveCD mounted over NFS
7
# - add support for LiveCD on SATA devices
7
# - add support for LiveCD on SATA devices
8
# - to allow LiveCD mounted over CIFS
8
# - to allow LiveCD mounted over CIFS
9
 
9
 
10
export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin
10
export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin
11
. liblinuxlive
11
. liblinuxlive
12
 
12
 
13
 
13
 
14
echolog "mounting /proc and /sys filesystems"
14
echolog "mounting /proc and /sys filesystems"
15
mount -t proc proc /proc
15
mount -t proc proc /proc
16
mount -t sysfs sysfs /sys
16
mount -t sysfs sysfs /sys
17
ln -sf /proc/mounts /etc/mtab # this allows us to use umount -a
17
ln -sf /proc/mounts /etc/mtab # this allows us to use umount -a
18
 
18
 
19
# setup DEBUGCMD variable. If debug boot option is present, call debug()
19
# setup DEBUGCMD variable. If debug boot option is present, call debug()
20
# function several times during script's execution
20
# function several times during script's execution
21
if [ "`cmdline_parameter debug`" ]; then DEBUGCMD="debug"; else DEBUGCMD=""; fi
21
if [ "`cmdline_parameter debug`" ]; then DEBUGCMD="debug"; else DEBUGCMD=""; fi
22
 
22
 
23
$DEBUGCMD
23
$DEBUGCMD
24
 
24
 
25
# amount of RAM to store changes
25
# amount of RAM to store changes
26
RAMSIZE="`cmdline_value ramsize`"
26
RAMSIZE="`cmdline_value ramsize`"
27
if [ "$RAMSIZE" = "" ]; then RAMSIZE="70%"; fi
27
if [ "$RAMSIZE" = "" ]; then RAMSIZE="70%"; fi
28
 
28
 
29
# Set these variables very carefully
29
# Set these variables very carefully
30
UNION=/union
30
UNION=/union
31
MEMORY=/memory
31
MEMORY=/memory
32
MOUNTDIR=livecd
32
MOUNTDIR=livecd
33
CHANGES=$MEMORY/SL54changes
33
CHANGES=$MEMORY/SL54changes
34
COPY2RAM=$MEMORY/copy2ram
34
COPY2RAM=$MEMORY/copy2ram
35
IMAGES=$MEMORY/images
35
IMAGES=$MEMORY/images
36
INITRAMDISK=$MOUNTDIR/live
36
INITRAMDISK=$MOUNTDIR/live
37
 
37
 
38
# set NFSROOT and NFSOPTS 
38
# set NFSROOT and NFSOPTS 
39
NFSROOT="`cmdline_value nfsroot`"
39
NFSROOT="`cmdline_value nfsroot`"
40
NFSOPTS="`cmdline_value nfsopts`"
40
NFSOPTS="`cmdline_value nfsopts`"
41
if [ "$NFSOPTS" = "" ]; then NFSOPTS="nolock,ro,rsize=8192,wsize=8192,hard,intr"; fi
41
if [ "$NFSOPTS" = "" ]; then NFSOPTS="nolock,ro,rsize=8192,wsize=8192,hard,intr"; fi
42
 
42
 
43
# set CIFSROOT and CIFSOPTS
43
# set CIFSROOT and CIFSOPTS
44
CIFSROOT="`cmdline_value cifsroot`"
44
CIFSROOT="`cmdline_value cifsroot`"
45
CIFSOPTS="`cmdline_value cifsopts`"
45
CIFSOPTS="`cmdline_value cifsopts`"
46
 
46
 
47
# set DHCPDELAY (in seconds)
47
# set DHCPDELAY (in seconds)
48
DHCPDELAY="`cmdline_value dhcpdelay`"
48
DHCPDELAY="`cmdline_value dhcpdelay`"
49
if [ "$DHCPDELAY" = "" ]; then DHCPDELAY=8; fi
49
if [ "$DHCPDELAY" = "" ]; then DHCPDELAY=8; fi
50
 
50
 
-
 
51
# set USBDELAY (in seconds)
-
 
52
USBDELAY="`cmdline_value usbdelay`"
-
 
53
if [ "$USBDELAY" = "" ]; then USBDELAY=8; fi
-
 
54
 
51
# we need cdrom support, isofs support, unionfs/aufs support, etc
55
# we need cdrom support, isofs support, unionfs/aufs support, etc
52
modprobe_essential_modules
56
modprobe_essential_modules
53
 
57
 
54
# disable DMA if nodma parameter is used
58
# disable DMA if nodma parameter is used
55
setup_dma
59
setup_dma
56
 
60
 
57
$DEBUGCMD
61
$DEBUGCMD
58
 
62
 
59
# if NFSROOT is set:
63
# if NFSROOT is set:
60
echolog "check for nfsroot or cifsroot"
64
echolog "check for nfsroot or cifsroot"
61
if [ "$NFSROOT" != "" ]; then
65
if [ "$NFSROOT" != "" ]; then
62
 
66
 
63
   echolog "nfsroot: $NFSROOT"
67
   echolog "nfsroot: $NFSROOT"
64
   $DEBUGCMD
68
   $DEBUGCMD
65
   load_network_modules
69
   load_network_modules
66
   $DEBUGCMD
70
   $DEBUGCMD
67
   get_dhcp_lease
71
   get_dhcp_lease
68
   $DEBUGCMD
72
   $DEBUGCMD
69
   modprobe_nfs_modules
73
   modprobe_nfs_modules
70
 
74
 
71
# if CIFSROOT is set
75
# if CIFSROOT is set
72
elif [ "$CIFSROOT" != "" ]; then
76
elif [ "$CIFSROOT" != "" ]; then
73
 
77
 
74
   echolog "cifsroot: $CIFSROOT"
78
   echolog "cifsroot: $CIFSROOT"
75
   $DEBUGCMD
79
   $DEBUGCMD
76
   load_network_modules
80
   load_network_modules
77
   $DEBUGCMD
81
   $DEBUGCMD
78
   get_dhcp_lease
82
   get_dhcp_lease
79
   $DEBUGCMD
83
   $DEBUGCMD
80
   modprobe_cifs_modules
84
   modprobe_cifs_modules
81
 
85
 
82
fi
86
fi
83
 
87
 
84
$DEBUGCMD
88
$DEBUGCMD
85
 
89
 
86
# $UNION will be used as a root directory, livecd modules will be added soon.
90
# $UNION will be used as a root directory, livecd modules will be added soon.
87
echolog "setup union on $UNION"
91
echolog "setup union on $UNION"
88
mkdir -p $UNION
92
mkdir -p $UNION
89
mkdir -p $MEMORY
93
mkdir -p $MEMORY
90
 
94
 
91
# looking for changes= parameter
95
# looking for changes= parameter
92
CHANGESVAL="`cmdline_value changes`"
96
CHANGESVAL="`cmdline_value changes`"
93
if [ "$CHANGESVAL" != "" ]; then 
97
if [ "$CHANGESVAL" != "" ]; then 
94
    # disable kernel warnings
98
    # disable kernel warnings
95
    PRINTK=`cat /proc/sys/kernel/printk`
99
    PRINTK=`cat /proc/sys/kernel/printk`
96
    echo "0" >/proc/sys/kernel/printk
100
    echo "0" >/proc/sys/kernel/printk
97
    find_changes
101
    find_changes
98
    # enable kernel warnings
102
    # enable kernel warnings
99
    echo "$PRINTK" >/proc/sys/kernel/printk
103
    echo "$PRINTK" >/proc/sys/kernel/printk
100
fi
104
fi
101
mkdir -p $MEMORY
105
mkdir -p $MEMORY
102
 
106
 
103
$DEBUGCMD
107
$DEBUGCMD
104
 
108
 
105
# mount tmpfs only in the case when changes= boot parameter was empty
109
# mount tmpfs only in the case when changes= boot parameter was empty
106
if [ "$CHANGESVAL" = "" ]; then 
110
if [ "$CHANGESVAL" = "" ]; then 
107
    echolog "mount tmpfs"
111
    echolog "mount tmpfs"
108
    mount -t tmpfs -o "size=$RAMSIZE" tmpfs $MEMORY
112
    mount -t tmpfs -o "size=$RAMSIZE" tmpfs $MEMORY
109
    $DEBUGCMD
113
    $DEBUGCMD
110
fi
114
fi
111
 
115
 
112
mkdir -p $CHANGES
116
mkdir -p $CHANGES
113
mkdir -p $COPY2RAM
117
mkdir -p $COPY2RAM
114
rm -rf $IMAGES
118
rm -rf $IMAGES
115
mkdir -p $IMAGES
119
mkdir -p $IMAGES
116
 
120
 
117
# mount unionfs or aufs
121
# mount unionfs or aufs
118
lsmod | grep -q ^unionfs
122
lsmod | grep -q ^unionfs
119
if [ $? -eq 0 ]; then  
123
if [ $? -eq 0 ]; then  
120
    mount -t unionfs -o dirs=$CHANGES=rw unionfs $UNION
124
    mount -t unionfs -o dirs=$CHANGES=rw unionfs $UNION
121
    if [ $? -ne 0 ]; then fatal "can't setup union in $UNION directory"; fi
125
    if [ $? -ne 0 ]; then fatal "can't setup union in $UNION directory"; fi
122
    echolog "unionfs mounted"
126
    echolog "unionfs mounted"
123
else
127
else
124
    mount -t aufs -o br:$CHANGES=rw aufs $UNION
128
    mount -t aufs -o br:$CHANGES=rw aufs $UNION
125
    if [ $? -ne 0 ]; then fatal "can't setup union (aufs) in $UNION directory"; fi
129
    if [ $? -ne 0 ]; then fatal "can't setup union (aufs) in $UNION directory"; fi
126
    echolog "aufs mounted"
130
    echolog "aufs mounted"
127
fi
131
fi
128
 
132
 
129
$DEBUGCMD
133
$DEBUGCMD
130
 
134
 
131
# try to find livecd data directory. If not found, try modprobing
135
# try to find livecd data directory. If not found, try modprobing
132
# USB and SATA kernel modules and repeat the find procedure again
136
# USB and SATA kernel modules and repeat the find procedure again
133
echolog "looking for data modules"
137
echolog "looking for data modules"
134
 
138
 
135
# disable kernel warnings
139
# disable kernel warnings
136
PRINTK=`cat /proc/sys/kernel/printk`
140
PRINTK=`cat /proc/sys/kernel/printk`
137
echo "0" >/proc/sys/kernel/printk
141
echo "0" >/proc/sys/kernel/printk
138
DATA="`find_live_data_dir $MOUNTDIR`"
142
DATA="`find_live_data_dir $MOUNTDIR`"
139
# enable kernel warnings
143
# enable kernel warnings
140
echo "$PRINTK" >/proc/sys/kernel/printk
144
echo "$PRINTK" >/proc/sys/kernel/printk
141
 
145
 
142
if [ "$DATA" = "" ]; then modprobe_usb_sata_modules; DATA="`find_live_data_dir $MOUNTDIR`"; fi
146
if [ "$DATA" = "" ]; then modprobe_usb_sata_modules; DATA="`find_live_data_dir $MOUNTDIR`"; fi
143
if [ "$DATA" = "" ]; then fatal "Data for LiveCD not found."; fi
147
if [ "$DATA" = "" ]; then fatal "Data for LiveCD not found."; fi
144
echolog "LiveCD found in: $DATA"
148
echolog "LiveCD found in: $DATA"
145
 
149
 
146
$DEBUGCMD
150
$DEBUGCMD
147
 
151
 
148
# If toram or copy2ram boot parameter is present, copy all .mo modules to RAM.
152
# If toram or copy2ram boot parameter is present, copy all .mo modules to RAM.
149
# (skip modules from /optional/ which are not listed in load= boot option)
153
# (skip modules from /optional/ which are not listed in load= boot option)
150
# Finaly modify DATA variable so it will point to correct directory
154
# Finaly modify DATA variable so it will point to correct directory
151
if [ "`cmdline_parameter toram`" != "" -o "`cmdline_parameter copy2ram`" != "" ]; then
155
if [ "`cmdline_parameter toram`" != "" -o "`cmdline_parameter copy2ram`" != "" ]; then
152
   echolog "copying modules to RAM, this may take some time"
156
   echolog "copying modules to RAM, this may take some time"
153
   copy_to_ram $DATA $COPY2RAM
157
   copy_to_ram $DATA $COPY2RAM
154
   cd_autoeject 1
158
   cd_autoeject 1
155
   umount $DATA 2>/dev/null
159
   umount $DATA 2>/dev/null
156
   if [ $? -ne 0 ]; then umount `dirname $DATA` 2>/dev/null; fi
160
   if [ $? -ne 0 ]; then umount `dirname $DATA` 2>/dev/null; fi
157
   DATA=$COPY2RAM
161
   DATA=$COPY2RAM
158
   cd_autoeject 0
162
   cd_autoeject 0
159
fi
163
fi
160
 
164
 
161
mkdir -p $UNION/boot
165
mkdir -p $UNION/boot
162
mount -o bind $DATA $UNION/boot
166
mount -o bind $DATA $UNION/boot
163
 
167
 
164
$DEBUGCMD
168
$DEBUGCMD
165
 
169
 
166
# DATA contains path to the base directory of all .mo images which need
170
# DATA contains path to the base directory of all .mo images which need
167
# to be mounted and inserted into live filesystem. Do it now.
171
# to be mounted and inserted into live filesystem. Do it now.
168
echolog "inserting all modules and creating live filesystem"
172
echolog "inserting all modules and creating live filesystem"
169
union_insert_modules $UNION $DATA $IMAGES
173
union_insert_modules $UNION $DATA $IMAGES
170
 
174
 
171
$DEBUGCMD
175
$DEBUGCMD
172
 
176
 
173
echo "copying rootchanges"
177
echo "copying rootchanges"
174
copy_rootchanges $DATA $UNION
178
copy_rootchanges $DATA $UNION
175
 
179
 
176
$DEBUGCMD
180
$DEBUGCMD
177
 
181
 
178
echo "creating /etc/fstab"
182
echo "creating /etc/fstab"
179
activate_fstab $UNION
183
activate_fstab $UNION
180
 
184
 
181
# More likely these directories aren't there.
185
# More likely these directories aren't there.
182
# Even if they are, this won't hurt.
186
# Even if they are, this won't hurt.
183
mkdir -p $UNION/proc
187
mkdir -p $UNION/proc
184
mkdir -p $UNION/sys
188
mkdir -p $UNION/sys
185
mkdir -p $UNION/tmp
189
mkdir -p $UNION/tmp
186
chmod 1777 $UNION/tmp
190
chmod 1777 $UNION/tmp
187
mkdir -p $UNION/dev
191
mkdir -p $UNION/dev
188
mkdir -p $UNION/initrd
192
mkdir -p $UNION/initrd
189
 
193
 
190
$DEBUGCMD
194
$DEBUGCMD
191
 
195
 
192
# no X? (set runlevel to 3)
196
# no X? (set runlevel to 3)
193
if [ "`cmdline_parameter nox`" ]; then
197
if [ "`cmdline_parameter nox`" ]; then
194
  echo "set runlevel to 3"
198
  echo "set runlevel to 3"
195
  sed -i "s/id:.:initdefault:/id:3:initdefault:/" $UNION/etc/inittab
199
  sed -i "s/id:.:initdefault:/id:3:initdefault:/" $UNION/etc/inittab
196
fi
200
fi
197
 
201
 
198
$DEBUGCMD
202
$DEBUGCMD
199
 
203
 
200
# Union contains all the files and directories unioned from all modules.
204
# Union contains all the files and directories unioned from all modules.
201
# Change root directory to it, and move initrd's root to /livecd/live/initramdisk
205
# Change root directory to it, and move initrd's root to /livecd/live/initramdisk
202
# Finaly execute /sbin/init to start the distribution.
206
# Finaly execute /sbin/init to start the distribution.
203
echolog "changing root directory..."
207
echolog "changing root directory..."
204
cd $UNION
208
cd $UNION
205
mkdir -p $INITRAMDISK
209
mkdir -p $INITRAMDISK
206
 
210
 
207
umount /sys # we won't need it anymore
211
umount /sys # we won't need it anymore
208
 
212
 
209
# if [ ! -e $UNION/dev/console ]; then mknod $UNION/dev/console c 5 1; fi
213
# if [ ! -e $UNION/dev/console ]; then mknod $UNION/dev/console c 5 1; fi
210
 
214
 
211
# Copy all dev files (found by mdev) to unioned dev directory
215
# Copy all dev files (found by mdev) to unioned dev directory
212
# so at least disk devices exist (your Linux may need them).
216
# so at least disk devices exist (your Linux may need them).
213
# Two exceptions, do not copy pty* and tty* devs.
217
# Two exceptions, do not copy pty* and tty* devs.
214
if [ ! -e /dev/console ]; then mknod /dev/console c 5 1; fi
218
if [ ! -e /dev/console ]; then mknod /dev/console c 5 1; fi
215
cp -fdR /dev . 2>/dev/null
219
cp -fdR /dev . 2>/dev/null
216
 
220
 
217
if [ -x $UNION/usr/sbin/chroot ];
221
if [ -x $UNION/usr/sbin/chroot ];
218
  then CHROOT=/usr/sbin/chroot
222
  then CHROOT=/usr/sbin/chroot
219
  else CHROOT=/usr/bin/chroot
223
  else CHROOT=/usr/bin/chroot
220
fi
224
fi
221
 
225
 
222
echolog "End of linux live scripts"
226
echolog "End of linux live scripts"
223
 
227
 
224
# pure magic ;-)
228
# pure magic ;-)
225
cat $UNION/bin/true >/dev/null
229
cat $UNION/bin/true >/dev/null
226
 
230
 
227
$DEBUGCMD
231
$DEBUGCMD
228
 
232
 
229
pivot_root . $INITRAMDISK
233
pivot_root . $INITRAMDISK
230
exec $CHROOT . sbin/init <dev/console >dev/console 2>&1
234
exec $CHROOT . sbin/init <dev/console >dev/console 2>&1
231
 
235
 
232
header "ERROR!"
236
header "ERROR!"
233
echolog "You are not supposed to be here, something went wrong!"
237
echolog "You are not supposed to be here, something went wrong!"
234
echolog "Even Ctrl+Alt+Del won't help you in kernel panic."
238
echolog "Even Ctrl+Alt+Del won't help you in kernel panic."
235
echolog "Try to boot with 'linux failsafe' or 'linux all_generic_ide'"
239
echolog "Try to boot with 'linux failsafe' or 'linux all_generic_ide'"
236
 
240